Laravel

Laravelでパッケージ開発

更新日:

Laravelで、パッケージ開発をする方法をご紹介したいと思います。ファサードクラスとか、Iocコンテナとか難しい単語が出てきますが、実際に簡単なパッケージを作成してみると、その辺のニュアンスも掴めてくると思います。

ワークベンチの作成

まず、コマンドプロンプトを起動したら、Laravelのインストールしてあるフォルダへ移動します。

>cd C:\xampp\htdocs\laravel

ここでは、ベンダー名をWinroad、パッケージ名をTransとして、新しいパッケージを作成します。※ベンダー名はパッケージの作成者を区別するためですので、各自の名前をつけてください。

>php artisan workbench Winroad/Trans --resources
  • resourcesの前のハイフンは2つです。

これで、Laravelのルートフォルダ(app,bootstrap,public,vendorと同じ階層)に、workbenchフォルダが作成されます。

そのworkbenchフォルダ内に、winroad(ベンダー名)フォルダが作成され、その中にtrans(パッケージ名)フォルダが作成されます。

その下の階層に、public、src、tests、vendorのフォルダが作成されますが、その中のsrcフォルダを開いてみると、その中にもWinroad(ベンダー名)が作成されています。

そのWinroadの中のTransフォルダ内にパッケージのクラスを作成します。

元号変換プログラム

それでは、例として簡単な西暦を元号に変換するプログラムTransクラスのgengoメソッドを作成します。

app/workbench/winroad/trans/src/Winroad/Trans/Trans.php

<?php namespace Winroad\Trans;
 class Trans{
 public function gengo($date){
 //日付を'/'で区切って変数に変換
 if($date && list($y,$m,$d)=explode('/',$date)){
 if($date >= "1989/01/08"){
 $gengo="平成";
 $y=$y-1988;
 }
 elseif($date >= "1926/12/25"){
 $gengo='昭和';
 $y=$y-1925;
 }
 elseif($date >= "1912/07/30"){
 $gengo='大正';
 $y=$y-1911;
 }
 elseif($date >= "1868/01/25"){
 $gengo='明治';
 $y=$y-1867;
 }
 else{
 $gengo='西暦';
 }
 }
 return sprintf("%s%d年%d月%d日",$gengo,$y,$m,$d);
 }
 }
  • 3-27行目:gengoメソッドは、引数を元号に変換します。
  • たとえば、gengo('1989/12/25')は、平成1年12月25日に変換します。
  • なお、明治以前の日付に関しては、西暦○○年○○月○○日と変換します。

IoCコンテナで結合

それでは、上記のTransクラスのgengoメソッドをLaravelで使えるようにしてみましょう。Transフォルダ内に作成されている、TransServiceProvider.phpにパッケージの基本設定を記述します。

デフォルトのサービスプロバイダーには、bootメソッド、registerメソッド、providesメソッドが作成されています。

IoCコンテナで結合するために、TransServiceProviderのregisterメソッドを、下記のように記述します。

app/workbench/winroad/trans/src/Winroad/Trans/TransServiceProvider.php

public function register(){
 $this->app->bind('trans',function(){
 return new \Winroad\Trans\Trans;
 });
 }
  •  上記のbindメソッドで、結合したIoCコンテナは、App::make('trans')メソッドで解決することが出来ます。

サービスプロバイダーの登録

上記サービスプロバイダーが自動的にロードされるように登録します。app.phpの109行目(WorkbenchServiceProviderの後)あたりに追加します。

app/config/app.php

'Winroad\Trans\TransSeviceProvider',

それでは、実際に動くのか、ルーターから直接、このTransクラスのgengoメソッドを使用してみましょう。

app/routes.php

Route::get('/',function(){
 $trans=App::make('trans');
 return $trans->gengo('1989/12/25');
 });
  • ブラウザからhttp://localhost/laravel/publicと入力して、平成1年12月25日と表示されたら、OKです。

ファサードクラスで静的メソッドの作成

ファサードクラスとは、IoCコンテナで結合されたクラスを静的なクラスとして提供してくれる便利なクラスです。

上記のApp::makeから、gengoメソッドチェーンのコードをもっと簡単に、Trans::gengo()メソッドとして使えるようにしてみましょう。

このファサードクラスは、とても簡単で、どのIoCコンテナを返すかを記述するだけです。

それでは、ファサードクラスを作成しましょう。

app/workbench/winroad/trans/src/Winroad/Trans/Facades/Trans.php

<?php namespace Winroad\Trans\Facades;
 use Illuminate\Support\Facades\Facade;
class Trans extends Facade{
 protected static function getFacadeAccessor(){
 return 'trans';
 }
 }
  • 1行目:Winroad\TransフォルダにFacadesフォルダを作成し、その中にファサードクラス(Trans.phpファイル)を保存しました。
  • 2-3行目:ファサードクラスは、LaravelのFacadeクラスを継承する必要があります。

最後に、Transクラスのエイリアスを登録するために、app.phpの175行目(Viewの後)あたりに、下記を追加します。

'Trans'=>'Winroad\Trans\Facades\Trans',
  • Laravelでは、ここで登録されたエイリアス(別名)が、表面上のクラス名として使用されますので、上記を下記のように登録すると、Trクラスのgengoメソッド(Tr::gengoメソッド)になります。
  • 'Tr'=>'Winroad\Trans\Facades\Trans',
  • つまり、クラス名は好きに変更できるということです。

これで、Trans::gengoメソッドの完成です。

尚、一度登録しておけば、Transクラスのseirekiメソッドを作成すれば、Trans::seirekiメソッドで使用することが出来ます。

ルーターで実際に使用できるかどうか試してみてください。

Route::get('/',function(){
 return Trans::gengo('1989/12/25');
 });

どうですか。LaravelのファサードクラスとIoCコンテナのニュアンスが掴めましたでしょうか。皆さんも便利なパッケージを作成して、Laravel発展のために貢献してください。

-Laravel

Copyright© WinRoad徒然草 , 2018 All Rights Reserved Powered by AFFINGER5.