Phalcon:HMVC视图不起作用

时间:2014-06-16 14:08:38

标签: views phalcon hmvc

我在渲染嵌套视图时出现问题,这是我尝试做的事情 我更改了您的请求' HMVC(HMVC-GitHub或/和HMVC-Pattern)功能进入元素模块

namespace Modules\Main\Libraries;

/**
 * Elements
 *
 * Helps to build UI elements for the application
 */
class Elements extends \Phalcon\Mvc\User\Component
{

    public function loadModule($path = '', $data = array()) {
        $di = clone $this->getDI();
        $dispatcher = $di->get('dispatcher');

        $paths = explode('/', $path);
        $data = is_array($data) ? $data : array($data);

        // get controller name
        if (isset($paths[0])) {
            $controller = $paths[0];
        }

        // get action name
        if (isset($paths[1])) {
            $action = $paths[1];
        }

        // get params
        if (isset($paths[2])) {
            array_splice($paths, 0, 2);
            $params = array_merge($paths, $data);
        } else {
            $params = $data;
        }

        if (!empty($controller)) {
            $dispatcher->setControllerName($controller);
        } else {
            $dispatcher->setControllerName('index');
        }

        if (!empty($action)) {
            $dispatcher->setActionName($action);
        } else {
            $dispatcher->setActionName('index');
        }

        if (!empty($params)) {
            if(is_array($params)) {
                $dispatcher->setParams($params);
            } else {
                $dispatcher->setParams((array) $params);
            }
        } else {
            $dispatcher->setParams(array());
        }

        $dispatcher->dispatch();

        $response = $dispatcher->getReturnedValue();
        if ($response instanceof ResponseInterface) {
            return $response->getContent();
        }

        return $response;
    }
}

我有两个控制器:

namespace Modules\Main\Controllers;

class IndexController extends ControllerBase
{

    public function indexAction()
    {
        $secondContent = $this->elements->loadModule('test/hello/json');

        $this->view->setVar('secondContent', $secondContent);
    }

}

namespace Modules\Main\Controllers;

use \Phalcon\Http\Response;

class TestController extends ControllerBase
{

    public function indexAction()
    {

    }

    public function helloAction($format='html', $param = 'empty')
    {
        $this->view->setVar('content', 'Hello this is test value "'.$param.'"');

        $content = $this->view->getContent();

        return (string)$content;

        // return 'Hello this is test value "'.$param.'"';
    }

}

我的DI

        $di['elements'] = function() {
            return new \Modules\Main\Libraries\Elements();
        };

查看文件 的IndexController ::索引

<h1>Congratulations!</h1>

<p>You're now flying with Phalcon. Great things are about to happen!</p>
<p>Second content: {{ secondContent}}</p>
<p>HMVC: {{ elements.loadModule('test/hello/json', 'test') }}</p>

和HelloController :: test

This is :: {{ content }}

期待得到

Congratulations!
You're now flying with Phalcon. Great things are about to happen!
Second content: This is :: Hello this is test value "empty"
HMVC: This is :: Hello this is test value "test"

但它只呈现HelloController(来自IndexController :: indexAction的第一次调用):

This is :: Hello this is test value "empty"

如果我将IndexController :: indexAction更改为

public function indexAction()
{
    $secondContent = '';

    $this->view->setVar('secondContent', $secondContent);
}

和TestController :: helloAction to

public function helloAction($format='html', $param = 'empty')
{
    $this->view->setVar('content', 'Hello this is test value "'.$param.'"');

    $content = $this->view->getContent();

    //return (string) $content;

    return 'Hello this is test value "'.$param.'"';
}

我得到的结果是(第二个内容为空):

Congratulations!
You're now flying with Phalcon. Great things are about to happen!
Second content: 
HMVC: Hello this is test value "test"

解决此问题的任何解决方案?

谢谢, 赫尔曼

1 个答案:

答案 0 :(得分:2)

Phalcon具有内置模块功能,您无需构建自己的模块加载器,只需要创建扩展ModuleDefinitionInterface的模块引导程序。

看看phalcon multi module

中的这个示例

https://github.com/phalcon/mvc/tree/master/multiple

下面这个例子来自上面的链接,它包含模块引导代码。

<?php

namespace Multiple\Frontend;

class Module
{

    public function registerAutoloaders()
    {

        $loader = new \Phalcon\Loader();

        $loader->registerNamespaces(array(
            'Multiple\Frontend\Controllers' => '../apps/frontend/controllers/',
            'Multiple\Frontend\Models' => '../apps/frontend/models/',
        ));

        $loader->register();
    }

    /**
     * Register the services here to make them general or register in the ModuleDefinition to make them module-specific
     */
    public function registerServices($di)
    {

        //Registering a dispatcher
        $di->set('dispatcher', function () {
            $dispatcher = new \Phalcon\Mvc\Dispatcher();

            //Attach a event listener to the dispatcher
            $eventManager = new \Phalcon\Events\Manager();
            $eventManager->attach('dispatch', new \Acl('frontend'));

            $dispatcher->setEventsManager($eventManager);
            $dispatcher->setDefaultNamespace("Multiple\Frontend\Controllers\\");
            return $dispatcher;
        });

        //Registering the view component
        $di->set('view', function () {
            $view = new \Phalcon\Mvc\View();
            $view->setViewsDir('../apps/frontend/views/');
            return $view;
        });

        $di->set('db', function () {
            return new \Phalcon\Db\Adapter\Pdo\Mysql(array(
                "host" => "localhost",
                "username" => "root",
                "password" => "secret",
                "dbname" => "invo"
            ));
        });

    }

}

您可以使用以下代码加载模块

$app = new \Phalcon\Mvc\Application();
$app->registerModules(array(
            'frontend' => array(
                'className' => 'Multiple\Frontend\Module',
                'path' => '../apps/frontend/Module.php'
            ),
            'backend' => array(
                'className' => 'Multiple\Backend\Module',
                'path' => '../apps/backend/Module.php'
            )
        ));