繁体   English   中英

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

[英]Cakephp: share logic between Model and Controller

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

在我的Cakephp应用程序中的某些部分(尤其是模型和控制器)中,我希望使用一些通用函数而不损失它们。 这些功能非常简单,例如重新解析字符串以删除奇怪的字符,因此我可以将它们应用于不同的位置,并且我不想从同一代码中保留多个副本。

我首先想到的是使用组件,但不建议在模型中使用它们,我也看到可以使用插件,但我认为它太大了。

也许我可以将这些功能放到bootstrap文件中,但是我不太喜欢这种解决方案。

哪种方法可以更好地实现这种逻辑共享?

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

如果要在模型之间共享逻辑,请执行以下操作:

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM