Laravel 通过不同命名路由调用的视图文件中的链接

Laravel 通过不同命名路由调用的视图文件中的链接,laravel,laravel-routing,laravel-5.8,Laravel,Laravel Routing,Laravel 5.8,我们的团队正在尝试将一个旧的多租户架构转换为Laravel,并且在我们的路线/视图中难以保持干燥 我们的帐户部分包含多个页面视图:帐户仪表板、编辑配置文件、付款方式、注册等。但是,我们为客户提供多个独立网站,并且有多个URL结构供用户访问其帐户: 除了标准之外 …他们还可以通过不同的独立网站访问其帐户: 上面所有这些URL都提供了完全相同的信息,但每个独立网站应用了不同的布局/主题。现在,我为上面这些设置的路线如下所示: // #### CLIENT ONE - ROOT Rout

我们的团队正在尝试将一个旧的多租户架构转换为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的命名路由链接,因为我们不知道该使用哪个链接。例如,我们不能在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
我还将有一个中间件,它将为
子域
添加默认参数,这样您就不必到处传递该参数

基本上,这一切都是动态的,根据当前的请求,您可以为所有这些参数设置默认值,这样您就不必自己将它们传递到路由帮助程序中,只要您需要来自路由名称的URL


这只是使用中的基本思想。

我认为向route添加参数并使其动态化将解决您的问题,如route::get(myroot/{event template}/account)和在逻辑中使用事件模板。您可以区分视图,如
返回视图('dashboard'.$event\u template,$This->data[$event\u template])