php - 如何在 ZF2 的控制台 Controller 中创建 URL?

标签 php zend-framework2

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

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

在操作中,我想发送一封电子邮件,其中包含指向网站上另一个操作的链接。这通常使用 URL View Helper 来完成,但由于请求的类型是 Console 而不是 HTTP,所以这不起作用。我已尝试创建一个 HTTP 请求,但我不知道如何为其提供站点域或 Controller /操作链接。

我的 Controller 代码:

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

这会引发错误:

======================================================================
   The application has thrown an exception!
======================================================================
Zend\Mvc\Router\Exception\RuntimeException
Request URI has not been set

如何在具有站点方案、域和路径/目标/操作的控制台 Controller 中创建 HTTP 请求?我如何将它传递给 URL View Helper?

最佳答案

解决这个问题的方法如下:

<?php

// Module.php

use Zend\View\Helper\ServerUrl;
use Zend\View\Helper\Url as UrlHelper;
use Zend\Uri\Http as HttpUri;
use Zend\Console\Console;
use Zend\ModuleManager\Feature\ViewHelperProviderInterface;

class Module implements ViewHelperProviderInterface
{

    public function getViewHelperConfig()
    {
        return array(
            'factories' => array(
                'url' => function ($helperPluginManager) {
                    $serviceLocator = $helperPluginManager->getServiceLocator();
                    $config = $serviceLocator->get('Config');

                    $viewHelper =  new UrlHelper();

                    $routerName = Console::isConsole() ? 'HttpRouter' : 'Router';

                    /** @var \Zend\Mvc\Router\Http\TreeRouteStack $router */
                    $router = $serviceLocator->get($routerName);

                    if (Console::isConsole()) {
                        $requestUri = new HttpUri();
                        $requestUri->setHost($config['website']['host'])
                            ->setScheme($config['website']['scheme']);
                        $router->setRequestUri($requestUri);
                    }

                    $viewHelper->setRouter($router);

                    $match = $serviceLocator->get('application')
                        ->getMvcEvent()
                        ->getRouteMatch();

                    if ($match instanceof RouteMatch) {
                        $viewHelper->setRouteMatch($match);
                    }

                    return $viewHelper;
                },
                'serverUrl' => function ($helperPluginManager) {
                    $serviceLocator = $helperPluginManager->getServiceLocator();
                    $config = $serviceLocator->get('Config');

                    $serverUrlHelper = new ServerUrl();
                    if (Console::isConsole()) {
                        $serverUrlHelper->setHost($config['website']['host'])
                            ->setScheme($config['website']['scheme']);
                    }

                    return $serverUrlHelper;
                },
            ),
        );
    }
}

当然,您必须在配置中定义默认主机和方案值,因为无法在控制台模式下自动检测它们。

关于php - 如何在 ZF2 的控制台 Controller 中创建 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27295895/

相关文章:

php - 如何在不使用工厂的情况下验证 Zend Framework 2 中的嵌套字段集

php - Laravel 电子邮件验证链接不起作用?

php - MYSQL 使用 PDO 在不存在的地方插入

php - 如何设置从第三方导入的内置评论框的样式?

php - Yii2 两个 submitButtons 去错 URL

zend-framework2 - Zend Framework 2 没有 Vhost 配置

zend-framework2 - 在 Zend Framework 2 中扩展 Zend\View\Helper\Url

zend-framework2 - 如何在ZF2的tableGateway中使用has()

php - imagecreatefromstring 问题与从 javascript 传递的字符串

forms - 表单集合上的 ZF2 对象绑定(bind)