2011-09-25 13 views
6

He estado usando CodeIgniter por un tiempo, y tener un conocimiento decente de MVC, PHP, etc.Modelo Fat Skinny controlador en CodeIgniter

Sin embargo, me resulta difícil adherirse al controlador flaco Modelo grasa carácter distintivo.

He visto mucho al respecto; incluyendo qué pseudocódigo incluir en cada archivo, pero no ejemplos reales. (Por favor, enlace a algunos artículos, si me he perdido ningún obvias!)

Me resulta difícil mover la lógica forma a un modelo. Por ejemplo, estoy usando una biblioteca personalizada para mi sistema de autenticación, que tiene su propio modelo. ¿Debo hacer un modelo de usuario del sitio para registrar usuarios? ¿O debería hacer un modelo de sitio para hacer eso? O un modelo de forma?

que me ayude a cabo, alguien me puede aconsejar sobre cómo skinnify este controlador? Me doy cuenta de que es un montón de código, pero los indicadores simples serían geniales. (Tenga en cuenta, lo único que acabo de escribir este código, por lo que no se ha rediseñado mucho, pero se debe dar un buen ejemplo de cómo algunos de mis métodos están yendo de las manos.)

public function register() 
{ 
    session_start(); 
    if ($this->tf_login->logged_in()) 
    { 
     redirect('profile'); 
    } 
    if ($_GET['oauth'] == 'true') 
    { 
     $type = $_GET['type']; 
     try 
     { 
      $token = $this->tf_login->oauth($type, '', 'email'); 
     } 
     catch (TFLoginCSRFMismatchException $e) 
     { 
      $this->tf_assets->add_data('error_message', $e->getMessage()); 
     } 
     catch (TFLoginOAuthErrorException $e) 
     { 
      $this->tf_assets->add_data('error_message', $e->getMessage()); 
     } 
     if ($token) 
     { 
      $user_details = $this->tf_login->call('https://graph.facebook.com/me?fields=email,first_name,last_name,username&access_token=' . $token); 
      $user_details_decoded = json_decode($user_details); 
      if ($user_details_decoded->email) 
      { 
       try 
       { 
        $id = $this->tf_login->create_user($user_details_decoded->username, 
        md5($user_details_decoded->username . time()), 
        $user_details_decoded->email, 
        '', 
        TRUE, 
        TRUE); 
       } 
       catch (TFLoginUserExistsException $e) 
       { 
        try 
        { 
         if ($this->tf_login->oauth_login($type, $user_details_decoded->email, $token)) 
         { 
          $this->session->set_flashdata('success_message', 'You have successfully logged in.'); 
          redirect('profile'); 
         } 
         else 
         { 
          $this->session->set_flashdata('error_message', 'An account with these details exists, but currently isn\'t synced with ' . $type . '. Please log in to sync the account.'); 
         } 
        } 
        catch (Exception $e) 
        { 
         $this->session->set_flashdata('error_message', $e->getMessage()); 
        } 
       } 
       catch (TFLoginUserNotCreated $e) 
       { 
        $this->tf_assets->add_data('error_message', 'You could not be registered, please try again.'); 
       } 
       if ($id) 
       { 
        $this->tf_login->add_user_meta($id, 'first_name', $user_details_decoded->first_name); 
        $this->tf_login->add_user_meta($id, 'surname', $user_details_decoded->last_name); 
        $this->tf_login->sync_accounts($id, $type, $token); 
        $this->session->set_flashdata('success_message', 'Welcome ' . $this->input->post('first_name', TRUE) . ' ' . $this->input->post('surname', TRUE) . '. Your account has been sucessfully created. You will shortly receive an email with a verification link in.'); 
        redirect('login'); 
       } 
      } 
      else 
      { 
       $this->session->set_flash_data('error_message', 'You could not be logged in, please try again.'); 
      } 
     } 
     // Redirect to clear URL 
     redirect(current_url()); 
    } 

    if ($this->form_validation->run() !== FALSE) 
    { 
     try 
     { 
      $id = $this->tf_login->create_user($_POST['username'], $_POST['password'], $_POST['email'], '', FALSE); 
     } 
     catch (Exception $e) 
     { 
      $this->tf_assets->add_data('error_message', $e->getMessage()); 
     } 
     if ($id) 
     { 
      $this->tf_login->add_user_meta($id, 'first_name', $_POST['first_name']); 
      $this->tf_login->add_user_meta($id, 'surname', $_POST['surname']); 
      if ($this->tf_login->register_verification_email()) 
      { 
       $this->session->set_flashdata('success_message', 'Welcome ' . $this->input->post('first_name', TRUE) . ' ' . $this->input->post('surname', TRUE) . '. Your account has been sucessfully created. You will shortly receive an email with a verification link in.'); 
       redirect('login'); 
      } 
      else 
      { 
       $this->tf_login->login_user($id); 
       $this->session->set_flashdata('success_message','Your account has been sucessfully created.'); 
       redirect('profile'); 
      } 
     } 
     else 
     { 
      $this->tf_assets->add_data('error_message', $this->tf_login->get_errors()); 
     } 
    } 
    if (validation_errors()) 
    { 
     $this->tf_assets->add_data('error_message', validation_errors()); 
    } 
    $this->tf_assets->set_content('public/register'); 
    $this->tf_assets->add_data('page_title', "Register"); 
    $this->tf_assets->render_layout(); 
} 

