Laravel - 从模型重定向?

时间:2014-06-10 22:45:16

标签: php redirect laravel laravel-4

我正在使用laravel构建一个简单的应用程序,并且我遇到了一个无法正常工作的重定向问题。我目前有一个注册表单,它发布到一个控制器方法,它调用模型上的静态方法,该方法将负责验证并将该用户保存到数据库。

到目前为止,这是我的代码。

routes.php文件

Route::get('/', function()
{   
    return View::make('index');
});


Route::post('/sign_up', 'userController@create_user');

userController.php

public function create_user()
{
    $data = Input::all();
    USER::validate($data);
}

user.php的

public static function validate($input) 
{


$rules = array
(
    'firstname' => 'Required|Min:3|Max:80|Alpha',
    'lastname'  => 'Required|Min:3|Max:80|Alpha',
    'password'  =>'Required|AlphaNum|Between:4,12|Confirmed',
    'password_confirmation'=>'Required|AlphaNum|Between:4,12'
);


$v = Validator::make($input, $rules);
        if( $v->passes() ) 
        {
            $user = new User;
            $user->firstname = Input::get('firstname');
            $user->lastname = Input::get('lastname');
            $user->password = Input::get('password');
            return var_dump($user); // Save user code here
        }

             return Redirect::to('/')->withErrors($v);


}

现在,我只是得到一个空白的屏幕。没有错误,我甚至可以改变重定向:到我想要的任何路线,即使是没有设置的路线,但仍然不会给出任何错误。

我确实设法让它对userController和User进行以下更改:

public function create_user()
{
    $data = Input::all();
    $response = USER::validate($data);

    **if($response == 2)**
    {
    return Redirect::to('/');
    }
}

user.php的

$v = Validator::make($input, $rules);
        if( $v->passes() ) 
        {
            $user = new User;
            $user->firstname = Input::get('firstname');
            $user->lastname = Input::get('lastname');
            $user->password = Input::get('password');
            return var_dump($user);
        }

             return 2;


}

这可以按预期调用来自控制器而不是模型的重定向。

这引出了几个问题。

  1. 为什么它在控制器而不是模型中有效,有没有办法使它按照我原来的意图工作?

  2. 如果没有,我如何从验证中获取错误?

  3. 这是一种布置我的应用程序的糟糕方式吗?我试图维护模型中的逻辑步骤,但到目前为止,将它投入控制器并完成它似乎更容易。

  4. 感谢您的回复。

2 个答案:

答案 0 :(得分:1)

您错过了控制器中的return。你应该return静态函数的结果。

但是,我会拆分它,这样你就可以拥有控制器中的所有东西,因为它非常简单。如果您有更多代码,可能需要考虑创建UserValidation class

另外,我将规则放在配置文件中,您可以从任何地方调用它们。这样,您就不会在验证中对规则进行硬编码,也可以在文件中编辑应用的所有验证规则。

控制器

public function create_user()
{
    $data = Input::all();
    USER::validate($data);

    $v = Validator::make($input, \Config::get('Foo.Rules'));
    if( $v->passes() ) 
    {
        self::insert_user($data);
    }

         return Redirect::to('/')->withErrors($v);
 }

 //This could be in a user validation class
public function insert_user($data){

    $user = new User;
    $user->firstname = Input::get('firstname');
    $user->lastname = Input::get('lastname');
    $user->password = Input::get('password');
    return var_dump($user); // Save user code here
}

Config Foo

$rules = array
(
    'firstname' => 'Required|Min:3|Max:80|Alpha',
    'lastname'  => 'Required|Min:3|Max:80|Alpha',
    'password'  =>'Required|AlphaNum|Between:4,12|Confirmed',
    'password_confirmation'=>'Required|AlphaNum|Between:4,12'
),

答案 1 :(得分:0)

  1. 控制器是那个意味着返回响应的控制器,而不是验证器 - 您可能会将其传回控制器,然后让控制器返回它 - 但这并不是它的目的。

  2. 您可能会返回Validator对象本身:

  3. return $this;

    然后在您的控制器中,您可以收到错误消息

    $error = $response->messages();

    1. 保持应用程序干燥通常是个好主意,这样可以更轻松地查找和修复错误 - 但这真的取决于您 - 工程设计也可能是个问题。