更改Laravel 4.2 Artisan命令中的应用程序URL

时间:2015-10-13 12:38:06

标签: php laravel laravel-4 artisan

我运行了一个在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。

有什么想法吗?

2 个答案:

答案 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')来设置网址。

BenJ似乎有个好主意。为什么不手动编写URL?

$emailURL = Config::get('app.url') . '/foo/bar/'并将其称为一天。