Gracias ¡por adelantado!

+2

La predicación del "Modelo de grasa" se aplica al patrón MVC original. [No es lo que hacen los frameworks PHP] (http://stackoverflow.com/questions/1549857/simple-php-mvc-framework/1549970#1549970). Tampoco te hace mucho bien con CI. Tratar el controlador como interfaz de procesamiento de formularios no es realmente un problema real. – mario

+1

posible duplicado del [Entendimiento MVC:? ¿Cuál es el concepto de "grasa" en los modelos "flaco" en los controladores] (http://stackoverflow.com/questions/3109715/understanding-mvc-whats-the-concept-of- fat-on-models-skinny-on-controllers) – Gordon

+3

Cuando busqué preguntas anteriores que no aparecían. Tendré una lectura, aplausos :) – Toddish

Respuesta

3

De lo que puedo decir, la mayor parte o la totalidad de este código pertenece en un controlador o un componente, por lo que no cree que su problema es la confusión Modelo/Controlador.

El código es difícil de leer, sin embargo, debido a las estructuras jerarquizadas de profundidad y el hecho de no romper a cabo tareas específicas en sus propios métodos. La refactorización principal de la que se beneficiaría aquí es la creación de nuevos métodos privados para separar las subtareas discretas que está realizando. Esto tiene el importante beneficio adicional de aclarar la estructura de alto nivel de su método actual. Por lo que podría terminar con algo que parecía (sólo para darle un ejemplo aproximado):

public function register() 
{ 
    session_start(); 
    if ($this->tf_login->logged_in()) 
    { 
     redirect('profile'); 
    } 
    if ($_GET['oauth'] == 'true') 
    { 
     $this->oauthRegister(); 
    } 

    $this->normalRegister(); 
} 

Del mismo modo, el método oatuhRegister y normalRegister métodos se desglosa en los métodos más pequeños a sí mismos, de modo que cuando usted era completamente terminado, cada método se adheriría al SRP y probablemente tendría menos de 10 líneas de código. Esto mejorará drásticamente la legibilidad y el mantenimiento de su código. También recomiendo consultar Clean Code, que es un buen argumento para mantener corto el método.

+0

había pensado dividiéndolo en métodos privados separados, pero luego pensé que podrían transferirse a un modelo. LUEGO pensé que realmente no me gustaban los redireccionamientos de manipulación de modelos, la configuración de errores, etc. Creo que lo dividiré, concéntrate en hacerlo más legible. Voy a marcar esto como la respuesta aceptada pronto, a menos que alguien más publique algo esclarecedor, porque hasta ahora esto tiene más sentido. – Toddish

+0

Estás DEFINITIVAMENTE en tu instinto de mantener las redirecciones fuera del modelo. Otra cosa que podría ayudarte, una respuesta que recibí en otro lugar cuando pregunté si la autenticación debería hacerse en el modelo o controlador: http://pastebin.com/SKvpjrk0. Entonces, si bien tienes razón de que el código que cambia el modelo va en el modelo, es típico que la autenticación entre en el controlador, lo cual tiene sentido porque es, literalmente, un acto de "control" de acceso. – Jonah

Cuestiones relacionadas