2017-02-19 40 views
0

При построении контроллеров, является ли неправильной практикой, чтобы правила проверки были получены из внедренного репозитория? В качестве примера рассмотрим следующий интерфейс:Правила валидации для контроллера, извлеченного из бизнес-уровня

interface UserRepository 
{ 
    /** 
    * @return array 
    */ 
    public function getCreateRules(); 
} 

Тогда использование этой функции может быть найден в store методе контроллера:

class UserController extends Controller 
{ 
    private $repo; 

    public function __construct(UserRepository $repo) 
    { 
     $this->repo = $repo; 
    } 

    public function store(Request $request) 
    { 
     $this->validate($request, $this->repo->getCreateRules()); 

     ... 
    } 
} 

Мой вопрос, если сдвинув правила в бизнес-слой что это смешивает проблемы. Идея пришла с this Средняя запись с 2014 года, поэтому я задаюсь вопросом, является ли это действительным ресурсом, учитывая его возраст.

+0

У вас есть какая-либо условная логика в репозитории, для каких правил следует отправлять обратно? –

+0

Нет условной логики. – JRLambert

ответ

2

Я бы лично не использовал репозиторий для этого и вместо этого использовал FormRequest.

https://laravel.com/docs/5.4/validation#form-request-validation

Таким образом:

  1. вы код еще многоразовые
  2. вы не должны создавать каких-либо добавлений логику, как это все встроенные
  3. Вы можете использовать типа, чтобы разрешить класс из контейнера, который, в свою очередь, автоматически выполнит проверку метода.

Кроме того, если вам нужно, чтобы ваши правила были разными для создания и обновления, вы можете использовать простой оператор switch, например.

public function rules() 
{ 
    switch ($this->method()) { 
     case 'GET': 
      return [ 
       //Create rules 
      ]; 
     case 'PUT': 
     case 'PATCH': 
      return [ 
       //Update rules 
      ]; 
    } 
} 

Вы store метод будет выглядеть примерно так:

public function store(UserRequest $request) 
{ 
    //Validation will have already been handled by this point so you 
    //don't need to add it manually 
    ... 
} 

Надеется, что это помогает!

+0

Это фантастика. Я не знал, что они существуют. Спасибо. – JRLambert

+0

@JRLambert Все в порядке. Рад, что смог помочь. –