完全に順番が前後しちゃってるけど。
- 11OutOf10/laravel-4-cells: Cells are view components for Laravel 4. They are mini-controllers with their own MVC stack, can invoke logic and render views.
- jp7carlos/laravel-5-cells: Cells are view components for Laravel 5. They are mini-controllers with their own MVC stack, can invoke logic and render views.
呼び出し方
@cell(name, template, attributes, action)
内部の動作の抜粋
class Cells
{
..
public function get($className,
$template = 'display',
$attributes = array() ,
$action = 'display' )
{
..
$instance = $this->app->make($className);
$instance->setDisableCache($this->caching_disabled);
array_set($cells, $className, $instance);
..
$instance->setAttributes($attributes);
$instance->initCell( $template , $action );
return $instance->displayView();
}
}
- Cellxxx のインスタンスを作り
- initCell() を呼ぶ
class CellBaseController
{
public function initCell( $template = 'display' , $action = 'display' )
{
$this->template = $template;
$this->init();
$data = (array) $this->$action();
$this->data = array_merge($this->attributes, $data);
}
public function displayView()
{
$path = "$this->name.$this->template";
..
return $this->renderView( $path );
}
public function renderView( $path )
{
return View::make('cells' . DIRECTORY_SEPARATOR . $path,$this->data);
}
}
initCell() の中では
- init()
- action() を呼んで、そこでセットされた結果を View に渡すデータとして保存
- displayView() を呼ぶ
displayView() の中では
- template の path をセットして
- renderView() に渡して renderView() が View::make する
実装時の注意点
- View で利用できる attributes に特定の値をセットするのは CellBaseController#setAttibute()
- init() に渡ってくる前に @cell() を呼ぶ際に渡した attributes には getAttribute / getAttributes でアクセスできる
- 個々の action は最終的に render の際に利用できる attributes に追加すべきデータの array を返す
- action 固有のものはこの部分だけを見ることでテストできそう
- 最終的に renderView() から View::make する際に template の存在チェックはしていないので、必ず対応する template を用意する1
コードで示すとこう
class CellFoo extends CellBaseController
{
function init()
{
// 共通の前処理はここ
// abstractなので実装しないといけない
// View から利用できる attribute のセットは原則こう
$this->setAttribute('key', 'value')
}
function action()
{
// attributes に追加あるいは attributes を上書きしたい値を返す
return array('action_key' => 'action_value')
// setAttribute してもよいが、自動で追加されるし、
// return する方がテストしやすいはず
}
}
Action に対応する View は絶対に必要。
views/cells/foo/action.blade.php
どうしてもイヤなら CellBaseController を override しておいて挙動を変えちゃった方がよさそう ↩