我们的团队正在尝试将旧的多租户体系结构转换为Laravel,并在保持DRY在我们的路线/视图中有些困难。
我们的帐户部分包含多个页面视图:帐户仪表板,编辑个人资料,付款方式,注册等。但是,我们为客户提供了多个独立网站,并且用户可以使用多种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的命名路由链接,因为我们不知道使用哪个。例如,我们不能在Blade中执行此操作...
<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 /创建另一个版本,并对每个版本使用不同的路由名称集。但是,在这些视图中重复本质上相同的功能感到错误。
您可以在前缀中使用参数,因此您无需重复相同的确切路线,也不会为其创建新名称。然后,您可以根据这些路由名称生成路由。
您可以为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的任何地方都将它们自己传递给路径帮助器。
这只是使用中的基本概念。