laravel - 通过不同命名路由调用的视图文件中的链接
问题描述
我们的团队正在尝试将旧的多租户架构转换为 Laravel,并且在我们的路线/视图中保持 DRY 有一些困难。
我们的帐户部分包含多个页面视图:帐户仪表板、编辑个人资料、付款方式、注册等。但是,我们为客户提供多个独立网站,并且有多个 URL 结构供用户访问其帐户:
除了标准...
...他们还可以通过不同的独立网站访问他们的帐户:
- https://clientone.ourdomain.com/event-app-one/account/
- https://clientone.ourdomain.com/event-app-two/account/
上面所有这些 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/ 设置另一个版本,并为每个文件使用一组不同的路由名称. 不过,在这些视图中复制基本相同的功能感觉是错误的。
解决方案
您可以使用前缀参数,这样您就不会重复相同的确切路由并为它们创建新名称。然后,您可以根据这些路由名称生成路由。
您可以为参数设置默认值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 的地方自己将它们传递给路由助手。
这只是使用中的基本思想。
推荐阅读
- c# - Nhibernate 无法编译映射文件
- sql - SQL Server - where 子句的 CASE
- javascript - 选择所有复选框不调用每个复选框的 JS 函数
- symfony - 无休止的页面加载从 symfony 中的存储库(学说)获取数据
- python - 编写 BIG pandas DataFrame 的最快方法
- python - 我正在寻找如何在 Python 中重新创建类似的图表
- javascript - 在 JavaScript 中将美元转换为美分
- python - 在 Python 中,有效过滤可能组合的子序列
- cuda - 在抛出 'thrust::system::system_error' 的实例后调用终止 what(): parallel_for failed: cudaErrorInvalidValue: invalid argument
- typo3 - TYPO3 routeEnhancers 用于新闻存档(DateMenu)和分页