Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
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 |
+--------+-----------+-------------------------------+----------------------+-------------------------------------------------------------------------+----------------------------------------------+
может есть идеи куда хотяб копать? весь день промучился с этой проблемой..
Не в сети
В 5.5 auth()->user() в конструкторе не будет работать, нужно искать другое решение. Для проверки админ зашел или нет, можно использовать посредника (middleware).
Изменено AlexeyMezenin (03.10.2017 11:51:26)
Не в сети
да.. тоже это нашли.
https://laracasts.com/discuss/channels/ … onstructor
Thing is controller construct executes before any middleware, so there is no user yet
крутяк блин.. думал будет проще.
и спасибо что не оставили в стороне
Не в сети
мож кому будет полезно.. С помощью 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('/');
}
}
Не в сети
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)
Не в сети
только все равно редирект срабатывает при "===" сравнении. меняю на "==" и все норм. даже если заменить на auth()->user()->id
Спасибо, исправил на ваш вариант.
Изменено sam (04.10.2017 17:44:41)
Не в сети