Auth: user () возвращает NULL в приложении множественной аутентификации - PullRequest
0 голосов
/ 29 января 2019

Я работаю в мультиавтоматическом приложении в Laravel 5.7.На данный момент у меня есть два типа пользователей (пользователи и магазины), но я не могу показать имя пользователя в макете блейда, когда я работаю с магазинами.Я получаю это сообщение об ошибке: «Попытка получить свойство« имя »необъекта»

Я уже заверил, что работаю с зашедшим в магазин магазином.Я использую директиву blade-сервера, чтобы показать опции некоторых меню магазина, а также она работает, когда я использую auth ('shop') -> user () -> name вместо Auth :: user () -> name.

Мой код:

Класс RegisterController, который создает новый магазин:

<?php
namespace App\Http\Controllers\Shop\Auth;

use App\Model\Shop\Shop;
use App\Model\Shop\ShopType;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;

class RegisterController extends Controller
{



use RegistersUsers;
/**
 * Where to redirect users after registration.
 *
 * @var string
 */
protected $redirectTo = '/shop/typeSelection';
/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('guest:shop');
}
/**
 * Get a validator for an incoming registration request.
 *
 * @param  array  $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'cif' => ['required', 'max:9', 'unique:shops'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:shops'],
        'password' => ['required', 'string', 'min:6', 'confirmed'],
        'accept_conditions' => ['required'],
    ]);
}
/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return \App\Model\Shop\Shop
 */
protected function create(array $data)
{
    $shopType = ShopType::where("description","=",'Free')->select("id") -> first() -> id;

    return Shop::create([
        'name' => $data['name'],
        'cif'   => $data['cif'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
        'active' => false,
        'activation_code' => $data['activation_code'],
        'shop_type' => $shopType, //Siempre la creamos como free pero inactiva.
    ]);
}
/**
 * Handle a registration request for the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function register(Request $request)
{
    $this->validator($request->all())->validate();

    $request['activation_code'] = str_random(30).time();

    event(new Registered($user = $this->create($request->all())));

    $this->guard()->login($user);

    return $this->registered($request, $user)
        ?: redirect($this->redirectPath());

}
/**
 * Get the guard to be used during authentication.
 *
 * @return \Illuminate\Contracts\Auth\StatefulGuard
 */
protected function guard()
{
    return Auth::guard('shop');
}
}

Model Shop:

<?php

namespace App\Model\Shop;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Shop extends Authenticatable
{
use Notifiable;

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = [
    'name', 'cif', 'email', 'password', 'activation_code', 'active', 'shop_type'
];

/**
 * The attributes that should be hidden for arrays.
 *
 * @var array
 */
protected $hidden = [
    'password', 'remember_token',
];

/**
 * Atributos boleanos para que se haga la conversion de 0 y 1 a bool.
 *
 * @var array
 */
protected $casts = [
    "active" => "boolean",
];

/**
 * Relacion de Eloquent
 *
 */
public function shopType()
{
    return $this->belongsTo(ShopType::class);
}

/**
 * Para saber el tipo de usuario autenticado
 *
 *
 * @return boolean
 */
public function isUser()
{
    return false;
}

/**
 * Para saber el tipo de usuario autenticado
 *
 *
 * @return boolean
 */
public function isShop()
{
    return true;
}

/**
 * Para saber el tipo de usuario autenticado
 *
 *
 * @return boolean
 */
public function isAdmin()
{
    return false;
}
}

Config / Auth.php Строки защиты:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],

    'shop' => [
        'driver' => 'session',
        'provider' => 'shops',
    ],
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],

    // 'users' => [
    //     'driver' => 'database',
    //     'table' => 'users',
    // ],
    'shops' =>[
        'driver' => 'eloquent',
        'model' => App\Model\Shop\Shop::class,
    ],
], 

'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'password_resets',
        'expire' => 60,
    ],

    'shops' => [
        'provider' => 'shops',
        'table' => 'password_resets',
        'expire' => 60,
    ],
],

Внешний вид макета (только тело):

<body>
<div class="app ">
    <nav class="navbar navbar-light bg-light justify-content-between">
        <div class="container-fluid">
            <div class="col-md-2">
                <a class="navbar-brand" href="{{ url('/') }}">
                    <img src="{{asset('img/logo/logo_75x100.png')}}" alt="{{ __('app/navbar.altLogo') }}">
                </a>
            </div>
            <div class="col-md-6">
                <div class="input-group md-form form-sm form-2 pl-0">
                    <input class="form-control my-0 py-1 amber-border" type="text" placeholder="{{ __('app/navbar.searchText') }}" aria-label="Search">
                    <div class="input-group-append">
                        <span class="input-group-text amber lighten-3" id="basic-text1"><i class="fas fa-search ic-navbar" aria-hidden="true"></i></span>
                    </div>
                </div>
            </div>
            @logued
                <div class="col-md-1">
                    <a href="#">
                        <i class="fas fa-user mr-sm-1 ic-navbar">&nbsp;{{Auth::user()->name }}</i>
                    </a>
                </div>
                <div class="col-md-1">
                    <a href="{{ route('logout') }}"
                       onclick="event.preventDefault();
                                                 document.getElementById('logout-form').submit();">
                        <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
                            @csrf
                        </form>
                        <i class="fas fa-sign-out-alt mr-sm-1 ic-navbar">&nbsp;Logout</i>
                    </a>
                </div>
            @else
            <div class="col-md-1">
                <a href="{{ route('login') }}">
                    <i class="fas fa-sign-in-alt  mr-sm-1 ic-navbar" aria-hidden="true">
                        &nbsp;Login
                    </i>
                </a>
            </div>
            <div class="col-md-1">
                <a href="{{ route('register') }}">
                    <i class="fas fa-user-plus  mr-sm-1 ic-navbar">&nbsp;Register</i>
                </a>
            </div>

            @endlogued


            <div class="col-md-1">
                <i class="fas fa-shopping-cart  mr-sm-1 ic-navbar">&nbsp;Cart</i>
            </div>
            <div class="col-md-1">
                <i class="fas fa-globe  mr-sm-1 ic-navbar">&nbsp;Lang</i>
            </div>



        </div>
    </nav>

    @auth
        <p>Soy autorizado</p>
    @elseauth
        <p>No soy autorizado</p>
    @endauth

    @guest
        <p>soy invitado</p>
    @elseguest
        <p>No soy invitado</p>
    @endguest

    <main class="py-4">
        @yield('content')
    </main>
</div>
</body>

Я ожидаю, что имя пользователя магазина часов вместо сообщения об ошибке.Как я уже сказал, я получаю ожидаемый результат, используя auth ('shop') -> user () -> name вместо Auth :: user () -> name.Я также работал в похожем проекте несколько месяцев назад, где этой проблемы не было, и проверяя ее, у меня тот же код.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Я снова проверил свой старый проект, и я использую Auth :: user (), и он работает с тремя различными типами аутентификации.Я пытаюсь вспомнить, как я это делаю, но это сложно, это был мой первый проект Laravel, и я проверяю каждый пример, который смотрю онлайн ...

0 голосов
/ 29 января 2019

Я не могу быть уверен, не проверив ваш старый проект.Но эта проблема может возникнуть из-за множественной аутентификации.Auth :: user () по умолчанию проверяет «веб» охрану.Но когда вы вошли в систему с охранником «магазина»;пользовательская функция возвращала NULL.

Хорошей практикой является явное определение охранника.Вы можете следить за этим обсуждением для более подсказок .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...