2016-08-27 22 views
12

Używam Laravel 5.3 i próbuję uzyskać uwierzytelnione użytkownika id w metodzie constructor więc mogę filtrować przez użytkownika przypisany firmie w następujący sposób:laravel 5,3 auth zameldowanie konstruktora powrocie fałszywe

namespace App\Http\Controllers; 

use Illuminate\Foundation\Bus\DispatchesJobs; 
use Illuminate\Routing\Controller as BaseController; 
use Illuminate\Foundation\Validation\ValidatesRequests; 
use Illuminate\Foundation\Auth\Access\AuthorizesRequests; 
use Illuminate\Support\Facades\View; 
use App\Models\User; 
use App\Models\Company; 
use Illuminate\Support\Facades\Auth; 


class Controller extends BaseController 
{ 
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests ; 

    public $user; 
    public $company; 


    public function __construct() 
    { 


     $companies = Company::pluck('name', 'id'); 
     $companies->prepend('Please select'); 
     view()->share('companies', $companies); 
     $this->user = User::with('profile')->where('id', \Auth::id())->first(); 
     if(isset($this->user->company_id)){ 
      $this->company = Company::find($this->user->company_id); 
      if (!isset($this->company)) { 
       $this->company = new Company(); 
      } 
      view()->share('company', $this->company); 
      view()->share('user', $this->user); 
     } 

    } 

Jednak to nie zwraca użytkownika id. Próbowałem nawet Auth::check() i to nie działa.

Gdybym przesunąć Auth::check() z metodą __construct() wtedy działa w następujący sposób:

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

class HomeController extends Controller 
{ 
    /** 
    * Create a new controller instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     parent::__construct(); 
     $this->middleware('auth'); 
    } 

    /** 
    * Show the application dashboard. 
    * 
    * @return \Illuminate\Http\Response 
    */ 
    public function index() 
    { 
     dd(\Auth::check()); 
     return view('home'); 
    } 
} 

Jednak to nie jeśli kładę to w metodzie konstruktu w HomeController też!

Jakieś pomysły, dlaczego to się nie udaje?

Odpowiedz

6

docs

nie można uzyskać dostępu do sesji lub uwierzytelnionego użytkownika w konstruktorze kontrolera za ponieważ middleware nie został jeszcze uruchomiony.

Alternatywnie można zdefiniować oprogramowanie pośrednie oparte na zamknięciu bezpośrednio w konstruktorze kontrolera. Przed użyciem tej funkcji, upewnij że aplikacja jest uruchomiona laravel 5.3.4 lub nowszej:

class ProjectController extends Controller 
{ 
    /** 
    * All of the current user's projects. 
    */ 
    protected $projects; 

    /** 
    * Create a new controller instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     $this->middleware(function ($request, $next) { 
      $this->projects = Auth::user()->projects; 

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

To nie działa dla mnie LR5.3.10 –

+0

działa dla mnie LR 5.3.10 i 5.3.16 bez problemu –

+0

@ ABDEL-RHMAN moje jest 5.3.4 i nie może wiesz, jak uaktualnić do swojej wersji? –

2

Błąd kończy się niepowodzeniem, ponieważ po $this->middleware('auth'); po parent::__construct(); nazywasz go. Oznacza to, że auth pośrednie oprogramowanie nie jest poprawnie załadowane.

+0

Wrzuciłem go po rodzica :: __ construct(); i to nie ma znaczenia. Usunąłem nawet oprogramowanie pośrednie i nie ma różnicy. czy masz przykład kodu? – 001221

7

Od 5.3 Auth::check nie będzie działać w kontrolerze sterownika, jest to jedna z nieudokumentowanych zmian. Musisz więc przenieść go do oprogramowania pośredniego lub zamiast tego użyć metod kontrolera lub przenieść projekt do wersji 5.2.x.

+0

naprawdę? nie zdawałem sobie z tego sprawy! bzdura – 001221

+0

@Alexey Mezenin, Wygląda na to, że opanowałeś laravel. Potrzebuję twojej pomocy. Zajrzyj tutaj: http://stackoverflow.com/questions/41047583/how-to-add-dynamic-dropdown-list-column-on-laravel-5-3-registration –