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

问题描述 投票:0回答:1

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

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

cakephp-3.0
1个回答
2
投票

我不认为Cell和控制器之间共享功能的标准惯例,它可能是关注点分离不良的标志(但不一定!)。我通常首先要确保这个函数实际上是一个“实用程序”,而不是更好地通过其他方式实现...

总而言之,可能有几种方法可以做共享功能:

选项A - 创建实用程序类

Cake本身将它的实用程序类放在src/Utility中,例如Hash class。它没有明确地在您自己的Utilities的文档中自己列出使用这个目录结构,但是我认为如果他们这样做的话就是他们建议的地方。

将方法粘贴在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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.