项目 Laravel 框架 5.1 升级到 5.5 过程中的一些问题

[TOC]

Composer镜像加速:

   $> composer config -g repo.packagist composer https://mirrors.aliyun.com/composer

版本之间文件修改对比查看地址:

https://github.com/laravel/laravel/compare...

以下只列出部分修改,其他修改请参照各版本的升级指南

Laravel5.1升级到5.2

1、更新依赖

删除illuminate/htmllaravelcollective/html包,使用composer remove 包名命令

更新composer.json

Require部分laravel/framework 5.2.*项目所有依赖检查是否支持5.2框架版本并更新

Require-dev部分新增symfony/dom-crawler ~3.0symfony/css-selector ~3.0

执行

   $> composer update -vvv

如果出现错误Something's changed, looking at all rules again (pass #23),说明项目依赖包与框架包不匹配

2、config调整

app.php文件中,删除

Illuminate\Foundation\Providers\ArtisanServiceProvider

Illuminate\Routing\ControllerServiceProvider

Illuminate\Html\HtmlServiceProvider

App\Providers\BusServiceProvider

3、Controller.php基类

use Illuminate\Foundation\Bus\DispatchesCommands

更换为

use Illuminate\Foundation\Bus\DispatchesJobs;

use DispatchesCommands

更换为

use DispatchesJobs

4、.env配置文件变量更新

APP_DOMAIN_ROOT=laraveltest.com
APP_DOMAIN_ADMIN=admin.{$APP_DOMAIN_ROOT}

{$PARAM}变量为${PARAM}

5、Jobs调整

在创建任务/命令时你不再需要实现SelfHandling契约

6、database.php中connections.mysql.strict

strictfalse

5.1版本中
set session sql_mode=''

5.2及之后版本
set session sql_mode='NO_ENGINE_SUBSTITUTION'

可通过配置项modes进行兼容
sql_modes参考地址https://www.cnblogs.com/Zender/p/8270833.h...

Laravel5.2升级到5.3

1、更新依赖

更新composer.json

Require部分laravel/framework 5.3.*项目所有依赖检查是否支持5.2框架版本并更新

Require-dev部分phpunit/phpunit ~5.0symfony/dom-crawler 3.1.*symfony/css-selector 3.1.*

执行

   $> composer update -vvv

如果出现错误Something's changed, looking at all rules again (pass #23),说明项目依赖包与框架包不匹配

laravel/tinker安装

2、Providers文件修改

EventServiceProviders.php

