注意:我发现这个非常相似的公开问题What's the correct place to share application logic in CakePHP?,但由于自2010年以来这些问题是开放的,我认为最好创建一个新问题。
我有一些常见的功能,我想在Cakephp应用程序的几个部分中使用它们,特别是在模型和控制器中。这些函数非常简单,比如重新分析字符串以删除奇怪的字符,所以我可以在不同的点上应用它们,我不想从相同的代码中保留几个副本。
我想要的第一件事就是使用Component,但不建议在模型中使用它们,我也看到可以使用插件,但我觉得它太大了。
也许我可以把这些功能放在bootstrap文件中,但我不太喜欢这个解决方案。
实现这种逻辑共享的更好方法是什么?
答案 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();
}
}