Cakephp:在Model和Controller之间共享逻辑

时间:2014-12-07 21:28:42

标签: php cakephp cakephp-model

注意:我发现这个非常相似的公开问题What's the correct place to share application logic in CakePHP?,但由于自2010年以来这些问题是开放的,我认为最好创建一个新问题。

我有一些常见的功能,我想在Cakephp应用程序的几个部分中使用它们,特别是在模型和控制器中。这些函数非常简单,比如重新分析字符串以删除奇怪的字符,所以我可以在不同的点上应用它们,我不想从相同的代码中保留几个副本。

我想要的第一件事就是使用Component,但不建议在模型中使用它们,我也看到可以使用插件,但我觉得它太大了。

也许我可以把这些功能放在bootstrap文件中,但我不太喜欢这个解决方案。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

如果你把它放在AppModel中,它将自动对所有模型都可用。

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

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

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

答案 2 :(得分:0)

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

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

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();
    }
}