Laravel 5.0 - 在函数

时间:2015-06-22 19:21:18

标签: php laravel laravel-5

我正在构建一个使用存储库模式的应用程序。现在我所做的是重用功能,但我遇到了一些打嗝。我有一个视图,显示了几个不同的模型。这些模型通过一对一关系(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”错误。

1 个答案:

答案 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'));
}