在 Laravel 4.2 Artisan 命令中更改应用程序 url

Changing the app url inside a Laravel 4.2 Artisan command

我 运行 一个内置于 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 命令来向用户发送预定的电子邮件,无论他们通过哪个域访问网站。因此该命令需要生成具有不同域的 urls,例如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

URL 生成器完全忽略了应用程序配置!

我知道我可以设置多个环境并将 --env=oranges 传递给 Artisan,但在我的用例中这并不实用。我只希望能够在 运行 时间内在整个站点范围内设置应用程序 url。

有什么想法吗?

URL::route() calls $route->domain() which gets the domain from $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') 来设置 url。

benJ 似乎有一个好主意。你为什么不手动写 URL?

$emailURL = Config::get('app.url') . '/foo/bar/' 收工吧。

好的,whoacowboy 是对的,根本没有考虑配置。我发现该站点的基础 URL(即使在 Artisan 命令中)似乎从 Symphony Request 对象一直返回。

因此,对于 change/spoof Artisan 中的域,以下将起作用:

Request::instance()->headers->set('host', 'oranges.local');

完成更改后再次还原主机名可能是明智的,但至少在我的用例中,这解决了我所有的问题!