2017-09-28 1 views
0

J'utilise Laravel 5.4.36. Lorsque j'utilise Auth::user()->id sur la méthode constructeur me montrer cette erreuren essayant d'obtenir la propriété de non-objet sur laravel 5.4 constructeur Auth :: user() -> id

(1/1) ErrorException
Essayer d'obtenir la propriété de non-objet
dans UserController.php (ligne 25)

mon contrôleur:

public function __construct() 
{ 
    echo Auth::user()->id; 
} 

Mais quand j'utilise Auth::user()->id sur la méthode d'index me montrer 2

résultat
public function index() 
{ 
    echo Auth::user()->id; 
} 

est: 2
Et quand je le tester sur la méthode de démarrage AppServiceProvider.php me montrer cette erreur encore

+0

Copie possible de [Laravel 5.4: Connectez-vous dans l'ID utilisateur à l'intérieur \ _ \ _ construct()] (https://stackoverflow.com/questions/43133361/laravel-5-4-get-logged-in-user- id-inside-construct) – Maraboc

+0

Je vois ce post et Quand j'utilise Auth :: user() -> id sur la méthode de démarrage AppServiceProvider montrez-moi cette erreur – paranoid

Répondre

0

Cet objet n'est pas disponible dans le constructeur. Vous pouvez utiliser Midelware ou l'utiliser dans d'autres méthodes

3

Le problème est que la session n'est toujours pas démarrée dans le constructeur. Il sera enregistré une fois que tous les middlewares seront enregistrés à partir de votre application/Http/Kernel.php et ce que vous essayez de récupérer ne donnera de valeur que si la session utilisateur a démarré.

Donc, dans le constructeur, vous devez remplacer la fonction middleware. Dans votre fichier contrôleur, vous pouvez accéder aux données de session utilisateur comme celui-ci

private $userId; 
$this->middleware(function ($request, $next) { 

// fetch your session here 

$this->userId = Auth::user()->id; 
return $next($request); 

}); 

Dans votre méthode d'index de ce contrôleur

public function index() 
{ 
    echo $this->userId; 
} 

Assurez-vous également l'utilisateur vous a connecté, sinon session ne sera pas exister pour l'utilisateur.

Espérons que cela aidera :)

1

En Laravel 5.3 et plus tard, le session is not available in controller constructors parce que le cadre invoque ces avant d'exécuter le middleware, les services ont donc auth pas été initialisé.

La documentation suggère le modèle suivant lorsque nous avons besoin d'utiliser des sessions ou auth dans les constructeurs de contrôleur:

class ProjectController extends Controller 
{ 
    protected $currentUserId; 

    public function __construct() 
    { 
     $this->middleware(function ($request, $next) { 
      $this->currentUserId = Auth::user()->id; 

      return $next($request); 
     }); 
    } 
} 

Cela ajoute un rappel de middleware à la fin de la chaîne middleware qui définit la valeur de l'utilisateur actuel après, le middleware de session s'exécute. Ensuite, nous pouvons utiliser $this->currentUserId à partir des autres méthodes de contrôleur.