【问题标题】:Bind posted data to a model in Laravel 5.4将发布的数据绑定到 Laravel 5.4 中的模型
【发布时间】:2017-11-21 06:37:47
【问题描述】:

我看到了关于这个问题的其他主题,没有解决。

所以在 Laravel 5.4 Route Model Binding 中,我们可以将路由绑定到模型,如下所示:

在web.php中定义路由:

web.php

Route::get('/users/{user}', UsersController@show);

UsersController@show

public function show(User $user){
    // now we already have access to $user because of route model binding
    // so we don't need to use User::find($user), we just return it:
    return view(users.show, compact('user'));
}

上面的代码可以正常工作,所以在我们的控制器中我们可以在不找到用户的情况下返回 $user,我们已经有了它。

但想象一下:

web.php

Route::patch('/users/archive', UsersController@archive);

已编辑: 现在上面的行创建了一个 patch 路由,我们在路由 url 中没有 {user},用户id 正在通过表单发布。

UsersController@archive

public function archive(Request $request, User $user){
    // how can I access the $user here without using User::find($user);
    // I get to this action via a form which is posting `user` as a value like `5`
    dd($request->user); // this now echo `5`
    // I can do:
    // $user = User::find($request->user);
    // and it works, but is there a way to not repeat it every time in every action
}

我尝试过的: 在 RouteServiceProvider::boot() 我有:

Route::model('user', 'App\User');

以上是我在谷歌上找到的,但不起作用。

我将不胜感激。


编辑: 它似乎不再被称为Route Model Binding,因为我们在route 中没有{user},那是因为我的代码不起作用,user 变量被posted 到控制器,它只是可通过$request->user访问。

这个路由模型绑定:

Route::patch('users/{user}/archive', UsersController@archive);

不是

Route::patch('users/archive', UsersController@archive);

因为我们没有{user},它是通过表单posted 并且只能通过$request->user 访问。 (路由模型绑定的定义如有错误请指正)

所以:

简而言之,我想要实现的目标:在发送到我的UsersController 的每个请求中,如果我将user 变量作为post 变量发送,它必须绑定到User::findOrFail($request->user) 然后@987654342 @ 必须在我的控制器操作中可用。

我想实现这一点,因为在每一个动作中我都在重复自己做User::findOrFail($request->user) 而我不想这样做,所以我想检查每个请求是否有variable namemodel name ,它们应该是有界的。

【问题讨论】:

  • 你试过public function archive(Request $request, User $user)
  • @AliRasheed 是的,不工作
  • 试试dd($request->all())
  • @aldrin27 它显示了所有发布的数据,我还有"user" => "5"
  • @aldrin27 但是当我这样做时:dd($user->id) 它是null,所以绑定不起作用

标签: php laravel laravel-5 eloquent


【解决方案1】:

你可以试试这个吗?

公共函数存档(请求 $request, $u = User::find($user){

//现在变量 $u 应该从 url 指向具有 id 的用户

}

【讨论】:

  • 你作弊了 :)))))) 这不是路由模型绑定!
  • 不,这样做似乎是个错误,` (1/1) FatalErrorException 语法错误,意外的 '(',期待 ')'`
【解决方案2】:

无需显式绑定到User 类,因此应删除Route::model('user', 'App\User');;类型提示应该足够了。

public function archive(Request $request, User $user) { ... }

应该可以工作,只要确保您在文件顶部导入正确的 User 类 (use App\User;)。

那么模型在你的$user变量(方法参数)中,试试dd($user)


现在很清楚,由于 {user} 变量不在 URI 中,这不是路由模型绑定问题。您只希望根据请求的内容将 User 实例作为参数注入。

$this->app->bind(User::class, function () {
    $user_id = request('user') ?: request()->route('user');
    return User::findOrFail($user_id);
});

您可以将其添加到 AppServiceProvider(或任何其他注册的提供程序)中的 register 方法中以注入模型。我留给你把它推广到其他模型类。

【讨论】:

  • 嗯,是的,它应该工作,但它不是!您是否在postpatch 方法中尝试过这个?因为我在 laracasts 中读到,您定义的路线中的变量名称必须是您的模型名称才能正常工作;这就是为什么我可以让它在get 路由中工作,因为我定义了类似Route::get('/users/{user}', UserController@show) 的路由,但在这种情况下,因为它是patch 路由Route::patch('/users/{user}/archive', UsersController@archive) 并且我没有类似{user} 的东西路线,这就是为什么它不起作用!请您在patch 路线中检查它吗?谢谢
  • 路由模型绑定在路由中的变量名称作为模型名称时起作用,因为我可以让它在 get 路由中工作:Route::get('users/{user}/archive'@UserController@archive),这是因为我有 @路由中的 987654341@ 并且您的代码在这种情况下有效,但是在补丁路由中:Route::patch('/users/archive', UsersController@archive) 我没有 {user},那是因为路由模型绑定不起作用!所以在我的情况下,当 user 被发布到控制器并且它不在路由 url 中时,我该如何使用路由模型绑定?
  • 简而言之,我想要实现的目标:在发送到我的UsersController 的每个请求中,如果我将user 变量作为post 变量发送,它必须绑定到@987654348 @ 并且它必须在我的控制器操作中可用。
  • @behz4d 哦,是的,如果参数不在路由中,那么它不是路由模型绑定。我正在用 2 个选项更新我的答案来做你想做的事
  • @behz4d 对,我也更新了处理路由绑定的答案。路由参数(路由定义中的'{user}' 部分)应该与您在方法签名中为变量指定的名称(User $user)相匹配。相反,您可以使用任何其他名称(Route::get('/{u}', ...))并使用Route::model('u', User::class) 注册该名称,然后在方法签名User $anyOtherName 中注册,它将被正确注入
【解决方案3】:

您的控制器中甚至不需要(Request $request)
如果您正确导入了 User 类,正如 alepeino 所说,您可以使用以下语法 $user-><value> 从 Model 访问所有用户值,例如:

public function archive(User $user) { 
  $userId = $user->id;
}


根据更新。
如果你使用 POST 请求,你可以使用request()->get('<variable you send as parameter>')这样的代码访问它的数据
例如:

public function archive() { 
  $userId = request()->get('user');
  $userInfo = User::find($userId); 
  //Or as you said
 $user = User::findOrFail(request()->get('user'));
}

【讨论】:

  • 好吧,他们可能需要保存补丁数据的 $request。 (除非他们更喜欢从外观或“辅助函数”中获取)
  • 路由模型绑定在路由中的变量名称作为模型名称时起作用,因为我可以让它在 get 路由中工作:Route::get('users/{user}/archive'@UserController@archive),这是因为我在路由中有{user},您的代码在这种情况下可以工作,但是在补丁路由中:Route::patch('/users/archive', UsersController@archive) 我没有{user},那是因为路由模型绑定不起作用!所以在我的情况下,当 user 被发布到控制器并且它不在路由 url 中时,我该如何使用路由模型绑定?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 2017-06-27
  • 2019-10-19
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
相关资源
最近更新 更多