Projets Laravel France
Appel d'une methode indefini et erruer de relation
BarnabéTebda
Bonjour à tous. Je suis en train de la gestion des utilisateurs, et je reçois quelques erreurs que 'ai tenté de regler mais vainement. l'erreur suivante s'affiche si je veux creer un utilisateur "Call to undefined method App\User::assignRole()" et celle ci quand je veux editer un utilisateur "Call to undefined relationship [roles] on model [App\User]"
Ceci est le code du modele Role
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Spatie\Activitylog\Traits\LogsActivity;
class Role extends Model
{
use LogsActivity;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['name', 'label'];
/**
* A role may be given various permissions.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
/**
* Grant the given permission to a role.
*
* @param Permission $permission
*
* @return mixed
*/
public function givePermissionTo(Permission $permission)
{
return $this->permissions()->save($permission);
}
/**
* Change activity log event description
*
* @param string $eventName
*
* @return string
*/
public function getDescriptionForEvent($eventName)
{
return __CLASS__ . " model has been {$eventName}";
}
}
Ceci est le code du modele User
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
Pour le controller UserController
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Role;
use App\User;
use Illuminate\Http\Request;
class UsersController extends Controller
{
/**
* Display a listing of the resource.
*
* @return void
*/
public function index(Request $request)
{
$keyword = $request->get('search');
$perPage = 15;
if (!empty($keyword)) {
$users = User::where('name', 'LIKE', "%$keyword%")->orWhere('email', 'LIKE', "%$keyword%")
->latest()->paginate($perPage);
} else {
$users = User::latest()->paginate($perPage);
}
return view('admin.users.index', compact('users'));
}
/**
* Show the form for creating a new resource.
*
* @return void
*/
public function create()
{
$roles = Role::select('id', 'name', 'label')->get();
$roles = $roles->pluck('label', 'name');
return view('admin.users.create', compact('roles'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
*
* @return void
*/
public function store(Request $request)
{
$this->validate(
$request,
[
'name' => 'required',
'email' => 'required|string|max:255|email|unique:users',
'password' => 'required',
'roles' => 'required'
]
);
$data = $request->except('password');
$data['password'] = bcrypt($request->password);
$user = User::create($data);
foreach ($request->roles as $role) {
$user->assignRole($role);
}
return redirect('admin/users')->with('flash_message', 'User added!');
}
/**
* Display the specified resource.
*
* @param int $id
*
* @return void
*/
public function show($id)
{
$user = User::findOrFail($id);
return view('admin.users.show', compact('user'));
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
*
* @return void
*/
public function edit($id)
{
$roles = Role::select('id', 'name', 'label')->get();
$roles = $roles->pluck('label', 'name');
$user = User::with('roles')->select('id', 'name', 'email')->findOrFail($id);
$user_roles = [];
foreach ($user->roles as $role) {
$user_roles[] = $role->name;
}
return view('admin.users.edit', compact('user', 'roles', 'user_roles'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
*
* @return void
*/
public function update(Request $request, $id)
{
$this->validate(
$request,
[
'name' => 'required',
'email' => 'required|string|max:255|email|unique:users,email,' . $id,
'roles' => 'required'
]
);
$data = $request->except('password');
if ($request->has('password')) {
$data['password'] = bcrypt($request->password);
}
$user = User::findOrFail($id);
$user->update($data);
$user->roles()->detach();
foreach ($request->roles as $role) {
$user->assignRole($role);
}
return redirect('admin/users')->with('flash_message', 'User updated!');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
*
* @return void
*/
public function destroy($id)
{
User::destroy($id);
return redirect('admin/users')->with('flash_message', 'User deleted!');
}
}
Pour le contrroleur RoleController
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Role;
use App\Permission;
use Illuminate\Http\Request;
class RolesController extends Controller
{
/**
* Display a listing of the resource.
*
* @return void
*/
public function index(Request $request)
{
$keyword = $request->get('search');
$perPage = 15;
if (!empty($keyword)) {
$roles = Role::where('name', 'LIKE', "%$keyword%")->orWhere('label', 'LIKE', "%$keyword%")
->latest()->paginate($perPage);
} else {
$roles = Role::latest()->paginate($perPage);
}
return view('admin.roles.index', compact('roles'));
}
/**
* Show the form for creating a new resource.
*
* @return void
*/
public function create()
{
$permissions = Permission::select('id', 'name', 'label')->get()->pluck('label', 'name');
return view('admin.roles.create', compact('permissions'));
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
*
* @return void
*/
public function store(Request $request)
{
$this->validate($request, ['name' => 'required']);
$role = Role::create($request->all());
$role->permissions()->detach();
if ($request->has('permissions')) {
foreach ($request->permissions as $permission_name) {
$permission = Permission::whereName($permission_name)->first();
$role->givePermissionTo($permission);
}
}
return redirect('admin/roles')->with('flash_message', 'Role added!');
}
/**
* Display the specified resource.
*
* @param int $id
*
* @return void
*/
public function show($id)
{
$role = Role::findOrFail($id);
return view('admin.roles.show', compact('role'));
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
*
* @return void
*/
public function edit($id)
{
$role = Role::findOrFail($id);
$permissions = Permission::select('id', 'name', 'label')->get()->pluck('label', 'name');
return view('admin.roles.edit', compact('role', 'permissions'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
*
* @return void
*/
public function update(Request $request, $id)
{
$this->validate($request, ['name' => 'required']);
$role = Role::findOrFail($id);
$role->update($request->all());
$role->permissions()->detach();
if ($request->has('permissions')) {
foreach ($request->permissions as $permission_name) {
$permission = Permission::whereName($permission_name)->first();
$role->givePermissionTo($permission);
}
}
return redirect('admin/roles')->with('flash_message', 'Role updated!');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
*
* @return void
*/
public function destroy($id)
{
Role::destroy($id);
return redirect('admin/roles')->with('flash_message', 'Role deleted!');
}
}
Pour le mode HasRole.php
<?php
namespace App;
trait HasRoles
{
/**
* A user may have multiple roles.
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function roles()
{
return $this->belongsToMany(Role::class);
}
/**
* Assign the given role to the user.
*
* @param string $role
*
* @return mixed
*/
public function assignRole($role)
{
return $this->roles()->save(
Role::whereName($role)->firstOrFail()
);
}
/**
* Determine if the user has the given role.
*
* @param mixed $role
*
* @return boolean
*/
public function hasRole($role)
{
if (is_string($role)) {
return $this->roles->contains('name', $role);
}
if (is_array($role)) {
foreach ($role as $r) {
if ($this->hasRole($r)) {
return true;
}
}
return false;
}
return !!$role->intersect($this->roles)->count();
}
/**
* Determine if the user may perform the given permission.
*
* @param Permission $permission
*
* @return boolean
*/
public function hasPermission(Permission $permission)
{
return $this->hasRole($permission->roles);
}
}
Merci d'avance.
Posté il y a 4 ans
bestmomo
Salut,
Il me semble que le trait n'est pas définit dans le modèle User :
class User extends Authenticatable
{
use HasRoles;
Posté il y a 4 ans
Vous ne pouvez pas répondre à ce sujet.