Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 02.10.2017 18:03:58

Не могу передать Модель User в конструктор контроллера

Laravel 5.5 винда7
я новичок.  все руты рабочие, логинюсь, регаюсь и т.д. с помощью (php artisan make:auth) за исключением вот этой группы:
проблема в следующем:
имеется рут '/admin'

Route::group(['prefix' => 'admin', 'middleware' => ['auth']], function () {
    Route::get('/', 'Admin\IndexController@index')->name('adminIndex');
    Route::resource('/articles', 'Admin\ArticlesController');
});

есть контроллер с конструктором.

use Illuminate\Support\Facades\Auth;
....
    public function __construct()
    {
//        $r = Auth::user();
//        dd($r);
        $this->user = Auth::user();
        if (!$this->user) {
            abort(403);
        }
    }

$this->user возвращает 403. если проверить через dd то в $r будет null.
в этом же контроллере, в любой другой функции если сделать проверку

$r = Auth::user();
dd($r);

модель пользователя отображается.
более того, если оставить проверку в __конструкторе, то (php artisan route:list) выдает ошибку [Symfony\Component\HttpKernel\Exception\HttpException]
и список рутов уже не формируется..

лично мои догадки, что middleware править надо. но че и как там править пока не понимаю..
пробовал менять auth на web результат такой же..
вот мой мидлварь

<?php

namespace Corp\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \Corp\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \Corp\Http\Middleware\TrustProxies::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \Corp\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \Corp\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \Corp\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];
}

я, собственно, хочу формировать меню для админа, и только он его должен видеть. но из за проблемы с моделью пользователя всё моё меню ругается что не один из рутов не существует..

    public function getMenu()
    {
        return LavMenu::make('adminMenu', function ($menu) {
            $r = Auth::user();
            dd($r);
            $menu->add('Статьи', array('route' => 'admin.articles.index'));
            $menu->add('Портфолио', array('route' => 'admin.articles.index'));
            $menu->add('Меню', array('route' => 'admin.articles.index'));
            $menu->add('Пользователи', array('route' => 'admin.articles.index'));
            $menu->add('Привилегии', array('route' => 'admin.articles.index'));
        });
    }

вот все мои сейчас руты

+--------+-----------+-------------------------------+----------------------+-------------------------------------------------------------------------+----------------------------------------------+
| Domain | Method    | URI                           | Name                 | Action                                                                  | Middleware                                   |
+--------+-----------+-------------------------------+----------------------+-------------------------------------------------------------------------+----------------------------------------------+
|        | GET|HEAD  | /                             | home                 | Corp\Http\Controllers\IndexController@index                             | web                                          |
|        | GET|HEAD  | _debugbar/assets/javascript   | debugbar.assets.js   | Barryvdh\Debugbar\Controllers\AssetController@js                        | Barryvdh\Debugbar\Middleware\DebugbarEnabled |
|        | GET|HEAD  | _debugbar/assets/stylesheets  | debugbar.assets.css  | Barryvdh\Debugbar\Controllers\AssetController@css                       | Barryvdh\Debugbar\Middleware\DebugbarEnabled |
|        | GET|HEAD  | _debugbar/clockwork/{id}      | debugbar.clockwork   | Barryvdh\Debugbar\Controllers\OpenHandlerController@clockwork           | Barryvdh\Debugbar\Middleware\DebugbarEnabled |
|        | GET|HEAD  | _debugbar/open                | debugbar.openhandler | Barryvdh\Debugbar\Controllers\OpenHandlerController@handle              | Barryvdh\Debugbar\Middleware\DebugbarEnabled |
|        | GET|HEAD  | admin                         | adminIndex           | Corp\Http\Controllers\Admin\IndexController@index                       | web,auth                                     |
|        | GET|HEAD  | admin/articles                | articles.index       | Corp\Http\Controllers\Admin\ArticlesController@index                    | web,auth                                     |
|        | POST      | admin/articles                | articles.store       | Corp\Http\Controllers\Admin\ArticlesController@store                    | web,auth                                     |
|        | GET|HEAD  | admin/articles/create         | articles.create      | Corp\Http\Controllers\Admin\ArticlesController@create                   | web,auth                                     |
|        | GET|HEAD  | admin/articles/{article}      | articles.show        | Corp\Http\Controllers\Admin\ArticlesController@show                     | web,auth                                     |
|        | PUT|PATCH | admin/articles/{article}      | articles.update      | Corp\Http\Controllers\Admin\ArticlesController@update                   | web,auth                                     |
|        | DELETE    | admin/articles/{article}      | articles.destroy     | Corp\Http\Controllers\Admin\ArticlesController@destroy                  | web,auth                                     |
|        | GET|HEAD  | admin/articles/{article}/edit | articles.edit        | Corp\Http\Controllers\Admin\ArticlesController@edit                     | web,auth                                     |
|        | GET|HEAD  | api/user                      |                      | Closure                                                                 | api,auth:api                                 |
|        | GET|HEAD  | articles                      | articles.show        | Corp\Http\Controllers\ArticleController@show                            | web                                          |
|        | GET|HEAD  | login                         | login                | Corp\Http\Controllers\Auth\LoginController@showLoginForm                | web,guest                                    |
|        | POST      | login                         |                      | Corp\Http\Controllers\Auth\LoginController@login                        | web,guest                                    |
|        | POST      | logout                        | logout               | Corp\Http\Controllers\Auth\LoginController@logout                       | web                                          |
|        | POST      | password/email                | password.email       | Corp\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail  | web,guest                                    |
|        | GET|HEAD  | password/reset                | password.request     | Corp\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest                                    |
|        | POST      | password/reset                |                      | Corp\Http\Controllers\Auth\ResetPasswordController@reset                | web,guest                                    |
|        | GET|HEAD  | password/reset/{token}        | password.reset       | Corp\Http\Controllers\Auth\ResetPasswordController@showResetForm        | web,guest                                    |
|        | GET|HEAD  | portfolios                    | portfolios.show      | Corp\Http\Controllers\PortfolioController@show                          | web                                          |
|        | GET|HEAD  | register                      | register             | Corp\Http\Controllers\Auth\RegisterController@showRegistrationForm      | web,guest                                    |
|        | POST      | register                      |                      | Corp\Http\Controllers\Auth\RegisterController@register                  | web,guest                                    |
|        | GET|HEAD  | test                          | test                 | Corp\Http\Controllers\TestController@test                               | web                                          |
+--------+-----------+-------------------------------+----------------------+-------------------------------------------------------------------------+----------------------------------------------+

