2013-10-08 2 views
2

Я использую Laravel 4 для своего приложения. В этом приложении у меня есть две модели auth: покупатели и пользователи. Я не хочу использовать поле User-> type, потому что у этих моделей есть совершенно другая логика.Laravel не изменяет модель пользователя на ходу

Вот мой Войти Контроллер:

public function postIndex() 
{ 

    if (Auth::attempt(array_only(Input::get(), array('email', 'password')), array_only(Input::get(), array('save')))) { 
     Login::create(array('user_id' => Auth::user()->id, 'session_id' => session_id())); // Создаем новую запись логина вместе с session_id. 
     return Redirect::to('/'); 
    } 

    return $this->userauth(); 
} 

public function userauth() { 

    Config::set('auth.model', 'User'); 
    Config::set('auth.table', 'users'); 
    $test = Config::get('auth.model'); 

    if (Auth::attempt(array_only(Input::get(), array('email', 'password')), array_only(Input::get(), array('save')))) { 
     Login::create(array('user_id' => Auth::user()->id, 'session_id' => session_id())); // Создаем новую запись логина вместе с session_id. 
     return Redirect::to('/'); 
    } 

    Session::flash('error', 'Auth not excepted. '. implode(' ', array_only(Input::get(), array('email', 'password')))); 

    return Redirect::to('logins')->withInput(Input::except('password')); 

} 

Я уже изменил настройки в auth.php работать с покупателями. Когда я набираю логин и пароль для покупателя, все работает отлично. Кажется, что после Auth :: tried() он не меняет настройки. Похоже, мне нужно перезагрузить объект Auth. Может кто-нибудь мне помочь?

Купить путь, если я пишу так:

public function postIndex() 
{ 


    Config::set('auth.model', 'User'); 
    Config::set('auth.table', 'users'); 
    $test = Config::get('auth.model'); 

    if (Auth::attempt(array_only(Input::get(), array('email', 'password')), array_only(Input::get(), array('save')))) { 
     Login::create(array('user_id' => Auth::user()->id, 'session_id' => session_id())); // Создаем новую запись логина вместе с session_id. 
     return Redirect::to('/'); 
    } 

    Session::flash('error', 'Auth not excepted. '. implode(' ', array_only(Input::get(), array('email', 'password')))); 

    return Redirect::to('logins')->withInput(Input::except('password')); 
} 

все прекрасно работает тоже.

ответ

4

Краткая Ответ: Вы правы. После первого вызова Auth::attempt() изменения в конфигурации не влияют. Во время выполнения вы должны использовать Auth::setProvider(), чтобы установить модель, которая будет использоваться.

Длинный ответ: Я не знаю, насколько хорошо это будет работать в вашей конкретной установки, но я нашел ваш вопрос, пытаясь сделать что-то подобное, так что я покажу вам, как я в конечном итоге делает это.

В моем случае требование состояло не просто в том, чтобы иметь двух разных типов пользователей. Я запускаю два веб-сайта на разных доменах из одной и той же базы кода, один для студентов и один для семейств-хозяев. У меня есть класс Student, который заменит User на одном сайте и Host с той же целью на другом. Оба реализуют UserInterface и RemindableInterface, поэтому мы там хорошо.

В приложении/filters.php, я создаю два специальных фильтров:

Route::filter('prep.student', function() { 
    Auth::setProvider(new Illuminate\Auth\EloquentUserProvider(App::make('hash'), 'Student')); 
}); 

Route::filter('prep.host', function() { 
    Auth::setProvider(new Illuminate\Auth\EloquentUserProvider(App::make('hash'), 'Host')); 
}); 

Здесь «Host» и «Студент» являются именами классов, которые вы хотите красноречивый драйвер аутентификации использовать.

В приложении/routes.php, я положил маршруты на две группы, и на каждую группу я использовал правильный фильтр выше:

/** 
* Routes for Students 
*/ 
Route::group(array('domain' => '[student domain]', 'before' => 'prep.student'), function() { 

    Route::get('test', function() { 
    return View::make('student/test'); 
    }); 
    ... 
}); 

/** 
* Routes for Hosts 
*/ 
Route::group(array('domain' => '[host domain'], 'before' => 'prep.host'), function() { 

    Route::get('test', function() { 
    return View::make('host/test'); 
    }); 
    ... 
}); 

В результате получается, что провайдер пользователя устанавливаются с соответствующей моделью для каждой группы маршрутов. Вероятно, вы также можете установить провайдера в app/start/global.php, но я решил сохранить его с маршрутизацией, так что очень ясно, что две группы маршрутов предназначены для двух разных доменов и имеют две разные модели аутентификации.

Я бы сделал это немного по-другому, я строил его новое, но эти два сайта являются интерфейсом большой старой кодовой базы, для которой я не могу существенно изменить базу данных, поэтому я свободно признаю, что это немного хак. Если вы не в такой ситуации, лучшим решением может быть класс User для аутентификации, а затем прикрепить его к двум другим моделям, которые вам нужны.

Смежные вопросы