我不确定我是否正确使用此功能,但我正在利用Laravel 5中的请求来检查用户是否已登录以及他是否是对象的所有者。为此,我需要在请求类中获取实际对象,但是我需要在控制器中获取相同的对象?
因此,我想,为什么不将对象设置为请求类中的变量,使控制器可以访问它,而不是两次获取它?
它有效,但我觉得很脏?有没有更合适的方法来解决这个问题?
实施例。 请求类
class DeleteCommentRequest extends Request {
var $comment = null;
public function authorize() {
$this->comment = comment::find(Input::get('comment_id'));
$user = Auth::user();
if($this->comment->user == $user)
return true;
return false;
}
public function rules() {
return [
'comment_id' => 'required|exists:recipes_comments,id'
];
}
}
实施例。的控制器:
public function postDeleteComment(DeleteCommentRequest $request) {
$comment = $request->comment;
$comment->delete();
return $comment;
}
那么我的问题是什么?在使用新的Laravel 5请求时,如何最好地处理两次使用该对象?我是否可能过度扩展应用程序的功能?可以将对象存储在应用程序类中,以便稍后可以在我的控制器中访问它吗?
答案 0 :(得分:1)
我需要查询本身的所有权,然后检查集合是否为空。
class DeleteCommentRequest extends Request {
var $comment = null;
public function authorize() {
$this->comment = comment::where('id',Input::get('comment_id'))->where('user_id',Auth::id())->first();
if($this->comment->is_empty())
return false;
return true;
}
public function rules() {
return [
'comment_id' => 'required|exists:recipes_comments,id'
];
}
}
答案 1 :(得分:1)
由于您希望在两个不同的地方使用模型,但只有在我重新开始使用route-model binding时才查询它。
在RouteServiceProvider类(或任何相关提供程序)中,您需要从引导方法内部绑定注释查询。 bind()的第一个参数是与路由中的通配符匹配的值。
public function boot()
{
app()->router->bind( 'comment_id', function ($comment_id) {
return comment::where('id',$comment_id)->where('user_id',Auth::id())->first();
} );
}
设置完成后,您可以从DeleteCommentRequest访问模型,如此
$this->comment_id
注意:变量是Comment_id,因为它与您的路线匹配,但它将包含实际模型。
从你的控制器你只需要注入它
public function postDeleteComment(Comment $comment, DeleteCommentRequest $request) {
$comment->delete();
return $comment;
}