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

Laravel Package Development

mikakane
February 16, 2019

Laravel Package Development

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

https://conference2019.laravel.jp/

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

mikakane

February 16, 2019
Tweet

More Decks by mikakane

Other Decks in Programming

Transcript

  1. chatbox.inc
    後藤 知宏
    Laravel Package Development

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. chatbox.inc
    Package Development

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  36. chatbox.inc
    Enjoy Laravel !

    View full-size slide

  37. chatbox.inc
    Thanks!

    View full-size slide