使用 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() 会破坏一些路由的主要内容,如果未能解决你的问题,请参考以下文章