【问题标题】:Hooks in Laravel 5?Laravel 5 中的钩子?
【发布时间】:2017-04-21 20:35:32
【问题描述】:

我正在创建一个包并想要钩子功能(当用户更新我的应用程序中的字段时,包应该注入一些额外的验证规则)。

我设法使用事件系统做到了这一点。我所做的是将 $rules 变量和 $request 传递给监听器,我修改 $rules 变量并返回它。

这是不好的做法吗?推荐的方法是什么?

我的意思是,它有效。我只是不确定这是否是最好的方法。

代码如下:

SettingsController.php(位于 App/ 下,我正在验证更新)

public function update(Setting $setting, Request $request)
{
    $rules = [
        'package' => 'required|in:'.implode(config('app.packages'),','),
        'name' => 'required|max:255|alpha_dash|not_contains:-|unique:auth_setting,name,'.$setting->id.',id,package,'.$setting->package,
        'description' => '',
    ];

    // Is this bad??
    $rules = Event::fire(new SettingsWereSubmitted($request,$rules))[0];

    $v = Validator::make($request->all(),$rules);

然后在我的包(packages/exchange/src/Listeners)中我得到了这个监听器(ValidateSettings.php):

public function handle(SettingsWereSubmitted $event)
{
    if($event->request->package == 'exchange')
    {
        // Add rules

        $rules = [
            'fee' => 'required|decimal|min_amount:0|max_amount:1|max_decimal:8',
             'freeze_trade' => 'required|in:1,0',
        ];

        $event->rules['value'] = $rules[$event->request->name];

        return $event->rules;
    }

}

【问题讨论】:

    标签: php laravel events hook laravel-5.2


    【解决方案1】:

    我正在查看你的这段代码

     if($event->request->package == 'exchange')
    

    并认为您可以通过使用 required_if 验证规则更轻松地实现相同的行为。

    $rules = [
            'package' => 'required|in:'.implode(config('app.packages'),','),
            'name' => 'required|max:255|alpha_dash|not_contains:-|unique:auth_setting,name,'.$setting->id.',id,package,'.$setting->package,
            'description' => '',
            'fee' => 'required_if:package,exchange|decimal|min_amount:0|max_amount:1|max_decimal:8',
            'freeze_trade' => 'required_if:package,exchange|in:1,0',
        ];
    

    添加: 顺便说一句,我建议使用 Request 类来验证收入请求并从控制器中删除验证代码,因为请求的验证是 Request 而不是 Controller 的责任。 在 Laravel 中这很容易。首先,在 Http\Requests 文件夹中创建请求类:

    class UpdateSomethingRequest extends Requst
    {
    
        public function rules()
        {
          return [
            'package' => 'required|in:'.implode(config('app.packages'),','),
            'name' => 'required|max:255|alpha_dash|not_contains:-|unique:auth_setting,name,'.$setting->id.',id,package,'.$setting->package,
            'description' => '',
            'fee' => 'required_if:package,exchange|decimal|min_amount:0|max_amount:1|max_decimal:8',
            'freeze_trade' => 'required_if:package,exchange|in:1,0',
          ];
        }
    
    }
    

    然后只需从控制器中删除该代码并键入提示新请求类以更新方法,如下所示:

    public function update(Setting $setting, UpdateSomethingRequest $request)
    {
    // Your request is already validated here so no need to do validation again
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 2014-06-19
      • 2015-04-07
      • 2015-10-01
      • 1970-01-01
      • 2021-11-02
      相关资源
      最近更新 更多