使用控件中的对象Zend \ View \ Helper \ Url

时间:2012-10-17 03:02:42

标签: php zend-framework2

抱歉我的英语不好,我来自俄罗斯

开始学习zend框架2 ...... 控制器中的示例,readAction():

use Zend\View\Helper\Url;

....

$helperUrl = new Url();
$address  = $helperUrl('news', array('action' => 'index'));

因此,抛出异常:

Zend\View\Exception\RuntimeException

File:
    W:\home\zf2\vendor\zendframework\
       zendframework\library\Zend\View\Helper\Url.php:80
Message:
    No RouteStackInterface instance provided

请帮帮我。 我做错了什么?

3 个答案:

答案 0 :(得分:12)

您无法在控制器中使用viewhelper - 而且您不需要。 还有一个Url控制器插件,几乎完全相同。

控制器插件是可调用的类,你可以像这样使用它们(控制器的动作上下文):

$url = $this->url()->fromRoute($route, $params, $options, $reuseMatchesParams);

所有参数都是可选的。有关详细信息,请查看Zend\Mvc\Controller\Plugin\Url中的代码或阅读docs

答案 1 :(得分:3)

Helpers和plugins虽然可以直接实例化,但通常不应该,因为它们通常由PluginManager管理。 PluginManager是ServiceManager的子类,因此,它提供了许多关于插件创建的功能,包括注入标准协作者,使用工厂来提供依赖注入等等。

对于Url帮助程序,有一个工厂可以确保它已经注入了配置的路由器 - 如果直接实例化它,你就不会有这个,它将无法完成它的工作,正如你所注意到的那样!

正如Daniel所说,你也想确保你得到一个适合上下文的插件。如果您在控制器中,请检查是否有可以为您完成工作的控制器插件。丹尼尔在他的帖子中与文档相关联。

答案 2 :(得分:0)

我知道已有一个已接受的答案,但我仍会发布这个以减轻像我这样的初学者的负担。

我使用smarty作为视图渲染器并且在smarty中你不能在视图中使用php代码,因此,一切都必须在控制器中完成,将它们分配在变量中然后将它们传递给视图。

您可以使用:

$url = $this->url()->fromRoute('route',array('name'=>'route-name'));

如果您正在阅读zend 2的教程,它将是这样的:

$url = $this->url()->fromRoute('album',array('action'=>'add'));
$url = $this->url()->fromRoute('album',array('action'=>'edit'));
$url = $this->url()->fromRoute('album',array('action'=>'delete'));

这将具有以下值:

/zf2/index.php/album/add
/zf2/index.php/album/edit
/zf2/index.php/album/delete

如您所见,您需要为其添加服务器名称,您可以在生成路径网址之前使用这些名称:

$url = $uri = $this->getRequest()->getUri();
$url = sprintf('%s://%s', $uri->getScheme(), $uri->getHost());

总的来说,代码段应如下所示:

$url = $uri = $this->getRequest()->getUri();
$url = sprintf('%s://%s', $uri->getScheme(), $uri->getHost());
$url .= $this->url()->fromRoute('album',array('action'=>'add'));

生产:

http://yourservername/zf2/index.php/album/add

希望这有助于初学者zf2用户