【问题标题】:Laravel 5.5 Object to update lost when passing from view to update methodLaravel 5.5 从视图传递到更新方法时要更新的对象丢失
【发布时间】:2018-02-01 10:28:27
【问题描述】:

我很生气尝试更新一个简单的实体,我看到当我将更新方法的参数 Role $role 更改为 int $id 并在更新之前创建一个 findOrFail 时,它可以工作,但它似乎我的刀片 for::open 没有将我的对象 $role 传递给我的控制器。 我试图在我的编辑刀片模板中像这样传递它:

{{ Form::open(['name'=>'editrole','method'=> 'put','route'=>['Role.update',$role],
                    'class'=>'mt-4 ml-2']) }} 

或者像这样:

{{ Form::open(['name'=>'editrole','method'=> 'put','url'=>route('Role.update',$role),
                    'class'=>'mt-4 ml-2']) }}

这里是更新方法:

public function update(RoleRequest $request, Role $role)
{

    try{

        //dd($role);
        $role->update($request->all());
        return redirect(route('Role.index'))->with('success_message','Rôle modifié');

    }catch (ModelNotFoundException $ex){

        return redirect(route('Role.index'))->with('error_message',
            'Erreur : '.$ex->getMessage().'<br />'.$ex->getTraceAsString());

    }

}

在更新方法中制作dd($role)时,属性为空 感谢您的帮助。

路线是这样的:

// Gestion des rôles
Route::resource('Role','Admin\RoleController');

【问题讨论】:

  • 分享你的路线?

标签: php laravel laravel-5 blade laravel-blade


【解决方案1】:

您不能将对象作为路由参数传递。使用你所说的 id,然后在各个表单字段中设置对象属性。

您不需要 try catch,因为如果路由模型绑定失败,404 将在到达您的方法之前发生。

public function update(RoleRequest $request, Role $role) {
    $role->update($request->all());
    return redirect(route('Role.index'))->with('success_message','Rôle modifié');
}

编辑:

这一切都在隐式绑定部分进行了解释:

https://laravel.com/docs/5.5/routing#route-model-binding

【讨论】:

  • 好吧,这很奇怪,因为当您默认生成控制器时,它们会在更新方法中接受模型对象,并且刀片文档似乎说这是可能的
  • 控制器方法由于路由模型绑定而具有模型对象。 Laravel 根据 id 和路由定义在幕后为你做一个find
  • 所以我必须更改我的方法参数并在之前进行 findOrFail ?
  • 不,没关系,将您的表单操作更改为route('Role.update',$role-&gt;id)
  • 它什么也没改变,$role 的 dd 属性总是空的
猜你喜欢
  • 2020-03-28
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 2023-04-03
  • 2014-09-13
相关资源
最近更新 更多