【问题标题】:Laravel 5.2 Modify Request After Form Validation Before ControllerLaravel 5.2 在控制器之前的表单验证后修改请求
【发布时间】:2017-02-23 13:16:20
【问题描述】:

我正在使用 laravel 5.2,并且我正在使用 laravel 供应商提供的表单请求来使我的代码干净,所以我的控制器上没有很多代码:

public function store( CouponRequest $request )
{
    DB::beginTransaction();
    try {
        $coupon = Coupon::create( $request->all() );

        DB::commit();
        return redirect()->route('admin.coupons.index');
    } catch (\Exception $e) {
        DB::rollback();
        return redirect()->back()->withInput();
    }

这是关于我的申请表的示例代码:

public function rules()
{
    switch ( strtolower( $this->method ) ) {
        case 'post':
        {
            return [
                'code' => 'required|unique:coupons,code',
                'name' => 'required',
                'start_year' => 'required',
                'start_month' => 'required',
                'start_day' => 'required',
                'start_time' => 'required',
                'finish_year' => 'required',
                'finish_month' => 'required',
                'finish_day' => 'required',
                'finish_time' => 'required',
                'using_time' => 'required',
                'type' => 'required',
                'free_shipment' => 'required',
                'target' => 'required',
                'target_user' => 'required'
            ];
        }
        case 'put':
        {
            return [
                'code' => 'required',
                'name' => 'required',
                'start_year' => 'required',
                'start_month' => 'required',
                'start_day' => 'required',
                'start_time' => 'required',
                'finish_year' => 'required',
                'finish_month' => 'required',
                'finish_day' => 'required',
                'finish_time' => 'required',
                'using_time' => 'required',
                'type' => 'required',
                'free_shipment' => 'required',
                'target' => 'required',
                'target_user' => 'required'
            ];
        }
        default:
        {
            return [];
        }
    }
}

我应该把这个命令放在哪里? :

$start_date = Carbon::create( $request->start_year, $request->start_month, $request->start_day );
$start_date->setTimeFromTimeString( $request->start_time );
$finish_date = Carbon::create( $request->finish_year, $request->finish_month, $request->finish_day );
$finish_date->setTimeFromTimeString( $request->finish_time );

如果我在验证之前放置此代码,当某些字段没有被用户填写好时,我可能会出错。

所以我想要的是在验证成功后放置这段代码,但我不想把它放在我的控制器上。

验证成功后是否可以调用FormRequest函数来修改我的请求?

我觉得控制器代码多的时候不好,所以我想最小化我的控制器代码。

【问题讨论】:

  • 你可以使用中间件
  • 工作流程是这样的:中间件 -> 表单请求 -> 控制器对吧?所以如果我把我的代码放在中间件上,它不会验证
  • 不要那样做。中间件提供了一种过滤进入应用程序的 HTTP 请求的机制。不转换 http 请求。你最终会得到一个令人困惑的代码库。您可以改为编写服务。这也将使您的控制器更加清洁和可靠。
  • 谁在使用$start_date$finish_date?你是坚持还是使用它?
  • @HilmiErdemKEREN 是对的,我可能误解了你的问题。您可以创建一个服务并将其注入控制器。服务容器将负责接线

标签: php laravel validation


【解决方案1】:

我将尝试使用 FormRequest。如果这里的意图是 validateassign start_date 和 finish_date,这可能是在 Laravel 中这样做的合理方式:

public function rules()
{
    switch ( strtolower( $this->method ) ) {
        case 'post':
        {
            return [
                'code' => 'required|unique:coupons,code',
                'name' => 'required',
                'start_year' => 'required',
                'start_month' => 'required',
                'start_day' => 'required',
                'start_time' => 'required',
                'finish_year' => 'required',
                'finish_month' => 'required',
                'finish_day' => 'required',
                'finish_time' => 'required',
                'using_time' => 'required',
                'type' => 'required',
                'free_shipment' => 'required',
                'target' => 'required',
                'target_user' => 'required'
            ];
        }
        case 'put':
        {
            return [
                'code' => 'required',
                'name' => 'required',
                'start_year' => 'required',
                'start_month' => 'required',
                'start_day' => 'required',
                'start_time' => 'required',
                'finish_year' => 'required',
                'finish_month' => 'required',
                'finish_day' => 'required',
                'finish_time' => 'required',
                'using_time' => 'required',
                'type' => 'required',
                'free_shipment' => 'required',
                'target' => 'required',
                'target_user' => 'required'
            ];
        }
        default:
        {
            return [];
        }
    }
}

/**
 * @inheritDoc
 *
 * This method overrides Laravel's defeault FormRequest
 * to create validator with `after()` hook
 */
protected function validator($validator)
{
    $validator
        ->make(
            $this->validationData(), $this->rules(), $this->messages(), $this->attributes()
        )
        ->after(function($validator) {

            if ($date = $this->getCarbonInstanceFromPrefix('start')) {
                $request->start_date = $date;
            } else {
                $validator->errors()
                    ->add('start_year', 'Invalid starting date and time');
            }

            if ($date = $this->getCarbonInstanceFromPrefix('finish')) {
                $request->finish_year = $date;
            } else {
                $validator->errors()
                    ->add('finish_year', 'Invalid finish date and time');
            }

        });
}

/**
 * Retrieve carbon instance from current request, using prefix
 *
 * @param  string $prefix
 *
 * @return Carbon|null
 */
protected function getCarbonInstanceFromPrefix($prefix = '')
{
    try {
        $date = Carbon::create( 
            $request->get($prefix . '_year'), 
            $request->get($prefix . '_month'), 
            $request->get($prefix . '_day') 
        );
        $date->setTimeFromTimeString( $request->get($prefix . '_time') );
        return $date;
    } catch (\Exception $e) {
        return null;
    }
}

快速说明

FormRequest 本质上是从Illuminate\Foundation\Http\FormRequest 扩展而来,并且可以覆盖创建Validator 实例的方法。通过创建自定义验证器,您可以附加 after() 事件来验证每个日期输入,并一次性为请求分配额外的参数。

【讨论】:

    猜你喜欢
    • 2016-05-16
    • 2016-05-23
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 2017-03-11
    • 2021-12-26
    相关资源
    最近更新 更多