Laravel5.2から5.3にバージョンアップしたときの話
こんにちは。広告システム開発部の竹谷です。
私のチームのサービスで、Laravelのバージョンを5.2から5.3にあげたときの話を書きます。
すでに5.4も出ていますが、段階的にまずは5.3にあげました。
PHPのバージョンは7.0.9です。
ドキュメント
ドキュメントはこちらになります。
https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0
composer.jsonの修正からやってみる
まずは、composer.json を修正して、$ composer install
をやり直してみます。
- "laravel/framework": "5.2.*",
+ "laravel/framework": "5.3.*",
"laravelcollective/html": "~5.0",
"webpatser/laravel-uuid": "2.*",
"aws/aws-sdk-php": "3.*",
@@ -16,8 +16,8 @@
"fzaninotto/faker": "~1.4",
"mockery/mockery": "0.9.*",
"phpunit/phpunit": "~4.0",
- "symfony/css-selector": "2.8.*|3.0.*",
- "symfony/dom-crawler": "2.8.*|3.0.*",
+ "symfony/css-selector": "2.8.*|3.1.*",
+ "symfony/dom-crawler": "2.8.*|3.1.*",
エラーがでます。
> php artisan optimize
[ErrorException]
Declaration of App\Providers\EventServiceProvider::boot(Illuminate\Contracts\Events\Dispatcher $events) should be compatible with Illuminate\Foundation\Support\Providers\EventServiceProvider::boot()
これは、ドキュメントのApplication Service Providers
という項目にあるとおり、下記の3つのファイルのboot関数が変わったことが原因のようです。
boot関数の引数を消します。
- app/Providers/AuthServiceProvider.php
- app/Providers/EventServiceProvider.php
- app/Providers/RouteServiceProvider.php
AuthServiceProvider.php
- public function boot(GateContract $gate)
+ public function boot()
{
- $this->registerPolicies($gate);
+ $this->registerPolicies();
EventServiceProvider.php
- public function boot(DispatcherContract $events)
+ public function boot()
{
- parent::boot($events);
+ parent::boot();
RouteServiceProvider.php
- public function boot(Router $router)
+ public function boot()
{
- parent::boot($router);
+ parent::boot();
もう一度、$ composer install
すると今度は通りました。
動かしてみる
とりあえず動かしてみます。
エラーが出ます。
FatalErrorException in Controller.php line 13:
Trait 'Illuminate\Foundation\Auth\Access\AuthorizesResources' not found
ドキュメントのThe AuthorizesResources Trait
という項目に
「AuthorizesResourcesは、AuthorizesRequestsに統合したから削除しておきましょう。」というような記載があるので削除します。
app/Http/Controllers/Controller.php
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
-use Illuminate\Foundation\Auth\Access\AuthorizesResources;
class Controller extends BaseController
{
- use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests;
+ use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
再度動かしてみると、別のエラーが出ます。
ReflectionException in Container.php line 749:
Class App\Http\Controllers\Auth\LoginController does not exist
ドキュメントのAuthentication Scaffolding
という項目に記載があります。
https://github.com/laravel/laravel/tree/5.3/app/Http/Controllers/Auth
にある4つのコントローラーをコピペして新しく置きます。
AuthController
は不要になります。AuthController
でやっていたカスタマイズは各コントローラーに引きつぎましょう。
routes.phpに以下も追加。
Auth::routes();
私たちのサービスで困った点
私たちのサービスで困った点としては、次のようなことがありました。
5.2では以下のような感じでログインに使うパラメータを指定していたのですが、その指定の方法が変わっていました。
protected $username = 'login_id';
5.3だと、username関数をオーバーライドする。
public function username()
{
return 'login_id';
}
他のprotected メンバ変数もオーバーライドするように変更になったようです。
ここまでで、一通り動くようになりました。
ドキュメントの変更点を確認
あとは、ドキュメントの変更点を読んで、サービスに影響がないかを確認します。
インターフェイスが変わっていたり、動作が変わっているところは要注意ですね。
まとめ
そんなにひっかかるところもなくスムーズにバージョンアップができました。
なるべく早く5.4にアップグレードしたいと思います。