#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. да, определенно, вы можете добавить несколько таблиц