如何在视图中调用不使用路径的操作?

时间:2015-02-13 20:27:30

标签: php controller dispatcher phalcon

路由器

new Router(false);

视图

module/views/index/index.volt

路线

$router->add("/", array(
        'module'     => 'module',
        'controller' => 'index',
        'action'     => 'index',
));

您如何调用名为" otherAction"使用按钮或锚点在index.volt中设置索引控制器而不添加新路由?

<?php

namespace Multiple\Module\Controllers;

class IndexController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {

    }

    public function otherAction()
    {

    } 
}

简而言之,我喜欢直接从视图本身发送。

3 个答案:

答案 0 :(得分:1)

我认为你的评论员是正确的,你不能在phalcon视图中这样做。我已经看到Laravel刀片扩展使用语法{{controller @ method}}完全符合您的要求,但我不知道phalcon有任何这样的事情。

我能建议的最好是:

<?php

namespace Multiple\Module\Controllers;

class IndexController extends \Phalcon\Mvc\Controller
{

    public function indexAction()
    {
        $other_data = $this->otherAction();
        // ... extract the required data from $other_data
        // ... pass the required data to the view
    }

    public function otherAction()
    {

    } 
}

我原本建议你不要从视图中调用该函数,但是可以通过将控制器作为视图变量传递给视图。我不相信这是最好的主意但是你会怎么做:

    public function indexAction()
    {
        $this->view->controller = $this;
    }

在视图中,您可以执行以下操作:

<?php $result = $controller->otherAction(); ?>

...然后你需要解释值$ result并相应地采取行动(取决于你如何编码otherAction()以及它返回的内容)。

我再一次认为这不是一个好主意。编写PHP内部模板会稍微破坏视图/控制器的分离,收集控制器中的所有变量并将其传递给视图,而不是期望将视图调用回控制器以获取内容,这将是更好的代码。

答案 1 :(得分:1)

如果您想隐藏某些操作并根据查询收集/发送的参数触发它们,则不一定是false路由器。

在我的一个控制器中,我有一个像这样的生产工作解决方案:

<强>初始化

public function initialize()
{
    // if someone tries to get to subaction of controller, prevent it.
    if ($this->dispatcher->getActionName() != 'index') {
        $this->dispatcher->setActionName('index');
    }

    // exploding request path - should you implement Path class.
    if ($path = Path::get()) {
        $this->hash = $path[1]; // or 2 or whatever you need
    } else {
        $this->dispatcher->forward(['controller' => 'notfound404']);
    }
}

这样整个控制器我都有一个hash属性,有一个参数我可以case结束。

示例indexAction

public function indexAction()
{
    if (!$this->request->isPost()) {
        // not a POST request, using mainAction to generate view.
        $this->dispatcher->forward(['action' => 'main']);
    } else {
        switch ($this->hash) {
            case 'stepOne':
            case 'stepTwo':
            case 'summary':
                $this->dispatcher->forward(['action' => $this->hash]);
                break;
            default:
                $this->dispatcher->forward(['action' => 'error']);
                break;
        }
    }
}

无论如何,可能无法使用路由器。

答案 2 :(得分:0)

你的问题不够详细。

你试过了吗?

<a href="index/other">Click to call otherAction</a>

你的index.volt视图中的