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

时间:2017-01-26 17:12:33

标签: laravel url routing

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

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 个答案:

答案 0 :(得分:2)

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

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

  1. 使用url()代替route()并手动创建您的网址
  2. 每次使用route()时,请记住将false作为第三个参数传递,它将使用不存在此问题的相对路径
  3. 使用自定义
  4. 覆盖默认路由()帮助程序

    我选择了第三个选项并创建了一个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