может есть идеи куда хотяб копать? весь день промучился с этой проблемой..

Не в сети

#2 02.10.2017 18:40:30

Re: Не могу передать Модель User в конструктор контроллера

В 5.5 auth()->user() в конструкторе не будет работать, нужно искать другое решение. Для проверки админ зашел или нет, можно использовать посредника (middleware).

Изменено AlexeyMezenin (03.10.2017 11:51:26)

Не в сети

#3 03.10.2017 11:49:47

Re: Не могу передать Модель User в конструктор контроллера

да.. тоже это нашли.
https://laracasts.com/discuss/channels/ … onstructor
Thing is controller construct executes before any middleware, so there is no user yet
крутяк блин.. думал будет проще.
и спасибо что не оставили в стороне smile

Не в сети

#4 04.10.2017 16:44:45

Re: Не могу передать Модель User в конструктор контроллера

мож кому будет полезно.. С помощью middleware проверяю на Админа:

командой создал мидлварь  php artisan make:middleware isAdmin
и в Kernel:
в $middlewareGroups Добавил

        'admin' => [
            'isAdmin:1', // 1 - это айдишник админа в users. так передаются параметры
        ],

в  protected $routeMiddleware = [ Добавил

'isAdmin' => \Corp\Http\Middleware\isAdmin::class,

ну и в самом классе isAdmin у меня:

<?php
namespace Corp\Http\Middleware;
use Closure;
class isAdmin
{
    public function handle($request, Closure $next, $admin_user_id)
    {
        if (auth()->check() && (auth()->user()->id == $admin_user_id)) { // если залогинен и админ
            return $next($request);
        } elseif (auth()->check() && (auth()->user()->id !== $admin_user_id)){ // если залогинен но не админ
            return redirect('/');
        }
        return redirect('/');
    }
}

Не в сети

#5 04.10.2017 16:59:42

Re: Не могу передать Модель User в конструктор контроллера

namespace Corp\Http\Middleware;
use Closure;
class isAdmin
{
    public function handle($request, Closure $next, $admin_user_id)
    {
        if (auth()->check() && (auth()->user()->id == $admin_user_id)) { // если залогинен и админ
            return $next($request);
        } elseif (auth()->check() && (auth()->user()->id !== $admin_user_id)){ // если залогинен но не админ
            return redirect('/');
        }
        return redirect('/');
    }
}

Все хорошо, только слишком много лишнего кода у тебя. Можно как-то так:

public function handle($request, Closure $next, $adminId)
{
    return auth()->id() === $adminId ? $next($request) : redirect('/');
}

Изменено AlexeyMezenin (04.10.2017 17:01:28)

Не в сети

#6 04.10.2017 17:31:44

Re: Не могу передать Модель User в конструктор контроллера

только все равно редирект срабатывает при "===" сравнении. меняю на "==" и все норм. даже если заменить на auth()->user()->id
Спасибо, исправил на ваш вариант.

Изменено sam (04.10.2017 17:44:41)

Не в сети

Подвал раздела