ログ日記

作業ログと日記とメモ

自作フレームワークの機能を書いてみる

実際に使用する事を考えると少し考慮しないといけない部分がある。

PHP5でのタイプヒンティングはプリミティブ型には対応していない事。

array型はPHP5.1で導入されたけどオブジェクトのみが対象なので、文字列等を使われないようにする必要がある。

あと、例に出されているようにActionに対してヒンティングを使うとして、引数にしか設定できないのも引っかかる。

今までのMapleではプロパティに対して値をインジェクションしていたので、その思考で行くと方向性が異なるので色々考えなければならないと思います。

ただ型を固定できて、その情報を元にインジェクションを行えるのはいい方法だとは思うのですが、Actionに適応するメリットが自分の思考では出てこなかったりします。(プロパティにすると設定でインジェクション情報を記述しないといけないから、その手間を省けるとか??見通しが良くなるとは思ってます)

http://d.hatena.ne.jp/a_php_ext/20071205/1196783462


自作のフレームワークでは、文字列の場合のみ設定ファイルでアクションクラス変数の値を指定できるようにしている。

[pathinfo]
request1 = 1
request2 = 2
; /で区切られた何番目の値を変数に結びつけるか

[property]
_property = hoge
; _で始まる変数はpublicだけれどインジェクション用
<?php
class SomeAction
{
    public $request1;
    public $request2;
    public $_property;

    public function execute(SomeLogic $logic)
    {
        ...
    }
}


実は、前は

<?php
class SomeAction
{
    var $_SomeLogic; /* _で始まり次に大文字が来るとそれはコンポーネント名と仮定して、自動インジェクション */

    function execute(){
        $this->_SomeLogic->calc();
        ...
    }
}

のようにプロパティから持ってくるようにしていたものを、タイプヒンティングを使うように変更した。
明確な利点が無いのが説明しにくい所だけど・・

  • 書くのが楽
  • ただのクラスとして考えた場合、メソッド間でやり取りしない(executeメソッドしかない)のだから引数でコンポーネントを渡すのが妥当
  • 沢山のコンポーネントを一度に使おうとすると引数が多くなる→構造がマズいんじゃないかと考え直す機会になる

くらいが使ってみての実感。
あとは、アクションクラスでの処理が長くなってprivateメソッドを作った場合、どこかで呼び出されているかもしれないプロパティの事を考えなくてよくなるとか。


設定ファイルで色々やるのか、出来る限りソースに情報を持ってくるのか。


アクションクラスだけじゃなくてコンポーネントのコンストラクタでもタイプヒンティングを利用している。

<?php
class SomeLogic
{
    private $otherLogic;
    private $someTableMapper;

    public function __construct(OtherLogic $other, OrMapperFactory $factory){
        $this->otherLogic = $other;
        $this->someTableMapper = $factory->factory('someTable');
    }
}

こっちの場合は、主な違いはプロパティがpublicになるかprivateになるかっていう部分だけかな。




関係ないけど、一つのアクションクラスに複数の役割を持たせるかっていうのも昔議論があったところだよねぇ。。
私は複数持たせたい。

<?php
class SomeAction
{
    public $req;
    public $result;

    public function execute(SomeLogic $logic)
    {
        /* 例えば、Ajaxを使わない場合 */
        $this->result = $logic->calc($this->req);
    }

    public function Ajax_SomeAction_execute(SomeLogic $logic, JsonView $view)
    {
        $this->execute($logic);
        $view->execute($this->result); /* 例えば、Ajax用の何らかの処理 */
    }
}

とかやりたい。
mapleを元にして作ったとは言っても、考え方は結構違ってるのかも。