【问题标题】:Problems with validation of rules in LaravelLaravel 中的规则验证问题
【发布时间】:2019-03-20 11:57:40
【问题描述】:

我在验证 Laravel 规则时遇到问题。我有这个 CRUD,它作为参数接收请求类型。我还构建了一个 StoreMultipleForm,因为我有两个需要同时有效的表单。这适用于 SAVE,但是,对于 INSERT,它会给出与我的 CRUD 请求冲突的错误:

Argument 1 passed to App\Http\Controllers\Admin\MedicosController::inserir() must be an instance of App\Http\Requests\StoreMultipleForm, instance of Illuminate\Http\Request given, called in /var/www/html/mateus/laravel/laravel-angular/app/Http/Controllers/CrudController.php on line 23

这是我的代码

CrudController.php

public function action(Request $request, $action = null, $id = null)
{
        if($action === null){
                return $this->index($id);
        }

    if (!in_array($action, $this->allowedMethods)) {
        return abort(404);
    }
    return $this->$action($request, $id);
}


UserController.php

//TYPE STOREFORMREQUEST ERROR! 
public function insert(StoreFormRequest $request){
        $user = new User;
        $user->med_crm = $request->med_crm;
        $user->med_juridico = $request->med_juridico;
        $user->med_name = $request->med_name;
        $user->save();
}

public function save(StoreFormRequest $request){
        $user = new User;
        $user->med_crm = $request->med_crm;
        $user->med_juridico = $request->med_juridico;
        $user->med_name = $request->med_name;
        $user->save();
}

代码当然不是,但重要的是参数以及为什么 SAVE 有效而 INSERT 无效。

这是我的 StoreMultipleForm

class StoreMultipleForm extends FormRequest
{

public function authorize()
{
    return true;
}

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    $formRequests = [
      MedicoFormRequest::class,
      ConsultorioFormRequest::class,
      //PacienteFormRequest::class
    ];

    $rules = [];

    foreach ($formRequests as $source) {
      $rules = array_merge(
        $rules,
        (new $source)->rules()
      );
    }

    return $rules;
}

public function messages()
{
    $formRequests = [
      MedicoFormRequest::class,
      ConsultorioFormRequest::class,
      //PacienteFormRequest::class
    ];

    $messages = [];

    foreach ($formRequests as $source) {
      $messages = array_merge(
        $messages,
        (new $source)->messages()
      );
    }

    return $messages;
}    

}

我的路线

$this->group(['middleware' => ['auth'], 'namespace' => 'Admin'], 
   function(){
    $this->get('/admin', 'AdminController@index')->name('admin.home');
    $this->post('/admin/medicos/salvar/{id?}', 'MedicosController@salvar')->name('medicos');    
    $this->any('/admin/medicos/{action?}/{id?}', 'MedicosController@action')->name('medicos');
    $this->get('/admin/util/cidades/{uf_id}', 'UtilController@getCidadesByUf')->name('cidades');
    $this->get('/admin/especialidades/areasatuacoes/{esp_id}', 'EspecialidadeController@getAreasDeAtuacaoByEspecialidade')->name('areasatuacoes');
    $this->any('/admin/pacientes/{action?}/{id?}', 'PacientesController@action')->name('pacientes');
    $this->any('/admin/anuidades/{action?}/{id?}', 'AnuidadesController@action')->name('anuidades');    
  });

save 和 insert 在真实代码中是不一样的,这里只是一个例子。 MedicoFormRequest 是其他请求,StoreFormRequest 是 MedicoFormRequest 和 ConsultorioFormRequest 之间的连接点。我的问题是 SAVE 方法有效,但是,对于 INSERT 无效。

【问题讨论】:

  • 什么是 inserir() ?
  • 插入** 我是巴西人
  • 不错不错,只是检查一下不是拼写错误
  • 这里使用insert()save()的目的是什么?
  • @MateusGonçalves 你能发布你的StoreMultipleForm 代码吗?

标签: php laravel rules


【解决方案1】:

基础 Http Request 类被注入到 CrudController::action 方法中,并且 action 方法试图将其传递给 UserController::insert 方法,但是,该方法需要一个 StoreFormRequest 类,这是一个更具体的Request 类的实现。

这种方法行不通,因为您无法将基类实例转换为子类实例。

【讨论】:

  • 因为 save 看起来是指向 save 方法的路由,而不是通过 action 方法代理。
  • 好的,我知道了。在你看来我应该怎么做?我是 laravel 的新手。
  • 我不会尝试以这种方式使用继承。您假设所有 CRUD 都是相同的。你可以在这里看到,这是不准确的,因为每个 CRUD 可能有不同的输入、输出和要求。如果您需要在每个 CRUD 上执行一些逻辑,也许您可​​以在构造函数中执行该设置或使用中间件,但我不会尝试通过一个控制器方法传递所有路由。
猜你喜欢
  • 2015-02-21
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2019-03-21
  • 1970-01-01
  • 2016-12-17
  • 2020-06-25
相关资源
最近更新 更多