我正在实现具有许多模型和关系的后台系统。
现在我陷入了我的UI战略: 假设我有房屋和房间。一所房子有很多房间。
我已经以“ Laravel”方式为这两个模型创建了控制器。(资源控制器)
所以我俩都有路线
example.com/backoffice/house
example.com/backoffice/room
我想要实现的功能听起来很简单:
我要在房屋的“详细信息”视图(“为此房屋创建房间”)中放置一个按钮,该按钮将我重定向到“房间/创建”,但是在创建视图中,我想将“ house_id”的值设置为id我来自的房子。因此,我通常可以在RoomController中使用store方法,然后重定向回房子。
我想要一个通用的方法,因为我必须在许多模型/视图上使用此功能。我正在考虑一个会话变量,但我认为最终有人可以更好地处理此类情况吗?还是UI处理的更好主意?
答案 0 :(得分:1)
显然,Laravel删除了一些很棒的5.6版文档,名为nested resource controllers
。
您可以做的是使用嵌套路由。
假设您当前的控制器是通过以下方式设置的:
Route::resource('houses', 'HouseController');
Route::resource('rooms', 'RoomController');
如果将此部分更改为以下内容:
Route::resource('houses', 'HouseController');
Route::resource('houses.rooms', 'RoomController');
这将每个房间耦合到一所房子,并且非常易于管理。它为您提供了类似于houses/4/rooms/create
的URL,它可以在您的create方法中立即为您提供house_id
:
public function create($houseId)
{
return view('houses.rooms.create', ['houseId' => $houseId]);
}
如果要编辑房间,则完全相同:
public function edit($houseId, $roomId)
Laravel 5.1 documentation仍然有此技术的示例。
答案 1 :(得分:1)
为此,我建议采用以下方式(也可能有其他方式)
更改路线:
Route::get('room/create/{house_id?},'Controller@action')->name('room.create')
在<a>
文件中添加house_view.blade.php
标记。
<a href="{{route('room.create', ['house_id' => $houseModel->id])}}">Create Room for this House</a>
房间控制器文件。
public function formCreate($house_id)
{
return view('form.room_create', ['house_id' => $house_id]);
}
在<input>
文件中添加隐藏的room_create.blade.php
标签类型
<input type="hidden" id="house_id" name="house_id" value="{{$house_id or ''}}">