Я не уверен, что это «правильный» способ делать вещи, но логика работает. У меня есть свой класс в настройке Laravel, который я use
в контроллере. В моем контроллере я вызываю функцию в своем пользовательском классе, однако я бы хотел перенаправить пользователя, если что-то случится внутри этой функции.
После беседы в IRC мне сказали, что вы не можете делать перенаправление в своем классе, вам нужно «вернуть объект ответа перенаправления с контроллера ».
Не совсем уверен, что это значит, но я полагаю, что вам придется делать переадресацию с контроллера.
Код (упрощенный, он работает):
Controller method: // Validate the incoming user $v = new SteamValidation( $steam64Id ); // Check whether they're the first user $v->checkFirstTimeUser();
Это уходит в мой класс SteamValidation (приложение / Acme / Steam / SteamValidation.php и namespaced), и он выполняет проверку:
public function checkFirstTimeUser() { // Is there any users? if( \User::count() == 0 ) { $user_data = [ // Data ]; // Create the new user $newUser = \User::create( $user_data ); // Log that user in \Auth::login($newUser); // Redirect to specific page return \Redirect::route('settings'); } return; }
Теперь, если счетчик больше 0, он просто возвращается обратно к контроллеру, и я счастливо продолжаю. Однако, если это новый пользователь, и я пытаюсь сделать перенаправление ( return \Redirect::route('settings');
) Я получаю пустую страницу!
Поэтому мои вопросы:
Причина, по которой вы не можете перенаправить из своего вложенного метода, состоит в том, что просто вызов Redirect :: route () не вызывает перенаправление. Метод вашего контроллера вернет то, что Laravel затем решит, что делать – если это будет просмотр, он отобразит его, если это перенаправление, он сделает перенаправление. В вашем вложенном методе вы можете вернуть то, что хотите, но так долго на контроллере он не проходит, что вниз по линии, тогда это не хорошо для вас.
Также вы, вероятно, не должны возвращать Redirect в вспомогательной функции. Если ваша функция validate имеет логический ответ (да, все хорошо, ничего плохого), тогда вы можете просто вернуть true / false, а затем выбрать это в контроллере для выполнения перенаправления:
// Validate the incoming user $v = new SteamValidation( $steam64Id ); // Check whether they're the first user if ($v->isFirstTimeUser()) { // note I renamed this method, see below return \Redirect::route('settings'); }
Однако, хотя мы берем на себя ответственность за перенаправление от вашего метода проверки, вы также должны нести ответственность за создание пользователя:
// SteamValidation public function isFirstTimeUser() { return (\User::count() == 0); } // Controller // Validate the incoming user $v = new SteamValidation( $steam64Id ); // Check whether they're the first user if ($v->isFirstTimeUser()) { // you may even wish to extract this user creation code out to something like a repository if you wanna go for it $user_data = [ // Data ]; // Create the new user $newUser = \User::create( $user_data ); // Log that user in \Auth::login($newUser); // Redirect to specific page return \Redirect::route('settings'); }