Я не получаю ORM в MVC - PullRequest
       19

Я не получаю ORM в MVC

2 голосов
/ 10 июня 2011

Я создаю систему авторизации на Kohana 3.1. Это по образовательным причинам.

Прямо сейчас я пытаюсь выучить ORM. Я понимаю, что я могу сделать с ORM, но я не понимаю, как я могу реализовать это в структуре MVC ... Сейчас все работает, но кажется, что это ужасно неправильно!

Вот действие моего контроллера:

public function action_signUp() {

  if ( !$this->request->post() ) {

    $view = new View_SignUp;


    $view->title = 'Sign Up';


    $this->response->body( $view->render() );

  } else {

    $validation =
      Validation::factory( $this->request->post() )
        ->rule( 'token', 'not_empty' )
        ->rule( 'token', 'Security::check' )
        ->rule( 'username', 'not_empty' )
        ->rule( 'username', 'max_length', array( ':value', 32 ) )
        ->rule( 'username', 'alpha_dash', array( ':value', true ) ) // Alpha chars (from UTF-8), numbers, underscores and dashes...
        ->rule( 'password', 'not_empty' )
        ->rule( 'password', 'min_length', array( ':value', 6 ) )
        ->rule( 'password', 'max_length', array( ':value', 255 ) )
        ->rule( 'passwordRepeatedly', 'not_empty' )
        ->rule( 'passwordRepeatedly', 'matches', array( ':validation', 'passwordRepeatedly', 'password' ) )
        ->rule( 'email', 'not_empty' )
        ->rule( 'email', 'email' );


    if ( $validation->check() ) {

      $user = ORM::factory( 'User' );

      $user->username = $this->request->post( 'username' );
      $user->password = sha1( $this->request->post( 'password' ) ); // To add salt or something...
      $user->email = $this->request->post( 'email' );

      $user->save();


      $this->request->redirect( 'sign-in' );

    } else {

      $view = new View_SignUp;


      $view->title = 'Sign Up';

      $view->haveErrors = true;

      forEach ( $validation->errors( 'errorMessages' ) as $error ) {

        $view->errors[] = array( 'error' => $error );

      }


      $this->response->body( $view->render() );

    }

  }

}

А вот и моя модель ORM ...

class Model_User extends ORM {

  //

}

Это действительно ужасно, а? Я знаю, что контроллеры должны быть крошечными, купить модели могут быть такими жирными, как они хотят ... но. Помоги мне, или, лучше, покажи мне пример!

1 Ответ

1 голос
/ 10 июня 2011

Проверка на уровне модели должна быть в ваших моделях , а не контроллерах. И ваши связанные с видом вещи должны быть изолированы в вашей модели представления, но не в контроллере:)

Итак, ваше действие должно выглядеть примерно так:

public function action_signup()
{
    $errors = array();
    $user = new Model_User;

    if ($post = $this->request->post())
    {
        try
        {
            $user->values($post)
                ->create();

            $this->request->redirect('somewhere_over_the_rainbow');
        }
        catch (ORM_Validation_Exception $e)
        {
            $errors += $e->errors();
        }
    }

    $this->view->errors = $errors;
    $this->view->user = $user;
}
...