Phalcon PHP - 多个视图目录

Phalcon PHP - Multiple views directories

我的 Phalcon PHP 项目有问题。我正在构建内部包含多个 MVC 目录的单模块应用程序。

每个模块都有自己的 "views" 目录,其中包含操作模板。 (index.volt、show.volt 等)。布局从 modules/layout/ 加载,然后用

设置
$this->view->setLayout('index');

在主控制器中initialize().

它是这样的:

    .
    ├── 申请
    │ └── 模块
    │ ├── 索引
    │ │ ├── ControllerBase.php
    │ │ ├── IndexController.php
    │ │ └── 浏览量
    │ │ └── index.volt
    │ ├── 布局
    │ │ ├── index.volt
    │ │ └── admin.volt
    │ ├── 页
    │ │ ├── Page.php
    │ │ ├── PageAdminController.php
    │ │ ├── PageController.php
    │ │ ├── admin_views
    │ │ │ ├── edit.volt
    │ │ │ └── index.volt
    │ │ └── 观看次数
    │ │ └── show.volt
    

这是我的查看服务:

$di->set('view', function () use ($mainConfig) {

    $view = new View();

    $view->setLayoutsDir(APPLICATION_PATH . "/modules/layout/");

    $view->registerEngines(array(
        '.volt' => function ($view, $di) use ($mainConfig) {

            $volt = new VoltEngine($view, $di);

            $volt->setOptions(array(
                'compiledPath' => $mainConfig->application->cacheDir,
                'compiledSeparator' => '_'
            ));

            return $volt;
        },
        '.phtml' => 'Phalcon\Mvc\View\Engine\Php'
    ));

    return $view;
}, true);

我想在主控制器中设置视图目录 (ControllerBase.php),因为它取决于当前控制器的名称。

例如:

myapp.com => /modules/index/views/index.volt
myapp.com/page/show/2 => /modules/page/views/show.volt

所以我的问题是:如何设置视图目录和搜索模式以匹配我的结构?

不是 100% 的答案,因为无论如何你都必须花时间在这上面,但你的冷启动应该是这样的:

class ControllerBase extends \Phalcon\Mvc\Controller 
{
    // initialization for all controllers in module
    protected function initialize() {

        $this->view->setViewsDir(
            sprintf('../application/modules/%s/views/', $this->router->getModuleName())
        );
    }

这应该让你的 phalcon 搜索模块目录中的视图,它的工作结构仍然是这样的:

.
├── application
│   └── modules
│       ├── index
│       │   ├── ControllerBase.php
│       │   ├── IndexController.php
│       │   └── views
│       │       └── Index
│       │           └──default.volt

不确定是否有更多 "global" 方法,但我有点 感觉 应该存在一个,最有可能通过 [=12= 中的奇异视图定义].

搞定了!

ControllerBase.php

$moduleName = $this->dispatcher->getControllerName();
$actionName = $this->dispatcher->getActionName();

// set view for current Controller and Action
$this->view->setMainView('layout/index');
$this->view->pick($moduleName."/views/".$actionName);

Services.php

$view->setViewsDir(APPLICATION_PATH . "/modules/");

我只是自己选择当前视图,使用 View::pick()