Параметр Laravel по умолчанию на маршруте - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь структурировать свою сеть следующим образом:

myapp.com/{myworkspace}/*

Где {myworkspace} - динамический параметр, а * - все язвы сети.

Я получил параметр myworkspace только после того, как пользователь вошел в систему, потому что это поле моей таблицы пользователей. Я не хочу передавать его каждый раз, когда вызываю помощника по маршруту, также он не нужен для действий контроллеров.

Итак, у меня проблема с настройкой этого параметра, и я пробовал так много способов, как middelwares, сессии, поставщики услуг и метод URL::defaults. Я думаю, что упускаю что-то важное, и я не могу достичь этого любым другим способом.

Может ли кто-нибудь помочь мне, пожалуйста?

UPDATE

Я пробую такие маршруты:

Route::middleware(['auth'])->group(function () {
    ...
    Route::prefix('{workspace}')->group(function () {
        ...
        Route::get('/example', 'SomeController@show')->name('example.show')
    });
});

Когда я пытаюсь использовать {{route(example.show)}}, выдается исключение Missing required parameters for [Route: example.show].

1 Ответ

0 голосов
/ 01 сентября 2018

В вашей настройке example.show - это маршрут с префиксом {workspace}.

{workspace} - это динамически определенный параметр маршрута, поэтому Laravel не может понять, что это такое - вам нужно определить его, когда вы попытаетесь сгенерировать маршрут.

Так, например, если мое рабочее пространство «богатое», {{route(example.show)}} станет:

{{ route(example.show, ['workspace' => 'rich']) }}

Документация Laravel по именованным маршрутам содержит краткий пример.

Редактировать

Если вы решили использовать функцию `route () 'для генерации ваших URL-адресов в ваших блейд-файлах, и у вас есть общий параметр маршрута, который необходимо определять на регулярной основе, я бы подумал написать помощника функция, чтобы сделать это проще. Так что вместо:

{{ route(example.show, ['workspace' => 'rich']) }}

Это может стать:

{{ MyHelperClass::generateWorkspaceRoute('example.show') }} 

А затем в вашем файле вспомогательного класса:

public function generateWorkspaceRoute($routeName) 
{
    $workspace = $this->getWorkspace();

    return route($routeName, ['workspace' => $workspace]);
}

private function getWorkspace() 
{
    // Your logic to determine workspace here.
    // If it is possible that we are generating this without an
    // authenticated user, then provide a fallback...
    return \Auth::check() ? \Auth::user()->workspace : 'workspace';
}

Затем вы можете найти свой запасной вариант в контроллере и перенаправить аутентифицированному пользователю в правильное рабочее пространство:

// in SomeController
public function show($workspace)
{
    if($workspace === 'workspace') {
        // Because our controller is behind the 'auth' middleware, 
        // we should now be able to generate a correct workspace route
        return redirect(MyHelperClass::generateWorkspaceRoute('example.show'));
    }

    // Normal controller logic continues from here...
}

Примечание: это требует знания того, каким будет ваше «резервное» рабочее пространство во время его генерации для каждого пользователя - если вы разрешаете своим пользователям определять это, вам нужно будет запретить им выбрав свой запасной вариант в качестве опции.

...