【问题标题】:How do I use the same method in both Controllers and Cells in cakephp 3.7?如何在 cakephp 3.7 的控制器和单元中使用相同的方法?
【发布时间】:2019-04-30 21:09:55
【问题描述】:

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

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

【问题讨论】:

  • 是静态方法吗?如果没有,可能吗?

标签: cakephp-3.0


【解决方案1】:

我认为在 Cell 和 Controller 之间共享功能没有标准约定,它可能表明关注点分离不佳(但不一定!)。我通常首先确保这个函数实际上是一个“实用程序”,而不是一般地以其他方式更好地实现......

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

选项 A - 创建实用程序类

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

选项 B - 创建特征

将函数粘贴到特征中。我只会在你不能将函数设为静态时才这样做(如果你不能,这可能是一个不好的迹象,它可能不是真正的“实用程序”)。

没有传统的地方可以放置共享特征。您可以将其与 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);
    }
}

【讨论】:

  • 我还要添加 Trait 版本,虽然在技术上是可行的,但对我来说感觉就像臭代码,在 Cells 和 Controllers 之间共享......如果这个函数在精神上不像 Cake 自己的 Hash 函数,它不是一个实用程序,可能有更好的方法来构建你正在做的事情。
  • 我使用的是 3.7 版,没有找到 Utility 文件夹,所以我想我必须创建它。无论如何,您的第一个选项(A)在我看来是一种干净的方式!是的,它是一个实用函数,可以肯定是静态方法(我在文本上做的一些自定义人员),它不依赖于其他任何东西:你给它一个参数,它会给你结果。
  • 你必须创建它,是的,应该更清楚:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多