Laravel 4 – две кнопки отправки в одной форме и оба отправляются для обработки различными действиями

У меня есть форма входа в систему, в которой есть поля электронной почты и пароля. И у меня есть две кнопки отправки, одна для входа (если пользователь уже зарегистрирован), а другой для регистрации (для новых пользователей). Поскольку действия входа и действия регистра различны, поэтому мне нужно каким-то образом перенаправить запрос со всеми данными сообщения в соответствующее действие. Есть ли способ достичь этого в Laravel 4 в чистом Laravel пути?

То, как я это сделаю

Если ваша форма (2 кнопки):

{{ Form::open(array('url' => 'test/auth')) }} {{ Form::email('email') }} {{ Form::password('password') }} {{ Form::password('confirm_password') }} <input type="submit" name="login" value="Login"> <input type="submit" name="register" value="Register"> {{ Form::close() }} 

Создайте контроллер «TestController»

Добавить маршрут

 Route::post('test/auth', array('uses' => 'TestController@postAuth')); 

В TestController у вас будет один метод, который проверяет, на какую кнопку было нажата, и два других метода для входа и регистрации

 <?php class TestController extends BaseController { public function postAuth() { //check which submit was clicked on if(Input::get('login')) { $this->postLogin(); //if login then use this method } elseif(Input::get('register')) { $this->postRegister(); //if register then use this method } } public function postLogin() { echo "We're logging in"; //process your input here Input:get('email') etc. } public function postRegister() { echo "We're registering"; //process your input here Input:get('email') etc. } } ?> 

Мое решение:

сначала я создал форму без каких-либо действий

 <script> var baseUrl = "{{ URL::to('/'); }}"; </script> {{ Form::open(array('url' => '', 'id'=> 'test-form')) }} {{ Form::text('username') }} {{ Form::password('password') }} {{ Form::password('confirm_password') }} <input type="submit" name="login" id="login" value="Login"> <input type="submit" name="register" id="register" value="Register"> {{ Form::close() }} 

для маршрутов (routes.php):

 Route::post('test/login', array('uses' => 'TestController@login')); Route::post('test/register', array('uses' => 'TestController@register')); 

контроллер (TestController.php)

 public function login(){ //do something... } public function register(){ //do something... } 

JQuery: (test.js)

 $('form :submit').on('click', function(event){ var a = $(this); var form = $('form'); var action = a.attr('id'); form.attr('action', baseUrl + '/test/' + action); form.submit(); }); 

Ответ ClickCoder – это пятно, единственное, что я заменил, чтобы сделать это на 100% «чистом пути Laravel», было бы использовать Form Builder для кнопок отправки.

http://laravel.com/docs/4.2/html#buttons

Первым параметром является значение submit, и вы можете передать его имя в следующем массиве параметров.

Поэтому вместо:

 <input type="submit" name="login" value="Login"> <input type="submit" name="register" value="Register"> 

Вы бы сделали:

 {{ Form::submit('Login', ['name' => 'login']) }} {{ Form::submit('Register', ['name' => 'register']) }} 

Если вы хотите, вы можете избежать утверждения if, если у вас есть одно имя и сделать что-то вроде этого:

HTML:

 {{ Form::submit('Login', ['name' => 'action']) }} {{ Form::submit('Register', ['name' => 'action']) }} 

PHP:

 public function postAuth() { $action = 'post' . Input::get('action'); //becomes either postLogin or postRegister $this->$action(); } 

Немного меньше гнездования, немного больше Laravel!

Вы можете сделать следующее:

Ваши маршруты (routes.php):

 Route::post('post1', array('before' => 'checkForm', 'uses' => 'TestController@post1')); Route::get('post2', array('as' => 'post2', 'uses' => 'TestController@post2')); 

filters.php

 Route::filter('checkForm', function() { if(Input::has('button2')) { return Redirect::route('post2')->withInput(); } }); 

TestController.php

 public function post1(){ return Input::all(); } public function post2(){ return Input::old(); } 

Форма: должна быть в вашем представлении. Однако, я создал временную форму в файле маршрута для этого ответа.

 Route::get('form2', function() { return Form::open(array('url' => URL::to('post1'))). Form::text('name', null). Form::email('email', null). '<button type="submit" name="button1" value="1">submit</button>'. '<button type="submit" name="button2" value="2">submit2</button>'. Form::close(); }); 

теперь просматривайте:

 http://yourDomain/form2 

Обратите внимание: я не уверен, что это правильный подход, чтобы разрешить две кнопки отправки, но он работает для двух кнопок отправки.

Дайте кнопкам отправки разные имена, например

 <button type="submit" name="login">Login</button> <button type="submit" name="signup">Signup</button> 

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

 public function postLoginOrSignup(){ $data = Input::all(); if(isset($data['login'])){ //handle login process } if(isset($data['signup'])){ //handle singup process } }