我运行了一个在Laravel 4.2中构建的多租户站点。在App配置中,我知道您可以设置单个基本URL,例如
/*
|--------------------------------------------------------------------------
| Application URL
|--------------------------------------------------------------------------
|
| This URL is used by the console to properly generate URLs when using
| the Artisan command line tool. You should set this to the root of
| your application so that it is used when running Artisan tasks.
|
*/
'url' => 'http://apples.local',
我已经建立了一个Artisan命令来向用户发送预定的电子邮件,无论他们通过哪个域访问该网站。因此,命令需要生成具有不同域的URL,例如http://oranges.local
。
在我的命令中,我试图在生成URL之前更改app.url
配置变量,但似乎没有任何影响:
Config::set('app.url', 'http://oranges.local');
$this->info('App URL: ' . Config::get('app.url'));
$this->info('Generated:' . URL::route('someRoute', ['foo', 'bar']));
尽管在运行时物理上改变了配置,但仍然会产生:
App URL: http://oranges.local
Generated: http://apples.local/foo/bar
网址生成器完全忽略了应用配置!
我知道我可以设置多个环境并将--env=oranges
传递给Artisan,但在我的用例中,这并不实用。我只是希望能够在运行时在站点范围内设置应用程序URL。
有什么想法吗?
答案 0 :(得分:2)
好的,whoacowboy是对的,配置根本没有被考虑。我发现该网站的基本URL(即使在Artisan命令中)似乎从Symphony Request对象一直回来。
因此,要更改/欺骗Artisan中的域名,以下内容将起作用:
Request::instance()->headers->set('host', 'oranges.local');
在完成更改后再次恢复主机名可能是明智的,但至少在我的用例中,这已经解决了我所有的问题!
答案 1 :(得分:0)
URL::route()
调用$route->domain()
从$route->action['domain']
/**
* Get the domain defined for the route.
*
* @return string|null
*/
public function domain()
{
return isset($this->action['domain']) ? $this->action['domain'] : null;
}
所以看起来它没有使用Config::get('app.url')
来设置网址。
$emailURL = Config::get('app.url') . '/foo/bar/'
并将其称为一天。