4

この種の問題のベストプラクティスが欲しい

I haveitemsと多対多関係のcategoriesテーブルcategory_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);
    }
}

カテゴリ、タイトル、およびコンテンツ フィールドを含む 1 つのフォームのみから、これら 2 セットのルールを検証する方法がわかりません。

現時点では、アイテムの検証を行っているだけですが、どうすればよいかわかりません。

  • コントローラーに新しいルールのセットを作成します->しかし、冗長に見えます
  • 順番にアイテムを検証してからカテゴリを検証します->しかし、検証エラーを処理する方法がわかりません。それらをマージする必要がありますか? そしてどうやって?
  • 私が知らない3番目の解決策

ここに私の 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();
    }
}

私はこの主題に関するいくつかの手がかりに非常に興味があります

ありがとう

4

3 に答える 3

10

あなたが指摘したように、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();
    }
}

もう 1 つの方法は、アイテム リポジトリ (ドメイン) のようなものを作成してアイテムとカテゴリ (モデル) を調整し、検証サービス (これも作成する必要があります) を使用してフォームを検証することです。

Chris Fidaoの本、Laravel の実装は、それを見事に説明しています。

于 2013-10-02T19:23:56.633 に答える
0

これを使用することもできます:

$validationMessages = 
    array_merge_recursive(
        $itemValidation->messages()->toArray(), 
        $categoryValidation->messages()->toArray());

return Redirect::back()->withErrors($validationMessages)->withInput();

と同じように呼び出します。

于 2014-06-29T13:24:41.473 に答える
0
$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;
于 2014-10-30T08:46:47.077 に答える