illuminate/containerとconfigを使ってバッチのマイクロフレームワーク(ベータ)作った

Posted: 2014-10-26 21:09 |  PHP全般 
だいぶまえに似た様な感じで作ってたんですが、
もっと自分が、こんなんだったらいいなーと思うものを少しずつ作ってまして
まだ途中でテストコードすらまだ書いていない(開発中には書いてますけどね)、
ほんとベータなんですが、GitHubのリポジトリに全部突っ込みました。
Iono.ConsolePackage
好きなプログレッシブトランスのレーベル名を勝手に使っただけなんですが、
こいつはsymfonyのconsoleを使って組み込んだんですが、
ちょっと実験的な要素と、いかに手を抜いて処理を実装するか、という所にフォーカスしてます

特徴は、

リードオンリーのトレイトを使って勝手にインジェクトする

どういうことかと。
フレームワーク内でコンポーネントとしていくつか用意してます
現在は必要最小限しか無いですが、あるのはこんな感じです
return [
    // database component
    'db' => "\\Iono\\Console\\Application\\Component\\DataStorage\\Db",
    // cache component
    'cache' => "\\Iono\\Console\\Application\\Component\\Cache\\Factory",
    // redis component
    'redis' => "\\Iono\\Console\\Application\\Component\\DataStorage\\Redis",
];
配列で、それぞれのクラスを指定します
これはconfigの誰でも触れる所にありまして、つまり、コンソールのコア以外は
好きな様にいじれます。
コンストラクタインジェクションも使えるので、それを使っても良いかもしれませんが。
それで、こいつをどうやって使うのかというと、
use Iono\Console\Application\Traits\Component;

/**
* Class User
* @package App\Repositories
*/
class User implements RepositoryInterface
{
    use Component;
    
    /**
     * @return mixed
     */
    public function getDbComponent()
    {
        // use db component
        return $this->db->connection();
    }
} 

Iono\Console\Application\Traits\Component がリードオンリーのtraitとして
先ほどの配列で指定されたコンポーネントを実行時にとってきて生成します
いちいちnewも書かなくて良いんですが、
今の所まったく補完が効かないので(当然ですが)困りものです
今はクラス毎にこのコンポーネントの中身を入れ替えるとかは用意してませんが
そのうちやるかもしれませんが、バッチなのでそこまで使わないのではないかと思いますけど。
これはilluminate/containerの中で、リフレクションを使って調べてオブジェクトを生成する場所があるんですが、
その部分でトレイトを利用して任意のオブジェクトを、しかも使いたいものを簡単に生成する様にしてます
フィールドインジェクションに近いんですが、アノテーションも何も無いのでちょっとアンチな感じかもしれません
そのうちもうちょっと変更する予定です

次にLaravelのサービスプロバイダーを似た様な感じで実装しましたが、これは

configとかに書かずに適当な所にファイルをおけばオートで依存解決をします

Laravel5でアノテーションも利用されるので、折角なのでアノテーションを使って
リフレクションで勝手にバインドする様にしました
ファイルの置き場所がどこでも良いのと、なんかいちいち書かなくて良いです(少し手間が減ったくらい)
 
use Iono\Console\Application\Provider;
use Iono\Console\Application\Annotation\Provide;

/**
 * Class ApplicationProvider
 * @package App\Console\Providers
 * @Provide
 */
class ApplicationProvider extends Provider
{

    /**
     * register application container binding
     * @return void
     */
    public function register()
    {
        $this->container->bind("App\Repositories\RepositoryInterface", "App\Repositories\User");
    }
}
providerを継承して、@Providerを記述するだけであとは勝手に読み込みます
annotationはfileCacheで吐く様になってますので、
cacheのディレクトリは777にする必要があります(デフォルトは/tmp/cache)

ほかにもLaravelインスパイアなので、artisan routesの様に
自分が実装したコマンドラインクラスの一覧を出力したりもできます

肝心のコマンド実装方法と実行方法ですが、
実装は下記の様にします
 
use Iono\Console\Application;

/**
 * Class SampleConsole
 * @package App\Console
 */
class SampleConsole extends Application
{
    use Application\Traits\Component;

    /** @var string */
    protected $command = 'sample';

    /** @var string */
    protected $description = "sample application";

    /**
     * @param array $array
     * @return mixed|void
     */
    public function action(array $array)
    {
        echo 'hello';
    }
}
actionに処理を記述しますが、コンストラクタインジェクションや、
バインドは前述の方法で指定できますのでそんな感じで使い、
コンポーネントを使いたい場合はトレイトを記述します
$commandプロパティがコマンド実行時の名前になります
この場合はsampleなので下記の様になります
 
$ php iono console:action sample
コマンドにクエリーで引数を与える事も出来ます
$ php iono console:action sample?hoge=1
この場合は、action()の第一引数に配列で渡されますので
あとは好きに利用できます。
他にコマンドの親クラスを追加する事も出来ますが、
現在はまだその実装をしていないので後日追加されます

このときに前述したルーターの様に一覧で見る事が出来るので叩いてみると良いです
$ php iono console:list
メール送信とかその辺は後日追加します
DBとCacheまわりは現在はdoctrineを使っていますので、特に難しいこともないと思います
また徐々に機能追加して自分でガリガリ使おうと思います


 

about ytake

執筆に参加しています


Laravel お役立ち情報

share



このエントリーをはてなブックマークに追加

Categories

laravel 45

DTM 0

music 0

PHP全般 31

0

JAPAN 1

WORLD 1

javascript 4

RDBMS 1

NoSQL 1

NewSQL 1

Recent Posts

Ad

comments powered by Disqus

GitHub

Social Links

Author


クリエイティブ・コモンズ・ライセンス
Yuuki Takezawa 作『Ytake Blog』はクリエイティブ・コモンズ 表示 - 非営利 4.0 国際 ライセンス で提供されています。

© ytake/comnect All Rights Reserved. 2014