我对Laravel还是很陌生,所以我在为具有多种内容类型的CMS的逻辑而苦苦挣扎。
说我有3种内容类型;食品,书籍和汽车。所有内容类型中的每个项目都有一个名称,URL和几个其他字段。
我可以创建,更新和删除这些资源中的任何一个,并且很可能将相同的代码复制了3次。唯一的区别是创建或更新,因为它们之间的字段名称会有所不同。
我应该为每个控制器复制这些字段/功能,还是在一个地方创建一些共同点?
最初,字段/函数的交叉不会很大,但是,如果我有10种内容类型,并且我想向其中的所有字段添加一个字段,则效率很低,我必须在很多地方更新代码
如果我有一个中央“节点”,其中包含每种内容类型中所有项目的ID和公共字段,则将此链接链接到自定义字段的各个表,当我想要添加,更新或删除公共字段。
我目前有3个控制器,到目前为止只使用了一个控制器,所以我在控制器中具有index()
,show()
和edit()
函数。
作为测试,我使用php artisan make:model Node -mcr
创建了一个Node模型,并简单地扩展了现有Controllers,以便它们扩展了NodeController。只是抛出了这样的错误;
Declaration of App\Http\Controllers\FoodController::show(App\Food$food) should be compatible with App\Http\Controllers\NodeController::show(App\Node $node)
这可能不是解决问题的方法,但是我根本不知道建议的做法。
答案 0 :(得分:0)
最适合您问题的标准最佳实践是
有一个数据库表,假设表名为node
,它将包含所有公共字段,并具有另一个表为categories
并将其与node
表相关(1 -m)对节点的类型(例如汽车,书籍,食物等)进行分类,并再创建一张表,假设node_meta
将根据节点的类型存储所有其他属性,
(您可以查看具有类似数据库设计的wordpress CMS数据库ER图。)
多态关系并不是上面另一个用户所说的好主意,它在查询基础数据时有一定的局限性,例如,您无法应用whereHas
查询,但仍然没有官方解决方案this problem。