【发布时间】:2019-04-30 21:09:55
【问题描述】:
我的 AppController 中有一个实用方法,我需要在 Cell(后端)中使用该方法。
是否有在两个地方使用相同方法的标准方法?我不想重复代码。
【问题讨论】:
-
是静态方法吗?如果没有,可能吗?
标签: cakephp-3.0
我的 AppController 中有一个实用方法,我需要在 Cell(后端)中使用该方法。
是否有在两个地方使用相同方法的标准方法?我不想重复代码。
【问题讨论】:
标签: cakephp-3.0
我认为在 Cell 和 Controller 之间共享功能没有标准约定,它可能表明关注点分离不佳(但不一定!)。我通常首先确保这个函数实际上是一个“实用程序”,而不是一般地以其他方式更好地实现......
总而言之,可能有几种方法可以实现共享功能:
Cake 本身将它的实用程序类放在src/Utility 中,例如Hash class。它没有在您自己的实用程序的文档中明确列出自己使用此目录结构,但我认为这是他们建议的地方。
在Utility静态类中粘贴方法:
namespace App\Utility;
class Gravitar {
public static function getUrl($username){
// the function
}
}
然后在每个地方用那个命名空间引用它,例如在控制器中:
namespace App\Controller;
use App\Utility\Gravitar;
class PeopleController {
public function view(){
// Normal view etc.
// Call by
Gravitar::getUrl($username );
}
}
将函数粘贴到特征中。我只会在你不能将函数设为静态时才这样做(如果你不能,这可能是一个不好的迹象,它可能不是真正的“实用程序”)。
没有传统的地方可以放置共享特征。您可以将其与 src/Controller/Traits 中的其他控制器特征一起放置,从那里在单元格中引用它:
namespace App\View\Cell;
use App\Controller\Traits\GravitarTrait;
class PeopleCell {
use GravitarTrait;
public function display(){
// Normal cell display function.
// Call by direct reference
$this->getUrl($username);
}
}
【讨论】: