Laravel - Auth::user data возвращает значение null, кроме контроллера входа

Я создаю аутентификацию пользователя, используя пользовательскую таблицу. В моем контроллере входа в систему аутентификация работает нормально и перенаправляется на панель инструментов. Но когда я собираюсь создать другой URL-адрес с использованием нового контроллера, данные аутентификации пользователя не отображаются для этого контроллера. Я хочу получить пользовательские данные через фасад авторизации в конструкторе. Как это возможно? Вот мой код:

веб.php:

<!---Routes for login and dashboard-->

Route::get('/login','CustomLogin@index');
Route::post('/login','CustomLogin@checklogin');
Route::get('/','CustomLogin@SuccessLogin');
Route::get('/logout','CustomLogin@logout');

<!---Routes for other controller where user auth not working-->

Route::get('/add-creditor', 'AddCreditor@index');

CustomLogin.php (контроллер):

    <?php

namespace App\Http\Controllers;

use App\library\My_functions;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\User;
use Illuminate\Support\Facades\Auth;
use Redirect;
use View;
use Session;
use Cookie;

class CustomLogin extends Controller
{
    public function __construct()
    {
        $this->_myFun = new My_functions;
    }

    public function index()
    {
        if(!Auth::check()) {
            return view('CustomLogin.CustomLogin');
        }
        else{
            Redirect::to(SITE_URL)->send();
        }
    }

    public function username()
    {
        return 'user_name';
    }

    function checklogin(Request $request)
    {
        $this->validate($request, [
           'input-username'     =>      'required',
           'input-password'     =>      'required'
        ]);

        $user_data = array(
            'user_name'  => $request->get('input-username'),
            'password' => $request->get('input-password')
        );

        if(Auth::attempt($user_data)){
            return redirect('/');
        }
        else
        {
            return back()->with('error','Wrong Login Details');
        }
    }

    function SuccessLogin(){
        if (!$this->_myFun->DoLogIn()) {
            Redirect::to(SITE_URL.'login')->send();
        }
        else {
            $data=array();
            return View::make('include.dashboard',$data);
        }
    }

    function logout(Request $request){
        Auth::logout();
        return redirect('/login');
    }

}

Функция DoLogIn() (приложение/библиотека)

<?php namespace App\library {
use Illuminate\Routing\Controller as BaseController;
use App\library\CreateCrmGuid; // Get custom function
use App\library\FunctionForContact; // Get custom function
use Illuminate\Http\Request;
use Session;
use DB;
use Hash;
use Auth;
use App\User;
class My_functions{

    public function DoLogIn()
    {
        //dd(Auth::user()); /*returns data if run from Login controller but null from Add Creditor controller*/
        if(Auth::check())
        {
            $user_id = Auth::user()->id;
            define('authenticated_user_id' ,$user_id);
            return true;
        }
        else
        {
            return false;
        }
    }
}

Контроллер AddCreditor

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Cookie;
use Config;
use App\library\my_functions; // Get custom function
use Redirect;
use DB;
use Session;

class AddCreditor extends Controller
{
    protected $_myFun;

    function __construct(){
        dd(Auth::user());  // this returns null
        $this->_myFun = new My_functions;
        if (!$this->_myFun->DoLogIn()) {
            Redirect::to(SITE_URL.'login')->send();
        }
    }
}

person Souvik Das    schedule 31.12.2019    source источник
comment
Рекомендуется использовать внедрение зависимостей. Не создавайте класс My_functions с "новым" оператором. Получите его через параметр Contractor. Laravel внедрит ваш класс и при необходимости разрешит любую зависимость.   -  person 112Legion    schedule 31.12.2019


Ответы (1)


Добавьте промежуточное ПО auth в свои маршруты

Route::middleware(['auth'])->get('/add-creditor', 'AddCreditor@index');

Тем не менее, после этого вы можете не получать пользовательские данные через фасад Auth в конструкторе контроллера, но в вашем методе Route, т.е. AddCreditor@index, вы получите пользовательские данные либо с помощью следующих методов.

Auth::user(); or request()->user();

person sumit    schedule 31.12.2019
comment
Спасибо, брат. Он работает нормально. Но я хочу получить пользовательские данные через фасад Auth в конструкторе контроллера. Разве это не возможно? - person Souvik Das; 31.12.2019
comment
Привет сумит. Разве нет способа не использовать промежуточное программное обеспечение аутентификации на каждом маршруте? - person Souvik Das; 31.12.2019
comment
Этого можно добиться, добавив промежуточное программное обеспечение в группу маршрутов, поэтому все ваши аутентифицированные маршруты должны находиться в группе, использующей промежуточное программное обеспечение. laravel.com/docs/5.8/routing#route-groups - person sumit; 02.01.2020