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

时间:2019-04-30 21:09:56

标签: cakephp-3.0

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

在两个地方都有使用相同方法的标准方法吗?我不想重复代码。

1 个答案:

答案 0 :(得分:2)

我认为在Cell和Controller之间没有共享功能的标准约定,这可能表示关注点分离不良(但不一定!)。通常,我首先要确保此函数实际上是“实用程序”,并且一般来说最好不要以其他方式实现...

话虽如此,也许有几种共享功能的方法:

选项A-创建实用程序类

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

将方法粘贴在Utility静态类中:     

namespace App\Utility;

class Gravitar {
    public static function getUrl($username){
        // the function
    }
}

然后在每个位置(例如在Controller中)使用该名称空间引用它:

namespace App\Controller;

use App\Utility\Gravitar;

class PeopleController {

    public function view(){
        // Normal view etc.

        // Call by 
        Gravitar::getUrl($username );
    }
}

选项B-创建特质

将功能粘贴在特征中。我只会在无法使函数静态化的情况下执行此操作(否则,可能会是一个不好的信号,它可能不是真正的“实用程序”。)

没有传统的地方可以表现出共同的特征。您可以将其与src/Controller/Traits中的其他Controller Traits一起放置,并从那里在Cell中进行引用:

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