【问题标题】:Using forceRootUrl() breaks some routing使用 forceRootUrl() 会破坏一些路由
【发布时间】:2017-06-12 06:11:09
【问题描述】:

我的 Laravel 应用程序从一个子目录运行,所以为了能够像这样使用 URL 帮助程序:{{ url('users') }} 而不是像这样的{{ url('subdirectory/users') }} 我在我的 AppServiceProvider.php 文件中使用 forceRouteUrl() 方法.它看起来像这样:

public function boot()
    {
        URL::forceRootUrl(Config::get('app.url'));

...

还有我的 .env:APP_URL=http://app.dev/subdirectory

到目前为止一切顺利,除了返回路线。例如,我有一个这样做的排序方法:

function sort_schedule($column, $order)
{
    return route('schedule', [
                 'sortBy' => $column,
                 'sortOrder' => $order,
            ]
         );
}

但它生成的链接是这样的:http://app.dev/subdirectory/subdirectory/...

当我使用Kyslik's Column Sortable 包时也会发生同样的事情。

我该如何解决这个问题?

【问题讨论】:

    标签: laravel url routing


    【解决方案1】:

    似乎虽然 url() 或 assets() 等其他帮助程序没有这个问题,但当 laravel 不能直接从站点根目录访问并且 forceRootUrl() 是时, route() 帮助程序往往会复制子路径用过的。 我使用的是 laravel 5.4,但以前的版本也存在这个问题。

    为了解决这个问题,我找到了三种可能的解决方案:

    1. 使用 url() 代替 route() 并手动创建您的 url
    2. 每次使用 route() 记得传递 false 作为第三个参数,它会使用没有这个问题的相对路径
    3. 用自定义的方法覆盖默认的 route() 帮助器

    我选择了第三个选项并创建了一个 CustomHelper.php 文件,其中包含我的新 route() 助手。 以下是有关如何覆盖默认助手的说明: https://laracasts.com/discuss/channels/general-discussion/override-functions-in-supporthelpersphp

    在我的 CustomHelper.php 文件中我添加了这个

    function route($name, $parameters = [], $absolute = true)
    {
        $appUrl = config('app.url'); // in your case: http://app.dev
        $appUrlSuffix = config('app.url_suffix'); // in your case: subdirectory
    
        // Additional check, do the workaround only when a suffix is present and only when urls are absolute
        if ($appUrlSuffix && $absolute) {
            // Add the relative path to the app root url
            $relativePath = app('url')->route($name, $parameters, false);
            $url = $appUrl.$relativePath;
        } else {
            // This is the default behavior of route() you can find in laravel\vendor\laravel\framework\src\Illuminate\Foundation\helpers.php
            $url = app('url')->route($name, $parameters, $absolute);
        }
    
        return $url;
    }
    

    app.url_suffix 是我在 config/app.php 中定义的自定义变量

    'url_suffix' => env('APP_URL_SUFFIX', null),
    

    在 .env 配置文件中

    APP_URL_SUFFIX=subdirectory
    

    【讨论】:

    • 我忘记指定必须在 bootstrap/autoload.php 中包含 CustomHelper.php 文件。添加要求 DIR 。 '/../app/Http/CustomHelpers.php';在包含供应商 autoload.php 之前
    猜你喜欢
    • 2016-10-18
    • 2018-02-24
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2020-10-23
    相关资源
    最近更新 更多