повторите таблицу отношений в запросе на вход с помощью laravel breeze

#laravel #authentication #laravel-8 #laravel-breeze

Вопрос:

Здравствуйте, я хочу включить свои роли в таблице отношений при входе в систему. Я использовал Laravel Breeze для аутентификации.

Models/User.php

  namespace AppModels;  use IlluminateContractsAuthMustVerifyEmail; use IlluminateDatabaseEloquentFactoriesHasFactory; use IlluminateFoundationAuthUser as Authenticatable; use IlluminateNotificationsNotifiable; use LaravelSanctumHasApiTokens;  class User extends Authenticatable {  use HasApiTokens, HasFactory, Notifiable;   /**  * The attributes that are mass assignable.  *  * @var string[]  */  protected $fillable = [  'name',  'email',  'password',  ];   /**  * The attributes that should be hidden for serialization.  *  * @var array  */  protected $hidden = [  'password',  'remember_token',  ];   /**  * The attributes that should be cast.  *  * @var array  */  protected $casts = [  'email_verified_at' =gt; 'datetime',  ];   //old  public function bookmarks(){  return $this-gt;hasMany('AppModelPost','post_bookmarks','user_id','post_id')-gt;get();  }    public function roles(){  return $this-gt;belongsTo('AppModelsRoles','roles','role_id','id');  } }  

AuthenticatedSessionController.php

  namespace AppHttpControllersAuth;  use AppHttpControllersController; use AppHttpRequestsAuthLoginRequest; use AppProvidersRouteServiceProvider; use IlluminateHttpRequest; use IlluminateSupportFacadesAuth;  class AuthenticatedSessionController extends Controller {  /**  * Display the login view.  *  * @return IlluminateViewView  */  public function create()  {  return view('auth.login');  }   /**  * Handle an incoming authentication request.  *  * @param AppHttpRequestsAuthLoginRequest $request  * @return IlluminateHttpRedirectResponse  */  public function store(LoginRequest $request)  {  $request-gt;authenticate();   $request-gt;session()-gt;regenerate();   return redirect()-gt;intended(RouteServiceProvider::HOME);  }   /**  * Destroy an authenticated session.  *  * @param IlluminateHttpRequest $request  * @return IlluminateHttpRedirectResponse  */  public function destroy(Request $request)  {  Auth::guard('web')-gt;logout();   $request-gt;session()-gt;invalidate();   $request-gt;session()-gt;regenerateToken();   return redirect('/');  } }  

LoginRequest.php

  namespace AppHttpRequestsAuth;  use IlluminateAuthEventsLockout; use IlluminateFoundationHttpFormRequest; use IlluminateSupportFacadesAuth; use IlluminateSupportFacadesRateLimiter; use IlluminateSupportStr; use IlluminateValidationValidationException;  class LoginRequest extends FormRequest {  /**  * Determine if the user is authorized to make this request.  *  * @return bool  */  public function authorize()  {  return true;  }   /**  * Get the validation rules that apply to the request.  *  * @return array  */  public function rules()  {  return [  'email' =gt; ['required', 'string', 'email'],  'password' =gt; ['required', 'string'],  ];  }   /**  * Attempt to authenticate the request's credentials.  *  * @return void  *  * @throws IlluminateValidationValidationException  */  public function authenticate()  {  $this-gt;ensureIsNotRateLimited();   if (! Auth::attempt($this-gt;only('email', 'password'), $this-gt;boolean('remember'))) {  RateLimiter::hit($this-gt;throttleKey());   throw ValidationException::withMessages([  'email' =gt; __('auth.failed'),  ]);  }   RateLimiter::clear($this-gt;throttleKey());  }   /**  * Ensure the login request is not rate limited.  *  * @return void  *  * @throws IlluminateValidationValidationException  */  public function ensureIsNotRateLimited()  {  if (! RateLimiter::tooManyAttempts($this-gt;throttleKey(), 5)) {  return;  }   event(new Lockout($this));   $seconds = RateLimiter::availableIn($this-gt;throttleKey());   throw ValidationException::withMessages([  'email' =gt; trans('auth.throttle', [  'seconds' =gt; $seconds,  'minutes' =gt; ceil($seconds / 60),  ]),  ]);  }   /**  * Get the rate limiting throttle key for the request.  *  * @return string  */  public function throttleKey()  {  return Str::lower($this-gt;input('email')).'|'.$this-gt;ip();  } }  

Я использовал Laravel-breeze для аутентификации. Все это работает нормально, но я также хочу добавить имя роли, когда пользователь войдет в систему. Как вы можете видеть, я также использовал отношения, но я не понимаю, где я могу написать код, чтобы получить свою таблицу отношений. Это мой код, Может кто-нибудь, пожалуйста, сказать мне, как я могу это сделать?

Например, адрес электронной почты для входа: poojan@gmail.com идентификатор роли = 1

в таблице ролей идентификатор: 1, имя_роли = «Целеуказатель»

Поэтому, когда я вошел в систему в данный момент, я получаю данные пользователя, но мне также нужны данные таблицы ролей.

заранее спасибо

Комментарии:

1. Итак, вы хотите прикрепить роль к пользователю, верно ??

2. Нет, я уже назначаю роль всем пользователям, но когда пользователь входит в систему, я тоже хочу получить имя роли.

3. Значит, вам нужно перенаправлять в зависимости от роли, верно ??

4. Весь предоставленный вами код уже встроен в фреймворк. Можете ли вы рассказать мне, что вы пробовали до сих пор

5. Когда я вошел в систему, мне тоже нужны данные сводной таблицы пользователей, как вы можете видеть в примере.

Ответ №1:

вы можете использовать атрибут в своей пользовательской модели

 protected $appends = ['role_name'];  public function getRoleNameAttribute() {  return $this-gt;roles-gt;first()-gt;role_name ?? 'N/A'; }  

используя приведенный выше код, вы получите атрибут role_name в экземпляре пользователя

если вы хотите, чтобы данные ролей были связаны с пользовательскими данными, попробуйте сделать это в модели пользователя

 protected $with = ['roles'];  

Комментарии:

1. Отлично, это работает. Я использовал protected $with = [‘роли’]; все данные таблицы ролей. Огромное спасибо. Могу ли я добавить дополнительные таблицы в $с, например, $с = [«роли», «продукты»]; ?

2. да, определенно, вы можете добавить несколько таблиц