我有一个包含电子邮件和密码字段的登录表单。我有两个提交按钮,一个用于登录(如果用户已经注册),另一个用于注册(用于新用户)。由于登录操作和注册操作不同,因此我需要一些方法将请求与所有发布数据重定向到其各自的操作。有没有办法以纯粹的Laravel方式在Laravel 4中实现这个目标?
答案 0 :(得分:37)
我会这样做的方式
如果您的表单是(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.
}
}
?>
答案 1 :(得分:3)
我的解决方案:
首先我设置没有动作的表单
<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() }}
for routes(routes.php):
Route::post('test/login', array('uses' => 'TestController@login'));
Route::post('test/register', array('uses' => 'TestController@register'));
controller(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();
});
答案 2 :(得分:2)
ClickCoder的回答是现场的,我唯一要用100%“纯Laravel方式”替换的方法就是使用表单生成器来提交按钮。
http://laravel.com/docs/4.2/html#buttons
第一个参数是submit的值,您可以在以下options数组中传递其名称。
所以而不是:
<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语句共享相同的名称并执行以下操作来完全逃避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!
答案 3 :(得分:0)
您可以执行以下操作:
您的路线(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
请注意:我不确定这是允许两个提交按钮的正确方法,但它适用于两个提交按钮。
答案 4 :(得分:0)
为提交按钮指定不同的名称,例如
<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
}
}