laravel 5.5。如何响应动作的重定向,而不是路由动作

时间:2018-02-14 15:41:39

标签: laravel response

我想在运行动作之前检查auth。如果用户拒绝,我将回复403状态。

我使用__construct中的方法函数来检查。

代码如下。

用户控制器:

public function __construct()
{


    if (!app()->runningInConsole()) {
        $beforeMethod = \Route::getCurrentRoute()->getActionMethod()."before";
        if (method_exists($this, $beforeMethod)) {
            return $this->$beforeMethod();
        }
    }

}

/**
 * Edit interface.
 *
 * @param $id
 * @return Content
 */
public function edit($id)
{


    return "success";
}

/**
 * Check user Auth
 * 
 * @return \Illuminate\Http\RedirectResponse
 */
public function editBefore()
{
    $id = \request()->route('user');
    if (Gate::denies('edit', User::find($id))) {

        return redirect("login");

    }
}

上面的代码,不要返回登录。

我应该用什么代码来实现我的目的?谢谢!

1 个答案:

答案 0 :(得分:0)

你真的很接近我会做的事情。我会使用Policies

您可以将这些添加到路由或路由组,以便在它到达控制器方法之前检查策略。

创建一个类似于:

的新策略类
class UserPolicy 
{
    public function canEdit(User $user) // this user is the logged in user
    {
        // Here you return true or false depending on whether they can edit or not.

        return $user->isAllowedToEdit();
    }
}

然后确保将该政策添加到AuthServiceProvider.php

public function boot(GateContract $gate)
{
    $gate->define('user.edit', UserPolicy::class.'@canEdit');
    // Additional policies
}

然后确保将can添加到$routeMiddleware中的Kernel.php

protected $routeMiddleware = [
    // other middleware
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
];

最后,您可以将其添加到路线中,确保使用您在AuthServiceProvider中定义的相同名称:

Route::get('/user/edit')
    ->uses('UserController@edit')
    ->middleware('can:user.edit');

我个人喜欢这样做,因为它清理控制器并让策略完成所有工作"幕后操作"。更好的是,您可以对多个路由使用相同的users.edit策略。