如何在 cakephp 3.7 的控制器和单元格中使用相同的方法?

How do I use the same method in both Controllers and Cells in cakephp 3.7?

我的 AppController 中有一个实用方法,我需要在 Cell(后端)中使用该方法。

是否有一个标准的方法可以在两个地方使用相同的方法?我不想重复代码。

我认为 Cell 和控制器之间没有共享功能的标准约定,它可能 是关注点分离不良的标志(但不一定!)。我通常会首先确保这个函数实际上是一个 "utility" 并且通常不会以其他方式更好地实现...

综上所述,可能有几种方法可以实现共享功能:

选项 A - 创建实用程序 Class

Cake 本身将其实用程序 class 放在 src/Utility 中,例如 Hash class。它没有在您自己的实用程序的文档中明确列出您自己使用此目录结构,但我假设这是他们建议的地方。

将方法粘贴到 Utility static class:

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

选项 B - 创建特征

将函数粘贴到特征中。如果你不能使函数静态化,我只会这样做(如果你不能,这可能是一个坏兆头,它可能不是真的 "utility")。

没有放置共享特征的常规位置。您可以将它与 src/Controller/Traits 中的其他 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);
    }
}