我正在构建一个使用存储库模式的应用程序。现在我所做的是重用功能,但我遇到了一些打嗝。我有一个视图,显示了几个不同的模型。这些模型通过一对一关系(MovieBasic到MovieDetail)和一对多关系(MovieBasic到MoviePersonnel)相关联。我遇到的问题是我有两个不同的请求来验证我的表单。它们是MovieBasicRequest,它验证我的电影的基本信息(标题,概要)和MovieDetailRequest,它验证我的电影的详细信息(价格,屏幕类型,运行时间等)。因此要区分使用哪个请求我已将参数添加到我的URL中,如下所示:
movie_basic.blade.php
<?php $params = ['id' => $movie->id, 'type' => 'movie_basic']; ?>
<h4>Movie Baiscs <span class="pull-right"><a href="{{ action('MovieController@edit', $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
,网址将如此
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('MovieController@show', compact('movie'));
}
这个函数基本上做的是确定传入的内容和从那里调用正确的请求。然而,我现在拥有它的方式只是创建一个空数组,因此无需验证。有没有办法使用这些请求来验证传入的信息?或者在将输入传递给存储库的更新功能之前验证输入?
PS。我也试过这个:
$this->movieBasic->update($id, MovieBasicRequest $request);
但是我收到了“未定义的变量$ request”错误。
答案 0 :(得分: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('MovieController@show', compact('movie'));
}