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にアップグレードしたいと思います。