我在Route::resource('category', 'CategoriesController');
每个类别都有
Route::resource('topic', 'TopicsController');
下的主题和主题。
每个类别都是主题。
所以我们可以去特定类别,例如/category/Games
这里我们有关于游戏的主题,例如主题WoW
。本主题位于/topic/WoW
下。全部使用方法show
现在我的问题
让我们假设用户想要创建新主题,他在/category/Games
,点击按钮New Topic
指向/topics/create
...为了让用户能够创建新主题我假设我应该根据CRUD资源元数据
create
的{{1}}方法
但是
如果我这样做,就会像TopicsController
那么接下来我将如何知道该主题必须包含哪些/topic/create
?
如果我喜欢Category
那么我可以使用部分名称,我会拥有它。
但正如我认为正确地根据这个CRUD方法论,我应该按照我在资源/category/WoW/topic/create
的{{1}}方法中所说的那样放置它,但那么知道用户希望它去哪个类别呢?我不知道我应该如何处理这种情况
答案 0 :(得分:2)
如本Laracast discussion所述,您可以使用点语法指定资源路径中的嵌套模型。在你的情况下,这意味着在/routes/routes.php
(在Laravel 5.3+中)或在app/Http/routes.php
中(在Laravel 5.0 - 5.2中):
Route::resource('category.topic', 'CategoryTopicController');
这将需要您为此用途创建资源控制器。在命令行中:
php artisan make:controller CategoryTopicController --resource
--resource
会自动创建快速启动的必要方法,但您可以手动编写它们(确保它们符合php artisan route:list
指定的内容。)
最终你走上了这些路线:
/category/{category}/topic
以及方法index()
/category/{category}/topic/{topic}
以及方法show($id)
/category/{category}/topic
以及方法store(Request $request)
/category/{category}/topic/{topic}
以及方法update(Request $request, $id)
/category/{category}/topic/{topic}
以及方法destroy($id)
即使Laravel使用$id
参数创建了这些方法,您也可以将其视为一个字符串(最好是一个可以包含在您的路径中的slug,例如/category/wow/topic/create
或/category/rainbow-6/topic/create
)
如果没有完成,请不要忘记创建模型:php artisan make:model Category --table=category && php artisan make:model Topic --table=topic
。
希望它有所帮助。
修改强>
自2017年5月起,如果您想摆脱额外路线edit
和create
(这些路线仅用于显示表单以生成store
或update
在您的资源中),您可以使用Route::apiResource
代替Route::resource
(请参阅this pull request来自this laraveldaily post的信息)。