我应该如何在CakePHP 3.x视图中使用requestAction

时间:2015-05-19 07:02:44

标签: cakephp-3.0

我的代码:

// View/Activities/index.ctp
...
<div>
    <?php echo $this->requestAction('/Activities/ajax_list/'.$categoryId,['return']);?>
</div>
...

//View/Activitest/ajax_list.ctp
....
<?php echo $this -> Html -> image("/img/add1.jpg"); ?>
...
<?php echo $this->Html->link('add_project', array('controller'=>'projects', 'action'=>'add', $categoryId)); ?>
....

我想要包含视图&#39; ajax_list&#39;进入&#39;索引&#39;,它已被显示,但图片和链接的网址错误。

然后我调试Cake / Routing / RequestActionTrait.php,&#34; requestAction&#34;函数我发现&#34; $ request = new Request($ params);&#34; $ request-&gt; base,$ request-&gt; webroot为空。

有人可以告诉我应该如何解决它?

1 个答案:

答案 0 :(得分:3)

新请求中未设置的$base / $webroot属性可能被视为错误,或者文档可能只是缺少正确的示例解决方案,我无法确定,您可能想要report this over at GitHub并看看开发者说的话。

使用视图单元格而不是requestAction()

只要适用,您最好使用视图单元而不是请求操作,因为它们可以避免调度新请求所带来的所有开销。

参见 Cookbook > Views > View Cells

没有涉及模特?使用元素!

如果没有调用任何模型,而您所做的只是生成HTML,那么您可以简单地使用元素。

参见 Cookbook > Views > Elements

修复requestAction()

可能的解决方法是使用调度程序过滤器,使用必要的值填充空$base / $webroot属性,例如

<强>的src /路由/过滤/ RequestFilterFix.php

namespace App\Routing\Filter;

use Cake\Event\Event;
use Cake\Routing\DispatcherFilter;

class RequestFixFilter extends DispatcherFilter
{
    public function beforeDispatch(Event $event)
    {
        $request = $event->data['request'];
        /* @var $request \Cake\Network\Request */

        if ($request->param('requested')) {
            $request->base = '/pro';
            $request->webroot = '/pro/';
            $request->here = $request->base . $request->here;
        }
    }
}

<强>配置/ bootstrap.php中

// ...

// Load the filter before any other filters.
// Must at least be loaded before the `Routing` filter.
DispatcherFactory::add('RequestFix');

DispatcherFactory::add('Asset');
DispatcherFactory::add('Routing');
DispatcherFactory::add('ControllerFactory');
// ...

另请参阅 Cookbook > Routing > Dispatcher Filters > Building a Filter