加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 13:17:33 所属栏目:PHP教程 来源:网络整理
导读:我有一个控制台控制器和一个发送电子邮件的动作(在下面的module.config.php中定义) 'console' = array( 'router' = array( 'routes' = array( 'cronroute' = array( 'options' = array( 'route' = 'sendEmails','defaults' = array( 'controller' = 'Applica
我有一个控制台控制器和一个发送电子邮件的动作(在下面的module.config.php中定义)
'console' => array(
    'router' => array(
        'routes' => array(
            'cronroute' => array(
                'options' => array(
                    'route'    => 'sendEmails','defaults' => array(
                        'controller' => 'ApplicationControllerConsole','action' => 'send-emails'
                    )
                )
            ),)
    )
),

在操作中,我想发送一封电子邮件,其中包含指向该网站上其他操作的链接.这通常使用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));

这会引发错误:

======================================================================
   The application has thrown an exception!
======================================================================
ZendMvcRouterExceptionRuntimeException
Request URI has not been set

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

以下是此问题的解决方法:
<?php

// Module.php

use ZendViewHelperServerUrl;
use ZendViewHelperUrl as UrlHelper;
use ZendUriHttp as HttpUri;
use ZendConsoleConsole;
use ZendModuleManagerFeatureViewHelperProviderInterface;

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 ZendMvcRouterHttpTreeRouteStack $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;
                },),);
    }
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读