【问题标题】:Laravel Artisan CLI doesn't set the right URLLaravel Artisan CLI 没有设置正确的 URL
【发布时间】:2015-07-02 07:23:11
【问题描述】:

概要

我在理解 Artisan 如何与环境和 .env 文件配合使用时遇到了一些问题。

我的问题是,当我在命令行上使用url 帮助程序的任务生成电子邮件时,我无法生成正确的链接。

当我尝试运行以下命令时,我的电子邮件包含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

edit 我的数据库连接设置在 .env 内并连接,因为它收集发送电子邮件所需的电子邮件地址以及创建的日期/时间,但无法按照.env 使用APP_URL

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

【问题讨论】:

    标签: php laravel laravel-5 command-line-interface laravel-artisan


    【解决方案1】:

    查看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 组件,主机将默认为 localhost。

    如果您使用//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

    【讨论】:

    • 这正是我所拥有的:S
    • @Ash 这对我有用。如果您使用过php artisan config:cache,请确保在进行任何更改后清除或重新缓存配置。此外,请确保您的 APP_URL 值包含协议(例如以 http:// 开头),否则它将在您设置的任何值前面加上 http://localhost
    • @Ash 还有一点需要注意:如果您的机器设置了 $APP_URL 环境变量,则该值将优先于 .env 文件中的任何内容。具体来说,如果您的 $APP_URL 变量设置为空字符串,那么您的 url 将设置为 http://localhost。您可以检查它是否设置为:if [ -z ${APP_URL+x} ]; then echo 'not set'; else echo 'set'; fi。您可以使用以下命令取消设置:unset APP_URL。 (你不能只做export APP_URL=,因为那是把它设置为空字符串,这不是你想要的。)
    • 当我运行它时,我得到“未设置”。
    • @Ash 您是否尝试过php artisan config:clear 以确保您没有看到缓存值?
    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2020-11-30
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多