Slide 1

Slide 1 text

chatbox.inc 後藤 知宏 Laravel Package Development

Slide 2

Slide 2 text

chatbox.inc 後 藤 知 宏 株式会社chatbox 代表取締役 関西フロントエンドUG代表 Twitter : @_mikakane エンジニア / 技術顧問

Slide 3

Slide 3 text

chatbox.inc Laravel Package Laravel で Package を開発するための仕組み Laravel の各種ライブラリ開発をサポート

Slide 4

Slide 4 text

chatbox.inc Package Development

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

chatbox.inc Laravel Package開発 Service Provider を起点に開発。 通常のLaravel でできることはほとんどなんでもできる。 クラス類は普通に autoload を使って読み込む想定 autoload と Service Provider で フォルダに分割されたパッケージをシステムに取り込む形 DI コンテナへのモジュール登録だけでなく、 artisan や ルートの作成、migration の登録も 。

Slide 8

Slide 8 text

chatbox.inc Route の作成 public function boot() { $this->loadRoutesFrom(__DIR__.'/routes/api.php'); } ServiceProvider の boot セクションで任意の Route ファイルを読み込める。 パッケージ内に ルートファイルを作って読み込めばルートが生成できる。

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

chatbox.inc view の登録 public function boot() { $this->loadViewsFrom(__DIR__.'/path/to/views', 'courier'); } ServiceProvider の boot セクションで 任意のフォルダを view ファイルの格納先として登録できる。 第二引数には、パッケージ名を登録。

Slide 12

Slide 12 text

chatbox.inc Package view の利用 Route::get('admin', function () { return view('courier::admin'); }); Package に格納された view ファイルは 登録時に使ったパッケージ名を利用して package::view の形式でコールできる。

Slide 13

Slide 13 text

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 で実行可能

Slide 14

Slide 14 text

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 を有効化できる。

Slide 15

Slide 15 text

chatbox.inc でも パッケージ開発って面倒……

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

chatbox.inc Work with Composer Composer の機能は、外部ライブラリのDLだけじゃない。 Autoloader や ローカルの依存解決を使って、 パッケージ開発をより便利に支援できる。 パッケージ開発の肝は、まずは 名前を切り出すところから 特定の機能を特定のフォルダに落とし込んで 独自の名前空間で展開する。

Slide 18

Slide 18 text

chatbox.inc 名前空間の追加 “autoload”: { “psr-4”: { “Chatbox\\HogeAdmin\\”: “modules/admin”, “Chatbox\\HogeFront\\”: “modules/front” } } Composer を利用して 任意の名前空間を追加できる。 app フォルダの外に、独自の名前空間 でコード群を展開できる。

Slide 19

Slide 19 text

chatbox.inc 小さな Laravel を複数作って、組み合わせる

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

chatbox.inc 導入手順 composer install を実行 1 2 3 親の composer.json に パッケージパスを登録 パッケージに composer.json を作成

Slide 22

Slide 22 text

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 を親にインストー ルさせる際に必要

Slide 23

Slide 23 text

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 のあるフォルダパスを追加

Slide 24

Slide 24 text

chatbox.inc composer でインストール $ composer require chatbox-inc/mailsystem:*@dev composer require でパッケージをインストールすると、 vendor にシンボリックリンクが貼られてモジュールが有効化される バージョンは * で @dev をつけてインストール パッケージ名は composer.json に 記載の名前を利用

Slide 25

Slide 25 text

chatbox.inc composer でapp の外のコードを有効化 Laravel でコードを書く場所は app フォルダだけじゃない composer を使って 外のフォルダのコードを Laravel に統合

Slide 26

Slide 26 text

chatbox.inc app にコードを書くと… 名前空間が App。 別のシステムと 統合しようとしたときに クラス名が被ってしまったり 切り出してライブラリ化しようとしたときにも 名前空間が App のままでは公開しづらくて書き直しに app フォルダの中にシステムの全てが入る システムのレイヤ x 機能 で複雑なフォルダ構成に

Slide 27

Slide 27 text

chatbox.inc app にコードを書くと…

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

chatbox.inc app でしかできないこと Exception Handler の制御 読み込む Service Provider の制御 ルートの Config の制御 .env の管理 アプリケーションの根本的な制御は、app で 各種ロジックはパッケージで

Slide 32

Slide 32 text

chatbox.inc パッケージで変わる開発 パッケージを導入することで変わる開発体制 app フォルダの外で 機能を開発して、 Laravel 全体で パッケージを管理

Slide 33

Slide 33 text

chatbox.inc 大規模プロジェクトを分割 パッケージ単位で分業、作業分割 開発もコードレビューもパッケージ単位で進め、 プロジェクト管理はより明瞭に Route / View / Service / Artisan など Laravel の複数の要素を、パッケージ単位で取りまとめ コードの管理もよりわかりやすく 機能を落としたり、別リポジトリ管理にしたり 後から生じる構成の変更にも柔軟に対応可能

Slide 34

Slide 34 text

chatbox.inc 日々、抽象化への挑戦を 再利用を目指したライブラリ制作を簡単に始められる 日々の業務から明日の業務を改善するためのコードを 少しづつ生産していく意識付け、習慣づくりを 名前を切り出して抽象化の設計作業をより身近に ライブラリを別に立てて再利用前提で…と進めるのは荷が重いが とりあえずフォルダを分けるだけなら簡単 パッケージ開発に成功すれば、大きな利益 設計に失敗しても経験になり、複雑なリポジトリ間の依存 に悩まされるようなコストも払わなくていい

Slide 35

Slide 35 text

chatbox.inc より柔軟でより高度な開発 日々の業務の中でパッケージ制作を意識する より高度で管理しやすいシステム開発を身近に

Slide 36

Slide 36 text

chatbox.inc Enjoy Laravel !

Slide 37

Slide 37 text

chatbox.inc Thanks!