【问题标题】:laravel validate multiple modelslaravel 验证多个模型
【发布时间】:2013-10-07 21:03:55
【问题描述】:

我想要解决这类问题的最佳做法

我有 itemscategoriescategory_item 表用于多对多关系

我有 2 个具有这些验证规则的模型

class Category extends Basemodel {

    public static $rules = array(
        'name'   => 'required|min:2|max:255'
    );
....


class Item extends BaseModel {

    public static $rules = array(
        'title'   => 'required|min:5|max:255',
        'content' => 'required'
    );
....


class Basemodel extends Eloquent{

    public static function validate($data){
        return Validator::make($data, static::$rules);
    }
}

我不知道如何仅通过一个包含类别、标题和内容字段的表单来验证这两组规则。

目前我只是对该项目进行了验证,但我不知道最好做什么:

  • 在我的控制器中创建一组新规则 -> 但这似乎是多余的
  • 依次验证项目然后类别 -> 但我不知道如何处理验证错误,我必须合并它们吗?以及如何?
  • 我不知道的第三种解决方案

这是我的 ItemsController@store 方法

/**
 * Store a newly created item in storage.
 *
 * @return Redirect
 */
public function store()
{
    $validation= Item::validate(Input::all());
    if($validation->passes()){
        $new_recipe = new Item();
        $new_recipe->title    = Input::get('title');
        $new_recipe->content = Input::get('content');
        $new_recipe->creator_id = Auth::user()->id;
        $new_recipe->save();

        return Redirect::route('home')
            ->with('message','your item has been added');
    }
    else{
        return Redirect::route('items.create')->withErrors($validation)->withInput();
    }
}

我对这个主题的一些线索非常感兴趣

谢谢

【问题讨论】:

    标签: validation laravel laravel-4


    【解决方案1】:

    正如您所指出的,一种方法是按顺序验证它:

    /**
     * Store a newly created item in storage.
     *
     * @return Redirect
     */
    public function store()
    {
        $itemValidation = Item::validate(Input::all());
        $categoryValidation = Category::validate(Input::all());
    
        if($itemValidation->passes() and $categoryValidation->passes()){
            $new_recipe = new Item();
            $new_recipe->title    = Input::get('title');
            $new_recipe->content = Input::get('content');
            $new_recipe->creator_id = Auth::user()->id;
            $new_recipe->save();
    
            return Redirect::route('home')
                ->with('message','your item has been added');
        }
        else{
            return Redirect::route('items.create')
                ->with('errors', array_merge_recursive(
                                        $itemValidation->messages()->toArray(), 
                                        $categoryValidation->messages()->toArray()
                                )
                    )
                ->withInput();
        }
    }
    

    另一种方法是创建类似项目存储库(域)的东西来编排您的项目和类别(模型)并使用验证服务(您也需要创建)来验证您的表单。

    Chris Fidao book,Implementing Laravel,精彩地解释了这一点。

    【讨论】:

    • 谢谢安东尼奥,你的第一个解决方案正是我想要的,但正如你提到的存储库解决方案,这绝对是要走的路
    • 你尝试过其他的 laravel 书吗?为什么选择这个?
    • 不仅因为我将它翻译成我的主要语言,它还是一本很棒的书,其中包含真实世界的示例以及您可以在当前项目中实际使用的东西。 Taylor 的书也是一本很棒的书,它为我们提供了一些关于 SOLID 原则和 IoC 容器的重要信息,但主要是关于 Laravel 编码理念。 Code Bright 是 goog,但它是为 Laravel 的初学者准备的。还有 Jeffrey Way 的书,关于测试,非常适合学习 TDD,但不是关于 Laravel。
    【解决方案2】:

    你也可以这样用:

    $validationMessages = 
        array_merge_recursive(
            $itemValidation->messages()->toArray(), 
            $categoryValidation->messages()->toArray());
    
    return Redirect::back()->withErrors($validationMessages)->withInput();
    

    并以同样的方式调用它。

    【讨论】:

      【解决方案3】:
      $validateUser = Validator::make(Input::all(), User::$rules);
      $validateRole = Validator::make(Input::all(), Role::$rules);
      
      if ($validateUser->fails() OR $validateRole->fails()) :
          $validationMessages = array_merge_recursive($validateUser->messages()->toArray(), $validateRole->messages()->toArray());
      
          return Redirect::back()->withErrors($validationMessages)->withInput();
      
      endif;
      

      【讨论】:

        猜你喜欢
        • 2013-08-27
        • 2014-06-26
        • 1970-01-01
        • 1970-01-01
        • 2018-03-22
        • 2016-09-11
        • 1970-01-01
        • 2020-02-07
        • 2013-04-06
        相关资源
        最近更新 更多