2014-05-13 53 views
2

在我的控制器大量的代碼,約爲1000線 建議您如何能夠更方便,例如,使一段代碼的特質如何使用Yii的特質在控制器

組件/ 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); 
} 

} 

回答

2

您可以使用特質,但你也可以使用行爲。

首先聲明自己的行爲

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
+0

謝謝,我會努力,我當然想有那種服務的,要發送到的參數的方法 – itcoder

相關問題