您好,欢迎访问一九零五行业门户网

Laravel 4.2 升级 Laravel 5.0 攻略

laravel 4.2 升级 laravel 5.0 攻略 https://phphub.org/topics/474 以下所指l4为laravel 4.2,l5为laravel 5.0 建议如下情况进行升级 对l4比较了解,同时对l5有基本的认识 想对比l4和l5的差异,快速学习l5 程序的代码写的不乱,按照laravel的基本的默认规则
laravel 4.2 升级 laravel 5.0 攻略
https://phphub.org/topics/474
以下所指l4为laravel 4.2,l5为laravel 5.0
建议如下情况进行升级
对l4比较了解,同时对l5有基本的认识想对比l4和l5的差异,快速学习l5程序的代码写的不乱,按照laravel的基本的默认规则来写有足够的耐心和精力熟练使用phpstorm,因为这是个规模较大的工程,有个具有代码逻辑分析功能的编辑器,会让你减少不必要的错误,特别是命名空间和引用。如果你还不怎么会用phpstorm,那么先看be awesome in phpstorm使用larvel-ide-helper这个插件,不然phpstorm就没有那么智能。(注意生成的_ide_helper.php的版本为l5的)以下内容部分来自官方文档。由于我建议全部添加命名空间,内容和文档有出入,并有些内容文档未提及
新建l5项目,然后再迁移新建一个l5项目,新建方法参考这里,然后拷贝l4的文件到新建的项目下面。
拷贝的文件包括:controller, routes, models, artisan commands, assets, 还有一些你自己添加的类或者资源。
composer 你的依赖和包拷贝你添加的所有的composer依赖和包到l5的 composer.json 中,也包括你引用的其他的代码和sdk。 不过需要注意一点就是,你依次去那些针对laravel开发的包需要到项目主页看看作者是否支持l5或者说准备支持l5,据我所知,目前主流的包基本已支持,因为改动不是特别大。选好支持l5的版本之后, composer update 就好了。
命名空间 namespacel4的命名空间是全局的。虽然官方说能不加命名空间就能迁移,但是还是手动给加上吧!不然以后更麻烦了。提醒一下,有这个方法可以修改命名空间的前缀: php artisan app:name yourproj。
如果你的程序中使用了变量作为动态类名,一定要注意在变量中添加完整的命名空间:
# l4中可能存在的写法$myclassname = 'dog';$obj = new $myclassname(); // 在l5中将要报错# l5中要修改为$myclassname = 'app\\models\\dog';$obj = new $myclassname();
配置文件 configuration项目根目录命令行 cp .env.example .env ,拷贝你自定义的配置到这里,配置文件不再像之前那样有很多文件夹供你根据环境选择了,l5下只有这一个,意思就是每个不同的环境都需要自己来稍微定制一些。不过每个项目下面可能都是不同的。写好配置文件后记得保存个模板到 .env.example 供其他队友使用。
在 config/ 下面开始使用 env('db_host', 'localhost') 的方式来调用你的配置到对应的数组键下面。
路由 routes拷贝原来的 routes.php 到 app/http/routes.php
控制器 controllers拷贝你的 contollers 到 app/http/controllers 下。添加正确的命名空间到每个类上app\http\controllers 。记得让你的 basecontroller 继承那个抽象类 controller 。然后挨个查看文件,根据phpstorm提示进行纠错,主要包括引用类和命名空间的错误。
模型 models新建文件夹到 app/models,把原来的 models 全部拷贝过来。首先,添加命名空间 app\models 。接着是关联到其他model的一些方法,比如 belongto, hasmany等,第一个参数需要填写完整的命名空间,例如
class user extends eloquent { public function phone() { // return $this->hasone('phone'); 原来这样写的 return $this->hasone('app\models\phone'); // l5需要添加完整命名空间 }}
过滤器 filtersl5中的中间件 middleware 是个重头戏,路由 routes.php 中的 ['before' => 'auth']需要替换为['middleware' => 'auth'] 。
同时还要改一下过滤器filters:
// app/filters.phprouter::filter('shall-not-pass', function() { return redirect::to('shadow');});
改成这样子
// app/providers/routeserviceprovider@boot()$router->filter('shall-not-pass', function() { return \redirect::to('shadow');});
缓存 cachebuilder 不再支持 remember 这个方法了,请使用 cache::remember 对程序改造 。如果使用了 redis,还需要 composer require 'predis/predis' 。
用户认证 authentication按照下面的操作对 user model 进行升级。
删除下面的内容
use illuminate\auth\userinterface;use illuminate\auth\reminders\remindableinterface;
然后添加以下代码:
use illuminate\auth\authenticatable;use illuminate\auth\passwords\canresetpassword;use illuminate\contracts\auth\authenticatable as authenticatablecontract;use illuminate\contracts\auth\canresetpassword as canresetpasswordcontract;
删除 userinterface 和 remindableinterface 这两个接口,然后添加 authenticatablecontract 和canresetpasswordcontract 这两个接口。
添加以下两个 traits 到类里面
use authenticatable, canresetpassword;
如果你用到illuminate\auth\reminders\remindabletrait和illuminate\auth\usertrait,那么就把他们删掉。
artisan commands直接拷贝你的命令行程序的文件到 app/console/cammands 目录,并添加对应命名空间。
接着拷贝 start/artisan.php 内容到 app/console/kernel.php 文件的 command 数组中。例如
protected $commands = [ 'laracasts\console\commands\clearhistorycommand', 'laracasts\console\commands\signupsreportcommand', 'laracasts\console\commands\welcomeusercommand',];
数据迁移 database migrations & seeds删除l5 database/migrations 中自带的两个数据迁移文件,然后把你自己原来的数据库迁移文件从app/database/migrations 拷贝到 database/migrations 中来。 app/database/seeds 的文件拷贝到database/seeds 中。
这个操作不需要添加命名空间,因为在 composer.json 中已经引入了该目录。
全局的依赖注入绑定 global ioc bindings如果在 start/global.php 中有ioc绑定的话,那就吧他们移动到 app/providers/appserviceprovider.php的 register 方法中。同时还需要引入 app facade。
视图模板 views直接从 app/views 复制到 resources/views 中。
l4中的 {{ }} 对应为l5的 {!! !!} ,而l4中的 {{{ }}} 对应l5的 {{ }} 。需要对应修改一下。
多语言文件 translation files复制 app/lang 到 resources/lang
public目录把你的公共资源都直接拷贝过去吧!
测试文件复制 app/tests 到 tests 目录。
form 和 html 帮助函数如果你用了 form 或者 html 帮助函数,那么就在 composer.json 中添加 illuminate/html: ~5.0。
然后在 config/app.php 中添加 'providers' :
'illuminate\html\htmlserviceprovider',
接着在 'aliases' 中添加:
'form' => 'illuminate\html\formfacade','html' => 'illuminate\html\htmlfacade',
分页替换 $paginator->links() 为 $paginator->render()。如果你这里使用了分页模板的话,l4是在links中传入分页模板的路径字符串,而l5中render的参数为illuminate\contracts\pagination\presenter对象,需要根据需要建立一个继承该接口的类。
消息队列l5对应的 beanstalk 包为: pda/pheanstalk: ~3.0,不再是 pda/pheanstalk: ~2.1
总结相信你按照上面的步骤执行后,你的程序依然报错。因为自己的项目都可能有一些比较 个性 的地方,所以需要多加细心和耐心来完成纠错。
如果你使用了xdebug的断点调试,可能会让你事半功倍。
遇到问题了欢迎来探讨!
最后祝你 level up !^^
其它类似信息

推荐信息