2013-10-01 3 views
4

Я хотел бы наилучшую практику для такого рода проблемыLaravel проверка нескольких моделей

У меня есть items, categories и category_item таблицы для отношения многих ко многим

У меня есть 2 модели с этими правилами Validations

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); 
    } 
} 

Я не знаю, как проверить эти два набора правил только из одной формы с полями категории, заголовка и содержимого.

На данный момент у меня просто проверка для элемента, но я не знаю, что лучше сделать:

  • создать новый набор правил в мой контроллер -> но это кажется излишним
  • последовательно проверять элемент, а затем категорию -> но я не знаю, как обрабатывать ошибки проверки, мне нужно их слить? и как?
  • 3-ий решение, которое я не знаю о

вот мой ItemsController @ магазин метод

/** 
* 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(); 
    } 
} 

Я очень заинтересован в какой-то подсказке об этой теме

благодаря

ответ

10

Один из способов, как вы указали, состоит в следующем:

/** 
* 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 книга, Implementing Laravel, объясняет, что чудесно.

+0

Благодаря Антонио, ваше первое решение именно то, что я искал, но, как вы упоминаете Repository решение, это, безусловно, путь –

+0

ли вы попробовать другие книги Laravel? почему вы выбрали этот? –

+1

Не только потому, что я перевел его на свой основной язык, это отличная книга с примерами реального мира и вещами, которые вы можете реально использовать в своих текущих проектах. Книга Тейлора, также замечательная, дает нам важную информацию о принципах SOLID и контейнере IoC, но в основном это касается философии кодирования Laravel. И Code Bright - goog, но для новичков в Laravel. Также книга Джеффри Уэй, о тестировании, очень хороша для изучения TDD, но не о Laravel. –

0

Вы также можете использовать это:

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

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

и называть его таким же образом.

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; 
Смежные вопросы