不幸的是,命令行環(huán)境不知道你的虛擬主機(jī)或者域的名稱。這就意味著如果你使用控制臺(tái)命令生成了絕對的 URL 你將可能像 http://localhost/foo/bar 一樣結(jié)束而并沒有什么用。
為了解決這個(gè)問題,你需要配置“請求環(huán)境”,這是一種受歡迎的說明方式也就是你需要設(shè)置你的環(huán)境使得它知道當(dāng)生成 URL 的時(shí)候該用哪一個(gè)。
這里有兩種設(shè)置請求環(huán)境的方法:在應(yīng)用程序?qū)用嫔弦约懊恳粋€(gè)命令層面。
為了設(shè)置被 URL 生成器所使用的請求環(huán)境,你可以將它所使用的參數(shù)定義成默認(rèn)值來改變默認(rèn)的 host (localhost)和策略(http)。你也可以設(shè)置基本路徑如果 Symfony 不在根目錄運(yùn)行。
記住這個(gè)不是通過簡單的網(wǎng)頁請求影響 URL 生成器,由于那些會(huì)重寫默認(rèn)值。
YAML:
# app/config/parameters.yml
parameters:
router.request_context.host: example.org
router.request_context.scheme: https
router.request_context.base_url: my/path
XML:
<!-- app/config/parameters.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<parameters>
<parameter key="router.request_context.host">example.org</parameter>
<parameter key="router.request_context.scheme">https</parameter>
<parameter key="router.request_context.base_url">my/path</parameter>
</parameters>
</container>
PHP:
// app/config/config_test.php
$container->setParameter('router.request_context.host', 'example.org');
$container->setParameter('router.request_context.scheme', 'https');
$container->setParameter('router.request_context.base_url', 'my/path');
只在一個(gè)命令中改變你可以簡單地將請求環(huán)境從 router 服務(wù)中取出然后重寫它的設(shè)置:
// src/AppBundle/Command/DemoCommand.php
// ...
class DemoCommand extends ContainerAwareCommand
{
protected function execute(InputInterface $input, OutputInterface $output)
{
$context = $this->getContainer()->get('router')->getContext();
$context->setHost('example.com');
$context->setScheme('https');
$context->setBaseUrl('my/path');
// ... your code here
}
}
當(dāng)使用 Symfony 2.3+ 和 SwiftmailerBundle 2.3.5+ 時(shí),內(nèi)存假脫機(jī)現(xiàn)在是在 CLI 中自動(dòng)處理的,下列代碼就不再需要了。
在控制臺(tái)命令中發(fā)送郵件和如何發(fā)送郵件指導(dǎo)中描述的一樣除了內(nèi)存假脫機(jī)被占用。
當(dāng)使用內(nèi)存假脫機(jī)時(shí)(更多信息詳見如何假脫機(jī)郵件指導(dǎo)),你必須知道由于 Symfony 處理控制臺(tái)命令的方式,郵件將不會(huì)被自動(dòng)發(fā)送。你必須自己處理隊(duì)列。使用下列代碼發(fā)送你的控制臺(tái)命令中的郵件:
$message = new \Swift_Message();
// ... prepare the message
$container = $this->getContainer();
$mailer = $container->get('mailer');
$mailer->send($message);
// now manually flush the queue
$spool = $mailer->getTransport()->getSpool();
$transport = $container->get('swiftmailer.transport.real');
$spool->flushQueue($transport);
另外的一個(gè)選項(xiàng)是創(chuàng)建一個(gè)只用于控制臺(tái)命令的環(huán)境并且使用一種不同的假脫機(jī)方法。
只有當(dāng)內(nèi)存假脫機(jī)被使用時(shí)才考慮假脫機(jī)。如果你使用文件假脫機(jī)(或者不完全假脫機(jī)),沒必要手動(dòng)在命令中清除隊(duì)列。