簡體   English   中英

Laravel 5.0 - 在函數中使用請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM