[英]Laravel 5.0 - Using Request in function
我正在構建一個使用存儲庫模式的應用程序。 現在我所做的是重用功能,但我遇到了一些小問題。 我有一個視圖,上面顯示了幾個不同的模型。 這些模型通過一對一關系(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
URL 看起來像這樣
www.moviesite.dev/1/edit?movie_basic
它將像這樣調用控制器中的編輯功能
電影控制器.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 模型之間的關系,類型並沒有真正發揮作用。 但是,它確實在我下面的更新功能中起作用:
電影控制器.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'));
}
本質上,此函數的作用是確定傳入的內容並從那里調用正確的請求。 然而,我現在擁有它的方式只是創建一個空數組,因此什么都不驗證。 有沒有辦法使用這些請求來驗證傳入的信息? 或者在我將輸入傳遞給存儲庫的更新功能之前驗證輸入?
附注。 我也試過這個:
$this->movieBasic->update($id, MovieBasicRequest $request);
但我收到“未定義變量 $request”錯誤。
你最好把它們結合起來。 您有時可以在表單驗證中使用,以處理僅驗證當前字段的情況。 這樣您的 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'));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.