项目 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/html
、laravelcollective/html
包,使用composer remove 包名命令
更新composer.json
Require部分laravel/framework 5.2.*
项目所有依赖检查是否支持5.2框架版本并更新
Require-dev部分新增symfony/dom-crawler ~3.0
和symfony/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
strict
为false
时
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.0
、symfony/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
中间件StartSession
、EncryptCookies
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.php
中middleware
新增中间件\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->encrypter
为Illuminate\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 协议》,转载必须注明作者和本文链接