7

sorry for my bad english, i'm from Russia

began to learn zend framework 2... Sample in controller, readAction():

use Zend\View\Helper\Url;

....

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

As a result, thrown exception:

Zend\View\Exception\RuntimeException

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

Please, help me. what I'm doing wrong?

4

3 回答 3

13

你不能在控制器中使用 viewhelper - 你也不需要。还有一个Url控制器插件几乎可以做到这一点。

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

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

所有参数都是可选的。有关更多信息,请检查代码Zend\Mvc\Controller\Plugin\Url或阅读文档

于 2012-10-17T07:18:14.473 回答
3

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

在 Url 助手的情况下,有一个工厂确保它注入了配置的路由器 - 如果您直接实例化它,您将不会拥有它,并且它无法完成它的工作,正如您所注意到的!

正如 Daniel 指出的那样,您还需要确保获得适合上下文的插件。如果您在控制器中,请检查是否有控制器插件可以为您完成这项工作。Daniel 在他的帖子中链接到文档。

于 2012-10-19T03:40:52.287 回答
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 之前使用这些来完成:

$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 用户

于 2014-01-27T09:37:19.043 回答