Cakephp:在模型和控制器之间共享逻辑


Cakephp: share logic between Model and Controller

注意:我发现了这个悬而未决的问题 在 CakePHP 中共享应用程序逻辑的正确位置是什么? 这非常相似,但由于这些问题自 2010 年以来一直是开放和死亡的,我认为最好创建一个新问题。

我有一些常见的函数,我想在我的 Cakephp 应用程序上不分几个部分使用它们,具体来说在模型和控制器中。这些函数非常简单,例如重新解析字符串以删除奇怪的字符,因此我可以在不同点应用它们,并且我不想从同一代码中维护多个副本。

我做的第一件事是使用组件,但不建议在模型中使用它们,我也看到可以使用插件,但我认为维护起来太大了。

也许我可以把这些功能放在引导程序中,但我不太喜欢这个解决方案。

实现这种逻辑共享的更好方法是什么?

就像Dave和burzum说的,如果它与数据有关,请将其放在模型/行为中。

但是如果它更通用,你可以简单地把它放在一个外部库,然后使用这个库。

Lib/MyLib.php
<?php
class MyLib {
    public static function doThis() {}
}
app/Controller/FooController.php
<?php
App::uses('AppController', 'Controller');
App::uses('MyLib', 'Lib');
class FooController extends AppController {
    public function someAction () {
        MyLib::doThis();
    }
}
app/Model/Foo.php
<?php
App::uses('AppModel', 'Model');
App::uses('MyLib', 'Lib');
class Foo extends AppModel {
    public function someMethod () {
        MyLib::doThis();
    }
}

经验法则:如果是数据操作,则应在模型中完成。

如果要在模型之间共享逻辑:使其成为行为。

这样,您可以将其附加到需要该功能的模型。在 Cake3 中,您也可以使用特征。

可以将它们放在您的AppModel中。 这样,您可以从任何模型访问它们(这意味着您也可以从任何控制器访问)。

如果将其放入 AppModel 中,它将自动可用于所有模型。

您可以通过任何控制器通过加载的模型运行它来访问它们:

// in any Model
$this->whateverMethod();
// in any Controller
$this->MyModel->whateverMethod();