根据to Lavarel documentation,如果我对多个子域使用子域路由,我必须将子域作为回调函数和控制器方法的第一个参数传递:
Route::domain('{sub}.example.org')->group(function () {
Route::get('a', function ($sub) { /* ... */ });
Route::get('b', function ($sub) { /* ... */ });
Route::get('c/{c}', function ($sub, $c) { /* ... */ });
Route::get('d/{d}', function ($sub, $d) { /* ... */ });
});
换句话说,我必须随处携带$sub
变量。假设我不关心它的价值,我可以避免这种情况,只做这样的事情(这不适用于多个参数):
Route::domain('{sub}.example.org')->group(function () {
Route::get('a', function () { /* ... */ });
Route::get('b', function () { /* ... */ });
Route::get('c/{c}', function ($c) { /* ... */ });
Route::get('d/{d}', function ($d) { /* ... */ });
});
如果我这样做,$c
和$d
将是子域的值。
假设我不关心子域值并且我有很多路由,有没有办法忽略它?
答案 0 :(得分:1)
我们有一个类似于动态前缀的东西。我们的解决方案是:
首先我们取消设置参数,如果它存在于" App / Http / Controllers / Controller.php"中,这是您的控制器最有可能扩展的类。
public function callAction($method, $parameters)
{
if (isset($parameters['clientident'])) {
unset($parameters['clientident']);
}
return parent::callAction($method, $parameters);
}
这将取消为每个控制器中的每个函数调用设置参数,并且应该解决您的问题。
但是因为我们在route()函数中需要它,所以我们创建了一个" App / Http / helpers.php"
的文件function route($name, $parameters = [], $absolute = true)
{
if (!isset($parameters['clientident'])) {
// If the given value is not an array, wrap it in one.
$parameters = Arr::wrap($parameters);
if (Auth::check()) {
$temp = ['clientident' => Auth::user()->getClientIdent()];
}
else if (request()->clientident) {
$temp = ['clientident' => request()->clientident];
}
else {
$temp = ['clientident' => 'general'];
}
$parameters = array_merge($parameters, $temp);
}
return app('url')->route($name, $parameters, $absolute);
}
并在" bootstrap / autoload.php"
中添加了新的帮助文件require __DIR__.'/../app/Http/helpers.php';
require __DIR__.'/../vendor/autoload.php'; << this line was already here
这是有效的,因为泰勒在每个辅助函数前面写了一张支票(如果已经设置好了),所以很容易覆盖它们
if (! function_exists('route')) {
function route($name, $parameters = [], $absolute = true)
{
return app('url')->route($name, $parameters, $absolute);
}
}
是Illuminate / Foundation目录中helpers.php中的代码。
我想在你的情况下必须处理路线功能有点不同。您应该能够使用域帮助程序函数获取子域,并将其作为参数再次添加回来,这很可能比上面的if elseif其他情况更容易。