【问题标题】:Cakephp 3 Callback method not reachedCakephp 3回调方法未达到
【发布时间】:2017-03-29 15:05:37
【问题描述】:

我对 afterDelete 回调方法有疑问。我不能使用它们。

在我的一个“存储”插件控制器中,我想删除一条记录,之后我想做一些其他的想法,但没有达到回调方法。我已经通过在 afterDelete() 回调方法中添加日志消息来检查这一点。

这是我删除记录的控制器:

namespace Storages\Controller;

class StoragecontainerBlocksController extends AppController {

   public function initialize() {
       parent::initialize();
       $this->loadComponent('RequestHandler');
   }

   public function ajaxDeleteBlockElement() {
       $this->autoRender = false;

       // load model
       $this->loadModel("StoragecontainerBlockElements");

       // get element id
       $elementId = $this->request->data('id');

       $this->request->allowMethod(['post', 'delete']);

       // delete element
       $storagecontainerBlockElement = $this->StoragecontainerBlockElements->get($elementId);
       $this->StoragecontainerBlockElements->delete($storagecontainerBlockElement);
   }
}

这是定义了 afterDelete 回调的(模型)表:

  use Cake\Log\Log;
  class StoragecontainerBlockElementsTable extends Table {

   public function afterDelete(Event $event) {
       Log::debug('Got here');
   }
  }

更新:

当我在 ajaxDeleteBlockElement 函数中调试 Log::debug($this->StoragecontainerBlockElements); 时,我在 debug.log 文件中得到了以下数组:

2017-03-31 07:03:48 Debug: Cake\ORM\Table Object
(
    [registryAlias] => StoragecontainerBlockElements
    [table] => storagecontainer_block_elements
    [alias] => StoragecontainerBlockElements
    [entityClass] => \Cake\ORM\Entity
    [associations] => Array
        (
        )

    [behaviors] => Array
        (
        )

    [defaultConnection] => default
    [connectionName] => default

更新:

namespace Storages\Model\Table;

use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
use Cake\Log\Log;

class StoragecontainerBlockElementsTable extends Table {

    public function initialize(array $config) {
       parent::initialize($config);
    }

    public function afterDelete(Event $event) {
       Log::debug('Got here');
    }
}

【问题讨论】:

  • $this->StoragecontainerBlockElements 可能不是您认为的那样...调试属性以确保它不是自动表(\Cake\ORM\Table 的实例)。
  • 我已经用调试结果更新了我的问题。

标签: cakephp cakephp-3.0


【解决方案1】:

从调试结果可以看出,$this->StoragecontainerBlockElements并不是你想象的那样,它是一个所谓的“自动表”或“通用表”,即\Cake\ORM\Table的一个实例,而不是一个具体的子类。

您的StoragecontainerBlockElementsTable 类/文件由于某种原因无法找到/加载,因此回退到\Cake\ORM\Table。可能是由于

  • 文件名、类名或命名空间中的拼写错误
  • 或者命名空间完全丢失(这不是你的问题)
  • 或者类存在于插件中,而您没有使用插件表示法来加载它
  • 或文件权限不允许读取文件
  • 或文件丢失(未部署)
  • ...

另见

【讨论】:

  • 我已经添加了我的 StoragecontainerBlockElementsTable 类。这是一个名为“Storages”的插件内的表。
  • Wikked!我必须在类名中包含插件名称,并用$this->loadModel("Storages.StoragecontainerBlockElements"); 之类的点分隔,谢谢您的帮助。你赢得了我的赏金!
【解决方案2】:

试试

use Cake\Log\Log;
use Cake\ORM\Table;

class StoragecontainerBlockElementsTable extends Table {

    public function afterDelete($event, $entity, $options){
        Log::debug('Got here');

    }
}

详情Here

【讨论】:

  • 这并不能解决我的问题。 “到了这里”消息不在我的 debug.log 文件中。您还有其他想法可以解决我的问题吗?
  • 我有更新代码,请通过添加debug()和die()来检查afterDelete()是否被触发
  • 当我调试 delete() 函数时,我得到一个“真”。但是,当我使用 ajax 调用 ajaxDeleteBlockElement() 函数时,如何调试 afterDelete() 呢?当我在 afterDelete() 方法中使用 die() 或 debug() 时没有发生任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 2012-05-31
  • 2012-10-20
  • 2017-07-23
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
相关资源
最近更新 更多