Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Laravel Package Development

Avatar for mikakane mikakane
February 16, 2019

Laravel Package Development

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

https://conference2019.laravel.jp/

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

Avatar for mikakane

mikakane

February 16, 2019
Tweet

More Decks by mikakane

Other Decks in Programming

Transcript

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

    を使って読み込む想定 autoload と Service Provider で フォルダに分割されたパッケージをシステムに取り込む形 DI コンテナへのモジュール登録だけでなく、 artisan や ルートの作成、migration の登録も 。
  2. chatbox.inc Route の作成 public function boot() { $this->loadRoutesFrom(__DIR__.'/routes/api.php'); } ServiceProvider

    の boot セクションで任意の Route ファイルを読み込める。 パッケージ内に ルートファイルを作って読み込めばルートが生成できる。
  3. chatbox.inc Artisan の登録 public function boot() { if ($this->app->runningInConsole()) {

    $this->commands([ FooCommand::class, BarCommand::class, ]); } } Service Provider の boot セクションで、 $this->commands を利用して 任意のコマンドクラスを artisan に登録できる。
  4. chatbox.inc Migration の登録 public function boot() { $this->loadMigrationsFrom(__DIR__.'/path/to/migrations'); } ServiceProvider

    の boot セクションで 任意のフォルダをマイグレーションファイルの格納先として登録できる。
  5. chatbox.inc view の登録 public function boot() { $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier'); }

    ServiceProvider の boot セクションで 任意のフォルダを view ファイルの格納先として登録できる。 第二引数には、パッケージ名を登録。
  6. chatbox.inc Package view の利用 Route::get('admin', function () { return view('courier::admin');

    }); Package に格納された view ファイルは 登録時に使ったパッケージ名を利用して package::view の形式でコールできる。
  7. 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. 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. chatbox.inc Work with Composer Composer の機能は、外部ライブラリのDLだけじゃない。 Autoloader や ローカルの依存解決を使って、 パッケージ開発をより便利に支援できる。

    パッケージ開発の肝は、まずは 名前を切り出すところから 特定の機能を特定のフォルダに落とし込んで 独自の名前空間で展開する。
  10. chatbox.inc 名前空間の追加 “autoload”: { “psr-4”: { “Chatbox\\HogeAdmin\\”: “modules/admin”, “Chatbox\\HogeFront\\”: “modules/front”

    } } Composer を利用して 任意の名前空間を追加できる。 app フォルダの外に、独自の名前空間 でコード群を展開できる。
  11. chatbox.inc 導入手順 composer install を実行 1 2 3 親の composer.json

    に パッケージパスを登録 パッケージに composer.json を作成
  12. chatbox.inc package の composer.json { "name": "chatbox-inc/mailsystem", "authors": [ {

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

    vendor にシンボリックリンクが貼られてモジュールが有効化される バージョンは * で @dev をつけてインストール パッケージ名は composer.json に 記載の名前を利用
  15. chatbox.inc app にコードを書くと… 名前空間が App。 別のシステムと 統合しようとしたときに クラス名が被ってしまったり 切り出してライブラリ化しようとしたときにも 名前空間が

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

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

    B module C module A 逆に増えすぎたマイクロサービスを統合したりできる Laravel module B Laravel module A
  18. chatbox.inc app でしかできないこと Exception Handler の制御 読み込む Service Provider の制御

    ルートの Config の制御 .env の管理 アプリケーションの根本的な制御は、app で 各種ロジックはパッケージで
  19. chatbox.inc 大規模プロジェクトを分割 パッケージ単位で分業、作業分割 開発もコードレビューもパッケージ単位で進め、 プロジェクト管理はより明瞭に Route / View / Service

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