Ошибка при попытке получить свойство Необъекта - PullRequest
0 голосов
/ 04 октября 2019

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

Я использую другую логику, но для меня это не работает. Вот мой код

UserModel :

public function role(){
    return $this->belongsTo(\App\Role::class);
}

RoleModel :

public function users(){
    return $this->hasMany(\App\User::class);
}

AdminController :

public function __construct()
{
    return $this->middleware(['auth','CheckAdmin']);
}

public function index(){
    //$adminUsers = User::with('roles')->where('id',auth()->user()->id)->get();
    //dd($adminUsers);
    return view('backend.admin.index');
}

CheckAdminMiddleware :

public function handle($request, Closure $next)
{
    if(Auth::user()->role->name == 'Admin'){
        return redirect('/admin')->with('message', "Successfully Login");
    }
    return $next($request);

}

My UserTable:

    $table->increments('id');
    $table->unsignedInteger('role_id')->default(1);
    $table->string('name');
    $table->string('username')->unique();
    $table->string('email')->unique();
    $table->string('phone_no',15)->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->enum('status', [0,1])->default(1);
    $table->timestamps();
    $table->softDeletes();

my roleTable:

Schema::create('roles', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name')->unique();
    $table->boolean('deletable')->default(true);
    $table->timestamps();
    $table->softDeletes();
});

Я получаю сообщение об ошибке в промежуточном программном обеспечении. что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 04 октября 2019

Вы ближе всего, чтобы получить результат. Поэтому попробуйте следующее:

  1. Сначала: удалите «return» из __construct следующим образом:
public function __construct()
{ 
    $this->middleware(['auth','CheckAdmin']); // without return keyword
}

Проверьте сейчас.

Убедитесь, что вы зарегистрировали это промежуточное ПО в конце $ routeMiddleware (в "app \ Http \ Kernel.php"), как это
protected $routeMiddleware = [
     // ...
     'CheckAdmin'=> CheckAdminMiddleware::class,
];

и запуститеmsgstr "php artisan config: cache".

Если это то же самое, то просто удалите "CheckAdmin" из __contstruct () следующим образом:
public function __construct()
{
    $this->middleware(['auth']);
}

И присоедините это промежуточное ПО в маршрутах (вместо контроллера), вот так:

Route::group([
    'as'     => 'admin.',
    'prefix'     => 'admin',
    'middleware' => [
        'checkAdmin', // THE THING
    ],
], function () {

    Route::get('dashboard', 'Admin\DashboardController@dashboard');
0 голосов
/ 04 октября 2019

если вы знакомы с отношениями laravel, то вы будете знать, что отношения many-to-many вернут

Illuminate\Support\Collection

Таким образом, вы можете использовать метод Contains https://laravel.com/docs/5.8/collections#method-contains

Вставьте следующий код в UserModel

public function hasRole($role)
    {
        return $this->roles()->get()->pluck('name')->contains($role);
    }

и код промежуточного программного обеспечения

public function handle($request, Closure $next)
{
    if(Auth::user()->hasRole('Admin')){
        return redirect('/admin')->with('message', "Successfully Login");
    }
    return $next($request);
}

Итак, мы получаем roles of Auth User и проверяем егос массивом (роли) , который содержит данный (роль)

0 голосов
/ 04 октября 2019

Потому что ваша Auth::user()->role возвращает коллекцию вместо объекта. Вам следует позвонить Auth::user()->role['name'].

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