Laravel样板文件将对象发送到控制器

时间:2018-03-06 03:12:54

标签: php laravel

我是Laravel的新手。我刚从https://github.com/rappasoft/laravel-5-boilerplate分叉 laravel 5样板

在路线文件中,我看到有这样的一行:

Route::group(['prefix' => 'user/{deletedUser}'], function () {
                Route::get('delete', 'UserStatusController@delete')->name('user.delete-permanently');
                Route::get('restore', 'UserStatusController@restore')->name('user.restore');
            });

我理解这意味着,当网址捕获'恢复'时,它将使用 UserStatusController 中的恢复功能。

这就是:

public function restore(User $deletedUser, ManageUserRequest $request)

任何人都可以帮我发现,如何将对象 $ deletedUser 发送到恢复功能。谢谢你!

3 个答案:

答案 0 :(得分:3)

如果你看一下路线定义:

user/{deletedUser}

{deletedUser}代表要删除/恢复的用户的id。变量在路由中的{}之间声明为docs个状态。

现在在您的控制器中:

public function restore(User $deletedUser, ManageUserRequest $request)

您可以看到User对象被声明为参数。 Laravel正在注入此对象,该对象将自动查找具有id的User对象。这称为Route Model Binding

documentation更好地解释了它:

  

将模型ID注入路径或控制器操作时,通常会查询以检索与该ID对应的模型。 Laravel路径模型绑定提供了一种将模型实例直接自动注入路径的便捷方法。例如,您可以注入与给定ID匹配的整个User模型实例,而不是注入用户的ID。

同样,在这种情况下注入的Request类是ManageUserRequest,它应该是FormRequest的一个实例。

因此,回到您的问题,您只需指定要删除/恢复的用户ID,如下所示:

someurl.dev/users/5     // <-- for the user of id=5

现在您的控制器将与该特定对象进行交互以执行您想要的操作:

public function restore(User $deletedUser, ManageUserRequest $request)
{
    $deletedUser->delete(); // for example
}

答案 1 :(得分:1)

这里发生了两件事:参数(docs)和模型绑定(docs

首先,在['prefix' => 'user/{deletedUser}']中,您可以看到您正在从网址解析参数。这样,当有人导航到api/user/3时,laravel会将3传递给您的路由处理程序。

其次,获取User模型实例而不仅仅获取id数字会非常好。这是可能的,它被称为&#34;模型绑定&#34;。模型绑定可以是

  • 您在boot类中将绑定添加到RouteServiceProvider方法,告诉laravel参数的预期类型是什么。

    public function boot()
    {
        parent::boot();
    
        Route::model('deletedUser', App\User::class);
        // in older docs I've seen 'App\User' passed as a string instead of as a class
    }
    
  • Laravel会根据类型提示自动确定您需要的型号。

    public function restore(User $deletedUser, ManageUserRequest $request) {}
    

    此处,$deletedUser的类型暗示为User。 Laravel看到了这一点,因此它将继续为您转换idEloquent模型。

您似乎正在使用隐式绑定,但请随时查看您的RouteServiceProvider课程。

查看文档链接以获取更多详细信息,它编写得非常好。 (如果您未使用5.6版,则只需更改链接中的版本号。)

答案 2 :(得分:1)

您只需将用户的ID作为参数传递。

这个功能

public function restore(User $deletedUser, ManageUserRequest $request)

您可以看到$deletedUser类型为User,Laravel将在id表中搜索$deletedUserUsers}并返回该用户的对象

如果您不想要用户对象,只需要将ID功能传递给

restore()
 public function restore($deletedUser, ManageUserRequest $request)