Laravel 5请求:授权然后将对象解析为控制器

时间:2015-04-21 09:49:32

标签: php laravel laravel-5

我不确定我是否正确使用此功能,但我正在利用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请求时,如何最好地处理两次使用该对象?我是否可能过度扩展应用程序的功能?可以将对象存储在应用程序类中,以便稍后可以在我的控制器中访问它吗?

2 个答案:

答案 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;
}