Laravel Package Development

D0cbc297e483306fb188649ea56f0c8d?s=47 mikakane
February 16, 2019

Laravel Package Development

Laravel JP Conference 2019 での登壇資料です。

https://conference2019.laravel.jp/

登壇に関する補足記事はこちら
https://note.mu/mikakane/n/n3a8ee80c9c38

D0cbc297e483306fb188649ea56f0c8d?s=128

mikakane

February 16, 2019
Tweet

Transcript

  1. 7.

    chatbox.inc Laravel Package開発 Service Provider を起点に開発。 通常のLaravel でできることはほとんどなんでもできる。 クラス類は普通に autoload

    を使って読み込む想定 autoload と Service Provider で フォルダに分割されたパッケージをシステムに取り込む形 DI コンテナへのモジュール登録だけでなく、 artisan や ルートの作成、migration の登録も 。
  2. 8.

    chatbox.inc Route の作成 public function boot() { $this->loadRoutesFrom(__DIR__.'/routes/api.php'); } ServiceProvider

    の boot セクションで任意の Route ファイルを読み込める。 パッケージ内に ルートファイルを作って読み込めばルートが生成できる。
  3. 9.

    chatbox.inc Artisan の登録 public function boot() { if ($this->app->runningInConsole()) {

    $this->commands([ FooCommand::class, BarCommand::class, ]); } } Service Provider の boot セクションで、 $this->commands を利用して 任意のコマンドクラスを artisan に登録できる。
  4. 10.

    chatbox.inc Migration の登録 public function boot() { $this->loadMigrationsFrom(__DIR__.'/path/to/migrations'); } ServiceProvider

    の boot セクションで 任意のフォルダをマイグレーションファイルの格納先として登録できる。
  5. 11.

    chatbox.inc view の登録 public function boot() { $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier'); }

    ServiceProvider の boot セクションで 任意のフォルダを view ファイルの格納先として登録できる。 第二引数には、パッケージ名を登録。
  6. 12.

    chatbox.inc Package view の利用 Route::get('admin', function () { return view('courier::admin');

    }); Package に格納された view ファイルは 登録時に使ったパッケージ名を利用して package::view の形式でコールできる。
  7. 13.

    chatbox.inc vendor:publish public function boot() { $this->publishes([ __DIR__.'/../config/package.php' => config_path('package.php')

    ], 'config'); $this->publishes([ __DIR__.'/../database/migrations/' => database_path('migrations') ], 'migrations'); } 任意のフォルダに、パッケージ内のファイル群を展開することも可能 第二引数でタグを指定して、コマンド実行時に制御できる。 コマンドは php artisan vendor:publish --tag=config で実行可能
  8. 14.

    chatbox.inc Auto Discovery "extra": { "laravel": { "providers": [ "Barryvdh\\Debugbar\\ServiceProvider"

    ], "aliases": { "Debugbar": "Barryvdh\\Debugbar\\Facade" } } }, composer.json の extra.laravel に Service Provider を記載することで、 config/app.php 設定ファイルを変更しなくても composer install 実施時に自動的に Service Provider を有効化できる。
  9. 17.

    chatbox.inc Work with Composer Composer の機能は、外部ライブラリのDLだけじゃない。 Autoloader や ローカルの依存解決を使って、 パッケージ開発をより便利に支援できる。

    パッケージ開発の肝は、まずは 名前を切り出すところから 特定の機能を特定のフォルダに落とし込んで 独自の名前空間で展開する。
  10. 18.

    chatbox.inc 名前空間の追加 “autoload”: { “psr-4”: { “Chatbox\\HogeAdmin\\”: “modules/admin”, “Chatbox\\HogeFront\\”: “modules/front”

    } } Composer を利用して 任意の名前空間を追加できる。 app フォルダの外に、独自の名前空間 でコード群を展開できる。
  11. 21.

    chatbox.inc 導入手順 composer install を実行 1 2 3 親の composer.json

    に パッケージパスを登録 パッケージに composer.json を作成
  12. 22.

    chatbox.inc package の composer.json { "name": "chatbox-inc/mailsystem", "authors": [ {

    "name": "t.goto", "email": "t.goto@chatbox-inc.com" } ], "require": { "sendgrid/sendgrid": "~7" }, "autoload":{ "psr-4":{ "Chatbox\\HogeSysytemMail\\": "./src", } } } require にパッケージの依存を記述 できる。 単体テストのために、 require-dev も定義可能 name は package を親にインストー ルさせる際に必要
  13. 23.

    chatbox.inc Path Repository の利用 { .... "repositories":[ {"type":"path","url": "./modules/mailsystem"}, {"type":"path","url":

    "./modules/front"}, {"type":"path","url": "./modules/admin"}, ], .... } repositories に モジュールの情報を追加する。 “type”: “path” で composer.json のあるフォルダパスを追加
  14. 24.

    chatbox.inc composer でインストール $ composer require chatbox-inc/mailsystem:*@dev composer require でパッケージをインストールすると、

    vendor にシンボリックリンクが貼られてモジュールが有効化される バージョンは * で @dev をつけてインストール パッケージ名は composer.json に 記載の名前を利用
  15. 26.

    chatbox.inc app にコードを書くと… 名前空間が App。 別のシステムと 統合しようとしたときに クラス名が被ってしまったり 切り出してライブラリ化しようとしたときにも 名前空間が

    App のままでは公開しづらくて書き直しに app フォルダの中にシステムの全てが入る システムのレイヤ x 機能 で複雑なフォルダ構成に
  16. 29.

    chatbox.inc Laravel as Package Container Laravel module A module B

    Laravel module C Laravel module B module C module A 大きくなりすぎたシステムを分割したり…
  17. 30.

    chatbox.inc Laravel as Package Container Laravel module C Laravel module

    B module C module A 逆に増えすぎたマイクロサービスを統合したりできる Laravel module B Laravel module A
  18. 31.

    chatbox.inc app でしかできないこと Exception Handler の制御 読み込む Service Provider の制御

    ルートの Config の制御 .env の管理 アプリケーションの根本的な制御は、app で 各種ロジックはパッケージで
  19. 33.

    chatbox.inc 大規模プロジェクトを分割 パッケージ単位で分業、作業分割 開発もコードレビューもパッケージ単位で進め、 プロジェクト管理はより明瞭に Route / View / Service

    / Artisan など Laravel の複数の要素を、パッケージ単位で取りまとめ コードの管理もよりわかりやすく 機能を落としたり、別リポジトリ管理にしたり 後から生じる構成の変更にも柔軟に対応可能