2015-07-12 24 views
1

使用cakephp 2.3.5。CakePHP 2.3 beforeFilter和implementsEvents不能共存

我在幾個控制器中使用beforeFilter來允許某些操作,而無需登錄。我已成功使用它一段時間。不過,我注意到如果控制器也有ImplementedEvents()方法,我無法在BeforeFilter之前觸發。

public function beforeFilter() { 
     parent::beforeFilter(); 
     $this->Auth->allow('matchWwiProducts'); 
}  

public function implementedEvents() { 
     return array(
        'Controller.Product.delete' => 'deleteSku', 
        'Controller.Product.price' => 'notifySubscribers', 
        'Controller.Product.stock' => 'notifySubscribers' 
     ); 
} 

對於作爲顯示上述我將被迫做一個登錄如果我調用該方法www.example.com/products/matchWwiProducts的代碼。

當我註釋掉implementsEvents()時,一切都按預期工作。我搜索了周圍,無法找到任何引用implementsEvents()與beforeFilter創建問題。

動作matchWwiProducts()如下。它在我登錄時運行良好。但是,我不想強​​制登錄進行此操作。

public function matchWwiProducts() { 
    // this is an audit function that matches Products sourced by wwi 
    // 
    $this->autoRender = false; // no view to be rendered 
    // retrieve products sourced from wwi from Table::Product 
    $this->Product->contain(); 
    $wwiProducts = $this->Product->getWwiSkus();       
    $wwiProductCount = count($wwiProducts); 
    // retrieve products sourced from wwi from Table:Wwiproduct 
    $this->loadModel('WwiProduct'); 
    $this->Wwiproduct->contain(); 
    $wwiSource = $this->Wwiproduct->getSkuList(); 
    $wwiSourceCount = count($wwiSource);       
    // identify SKUs in $wwiProducts that are not in $wwiSource 
    $invalidSkus = array_diff($wwiProducts, $wwiSource);       
    // identify SKUs in $wwiSource that are not in $wwiProducts 
    $missingSkus = array_diff($wwiSource, $wwiProducts);       
    $missingSkuDetails = array(); 
    foreach ($missingSkus as $missingSku) { 
      $skuStockStatus = $this->Wwiproduct->getStockStatus($missingSku); 
      $missingSkuDetails[$missingSku] = $skuStockStatus; 
      }       
    $email = new CakeEmail(); 
    $email->config('sourcewwi'); 
    $email->template('sourcewwiaudit', 'sourcewwi'); 
    if (count($invalidSkus) > 0 || count($missingSkus) > 0) { 
      $email->subject('WWI Source Audit: Invalid or Missing SKUs'); 
      $email->viewVars(array('invalidSkus' => $invalidSkus,              
            'missingSkuDetails' => $missingSkuDetails, 
            'wwiProductCount' => $wwiProductCount, 
            'wwiSourceCount' => $wwiSourceCount)); 
    } else { 
      $email->subject('WWI Source Audit: No Exceptions'); 
      $email->viewVars(array('wwiProductCount' => $wwiProductCount, 
            'wwiSourceCount' => $wwiSourceCount)); 
    } 
    $email->send(); 
} 
+0

請問您可以發佈'matchWwiProducts'行動嗎? – dav

+0

已添加動作matchWwiProducts。 –

回答

2

它不火,因爲你重載implementendEvents()方法沒有確保你保持the existing events那裏。

public function implementedEvents() { 
     return array_merge(parent::implementedEvents(), array(
        'Controller.Product.delete' => 'deleteSku', 
        'Controller.Product.price' => 'notifySubscribers', 
        'Controller.Product.stock' => 'notifySubscribers' 
     )); 
} 

Overloading in php.

檢查大部分基類,控制器,表,行爲,組件,它們都火或監聽事件。所以在那裏擴展某些方法時要小心。最簡單的方法可能會在所有類中搜索「EventListenerInterface」。實現此接口的類可能會實現事件回調。

+0

謝謝你的答案burzum。當我從旅行中回家時,我會對它進行測試,但看起來它會起作用。 –

+1

是的,它完美的作品。我現在知道一些我以前不知道的東西。謝謝! –

+0

這不僅適用於這種方法,這是基本的OOP,你可以重寫任何方法,你必須決定是否要調用它的父類不是。大多數時候你想要。 http://php.net/manual/en/language.oop5.overloading.php你介意把答案標記爲正確嗎?謝謝。 – burzum