如何在控制器中使用Yii特征

时间:2014-05-13 06:57:24

标签: yii traits

在我的控制器中有很多代码,大约1000行 建议如何使方便,例如在特质中制作一段代码

  

组件/ ProductTrait.php

trait ProductTrait{

protected function getProductProvider(Product $model){
    $dataProductProvider = new CActiveDataProvider('Product', array(
            'criteria' => array(
                    'limit' => $pageLimit,
                    'condition' => 't.creatorId = :creatorId AND t.categoryId =:categoryId',
                    'order' => 't.created DESC',
                    'params' => array(
                            ':creatorId' => $model->creatorId,
                            ':categoryId' => $model->categoryId,
                    ),
            ),
            'pagination' => false,
            'sort' => false,
    ));
    return $dataProductProvider;
 }


}

控制器

class DealerController extends Controller{
use ProductTrait;
public function actionView($id){
    $model = $this->loadModel($id);
    if ($model === null) {
        throw new CHttpException(404, 'The requested page does not exist.');
    }
    $renderParams['productProvider'] = $this->getProductProvider($model);
 }  

}

1 个答案:

答案 0 :(得分:2)

您可以使用Trait,但也可以使用行为。

首先声明你的行为

class ProductBehavior extends CBehavior
{
    protected function getProductProvider(Product $model){
        $dataProductProvider = new CActiveDataProvider('Product', array(
            'criteria' => array(
                    'limit' => $pageLimit,
                    'condition' => 't.creatorId = :creatorId AND t.categoryId =:categoryId',
                    'order' => 't.created DESC',
                    'params' => array(
                            ':creatorId' => $model->creatorId,
                            ':categoryId' => $model->categoryId,
                    ),
            ),
            'pagination' => false,
            'sort' => false,
        ));
        return $dataProductProvider;
    }
}

然后你在你的控制器中使用它(不要忘记附加它,我已经用init方法完成了它)

class DealerController extends Controller{

    public function init() {
        //Attach the behavior to the controller
        $this->attachBehavior("productprovider",new ProductBehavior);
    }

    public function actionView($id){
        $model = $this->loadModel($id);
        if ($model === null) {
            throw new CHttpException(404, 'The requested page does not exist.');
        }
        //We use the behavior methods as if it is one of the controller methods
        $renderParams['productProvider'] = $this->getProductProvider($model);
    }   
}

行为的主要观点是它在php 5.3中工作,而特性则不是。

现在,traitsbehaviors之间存在一些差异:

  • 行为的第一个区别是特征不能参数化。

在您的控制器中,您可以通过这种方式声明行为:

public function behaviors(){
        return array(
                'ProductBehavior ' => array(
                        'class' => 'components.behaviors.ProductBehavior',
                        'firstAttribute' => 'value',
                        'secondAttribute' => 'value',
                )
        );
}

您的ProductBehavior课程将有2个公开属性:firstAttributesecondAttribute

  • 与行为相比,一个特征缺点是运行时附件。如果你想扩展一个给定的(比如说是3rdParty)类,它有一些特殊的功能,行为让你有机会将它们附加到类(或者更具体地说是类的实例)。使用特征,你必须修改类的来源。

  • A Wiki about behaviors

  • The Yii Guide
  • The CBehavior doc