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. chatbox.inc 後藤 知宏 Laravel Package Development

  2. chatbox.inc 後 藤 知 宏 株式会社chatbox 代表取締役 関西フロントエンドUG代表 Twitter :

    @_mikakane エンジニア / 技術顧問
  3. chatbox.inc Laravel Package Laravel で Package を開発するための仕組み Laravel の各種ライブラリ開発をサポート

  4. chatbox.inc Package Development

  5. chatbox.inc Package 開発してますか? ドキュメントはあるものの あまり使われている印象がない…

  6. chatbox.inc ライブラリ開発だけじゃない パッケージ開発 プロジェクト間の共通機構を抽象化 大規模プロジェクトのモジュール分割 etc... TODAY’S THEME!

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

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

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

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

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

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

    }); Package に格納された view ファイルは 登録時に使ったパッケージ名を利用して package::view の形式でコールできる。
  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 で実行可能
  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 を有効化できる。
  15. chatbox.inc でも パッケージ開発って面倒……

  16. chatbox.inc 気軽に始めるパッケージ開発! 再利用を前提としなくても、 まずは大きなシステムをパッケージに切り出すところから

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

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

    } } Composer を利用して 任意の名前空間を追加できる。 app フォルダの外に、独自の名前空間 でコード群を展開できる。
  19. chatbox.inc 小さな Laravel を複数作って、組み合わせる

  20. chatbox.inc Type Path Repository プロジェクト内に作成した特定のフォルダを Composer 上の依存ライブラリとして 認識させることができる機能 名前空間ベースのファイル群だけではなく、 依存ライブラリもまとめて管理できる

    依存を剥がせばパッケージの依存も剥がれる あとで切り出してライブラリ化するのも簡単
  21. chatbox.inc 導入手順 composer install を実行 1 2 3 親の composer.json

    に パッケージパスを登録 パッケージに composer.json を作成
  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 を親にインストー ルさせる際に必要
  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 のあるフォルダパスを追加
  24. chatbox.inc composer でインストール $ composer require chatbox-inc/mailsystem:*@dev composer require でパッケージをインストールすると、

    vendor にシンボリックリンクが貼られてモジュールが有効化される バージョンは * で @dev をつけてインストール パッケージ名は composer.json に 記載の名前を利用
  25. chatbox.inc composer でapp の外のコードを有効化 Laravel でコードを書く場所は app フォルダだけじゃない composer を使って

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

    App のままでは公開しづらくて書き直しに app フォルダの中にシステムの全てが入る システムのレイヤ x 機能 で複雑なフォルダ構成に
  27. chatbox.inc app にコードを書くと…

  28. chatbox.inc app をよりスリムに 切り離し用意な パッケージの寄せ集めで、 大きなシステムが構築される、という開発のカタチ

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

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

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

    ルートの Config の制御 .env の管理 アプリケーションの根本的な制御は、app で 各種ロジックはパッケージで
  32. chatbox.inc パッケージで変わる開発 パッケージを導入することで変わる開発体制 app フォルダの外で 機能を開発して、 Laravel 全体で パッケージを管理

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

    / Artisan など Laravel の複数の要素を、パッケージ単位で取りまとめ コードの管理もよりわかりやすく 機能を落としたり、別リポジトリ管理にしたり 後から生じる構成の変更にも柔軟に対応可能
  34. chatbox.inc 日々、抽象化への挑戦を 再利用を目指したライブラリ制作を簡単に始められる 日々の業務から明日の業務を改善するためのコードを 少しづつ生産していく意識付け、習慣づくりを 名前を切り出して抽象化の設計作業をより身近に ライブラリを別に立てて再利用前提で…と進めるのは荷が重いが とりあえずフォルダを分けるだけなら簡単 パッケージ開発に成功すれば、大きな利益 設計に失敗しても経験になり、複雑なリポジトリ間の依存

    に悩まされるようなコストも払わなくていい
  35. chatbox.inc より柔軟でより高度な開発 日々の業務の中でパッケージ制作を意識する より高度で管理しやすいシステム開発を身近に

  36. chatbox.inc Enjoy Laravel !

  37. chatbox.inc Thanks!