CakePHP Containable不会在包含的模型上触发其他行为的回调?

时间:2011-12-12 14:44:31

标签: php cakephp callback behavior containable

似乎没有人有这个问题,所以要么我做错了,要么没有人试过:

我有一个模型“信息中心”,它有许多“InfocenterArticle”。为了获取包含相关内容的数据,我将Containable行为附加到两者。

到目前为止,我一直运用自己实施的“HasImageAttachment”行为。问题是在包含的模型中,我的行为的回调不会被调用。

我的模特:

class Infocenter extends AppModel {
    ...
    $actsAs = array('HasImageAttachment', 'Containable');
    $hasMany = array('InfocenterArticle');
    ...
}

class InfocenterArticle extends AppModel {
    ...
    $actsAs = array('Containable');
    $belongsTo = array('Infocenter');
    ...
}

在我的控制器中,我打电话:

$conditions = array('InfocenterArticle.id' => $id);
if ($this->notLoggedIn()) $conditions['InfocenterArticle.freigabe'] = 1;
$article = $this->InfocenterArticle->find('first', array(
    'contain' => array(
      'Infocenter',
      'Infocenter.InfocenterArticle' => array(
        'fields' => array('id', 'title', 'freigabe'),
        'order' => array(
          'InfocenterArticle.order_index' => 'desc',
          'InfocenterArticle.created' => 'desc',
          'InfocenterArticle.title' => 'asc'
        ),
        'conditions' => array(
          'InfocenterArticle.infocenter_id' => 'Infocenter.id'
        ),
      ),
    ),
    'conditions' => $conditions,
));

我可以看到我的HasImageAttachmentBehavior :: setup()方法被调用但是HasImageAttachmentBehavior :: afterFind()(以及beforeFind())却没有。虽然调用了Infocenter :: afterFind(),这使我能够做一些肮脏的黑客攻击,现在还不错,但我讨厌它。

我做错了什么?

编辑:回复RichardAtHome评论的其他信息。

1)我的行为适用于没有附着可包含的模型。

2)我确保通过放置一个简单的die()来调用afterFind();在第一行。脚本不会死()。

3)签名应该没问题,我再仔细检查。

4)我正在使用CakePHP 1.3。

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

目前我不相信CakePHP核心支持Contained模型中的行为。

可能是由于可能的递归,如果你有奇怪的包含数组,行为可能会被错误地调用。

CakePHP Lighthouse项目中有一篇关于通过关联模型调用行为的文章,并提供了一些解决方法建议。

http://cakephp.lighthouseapp.com/projects/42648/tickets/95-afterfind-and-beforefind-callbacks-not-working-on-associated-models-was-translate-behavior-should-translate-associated-model-data

答案 1 :(得分:0)

我刚刚写了一篇关于如何处理这种情况的广泛文章。

适用于CakePHP 2.x和PHP 5.4 +。

Containable behavior alternative function

答案 2 :(得分:0)

显然这是一个刻意的设计点(??!?)。因此,如果您希望关联模型的行为与模型完全相同,则必须一直升级到3.0。叹息。

以下是一个广泛的讨论:https://github.com/cakephp/cakephp/issues/1730 以及最简单的食谱修复:https://schneimi.wordpress.com/2009/09/06/behavior-afterfind-on-model-associations/