使用 forceRootUrl() 会破坏一些路由

Posted

技术标签:

【中文标题】使用 forceRootUrl() 会破坏一些路由【英文标题】:Using forceRootUrl() breaks some routing 【发布时间】: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 包时也会发生同样的事情。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

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

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

    使用 url() 代替 route() 并手动创建您的 url 每次使用 route() 记得传递 false 作为第三个参数,它会使用没有这个问题的相对路径 用自定义的方法覆盖默认的 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 之前

以上是关于使用 forceRootUrl() 会破坏一些路由的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的路由在调用破坏函数后会失败?

laravel modal 删除确认不会去破坏路由

Vue路由器保留iframe dom元素(只是隐藏,不要破坏)

节点光纤会破坏节点域吗?

可可豆荚更新破坏了一些东西,现在“豆荚更新”会产生错误

如何攻击路由器