这是一个关于如何使用精彩的Laravel创建更好的应用程序的问题。我想创建一个具有多个具有用户权限的表单的CRUD应用程序。
详情:
查看即可。我有3个表单,例如我们称之为cat
,turtle
和dog
。最重要的是他们有不同数量的领域。
Here are forms
控制器即可。用户填写表格并按下游戏中的控制器save
按钮。我们所有人都知道更薄的控制器越好。但我使用这样的结构:
switch($type)
{
case '1':
//form validation -> move to model
//if all have passed that insert into database
//Show user a message
break;
case '2':
//form validation -> move to model
//if all have passed that insert into database
//Show user a message
break;
//.....
default:
//show message
break;
}
变量type
等于用户填写的表单类型。但正如你现在所看到的那样,控制器非常大,我不喜欢它。最好的方法是什么?
模型即可。
我有4个表格,dogs_data
,turtle_data
,cat_data
我存储了表单中的所有数据,pets_data
我存储了有关宠物的不同元数据。它是如何工作的?验证通过后,将数据插入其中一个表中,并获取此插入的ID。然后在pets_data
中创建记录并将ID插入pet_id
并插入table_type
,这将是从数据库获取信息所必需的。我认为使用数据库是非常奇怪的方式。 Here是表格的可视化。
另一个问题是 - 显示数据。例如,用户无权编辑数据或删除记录,但管理员可以删除,更新并查看数据库中的大量数据。我应该创建另一个像AdminController这样的控制器并在那里写另一个只显示admin信息的方法吗?
我的申请现在:
WebSiteController
- 显示网站AdminController
- 管理页面,有一个方法可以生成查看宠物的特殊页面。 UserController
- 用户控制面板,还有生成查看宠物页面的方法,但对用户特别。我想创造这样的东西
AuthController
- 特别适用于登录\ registration \ activation \ etc PetsController
- 创建\ delete \ update \ etc,还可以查看两个版本:user
和admin
。我的想法是创建一个方法getShowPets($pet_id)
(重要的是它只有 id 来自pets_data
,而不是 pets_id )然后获得用户的权限和生成页面。 依此类推,我想重新编写我的应用程序使用DRY规则
如果你能给我一些关于这个项目的好建议,我将非常高兴。
答案 0 :(得分:2)
看起来你正在建立一个多态关系,在这种情况下,我会把所有东西分开,这意味着你有一个Cat,Dog,Turtle和PetData的模型。您拥有CatController,DogController和TurtleController的控制器。并且您有一个Cat表单,一个Dog表单和一个Turtle表单,每个表单还包含pet_info表所需数据的输入。
要创建多态关系,您的pet_data表将需要进行一些更改。只需将表格列更改为pet_type
即可。 Laravel期望此列的某个名称及其内容是模型的名称而不是表的名称。
为这些设置模型非常简单,我将使用PetData和Dog来开始。
class Dog extends Eloquent
{
protected $table = 'dogs_data';
protected $timestamps = false;
public function petData()
{
return $this->morphMany('PetData', 'pet');
}
}
class PetData extends Eloquent
{
protected $timestamps = false;
public function pet()
{
return $this->morphTo();
}
}
可以在这里阅读更多相关内容...... http://laravel.com/docs/eloquent#polymorphic-relations
为所有内容设置单独的模型/控制器的想法可能看起来很多,但是在尝试维护或添加其他动物到您的应用程序时,它有很长的路要走,因为您很少需要修改生产代码,带走尝试为您的网站添加增强功能时可能会引入更多错误。
现在,保存宠物和相关宠物数据变得非常容易,而不必担心pet_data表中的pet_id和pet_type,Laravel会为您处理。您的狗控制器上的功能可能如下所示......
class DogController extends BaseController
{
public function save()
{
$dog = new Dog;
$dog->name = Input::get('name');
$dog->age = Input::get('age');
$dog->save();
$pet_data = new PetData;
$pet_data->color = Input::get('color');
$dog->petData()->save($pet_data);
}
}
至于为管理员创建另一个控制器,我会说是的,那样做。在不同的文件中保留您认为不同的网站部分永远不会受到伤害。它不仅有助于组织,而且还有关注点的分离,您可能应该阅读更多内容。
还有一些很棒的第三方选项来管理角色。我之前使用过zizaco/entrust
,发现它很容易管理。在尝试管理谁可以在您的网络应用上做什么时,它可能会让您的生活更轻松。