public function boot(DispatcherContract $events)
    {
        parent::boot($events); 

改为

public function boot()
    {
    parent::boot();

RouteServiceProvider.php

public function boot(Router $router)
{
    //
    parent::boot($router);

改为

public function boot()
{
    //
    parent::boot(); 

3、scode错误

Interface 'Illuminate\Database\Eloquent\ScopeInterface' not found

使用到的地方调整为Illuminate\Database\Eloquent\Scope

4、session

5.3及以后的版本controller的构造方法____construct无法获取session,
原因5.3之前版本路由中间件先执行再实例控制器

Illuminate\Routing\Router.php

    protected function runRouteWithinStack(Route $route, Request $request)
    {
        $shouldSkipMiddleware = $this->container->bound('middleware.disable') &&
                                $this->container->make('middleware.disable') === true;

        $middleware = $shouldSkipMiddleware ? [] : $this->gatherRouteMiddlewares($route);

        return (new Pipeline($this->container))
                        ->send($request)
                        ->through($middleware)
                        ->then(function ($request) use ($route) {
                            return $this->prepareResponse(
                                $request,
                                $route->run($request)//此处进行控制器实例化
                            );
                        });
    } 

5.3及以后版本中获取控制器路由中间件时会先实例化控制器再执行路由中间件
Illuminate\Routing\Router.php

    protected function runRouteWithinStack(Route $route, Request $request)
    {
        $shouldSkipMiddleware = $this->container->bound('middleware.disable') &&
                                $this->container->make('middleware.disable') === true;

        $middleware = $shouldSkipMiddleware ? [] : $this->gatherRouteMiddleware($route);//此处获取路由中间件时实例化控制器

        return (new Pipeline($this->container))
                        ->send($request)
                        ->through($middleware)
                        ->then(function ($request) use ($route) {
                            return $this->prepareResponse(
                                $request, $route->run()
                            );
                        });
    }

可用方法如下:

    $this->middleware(function ($request, $next) {
            $passport = $request->session()->get('passport');

            return $next($request);
        }); 

或者
App\Http\Kernel$middleware属性开启session中间件StartSessionEncryptCookies

    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Session\Middleware\StartSession::class,
    ]; 

Laravel5.3升级到5.4

1、更新依赖

更新composer.json

Require部分laravel/framework 5.4.*项目所有依赖检查是否支持5.4框架版本并更新

Require-dev部分phpunit/phpunit ~5.7

执行

   $> composer update -vvv

如果出现错误Something's changed, looking at all rules again (pass #23),说明项目依赖包与框架包不匹配

2、Session

Session::set()改为Session::put()

$request->session()->set()改为$request->session()->put()

3、UrlGenerator

Illuminate\Routing\UrlGenerator类的forceSchema方法已经被重命名为forceScheme

4、Model

5.4版本开始获取属性时,会调用
Illuminate\Routing\Database\Eloquent\Concerns\HasAttributes.php
getAttributeValue方法,自增主键及$casts属性中设置的类型会进行强制转换

作用域Illuminate\Routing\Database\Eloquent\Concerns\HasGlobalScopes.php

新增事件Illuminate\Routing\Database\Eloquent\Concerns\HasEvents.php

5、pagination

Illuminate\Pagination\AbstractPaginator.php文件中

addQuery方法修饰由public改为protected

直接调用addQuery方法的地方可改为调用appends方法

6、中间件

app/Http/Kernel.phpmiddleware新增中间件\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class
将空字符串转换为null,当mysql配置严格模式strict设置为false时,添加数据时空字段的值null,导致执行sql语句报错,可取消此中间件

Laravel5.4升级到5.5

1、更新依赖

更新composer.json

Require部分php >=7.0.0,laravel/framework 5.5.*,fideloper/proxy:~3.3项目所有依赖检查是否支持5.5框架版本并更新

Require-dev部分phpunit/phpunit ~6.0 ,filp/whoops ~2.0

执行

   $> composer update -vvv

如果出现错误Something's changed, looking at all rules again (pass #23),说明项目依赖包与框架包不匹配

2、Config

app.php删除'Laravel\Tinker\TinkerServiceProvider',

3、index.php

public/index.php

require __DIR__.'/../bootstrap/autoload.php';

改为

require __DIR__.'/../vendor/autoload.php'; 

4、cookie中间件EncryptCookies

5.4版本及5.5低版中,cookie加密时默认serialize序列化,解密时默认unserialize反序列化。5.5高版中cookie加解密默认不进行序列化。

Illuminate\cookie\Middleware\EncryptCookies.php

低版本中

protected function encrypt(Response $response)
{
        foreach ($response->headers->getCookies() as $cookie) {
            if ($this->isDisabled($cookie->getName())) {
                continue;
            }

            $response->headers->setCookie($this->duplicate(
                $cookie, $this->encrypter->encrypt($cookie->getValue())
            ));
        }

        return $response;
 }

高版本中

protected function encrypt(Response $response)
{
        foreach ($response->headers->getCookies() as $cookie) {
            if ($this->isDisabled($cookie->getName())) {
                continue;
            }

            $response->headers->setCookie($this->duplicate(
                $cookie, $this->encrypter->encrypt($cookie->getValue(), static::serialized($cookie->getName()))
            ));
        }

        return $response;
}

$this->encrypterIlluminate\Encryption\Encrypter.php
方法encrypt($value, $serialize = true)

多个系统利用redis进行共享session时,如果版本不一致导致cookie加解密失败,
如果希望跟之前保持一致可修改app\Http\Middelware\EncryptCookies.php文件将父类Illuminate\cookie\Middleware\EncryptCookies$serialize属性设置为true

class EncryptCookies extends Middleware
{

    protected static $serialize = true;

    /**
     * The names of the cookies that should not be encrypted.
     *
     * @var array
     */
    protected $except = [
        //
    ];
}

5、request的only方法

5.4及之前版本,如果对应键值不存在,对应键值为null
5.5版本,如果对应键值不存在,对应键不返回

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!