阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Laravel 4.2 升级 Laravel 5 全面攻略

168次阅读
没有评论

共计 4422 个字符,预计需要花费 12 分钟才能阅读完成。

建议如下情况进行升级

  1. 对 Laravel 4.2 比较了解,同时对 Laravel 5.0 有基本的认识
  2. 想对比 Laravel 4.2 和 Laravel 5.0 的差异,快速学习 L5
  3. 程序的代码写的不乱,按照 Laravel 的基本的默认规则来写
  4. 有足够的耐心和精力
  5. 熟练使用 phpstorm,因为这是个规模较大的工程,有个具有代码逻辑分析功能的编辑器,会让你减少不必要的错误,特别是命名空间和引用。如果你还不怎么会用 phpstorm,那么先看 Be Awesome in PHPStorm
  6. 使用 larvel-ide-helper 这个插件,不然 phpstorm 就没有那么智能。(注意生成的_ide_helper.php 的版本为 Laravel 5.0 的)

以下内容部分来自官方文档。由于我建议全部添加命名空间,内容和文档有出入,并有些内容文档未提及

新建 Laravel 5.0 项目,然后再迁移

新建一个 Laravel 5.0 项目,新建方法参考这里,然后拷贝 Laravel 4.2 的文件到新建的项目下面。

拷贝的文件包括:controller, routes, models, Artisan commands, assets, 还有一些你自己添加的类或者资源。

Composer 你的依赖和包

拷贝你添加的所有的 composer 依赖和包到 Laravel 5.0 的 composer.json 中,也包括你引用的其他的代码和 SDK。
不过需要注意一点就是,你依次去那些针对 Laravel 开发的包需要到项目主页看看作者是否支持 Laravel 5.0 或者说准备支持 L5,据我所知,目前主流的包基本已支持,因为改动不是特别大。选好支持 Laravel 5.0 的版本之后,composer update 就好了。

命名空间 Namespace

Laravel 4.2 的命名空间是全局的。虽然官方说能不加命名空间就能迁移,但是还是手动给加上吧!不然以后更麻烦了。提醒一下,有这个方法可以修改命名空间的前缀:php artisan app:name Yourproj

如果你的程序中使用了变量作为动态类名,一定要注意在变量中添加完整的命名空间:

# Laravel 4.2 中可能存在的写法
$myClassName = 'Dog';
$obj = new $myClassName(); // 在 Laravel 5.0 中将要报错

# L5 中要修改为
$myClassName = 'app\\Models\\Dog';
$obj = new $myClassName();

配置文件 Configuration

项目根目录命令行 cp .env.example .env,拷贝你自定义的配置到这里,配置文件不再像之前那样有很多文件夹供你根据环境选择了,Laravel 5.0 下只有这一个,意思就是每个不同的环境都需要自己来稍微定制一些。不过每个项目下面可能都是不同的。写好配置文件后记得保存个模板到 .env.example 供其他队友使用。

在 config/ 下面开始使用 env('DB_HOST', 'localhost') 的方式来调用你的配置到对应的数组键下面。

路由 routes

拷贝原来的 routes.phpapp/Http/routes.php

控制器 controllers

拷贝你的 contollersapp/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');  // Laravel 5.0 需要添加完整命名空间
    }

}

过滤器 Filters

Laravel 5.0 中的中间件 Middleware 是个重头戏,路由 routes.php 中的 ['before' => 'auth']需要替换为 ['middleware' => 'auth']

同时还要改一下过滤器 Filters:

// app/filters.php
Router::filter('shall-not-pass', function() {
    return Redirect::to('shadow');
});

改成这样子

// app/Providers/RouteServiceProvider@boot()
$router->filter('shall-not-pass', function() {
    return \Redirect::to('shadow');
});

缓存 Cache

Builder 不再 支持 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;

删除 UserInterfaceRemindableInterface 这两个接口,然后添加 AuthenticatableContractCanResetPasswordContract 这两个接口。

添加以下两个 traits 到类里面

use Authenticatable, CanResetPassword;

如果你用到 Illuminate\Auth\Reminders\RemindableTraitIlluminate\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

删除 Laravel 5.0 database/migrations 中自带的两个数据迁移文件,然后把你自己原来的数据库迁移文件从 app/database/migrations 拷贝到 database/migrations 中来。app/database/seeds 的文件拷贝到 database/seeds 中。

这个操作不需要添加命名空间,因为在 composer.json 中已经引入了该目录。

全局的依赖注入绑定 Global IoC Bindings

如果在 start/global.php 中有 ioc 绑定的话,那就吧他们移动到 app/Providers/AppServiceProvider.phpregister 方法中。同时还需要引入 App facade

视图模板 Views

直接从 app/views 复制到 resources/views 中。

Laravel 4.2 中的 {{}} 对应为 Laravel 5.0 的 {!! !!},而 Laravel 4.2 中的 {{{}}} 对应 Laravel 5.0 的 {{}}。需要对应修改一下。

多语言文件 Translation Files

复制 app/langresources/lang

Public 目录

把你的公共资源都直接拷贝过去吧!

测试文件

复制 app/teststests 目录。

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()。如果你这里使用了分页模板的话,Laravel 4.2 是在 links 中传入分页模板的路径字符串,而 Laravel 5.0 中 render 的参数为 Illuminate\Contracts\Pagination\Presenter 对象,需要根据需要建立一个继承该接口的类。

消息队列

Laravel 5.0 对应的 Beanstalk 包为:"pda/pheanstalk": "~3.0",不再是 "pda/pheanstalk": "~2.1"

总结

相信你按照上面的步骤执行后,你的程序依然报错。因为自己的项目都可能有一些比较 个性 的地方,所以需要多加细心和耐心来完成纠错。

如果你使用了 xdebug 的断点调试,可能会让你事半功倍。

遇到问题了欢迎来探讨!

最后祝你 level up!^^

Ubuntu 下使用 Nginx 部署 Laravel  http://www.linuxidc.com/Linux/2015-08/121988.htm

Ubuntu 14.04 上使用 Nginx 部署 Laravel 5.0  http://www.linuxidc.com/Linux/2015-08/121986.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-11/124750.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4422字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中