23141


自己解決したのでいったん削除しましたが、誰かの役に立つかもしれないので再掲します。

`Laravel 5.1`の環境で、ライブラリの開発を行おうとしています。  
まず、作成直後のプロジェクトに、`extlib/vendor/codename`というフォルダーを作り、そこを開発するライブラリの置き場所にすることにしました。このパスを認識させるために、`composer.json`に以下のパスを追加し、`composer
dumpautoload`を行いました。

[code]

    (前略)
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/",
            "codename\\": "extlib/vendor/codename"  註：この行を追加
        }
    },
    (後略)
    
[/code]

この配下に`service`. `provider`,
`facade`といったフォルダーを作成し、サービス用のクラスや、サービスプロバイダークラス、ファサードクラスを作成して置いてあります。

この設定の中で、`Foo`サービスを`FooProvider`で`singleton`登録し、さらに`FooFacade`を通して使おうとしています。

[code]

    <?php // Fooサービス
    namespace codename\service;
    
    class Foo
    {
        public function getMessage()
        {
            return 'ごきげんよう';
        }
    }
    
    <?php // FooProviderサービスプロバイダー
    namespace codename\provider;
    
    use Illuminate\Support\ServiceProvider;
    use codename\service\Foo;
    
    class FooProvider extends ServiceProvider
    {
        protected $defer = true;
    
        public function register()
        {
            $this->app->singleton('ex-foo', function ($app) {
                return new Foo();
            });
        }
    
        public function boot()
        {
            \Log::info(app()->getBindings()); // ex-fooは一覧にある。
            \Log::info(app('ex-foo')->getMessage());  // これは出力される
        }
    }
    
[/code]

`boot`メソッドに記述したログ出力は期待通りに出力されているため、サービスコンテナへの登録はうまくいっているものと考えました。

しかし、確認のために`routes.php`に以下のようなルーティングを追加して、内容表示を試みたところ、`Class ex-foo does not
exist`となってしまいます。同様に、バインド一覧を確認しましたが、やはり一覧には登録がありませんでした。

[code]

    Route::get('test', function () {
        \Log::info(app()->getBindings()); // 一覧にはex-fooはない。
    
        // $s = new codename\service\Foo(); // こちらはOK
        // $s = app()->make('ex-foo'); // Class ex-foo does not exist
        $s = app('ex-foo'); // Class ex-foo does not exist
    
        return $s->getMessage();
    });
    
[/code]

ちなみに、`Facade`経由の場合も`Class ex-foo does not
exist`となります。主因はそれ以前にあるので、こちらは省略します。あたかも、違うサービスコンテナを見ているような状況なのですが、Laravelの経験が浅いためその理由がつかめません。解決方法やヒントをお持ちでしたら、ご教授いただけないでしょうか。


CC BY-SA 3.0
2016-03-15T00:03:20.410
23140
2016-03-15T00:56:33.273
2016-03-15T00:56:33.273
14779
question
laravel laravel-5
サービスコンテナにサービスが反映されない


`php artisan clear-compiled`を行うことで、正常に動作するようになりました。

しかし、ログには`FooProvider`からは正常な結果が出て、`router`からは見えないという現象なのはなぜなのか、よくわかりませんでした。それぞれの見ているサービスコンテナのインスタンスが違うとしか思えませんでした。

こんな情報でも、どなたかのお役に立てばよいですが、、。


CC BY-SA 3.0
2016-03-15T00:09:21.547
23141
2016-03-15T00:09:21.547
14779
23140
answer