测试 Laravel 应用程序时,一个加载门如何定义?

ori*_*yan 5 php testing laravel laravel-5

我正在为 Laravel 应用程序编写测试。在我的 中,我根据数据库中的权限表AuthServiceProvider->boot()定义了许多用户能力。$gate->define()

基本上是这样的:

 foreach ($this->getPermissions() as $permission) {
            $gate->define($permission->name, function ($user) use ($permission) {
                return $user->hasPermission($permission->name);
            });
        }
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我正在动态创建权限,但AuthServiceProvider已经启动,这意味着我无法使用@canGate等验证用户权限。

有没有正确的方法来处理这个问题?

Hal*_*nex 0

你可以在里面做这样的事情AuthServiceProvider

首先导入必要的包

use Illuminate\Auth\Access\Gate;
use Illuminate\Contracts\Auth\Access\Gate as GateContract;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
Run Code Online (Sandbox Code Playgroud)

然后添加这个boot()方法

public function boot(GateContract $gate)
{
    parent::registerPolicies($gate);

    $gate->define('update-post', function ($user, $post, $isModerator) {
        // check if user id equals post user id or whatever
        if ($user->id === $post->user->id) {
            return true;
        }

        // you can define multiple ifs
        if ($user->id === $category->user_id) {
            return true;
        }

        if ($isModerator) {
            return true;
        }

        return false;
    });

    // you can also define multiple gates
    $gate->define('update-sub', function($user, $subreddit) {
        if($user->id === $subreddit->user->id) {
            return true;
        }

        return false;
    });
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中你可以做这样的事情

if (Gate::denies('update-post', [$post, $isModerator])) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)