如何在CakePHP 3中的插件AppController中引用AppController公共函数

时间:2017-03-09 06:56:07

标签: cakephp

在恕我直言中应该是微不足道的东西。

我的网络应用AppController中有一个公共功能 - 称之为getDbConfig()

我有一个插件,我想引用在系统范围的AppController中定义的getDbConfig()函数。

显然$this->getDbConfig()不起作用 - 因为$ this指的是本地上下文 - 但对于我的生活,我无法弄清楚如何在插件中指定系统AppController中公共函数的路径AppControllers

3 个答案:

答案 0 :(得分:1)

没有意义恕我直言。插件可以在您的应用程序之外生活。理想情况下,您可以将插件公开,以便其他开发人员可以在其应用程序中使用它。

如果你引用了你(并且只有你)在AppControll中拥有的功能,你的插件就不再是一个插件。

我认为这是您应该创建组件的典型情况。将getDbConfig()放在Component中,以便您可以从Plugin和AppController中调用该组件

答案 1 :(得分:1)

  

但是对于我的生活,我无法弄清楚如何在插件AppControllers中的系统AppController中指定公共函数的路径

了解php OOP namespace basics。您需要导入和别名该类。并从您的应用程序AppController继承。这将使插件依赖于App命名空间可用,但是,至少我从未见过使用另一个命名空间的CakePHP应用程序。如果它是另一个,开发人员仍然可以分叉并使用该分叉并对其进行更改。

或者将相关代码作为组件或实用程序类,并检查插件AppController是否存在该类,然后实例化实用程序li​​b或加载组件。

答案 2 :(得分:0)

您应该将该函数作为配置参数传递给您的插件/组件,或者将结果从getDbConfig()传递给我(我认为它不会发生太大的变化)。

所以:

class MyComponent extends Component
{
  private $dbconfig = null;

  public function initialize (array $config)
  {
     parent::initialize ($config);
     if (isset ($config['dbconfig']))
     {
       $this->dbconfig = $config['dbconfig'];
     }
  }

}

然后,在你的控制器中:

class MyController extends AppController
{ 
   public function initialize()
   {
      parent::initialize();
      $this->loadComponent ('My', ['dbconfig' => $this->getDbConfig()]);
   }
}

如果你真的必须引用一个函数并调用它,请使用variable functions