如何在CRUD应用程序中成为更多Laravel?

时间:2014-08-07 12:08:36

标签: php mysql laravel

这是一个关于如何使用精彩的Laravel创建更好的应用程序的问题。我想创建一个具有多个具有用户权限的表单的CRUD应用程序。

详情

  1. 查看即可。我有3个表单,例如我们称之为catturtledog。最重要的是他们有不同数量的领域。 Here are forms

  2. 控制器即可。用户填写表格并按下游戏中的控制器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等于用户填写的表单类型。但正如你现在所看到的那样,控制器非常大,我不喜欢它。最好的方法是什么?

  3. 模型即可。 我有4个表格,dogs_dataturtle_datacat_data我存储了表单中的所有数据,pets_data我存储了有关宠物的不同元数据。它是如何工作的?验证通过后,将数据插入其中一个表中,并获取此插入的ID。然后在pets_data中创建记录并将ID插入pet_id并插入table_type,这将是从数据库获取信息所必需的。我认为使用数据库是非常奇怪的方式。 Here是表格的可视化。

  4. 另一个问题是 - 显示数据。例如,用户无权编辑数据或删除记录,但管理员可以删除,更新并查看数据库中的大量数据。我应该创建另一个像AdminController这样的控制器并在那里写另一个只显示admin信息的方法吗?

    我的申请现在:

    1. WebSiteController - 显示网站
    2. AdminController - 管理页面,有一个方法可以生成查看宠物的特殊页面。
    3. UserController - 用户控制面板,还有生成查看宠物页面的方法,但对用户特别。
    4. 我想创造这样的东西

      1. AuthController - 特别适用于登录\ registration \ activation \ etc
      2. PetsController - 创建\ delete \ update \ etc,还可以查看两个版本:useradmin。我的想法是创建一个方法getShowPets($pet_id)(重要的是它只有 id 来自pets_data,而不是 pets_id )然后获得用户的权限和生成页面。
      3. 依此类推,我想重新编写我的应用程序使用DRY规则

        如果你能给我一些关于这个项目的好建议,我将非常高兴。

1 个答案:

答案 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,发现它很容易管理。在尝试管理谁可以在您的网络应用上做什么时,它可能会让您的生活更轻松。