从 CakePHP 3 中的 AppController 调用插件的控制器

calling plugin's controller from AppController in CakePHP 3

我已经为 CakePHP 3.4.* 编写了一个插件。

此插件将检查是否已设置数据库配置,如果未设置,则它让用户通过 GUI 界面设置数据库配置,就像 wordpress 一样。

插件运行良好,但必须通过访问插件url手动加载

http://example.com/installer/install

其中 installer 是在 plugins/Installer/src/Controller/ 目录

中调用 InstallController class 的插件名称

现在我想自动检查它并在无法建立数据库连接时将用户重定向到安装界面。

为此,我在插件控制器 InstallController 中编写了一个函数

public function installationCheck() {
    $db = ConnectionManager::get('default');

    if(!$db->connect()) {
        if(Configure::read('Database.installed') == true) {
            $this->Flash->error(__("Database connection couldn't be established. Please, re-configure it to start the application"));
            return $this->redirect(['action' => 'index']);
        } else {
            $this->Flash->error(__("Please configure your database settings for working of your application"));
            return $this->redirect(['action' => 'index']);
        }
    }
    return true;
}

现在是问题。

从主应用程序的 /app/src/Controller/AppController.php 文件调用此方法最简单的方法是什么?

你不应该那样做!

如果您需要访问另一个控制器,我建议您将该功能移动到 Component,这是控制器之间共享的逻辑包。

简单的回答,你不会!

共享控制器逻辑属于 AppController 本身,属于 Component or a TraitAppController 永远不应该访问在其他控制器中定义的方法,它们不应该被它访问。

对于您正在做的事情,您可能希望在可以通过 AppController 或相关控制器加载的组件中执行此操作。

所以你的组件看起来像:-

<?php
namespace Installer\Controller\Component;

use Cake\Controller\Component;

class InstallComponent extends Component
{
    public function installationCheck()
    {
        // Method's logic
    }
}

然后您将在相关控制器中加载:-

public function initialize()
{
    parent::initialize();
    $this->loadComponent('Installer.Install');
}

然后您可以使用控制器中的组件方法,例如:-

$this->Install->installationCheck();