【问题标题】:Phalcon: Inheritance of controllers with modules and common controllersPhalcon:带有模块和通用控制器的控制器的继承
【发布时间】:2014-04-14 17:29:02
【问题描述】:

我希望有人能够帮助我,因为我一直在疯狂地试图让它工作。我在网上进行了无数次搜索并找到了一些信息,但不幸的是,我似乎无法找到解决方案。

我正在尝试使用多个模块在 Phalcon 中实现以下目标。

MasterController 扩展了 Controller
BackendController 扩展了 MasterController
ModuleController 扩展 BackendController
ClientsController 扩展了 ModuleController

我的文件夹结构是这样的:

应用程序
|->客户关系管理
|-->控制器
|--->模块控制器
|--->客户端控制器
常见
|->控制器
|-->主控制器
|-->后端控制器

现在在 CRM 下的 Modules.php 文件中,我有以下内容:

    $loader->registerNamespaces(
        array(
            'Multiple\Crm\Controllers'      => __DIR__ . '/controllers/',
            'Multiple\Crm\Models'           => __DIR__ . '/models/',
            'Multiple\Crm\Plugins'          => __DIR__ . '/plugins/',
            'Multiple\Common\Controllers'   => __DIR__ . '/../../common/controllers/'
        )
    );

我的 ModuleController 文件如下所示:

class ModuleController extends Multiple\Common\Controllers\BackendBase
{
    public function onConstruct()
    {
        echo "hello";
    }
}

每当我运行代码时,都会遇到以下致命错误:

致命错误:在第 8 行的 /var/www/phalcon/html/apps/crm/controllers/ModuleController.php 中找不到类“Mulitple\Common\Controllers\BackendBase”

我尝试了很多东西,但我似乎无法让它发挥作用。谁能对此有所了解并告诉我我做错了什么?

非常感谢。

【问题讨论】:

  • 您确定需要多模块应用吗?如果您是 Phalcon 的新手,我建议您从单个模块应用程序开始。但是,如果您确实需要应用程序模块,请查看this repo,您可以在那里找到一些使用应用程序模块的结构示例。关于您的命名空间控制器in this answer,您可能会发现一些有用的信息。
  • 还要检查你的路径。 ../../ 有时并不是最好的方法。我通常设置一个 ROOT_PATH 常量,它指向我的应用程序的顶部,然后用它设置路径。
  • @cvsguimaraes:是的,我确实需要一个多模块应用程序。我正在尝试将现有系统转换为 Phalcon。我已经检查了您的第二个链接并选择了 registeringClasses,因为在这种情况下我只需要两个。我将继续使用这种方法,看看我能到达哪里。感谢您的帮助。
  • @NikolaosDimopoulos:感谢您的提示。我想我会设置一个 ROOT_PATH 常量并使用它,因为它会使事情更容易理解。我确实检查了路径,并确定它工作正常。我认为这是自动加载器没有从我在 registerNamespace 中使用的文件夹中获取文件的情况。也感谢您的帮助。

标签: php inheritance controllers phalcon


【解决方案1】:

在查看了@cvsguimaraes 和@NikolaosDimoploulos 的cmets 之后,我选择了“重新开始”。我使用 phalcon devtools 使用 apps 选项生成结构的基础。

基于此,我能够从那里“构建”结构。

为了获得继承权,我最终得到了这样的结果:

#File: apps/crm/controllers/ClientsController.php
namespace myApp\CRM\Controllers

class ClientsController extends ControllerBase {...}

#File: apps/crm/controllers/ControllerBase.php
namespace myApp\CRM\Controllers

class ControllerBase extends \myApp\common\Controllers\FrontendBase {...}

#File: common/controllers/FrontendBase.php
namespace myApp\common\Controllers

class FrontendBase extends \myApp\common\Controllers\MasterBase {...}

#File: common/controllers/MasterBase.php
namespace myApp\common\Controllers

class MasterBase extends \Phalcon\Mvc\Controller {...}

然后在文件中:apps/crm/Module.php 我有以下内容:

namespace myApp\CRM;

class Module implements ModuleDefinitionInterface
{

    public function registerAutoloaders()
    {
        $loader = new Loader();
        $loader->registerNamespaces(array(
            'myApp\CRM\Controllers' => __DIR__ . '/controllers',
            'myApp\CRM\Models' => __DIR__ . '/models',
            'myApp\common\Controllers' => __DIR__ . '/../../common/Controllers',
            'myApp\common\Models' => __DIR__ . '/../../common/Models'
        ));
        $loader->register();
    }
}

然后这将按您的预期工作。您可以在 MasterBase 中拥有可以从更高级别调用的函数,也可以运行诸如在不同级别的输出中添加 css 和 JS 等函数,以便您根据需要分离出控件。

【讨论】:

    猜你喜欢
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2012-11-30
    • 1970-01-01
    相关资源
    最近更新 更多