ZF2从CLI生成绝对URI

时间:2014-01-16 20:11:21

标签: url zend-framework2 view-helpers

我有一个cron作业,它运行ZF2 CLI路由以发送一些电子邮件通知。电子邮件使用我通过

呈现的HTML视图
$emailBody = $this->getServiceLocator()->get('viewrenderer')
               ->render('some/partial/name.phtml',$params);

在这部分中我使用了视图助手

<?php echo $this->url('some-route', array(), array('force_canonical' => true)); ?>

生成我网站上网页的绝对网址。但是当我通过CLI运行时,我看到了一个例外:

Zend\Mvc\Router\Exception\RuntimeException
Request URI has not been set

我是否需要在视图渲染服务中注入一个虚拟的HttpRequest对象,还是应该以不同的方式处理它?<​​/ p>

2 个答案:

答案 0 :(得分:2)

因为这是通过CLI运行的,所以脚本没有真正的方法来知道正确的域来生成绝对URI。

我最终在 module / Application / src / Application / View / Helper / CliDomain.php

创建了一个视图帮助器
<?php
namespace Application\View\Helper;
use Zend\View\Helper\AbstractHelper;

class CliDomain extends AbstractHelper {
    protected $_config_protocol;

    protected $_config_domain;

    public function __construct(array $cliConfig) {
        $this->_config_protocol = $cliConfig['scheme'];
        $this->_config_domain = $cliConfig['domain'];
    }

    public function __invoke() {
        return $this->_config_protocol.'://'.$this->_config_domain;
    }

}

并在 module / Application / config / module.config.php

中配置工厂
return array(
    ...
    'view_helpers' => array(
        ...
        'cliDomain' => function ($sm) {
                $config = $sm->getServiceLocator()->get('config');
                if (!isset($config['cli_url'])) {
                    throw new \InvalidArgumentException('Please add a "cli_url" configuration to your project in order for cron tasks to generate emails with absolute URIs');
                }
                return new \Application\View\Helper\CliDomain($config['cli_url']);
            },

在项目的 config / autoload / global.php 文件中,我为返回的数组添加了一个新键

<?php
return array(
    ...
    'cli_config' => array(
        'scheme' => 'http',
        'domain' => 'prod.example.com',
    ),
);

对于登台服务器,我在 config / autoload / local.php中添加了匹配的配置条目

<?php
return array(
    ...
    'cli_config' => array(
        'scheme' => 'http',
        'domain' => 'staging.example.com',
    ),
);

所以在问题的视图脚本中,我只是在URL中调用了帮助器,并且不打算强制规范化。

<a href="<?php echo $this->cliDomain() . $this->url('some-route'); ?>">a link!</a>

答案 1 :(得分:0)

一种方法是将Uri\Http对象传递给url()视图助手:

<?php
// at the top of your view script, or passed assigned to the view model
$uri = new \Zend\Uri\Http('http://www.example.com/subdir');
?>


<!-- within the view script -->
<?= $this->url('some-route', array(),
    array('force_canonical' => true, 'uri' => $uri)); ?>

或者只是在视图脚本中对其进行编码:

http://example.com/subdir<?= $this->url('some-route'); ?>

(我假设您使用的是PHP5.4或更高版本,因此您可以使用<?=