2015-06-22 2 views
2

Я создаю приложение, которое использует шаблон репозитория. Теперь то, что я сделал, - это функция повторного использования, но я немного ударил икоту. У меня есть один вид, который показывает несколько разных моделей. Эти модели связаны между собой соотношением «один к одному» (MovieBasic to MovieDetail) и отношения «один ко многим» (MovieBasic to MoviePersonnel). Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть два разных запроса для проверки моих форм. Это MovieBasicRequest, который проверяет основную информацию моего фильма (Title, Synopsis) и MovieDetailRequest, которая проверяет подробную информацию о моем фильме (цена, тип экрана, время исполнения и т. Д.). Таким образом, чтобы различать, какой запрос использовать я добавил параметр к моему URL следующим образом:Laravel 5.0 - Использование запроса в функции

movie_basic.blade.php

<?php $params = ['id' => $movie->id, 'type' => 'movie_basic']; ?> 
<h4>Movie Baiscs <span class="pull-right"><a href="{{ action('[email protected]', $params) }}">Edit</a></span></h4> 
<hr> 
<table class="table table-bordered"> 
    <tbody> 
    <tr> 
     <td>{{ $movie->movie_title}}</td> 
    </tr> 
    <tr> 
     <td>{{ $movie->movie_synopsis }}</td> 
    </tr> 
    </tbody> 
</table> 

Я знаю, что с помощью <?php ?> тегов не лучшая практика, но я очистит это позже. Так из-за моего $params URL-адрес будет выглядеть так

www.moviesite.dev/1/edit?movie_basic 

который будет вызывать функцию редактирования в контроллере, как так

MovieController.php

/** 
    * Show the form for editing the specified resource. 
    * 
    * @param int $id 
    * @return Response 
    */ 
    public function edit($id) 
    { 
     $movie = $this->movieBasic->find($id); 

     return view('cms.edit', compact('movie', 'type')); 
    } 

В этом случае тип на самом деле не играет роли из-за взаимосвязи между моделями MovieBasic и MovieDetail. Однако он все же играет определенную роль в моей функции обновления ниже:

MovieController.php

/** 
    * Update the specified resource in storage. 
    * 
    * @param int $id, MovieBasicRequest $request 
    * @return Response 
    */ 
    public function update($id) 
    { 
     if(strcmp($_GET['type'], 'movie_basic') == 0) 
     { 
      $movie = $this->movieBasic->find($id); 
      $this->request = new MovieBasicRequest; 
      $this->movieBasic->update($id, $this->request); 
     } 
     elseif(strcmp($_GET['type'], 'movie_detail') == 0) 
     { 
      $movie = $this->movieBasic->find($id); 
      $this->request = new MovieDetailRequest; 
      $this->movieDetail->update($id, $this->request); 
     } 

     return redirect()->action('[email protected]', compact('movie')); 
    } 

По сути, эта функция делает это определить, что передается в и оттуда вызвать правильный запрос. Однако, как у меня сейчас, он просто создает пустой массив и, таким образом, ничего не проверяет. Есть ли способ использовать эти запросы для проверки переданной информации? Или для проверки ввода, прежде чем передать его функции обновления хранилища?

PS. Я также пробовал:

$this->movieBasic->update($id, MovieBasicRequest $request); 

но я получаю сообщение об ошибке «Неопределенная переменная $ запрос».

+1

Это должно быть что-то вроде 'public function update (MovieRequest $ request, $ id)', пожалуйста, просмотрите раздел Validation документации. – user2094178

ответ

1

Вам следует лучше их комбинировать. И вы можете использовать sometimes в своей форме для проверки того, где вы будете только проверять текущие поля. Так что ваш MovieRequest может быть как ниже

class MovieRequest extends Request 
{ 

    public function authorize() 
    { 
     return true; 
    } 

    public function rules() 
    { 
     return [ 
      'movie_title' => 'sometimes|required|min:3', 
      'price' => 'sometimes|required|integer' 
      // and so on 
     ]; 
    } 

} 

Таким образом, вы можете обновить ваш контроллер, как показано ниже, и использовать для обеих страниц. Например, если цена не задана в запросе, то она пропустит ее проверку, но если она присутствует и пуста, тогда она выдает сообщение об ошибке, как требуется.

public function update($id, MovieRequest $request) 
{ 
    $movie = $this->Movie->find($id); 
    $movie->fill($request->all()); 
    $movie->save(); 
    return redirect()->action('[email protected]', compact('movie')); 
} 
Смежные вопросы