如何在ZF2中的控制台控制器中创建URL?

Nic*_*ick 8 php zend-framework2

我有一个控制台控制器和一个发送电子邮件的动作(在下面的module.config.php中定义)

'console' => array(
    'router' => array(
        'routes' => array(
            'cronroute' => array(
                'options' => array(
                    'route'    => 'sendEmails',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Console',
                        'action' => 'send-emails'
                    )
                )
            ),              
        )
    )
),
Run Code Online (Sandbox Code Playgroud)

在操作中,我想发送一封电子邮件,其中包含指向该网站上其他操作的链接.这通常使用URL View Helper来完成,但由于Request类型是Console而不是HTTP,因此不起作用.我试图创建一个HTTP请求,但我不知道如何给它站点域或Controller/Action链接.

我的控制器代码:

$vhm = $this->getServiceLocator()->get('viewhelpermanager');
$url = $vhm->get('url');
$urlString = $url('communication', array('action' => 'respond', 'id' => $id,
    array('force_canonical' => true));
Run Code Online (Sandbox Code Playgroud)

这会引发错误:

======================================================================
   The application has thrown an exception!
======================================================================
Zend\Mvc\Router\Exception\RuntimeException
Request URI has not been set
Run Code Online (Sandbox Code Playgroud)

如何在具有站点方案,域和路径/到/ action的控制台控制器中创建HTTP请求?我如何将其传递给URL View Helper?

Kwi*_*ido 1

更新: 这篇文章的正确答案可以在这里找到: Stackoverflow:在 ZF2 控制台应用程序中使用 HTTP 路由

好吧,你已经非常接近这个了,但你没有使用这个Url插件。如果您进一步深入了解控制器插件的 ZF2 文档,您可能已经找到了解决方案。

请参阅参考:ZF2 文档 - 控制器插件

ConsoleController必须实现以下其中一项才能检索控制器插件:

  1. AbstractActionController
  2. AbstractRestfulController
  3. setPluginManager

AbstractActionController如果您还没有这样做,我建议您使用 来扩展您的控制器。

如果您确实使用,AbstractActionController您可以简单地调用$urlPlugin = $this->url(),因为它AbstractActionController有一个__call()为您检索插件的实现。但您也可以使用:$urlPlugin = $this->plugin('url');

因此,为了生成邮件的 URL,您可以在控制器中执行以下操作:

$urlPlugin = $this->url();
$urlString = $urlPlugin->fromRoute(
    'route/myroute',
    array(
        'param1' => $param1,
        'param2' => $param2
    ),
    array(
        'option1' => $option1,
        'option2' => $option2
    )
);
Run Code Online (Sandbox Code Playgroud)

您现在可以将此 URL 传递给您的视图viewModel或在 viewModel 中使用 URL viewHelper,但这取决于您。

尽量避免在控制器中使用 viewHelpers,因为我们有适用于这种情况的插件。

如果您想知道AbstractActionController有哪些方法,请参阅ZF2 ApiDoc - AbstractActionController

为了使这项工作有效,您必须使用正确的结构设置路由配置:

// This can sit inside of modules/Application/config/module.config.php or any other module's config.
array(
    'router' => array(
        'routes' => array(
            // HTTP routes are here
        )
    ),

    'console' => array(
        'router' => array(
            'routes' => array(
                // Console routes go here
            )
        )
    ),
)
Run Code Online (Sandbox Code Playgroud)

如果您有控制台模块,请坚持使用控制台路由路径。不要忘记控制台键及其下方的所有路线!查看文档以供参考:ZF2 - 文档:控制台路由和路由