【问题标题】:cakephp behavior afterFind not called on related modelscakephp 行为 afterFind 没有在相关模型上调用
【发布时间】:2011-05-01 00:24:17
【问题描述】:

我正在使用 afterFind 函数来修改 find 函数中的数据。它工作正常。如果我将 afterFind 函数移动到一个行为中(在插件中),它仍然可以工作,但只有当感兴趣的模型是主要模型时,即当模型属于另一个模型时它不会被调用。有没有办法解决这个问题?我正在使用蛋糕 1.3.4。这是该行为的简化版本:

class ChemicalStructureBehavior extends ModelBehavior {
    function afterFind(&$model, $results, $primary) {
        foreach ($results as &$unit) {
            // format chemical formula (with subscripts)
            $unit[$model->alias]['chemical_formula_formatted'] = preg_replace('/([0-9]+)/i', '<sub>$1</sub>', $unit[$model->alias]['chemical_formula']);
        }

        return $results;
    }
}

【问题讨论】:

  • 从 PHP 5.4 及更高版本开始,您可以为此使用 Trait - 只需将您的 afterFind() 代码放入包含 trait 声明的新文件中(将 $model 引用更改为 $this)并包括它位于 Model 类的顶部,带有 use 语句。您需要使用App::import()require() 在模型文件顶部加载包含您的特征的文件。

标签: cakephp callback cakephp-1.3 behavior


【解决方案1】:

我想我会做两件事之一,具体取决于代码块的通用程度:

  1. 通用版本:不使用行为,但在AppModel::afterFind 中包含您的方法块
  2. 手术版:使用行为并将其附加到需要共享功能的每个模型。

【讨论】:

  • (1) 对我不起作用,因为它仅适用于某些而非全部模型。 (2),本质上是我想要做的,但是当模型不是主要模型时它不起作用
  • 我的意思是您字面上将行为附加到您需要该功能的每个模型。行为并非旨在针对关联模型进行操作。
  • 谢谢。 “从字面上将行为附加到每个模型”是什么意思?
  • 我只是说关联模型仍然是模型。我必须对照代码进行验证,但我认为关联的模型是通过单独调用这些模型的find() 方法来检索的。如果是这样,那么附加行为应该会导致回调触发那些。
  • 另一方面,对关联模型的独立find() 调用也可能为一些无限循环地狱打开大门,因此可能避免了这种情况。我很想听听你从实践中学到了什么。
【解决方案2】:

一个行为不应该适用于相关模型,例如,如果你有这两个模型:

app/models/product.php

<?php

class Product extends AppModel{
    var $belongsTo = array('Category');
    var $actsAs = array('SomeBehavior');
}

?>

app/models/category.php

<?php 

class Category extends AppModel {
    var $hasMany = array('Product');
}

?>

SomeBehavior 只会在调用 Product 的方法时执行,因为该行为与 Category 无关

【讨论】:

  • 我已经改写了我的评论。我不希望它适用于相关模型,我希望它适用于一个模型,无论它是否被称为主要模型。在您的示例中,我会将行为与类别而不是产品相关联,并且我希望无论类别是主要模型(/categories/view/1)还是被产品调用(/products/)都调用回调函数查看/1)。目前只在前一种情况下调用行为回调函数。如果我将回调函数放在类别模型中而不是行为中,则在两种情况下都会调用它。
【解决方案3】:

http://github.com/m3nt0r/eventful-cakephp

设置一个执行格式化的事件——根据需要触发该事件。像蛋糕一样简单。

【讨论】:

  • 感谢您的建议。我会调查的。
  • 每次我建议 Eventful 插件时,有人会在几分钟内给我投票 - 不得不怀疑它是否是 m3nt0r(作者)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多