Gate::allows 在 Laravel 5.3 中不工作
Gate::allows not working in Laravel 5.3
我在 Laravel 5.3 上使用新的 Gate::allows
方法有问题。
这是我的 AuthServiceProvider.php
测试:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Gate::define('settings', function ($user)
{
return true;
});
}
}
通常,无论用户的角色如何,每个人都可以访问设置。
但这总是显示 'no' 而不是 'ok'。
<?php
namespace App\Http\Controllers;
use Gate;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class SettingsController extends Controller
{
public function __construct(Request $request)
{
echo Gate::allows('settings') ? 'ok' : 'no';
}
}
从 Laravel 5.3 开始,我们无法访问控制器构造函数中的会话或经过身份验证的用户,如 upgrade guide
中所述
由于 Gate
facades 使用 User
模型,它可能会尝试访问用户,但它尚未在控制器的构造函数中准备就绪
因此,您应该考虑使用中间件来检查 Gate
。您还可以直接在控制器构造函数中使用基于闭包的中间件:
public function __construct(Request $request)
{
$this->middleware(function ($request, $next) {
echo Gate::allows('settings') ? 'ok' : 'no';
});
}
您必须获得授权。如果 laravel 没有看到用户,它 returns false。
我遇到了同样的问题,据我所知 AuthServiceProvider 是在 \App\Providers 下的命名空间所以如果你把 类 在没有全局命名空间的 $policies 属性中,它们也被命名为 \App\Providers .. 所以在你的情况下 \App\Providers\App\Model 和 \App\Providers\Policies\ModelPolicy.
总而言之,尝试这样的 $policies 属性:
protected $policies = [
\App\Model::class => \App\Policies\ModelPolicy::class,
];
希望对您有所帮助:)
PS。第一次来activity,大家好,新年快乐
您必须获得授权。如果 laravel 看不到用户,则 returns 错误。或者你使用守卫。我有它是因为这个并且有类似的问题。
我在 Laravel 5.3 上使用新的 Gate::allows
方法有问题。
这是我的 AuthServiceProvider.php
测试:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Gate::define('settings', function ($user)
{
return true;
});
}
}
通常,无论用户的角色如何,每个人都可以访问设置。
但这总是显示 'no' 而不是 'ok'。
<?php
namespace App\Http\Controllers;
use Gate;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class SettingsController extends Controller
{
public function __construct(Request $request)
{
echo Gate::allows('settings') ? 'ok' : 'no';
}
}
从 Laravel 5.3 开始,我们无法访问控制器构造函数中的会话或经过身份验证的用户,如 upgrade guide
中所述由于 Gate
facades 使用 User
模型,它可能会尝试访问用户,但它尚未在控制器的构造函数中准备就绪
因此,您应该考虑使用中间件来检查 Gate
。您还可以直接在控制器构造函数中使用基于闭包的中间件:
public function __construct(Request $request)
{
$this->middleware(function ($request, $next) {
echo Gate::allows('settings') ? 'ok' : 'no';
});
}
您必须获得授权。如果 laravel 没有看到用户,它 returns false。
我遇到了同样的问题,据我所知 AuthServiceProvider 是在 \App\Providers 下的命名空间所以如果你把 类 在没有全局命名空间的 $policies 属性中,它们也被命名为 \App\Providers .. 所以在你的情况下 \App\Providers\App\Model 和 \App\Providers\Policies\ModelPolicy.
总而言之,尝试这样的 $policies 属性:
protected $policies = [
\App\Model::class => \App\Policies\ModelPolicy::class,
];
希望对您有所帮助:)
PS。第一次来activity,大家好,新年快乐
您必须获得授权。如果 laravel 看不到用户,则 returns 错误。或者你使用守卫。我有它是因为这个并且有类似的问题。