パッケージは、Laravel に機能を追加する主な方法です。パッケージは、Carbon のような日付の処理から Behat のような BDD テスト フレームワーク全体まで、あらゆるものを提供できます。
もちろんバッグにも色々な種類があります。一部のパッケージはスタンドアロンです。つまり、Laravel だけでなく、あらゆるフレームワークで使用できます。たとえば、Carbon と Behat は独立したパッケージです。これらのパッケージはすべて、composer.json ファイルでリクエストすることで、Laravel で使用できます。
一方、他のパッケージは Laravel でのみ使用できます。これらのパッケージには、Laravel アプリケーションの機能を強化するために使用されるルート、コントローラー、ビュー、構成が含まれる場合があります。この章では主に、これらのパッケージについて説明します。 Laravel Bagでのみ使用できます。
サービスプロバイダーは、パッケージと Laravel の間の接続ポイントです。サービスプロバイダーは、オブジェクトをLaravelのサービスコンテナにバインドし、ビュー、設定、ローカリゼーションファイルなどのパッケージリソースをロードする場所をLaravelに指示する責任があります。
サービス プロバイダーは IlluminateSupportServiceProvider クラスを継承し、register と boot という 2 つのメソッドが含まれています。 ServiceProvider 基本クラスは、Composer パッケージluminut/supportにあります。
サービス プロバイダーの詳細については、そのドキュメントを参照してください。
パッケージのルートを定義するには、パッケージ サービス プロバイダーのブート メソッドにルーティング ファイルを導入するだけです。ルーティング ファイルでは、Laravel アプリケーションでルートを登録するのと同じように、Route ファサードを使用してルートを登録できます。
/** * Perform post-registration booting of services. * * @return void */public function boot(){ if (! $this->app->routesAreCached()) { require __DIR__.'/../../routes.php'; }}
4.1 ビュー
Laravel にパッケージ ビューを登録するには、ビューの場所を Laravel に伝える必要があります。これを実現するには、サービス プロバイダーのloadViewsFrom メソッドを使用します。 loadViewsFrom メソッドは、ビュー テンプレートへのパスとパッケージ名という 2 つのパラメーターを受け取ります。たとえば、パッケージ名が「courier」の場合、サービス プロバイダーのブート メソッドに次のコードを追加します。
/** * Perform post-registration booting of services. * * @return void */public function boot(){ $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier');}
パッケージ ビューは、同様の package::view 構文を使用して参照されます。したがって、次のようにクーリエパッケージに管理ビューをロードできます:
Route::get('admin', function () { return view('courier::admin');});
パッケージビューをオーバーライドします
loadViewsFrom メソッドを使用すると、Laravel は実際にビュー Storage に対して 2 つのビューを登録します。 location: 1 つは resource/views/vendor ディレクトリで、もう 1 つは指定したディレクトリです。したがって、Courier を例に挙げます。パッケージビューをリクエストするとき、Laravel はまず、開発者が resource/views/vendor/courier にカスタマイズされたバージョンのビューを提供しているかどうかを確認します。ビューが存在しない場合、Laravel はユーザーを検索します。その際に指定されたloadViewsFromディレクトリを呼び出します。このメカニズムにより、エンド ユーザーはパッケージ ビューを簡単にカスタマイズ/オーバーライドできます。
ビューの公開
ビューをアプリケーションの resource/views/vendor ディレクトリに公開したい場合は、サービス プロバイダーの公開メソッドを使用できます。このメソッドは、パッケージのビュー パスとそれに対応するパブリッシュ パス配列をパラメータとして受け取ります:
/** * Perform post-registration booting of services. * * @return void */public function boot(){ $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier'); $this->publishes([ __DIR__.'/path/to/views' => base_path('resources/views/vendor/courier'), ]);}
これで、パッケージ ユーザーが Laravel のアーティザン コマンド Vendor:publish を実行すると、ビュー パッケージが指定されたパスにコピーされます。
4.2 翻訳
パッケージに翻訳ファイルが含まれている場合、loadTranslationsFrom メソッドを使用して、Laravel に翻訳ファイルをロードする方法を指示できます。たとえば、パッケージの名前が「courier」の場合、次のコードを追加する必要があります。次のコード サービス プロバイダーのブート メソッドへ:
/** * Perform post-registration booting of services. * * @return void */public function boot(){ $this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier');}
パッケージの変換は、package::file.line 形式の構文を使用して参照されます。したがって、次のようにメッセージ ファイルから宅配便パッケージのウェルカム行をロードできます:
echo trans('courier::messages.welcome');
翻訳ファイルを公開します
パッケージの翻訳をアプリケーションのリソースに公開したい場合/lang/vendor ディレクトリでは、パッケージ パスと対応する公開パス配列パラメーターを受け取るサービス プロバイダーの公開メソッドを使用できます。たとえば、宅配便パッケージの翻訳ファイルを公開するには、次のようにします。
/** * Perform post-registration booting of services. * * @return void */public function boot(){ $this->loadTranslationsFrom(__DIR__.'/path/to/translations', 'courier'); $this->publishes([ __DIR__.'/path/to/translations' => resource_path('lang/vendor/courier'), ]);}
4.3 構成
通常、パッケージ構成ファイルをアプリケーションのルート ディレクトリの config ディレクトリに公開すると、パッケージ ユーザーがデフォルトの構成オプションを簡単にオーバーライドできるようになります。サービスプロバイダーのブートメソッドでpublishesメソッドを使用する必要があります:
/** * Perform post-registration booting of services. * * @return void */public function boot(){ $this->publishes([ __DIR__.'/path/to/config/courier.php' => config_path('courier.php'), ]);}
$value = config('courier.option');
独自のパッケージをマージすることも選択できます。これにより、ユーザーはアプリケーション構成ファイルで実際に上書きしたい構成オプションのみを導入できるようになります。 2 つの構成をマージするには、サービス プロバイダーの register メソッドで mergeConfigFrom メソッドを使用します。
/** * Register bindings in the container. * * @return void */public function register(){ $this->mergeConfigFrom( __DIR__.'/path/to/config/courier.php', 'courier' );}
/** * Perform post-registration booting of services. * * @return void */public function boot(){ $this->publishes([ __DIR__.'/path/to/assets' => public_path('vendor/courier'), ], 'public');}
现在,当包用户执行 vendor:publish命令时,前端资源将会被拷贝到指定位置,由于你需要在每次包更新时重写前端资源,可以使用 --force标识:
php artisan vendor:publish --tag=public --force
如果你想要确保前端资源已经更新到最新版本,可添加该命令到 composer.json文件的 post-update-cmd列表。
你可能想要分开发布包前端资源组和资源,例如,你可能想要用户发布包配置的同时不发布包前端资源,可以通过在调用时给它们打上“标签”来实现分离。下面我们在包服务提供者的 boot方法中定义两个公共组:
/** * Perform post-registration booting of services. * * @return void */public function boot(){ $this->publishes([ __DIR__.'/../config/package.php' => config_path('package.php') ], 'config'); $this->publishes([ __DIR__.'/../database/migrations/' => database_path('migrations') ], 'migrations');}
现在用户可以在使用Artisan命令 vendor:publish时通过引用标签名来分开发布这两个组:
php artisan vendor:publish --provider="Vendor\Providers\PackageServiceProvider" --tag="config"