我正在尝试为用户设置策略。然而,我不断得到一个错误:
太少的参数功能应用\政策\用户政策::更新(),1传递 /vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php在第481行,正好2预期(视图: /resources/views/users/index.blade.php)
错误异常 /app/Policies/UserPolicy.php20
哪一个在地图上UserPolicy@update作用
当我以超级管理员的身份登录时,它工作正常,但每当我以不同角色的用户身份登录时,它就会抛出此错误。
下面是我目前的实现:
用户策略
class UserPolicy
{
use HandlesAuthorization;
public function update(User $user, User $userEdit) {
if ($user->id == $userEdit->id) {
return true;
}
return $user->can('update_user');
}
public function before($user, $ability) {
if ($user->hasRole('super_admin')) {
return true;
}
}
}
用户控制器
class UsersController extends Controller {
public function __construct() {
$this->middleware('auth');
}
public function edit(User $user) {
$this->authorize('update', $user);
return view('users.edit', [
'user' => User::with('roles', 'level')->find($user->id),
'surveys' => \App\Survey::all(),
]);
}
public function update(UserRequest $request, User $user) {
$this->authorize('update', $user);
$request->save();
session()->flash('success', 'User successfully updated');
// means user is editing his own profile
if (auth()->id() == $user->id) {
return redirect('/dashboard');
} else {
return redirect('/users');
}
}
}
用户请求
class UserRequest extends FormRequest {
public function authorize() {
return true;
}
public function rules() {
switch ($this->method()) {
case 'POST':
return [
'name' => 'required|string',
'email' => 'required|string|email|max:255|unique:users',
'role' => 'required|exists:roles,id',
'level' => 'required|string',
];
break;
case 'PATCH':
return [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users,email,'.$this->user->id,
'role' => 'sometimes|exists:roles,id',
'level' => 'sometimes|string',
'password' => 'nullable|sometimes|string|min:6|confirmed'
];
break;
default:
break;
}
}
public function save() {
switch (request()->method()) {
case 'POST':
$this->createUser();
break;
case 'PATCH':
$this->updateUser();
break;
default:
break;
}
}
protected function createUser() {
// random generate password
$password = str_random(8);
$user = User::create([
'name' => request('name'),
'email' => request('email'),
'level_id' => request('level'),
'password' => Hash::make($password),
]);
$user->assignRoleById(request('role'));
Mail::to($user)->send(new WelcomeMail($user, $password));
}
protected function updateUser() {
$user = User::findOrFail($this->user->id);
$user->name = request('name');
$user->email = request('email');
if (request('password') != '') {
$user->password = Hash::make(request('password'));
}
if (request('level') != '') {
$user->level_id = request('level');
}
$user->update();
if (request('role') != '') {
$user->roles()->sync([request('role')]);
}
}
}
AuthServiceProvider
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
\App\User::class => \App\Policies\UserPolicy::class,
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
foreach ($this->getPermissions() as $permission) {
Gate::define($permission->name, function($user) use ($permission) {
return $user->hasRole($permission->roles);
});
}
}
protected function getPermissions() {
return Permission::with('roles')->get();
}
}
在UserRequest
中,调用$user时没有给出任何参数-
试试这个:
$user-
编辑:我只是移动以下内容...
$this->authorize('update', $user);
$request->save();
session()->flash('success', 'User successfully updated');
// means user is editing his own profile
if (auth()->id() == $user->id) {
return redirect('/dashboard');
} else {
return redirect('/users');
}
...转到
updateUser()
函数。
在我的视图文件中,我正在呼叫
@can('update', App\User::class)
<!-- html code --!>
@endcan
而不是
@can('update', $user)
<!-- html code --!>
@endcan
我没有将用户实例传递给导致错误的函数。
当我将数据发送到MySQL数据库时,我在上遇到了这个错误 此错误: 函数App\Http\Controllers\Auth\LoginController::authenticated()的参数太少,在C:\xampp\htdocs\codecrowne\vendor\laravel\framework\src\light\Foundation\Auth\AuthenticatesUsers.ph
为了正确的管理组件的生命周期,Windsor 使用释放策略,就是负责保持对 Windsor 创建的组件的跟踪并且在需要的时候释放它们。 其约定由IReleasePolicy接口定义,并能够通过IKernel的ReleasePolicy属性访问。 var policy = container.Kernel.ReleasePolicy; container.Kernel.ReleasePolicy =
我试图在我的services.yaml中为ImageManager.php获取一个参数,但它不起作用,我无法解决此错误。 错误是这样的: 类型错误:参数太少,无法运行App\Manager\ImageManager::__construct(),0在C:\wamp64\www\SymfonyAPI\var\ache\dev\ContainerZxFSS5S\getImageManagerServi
刀片: 类AuthServiceProvider扩展了ServiceProvider: 它给我这个错误: 函数App\Providers\AuthServiceProvider::App\Providers{closure}(),在/var/www/html/vendor/laravel/framework/src/light/Auth/Access/Gate中传递的参数太少。第452行和第3行的
我是PHP和Laravel的初学者。我在我的项目Laravel 7中使用。我有存储库模式在我的项目与缓存。 PageServiceProvider: CachingBaseRepository: BaseRepository: PageRepository: 恶作剧记录片 PageRepositoryInterface: 我想在上面的代码中为我的网站添加缓存。我的控制器如下所示: 当我运行上述代码
我在服务中使用MongoRepository。在我的例子中,我有三个字段,它们的名字是“姓名”、“年龄”和“性别”。我可以在我的界面中使用以下方法来查询数据: 现在我想用这3个字段的每一个组合来查询数据,所以我需要在这里写7 (3 3 1)方法,它真的很难看。 我试着写些 如果输入只有两个字段:name=Chris,age=18,那么我可以调用 来获取Chris和18岁的人的名单。我怎样才能实现这