Cakephp 2.3 beforeFilter 和 ImplementedEvents 无法共存

问题描述 投票:0回答:1

使用cakephp 2.3.5。

我在多个控制器中使用 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,我将被迫登录。

当我注释掉 ImplementEvents() 时,一切都会按预期进行。我四处搜索,找不到任何对 ImplementEvents() 的引用,从而导致 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();
}
php cakephp cakephp-2.0
1个回答
2
投票

它不会触发,因为您正在重载 ImplementendEvents() 方法而没有确保将 现有事件保留在那里。

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

php 中的重载。

检查大部分基类,Controller、Table、Behavior、Component,它们都会触发或监听事件。因此,在此处扩展某些方法时要小心。最简单的方法可能是在所有类中搜索“EventListenerInterface”。实现此接口的类很可能实现事件回调。

© www.soinside.com 2019 - 2024. All rights reserved.