Laravel Artisan CLI 没有正确设置 URL

Laravel Artisan CLI doesn't set the right URL

剧情简介

我在理解 Artisan 如何处理环境和 .env 文件时遇到一些问题。

我的问题是,当我从使用 url 助手的命令行任务生成电子邮件时,我无法生成正确的 link.

当我尝试 运行 以下命令时,我的电子邮件包含 http://localhost/<link part> 而不是 http://domain.local/;我也在本地工作。

php artisan account:probation --method=notify
php artisan --env=production account:probation --method=notify
php artisan --env=local account:probation --method=notify

编辑 我的数据库连接设置在 .env 内并连接,因为它收集发送电子邮件所需的电子邮件地址以及创建的 date/time,同时不能按照 .env.

使用 APP_URL

当这些相同的电子邮件 运行 通过应用程序正确设置时:http://domain.local/,所以现在我有点困惑。

检查 config/app.php 中的 'url' 键。这是 Artisan 拾取的值。默认设置为 'http://localhost'.

如果您想在 .env 文件中使用 APP_URL 指定此值,则需要将配置文件中的 'url' 键更改为:

'url' => env('APP_URL'),

编辑

当通过网络 运行 时,有效的 Request 对象已经可用。当通过 Artisan 运行 时,Laravel 必须创建一个伪造的 Request 对象。它使用配置中定义的 url 执行此操作。

这个值被传递给 Symfony Request 对象的 create 方法。此方法使用本机 parse_url 方法将值分解为 url 个组件。如果解析的 url 不包含 host 组件,它将默认为 localhost.

给定 domain.local 的 url,您将得到以下结果:

print_r(parse_url('domain.local'));
=====
Array
(
    [path] => domain.local
)

由于组件不包含 host 组件,主机将默认为本地主机。

如果您使用 //domain.local,您会得到以下结果:

print_r(parse_url('//domain.local'));
=====
Array
(
    [host] => domain.local
)

现在 host 组件已经存在,它将用于您的 Artisan 命令所需的任何 URL 生成。

要查看更多信息的源代码:

从配置中获取 url 并创建 Request:
https://github.com/laravel/framework/blob/5.0/src/Illuminate/Foundation/Bootstrap/SetRequestForConsole.php

正在生成的 Symfony Request(上面调用的 create 方法):
https://github.com/symfony/HttpFoundation/blob/master/Request.php