2015-08-07 12 views
5

Ho usato config::set('auth.model','App\Fblogin') e scaricato config::get('auth.model'); Sembra aggiornare il valore bene, ma quando provo a Auth::logInUsingId() sembra che stia ancora usando il default App\User. Quindi cosa posso fare in modo che io possa usare il App\Fblogin sul mio controller?Cambiare il modello di Auth al volo

+0

È possibile che non si stia eseguendo l'override del file di configurazione all'inizio del ciclo di vita dell'app. Cose diverse vengono eseguite e richieste in tutta l'app in momenti diversi. Vedi http://laravel.com/docs/5.1/lifecycle per maggiori dettagli. Probabilmente, dovrai sovrascrivere la configurazione non più tardi dei tuoi metodi di avvio o registrazione "app/Provider/AppServiceProvider.php". In caso contrario, è probabile che il modello auth venga utilizzato prima di essere sottoposto a override. –

+0

per favore spiega nella tua domanda dove e come stai impostando il valore auth.model. Il ciclo di vita di laravel è molto specifico e richiede di annullare esplicitamente il comportamento al momento giusto. – Luceos

+0

sì, come ha detto @Luceos, alcuni esempi di codice potrebbero aiutare a risolvere il problema. Spero che tu (o qualcuno del tuo team di sviluppo) non stia eseguendo _caching_ le tue configurazioni. – kishanterry

risposta

5

Se stai usando laravel 5.1.11 o superiore, utilizzare questo:

auth()->getProvider()->setModel(App\Fblogin::class); 

Se non è possibile/non sarà l'aggiornamento, ho paura non c'è un modo semplice per raggiungere Questo.

Il modello è risolto tramite EloquentUserProvider. La classe del modello utilizzata è impostata nel costruttore, che non può essere modificata in fase di esecuzione perché la proprietà è protected.

è possibile estendere la EloquentUserProvider, o si può barare e impostarlo:

function set_auth_model($model) { 
    $closure = (function ($model) { $this->model = $model; }); 

    $closure = $closure->bindTo(Auth::getProvider()); 

    $closure($model); 
} 

set_auth_model(App\Fblogin::class); 

Ma in realtà ... basta eseguire l'aggiornamento.

1

Questo potrebbe essere possibile ma è necessario provarlo. È possibile impostare il proprio driver Auth, che estende semplicemente il driver di autenticazione laravel predefinito, ma lo modifica un po '. Puoi farlo attraverso un provider, per esempio. Nel metodo di avvio del provider che ci si dice:

$this->app['auth']->extend('my-auth', function ($app) { 
     return new Guard(
      new MyUserProvider($app['hash']), 
      $app->make('session.store') 
     ); 
    }); 

Nota Non siamo più passa il modello attraverso il costruttore. Lo gestiremo diversamente. La tua classe MyUserProvider estende EloquentUserProvider. Sostituiamo il metodo createModel con la nostra versione, che invece di usare il nome del modello costruito ottiene il nome del modello durante il runtime.

class MyUserProvider extends EloquentUserProvider 
{ 
    public function __construct(HasherContract $hasher) 
    { 
     $this->hasher = $hasher; 
    } 

    public function createModel() 
    { 
     $class = app()->config->get('auth.model'); 

     return new $class; 
    } 
} 

Non ho effettivamente provato a vedere se questo funziona, ma probabilmente puoi farlo funzionare con questo metodo.