有没有办法忽略子域路由

时间:2018-01-17 09:42:38

标签: php laravel laravel-5 laravel-5.5

根据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将是子域的值。

假设我不关心子域值并且我有很多路由,有没有办法忽略它?

1 个答案:

答案 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其他情况更容易。