基于异常的表单验证

时间:2012-05-02 07:02:35

标签: php exception error-handling fuelphp

我使用sentry作为我的应用的auth包,这是我用于注册用户的控制器方法。

class Controller_Auth extends \Controller_Base
{

    function action_signup($type='user')
    {
        $user = \Fieldset::forge('new_user');
        $user->add('email', 'Email', array(), array(array('required'), array('valid_email')));
        $user->add('password', 'Password', array(), array(array('required')));
        $user->add('confirm_password', 'Confirm Password', array(), array(array('match_field', 'password') ));
        $user->add('submit', '', array('value'=>'Sign Up', 'class' => 'btn', 'type'=>'submit'));

        $user->repopulate();

        if($user->validation()->run())
        {

            try
            {
                $fields = $user->validated();

                $user_id = \Sentry::user()->create(array('email'=>$fields['email'], 'password'=>$fields['password']));

                if($user_id)
                {
                    // the user was created - send email notifying user account was created
                }
                else
                {
                    // something went wrong - shouldn't really happen
                }
            }
            catch(\SentryUserException $e)
            {
                \Library_Message::set('error', $e->getMessage());
            }
            catch(\Database_Exception $e)
            {
                \Library_Message::set('error', 'Database error occured. Please try again');
            }
        }
        else
        {
            \Library_Message::set('error', $user->validation()->errors());
        }

        $this->template->set('content', $user->form(), false);
    }

}

正如您所看到的那样,我混淆了验证错误和异常,我想知道是否有办法使用异常处理所有错误?

1 个答案:

答案 0 :(得分:0)

我建议创建一个私有方法,在错误上抛出异常以使其同质化。

/**
 *
 * @throws Exception
 */
private function validateUserRun($user) {
   if(!$user->validation()->run()) {
       throw new YourException(); //Use a different exception than 'Exception' please
   }
}

然后在尝试

上调用它
function action_signup($type='user') { 
//...
   try {
     $this->validateUserRun($user);
     $fields = $user->validated();
     //...
   } 
   catch(\SentryUserException $e) {
            \Library_Message::set('error', $e->getMessage());
   } catch(\Database_Exception $e) {
            \Library_Message::set('error', 'Database error occured. Please try again');
   } catch (YourException $e) {
      //Here you can catch the exception
   }
//...
}