イベントが発火せずにハマる

前回、イベント機能を試してみました。その際に、イベントが発火しない不可解な現象にハマリました。

**********

本現象は v5.1 で改善されました。
v5.1ではプロジェクト作成直後に、compiled.phpは生成されなくなりました。
但し、手動で php artisan optimize を実行して、compiled.php を生成した場合には同様の現象が発生しますので、ご注意ください。

ちなみに、v5.1では php artisan optimize した時に、compiled.phpが生成されるディレクトリは vender から bootstrap/cache に変わりました。

【参考情報】はこちら

**********


現象

公式サイトのドキュメントに従い、イベントとイベントハンドラを作成し、EventServiceProvider.phpに登録をしたのですが、何度やってもイベント発火時に、イベントハンドラが実行されません。


原因

vender/compiled.php が原因です

compiled.php はLaravelのパフォーマンスを上げる為のファイルで、このファイルがあると自分が追記したサービスプロバイダよりも、compiled.php内のクラスの方が優先して読み込まれます。その為、EventServiceProvider.phpに追記したイベント設定が読み込まれていない状態でした。

compiled.php は php artisan optimize を実行することで生成されますが、プロジェクト作成直後には必ず生成されます


解決方法

vender/compiled.php を削除します

compiled.phpの削除方法は3つあります。

1) 手動で削除

$ rm vendor/compiled.php

2) artisan コマンドでクリア

$ artisan clear-compiled

3) アプリをデバッグモードにして、composer の requireか、install、update を実行

// .env

APP_DEBUG=true
$ composer require hoge/hoge

composer.json

Laravelの composer.json 内には以下の script 句があり、composer実行後にスクリプトが実行されるようになっています。php artisan optimize はデバックモードの時には、compiled.php を生成しないため、composer コマンドを使うことで、意図せず compiled.php をクリアできていることあります。

{
    ...
    "scripts": {
        "post-install-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ],
        "post-update-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ],
        "post-create-project-cmd": [
            "php -r "copy('.env.example', '.env');"",
            "php artisan key:generate"
        ]
    },
    ...
}

まとめ

かなりトリッキーな現象でした。EventServiceProvider.phpにかぎらず、他のサービスプロバイダーを修正した場合でもこの現象を踏んでしまう可能性があるのでで注意が必要です。

【参考情報】はこちら

なお、optimize のことは、公式サイトのドキュメントに載っていません。詳細な情報は以下をご覧ください。

http://laravel-recipes.com/recipes/60/optimizing-the-framework-for-better-performance
http://laravel-recipes.com/recipes/59/clearing-the-compiled-class

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中