Ссылки в файлах представлений, которые вызываются по разным именованным маршрутам. - PullRequest
0 голосов
/ 25 октября 2019

Наша команда пытается преобразовать старую многопользовательскую архитектуру в Laravel и испытывает некоторые трудности с сохранением СУХОГО в наших маршрутах / представлениях.

В разделе нашего аккаунта есть несколько просмотров: панель управления аккаунтом, изменение профиля, оплатаметоды, регистрации и т. д. Однако мы предоставляем несколько автономных веб-сайтов для клиента, и существует несколько структур URL для доступа пользователя к своей учетной записи:

В дополнение к стандартному ...

... они также могут получить доступ к своей учетной записи через различные автономные веб-сайты:

Все приведенные выше URL дают одинаковую информацию, но с разным макетом / темой, применяемой для каждого автономного веб-сайта. Прямо сейчас маршруты, которые я установил для вышеупомянутых, выглядят так:

// #### CLIENT ONE - ROOT
Route::domain('{subdomain}.ourdomain.com')->group(function() {
  Route::middleware(['setTheme:clientone-account-theme'])->group(function() {
    Route::get('/', 'ClientController@index')->name('index');
    Route::prefix('account')->group(function() {
      Route::get('/', 'AccountController@index')->name('clientone.account.show');
      Route::get('/edit', 'AccountController@edit')->name('clientone.account.edit');
      ...
    });
  });
  // #### CLIENT ONE - EVENT APP ONE
  Route::prefix('event-app-one')->group(function() {
    Route::middleware(['setTheme:clientone-eventapp-one-theme'])->group(function() {
      Route::get('/', 'EventAppController@index')->name('clientone.eventapp.one.index');
      ...
      Route::prefix('account')->group(function() {
        Route::get('/', 'AccountController@index')->name('clientone.eventapp.one.account.show');
        Route::get('/edit', 'AccountController@edit')->name('clientone.eventapp.one.account.edit');
        ...
      });
    });
  });
  // #### CLIENT ONE - EVENT APP TWO
  Route::prefix('event-app-2')->group(function() {
    Route::middleware(['setTheme:clientone-eventapp-two-theme'])->group(function() {
      Route::get('/', 'EventAppController@index')->name('clientone.eventapp.two.index');
      ...
      Route::prefix('account')->group(function() {
        Route::get('/', 'AccountController@index')->name('clientone.eventapp.two.account.show');
        Route::get('/edit', 'AccountController@edit')->name('clientone.eventapp.two.account.edit');
        ...
    });
  });
});

Все эти маршруты в настоящее время работают. Нам не нравится включать имя клиента или приложения во все наши имена маршрутов, потому что они становятся довольно длинными и не могут быть использованы повторно, но если мы их уберем, мы обнаружим, что наши URL-адреса маршрутов переопределят друг друга.

Однако, если мы сделаем это таким образом, наши учетные записи, которые мы разделяем по всем этим URL-адресам, не смогут использовать именованные ссылки на маршруты для href, потому что мы не знаем, какой из них использовать. Например, мы не можем сделать это в блейде ...

<a href="{{ route($subdomain . '.account.edit', ['subdomain' => $subdomain]) }}">Edit Profile</a>

... потому что, хотя это будет работать на clientone.ourdomain.com/account/, оно не будет работать наclientone.ourdomain.com/event-app-one/account/.

Должен ли я просто не использовать имена маршрутов для ссылок в наших представлениях и использовать вместо них относительную ссылку? Или я иду по своему маршруту, называя все неправильно? Единственное, о чем я могу думать, это скопировать все файлы представлений и иметь одну версию для .com / account / и другую для .com / all-event-apps / account / и просто использовать разные наборы имен маршрутов для каждого,Хотя кажется неправильным дублировать по существу те же функции в этих представлениях.

1 Ответ

0 голосов
/ 25 октября 2019

Вы можете использовать параметр для префикса, чтобы вы не повторяли одни и те же точные маршруты и не создавали для них новые имена. Затем вы можете создавать маршруты на основе этих названий маршрутов.

Вы можете установить значения по умолчанию для параметров для UrlGenerator, чтобы помочь справиться с этим.

Я бы добавил промежуточное ПО для вашей группы, которое проверяетпрефикс затем назначит его в качестве параметра по умолчанию на UrlGenerator:

// instead of app-one, app-two, etc etc
Route::prefix('{app}')->middleware('handleapp')...

// handleapp middleware

Url::defaults(['app' => $request->route()->parameter('app')]);

$request->route()->forgetParameter('app'); // if you dont want this passed into controller methods

// where you need to generate a route
route('eventapp.account.edit'); // {app} is handled by the default we set so doesn't have to be passed

У меня также было бы промежуточное ПО, которое также добавит параметр по умолчанию для subdomain, поэтому вам не нужно передавать егосебя везде.

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

Это просто основная идея в использовании.

...