2011-02-03 18 views
5

? Estoy tratando de construir un buen marco PHP para uso personal. Me doy cuenta de que hay muchas experiencias existentes, pero esta es una gran experiencia de aprendizaje que cubre la gran mayoría de los diferentes desafíos y realmente me enseña mucho, además de tener un producto terminado cuando lo he terminado, que espero utilizar para desarrollar otros proyectos de y como lo estoy construyendo, no debería haber una curva de aprendizaje sobre cómo usarlo.¿Es así como usar un patrón MVC en PHP OO

Algunos de los objetivos básicos,
- Use PHP Object Oriented en lugar de procedural.
- Use un MVC o algo similar para aprender más sobre este estilo.
- Ser ligero y rápido/buen rendimiento

Aquí está mi planeado estructura del sitio, excluyendo algunas otras carpetas para JavaScript, imágenes, css, algunas funciones de ayuda/archivos, etc.

/// estructura del sitio ////////// /////////////

site.com/ 
     /index.php 
site.com/library/ 
       /Config.class.php 
       /Photos.class.php 
       /Mail.class.php 
       /Filter.class.php 
       /QRcodes.class.php 
       /Router.class.php 
       /Database.class.php 
       /Templates.class.php 
       /etc, etc,etc...... 
site.com/modules/ 
       /account/ 
         /model 
         /views 
         /controllers 
       /users/ 
         /model 
         /views 
         /controllers 
       /messages/ 
         /model 
         /views 
         /controllers 
       /API/ 
         /model 
         /views 
         /controllers 
       /forums/ 
         /model 
         /views 
         /controllers 
       /blogs/ 
         /model 
         /views 
         /controllers 
       /etc, etc, etc, etc............. 
         /model 
         /views 
         /controllers 

he decidido encaminar todas las solicitudes a través de un único punto de entrada, index.php
I wi Construiremos una clase/objeto Router que coincidirá con el URI contra un mapa de posibles destinos utilizando expresiones regulares. Aquí hay un fragmento de lo que tengo por ahora para esta parte ...

<?php 
//get url from URL 
$uri = isset($_GET['uri']) ? $_GET['uri'] : null; 

$uri_route_map = array( 
    //users/account like http://mysite.com/users/324 (any digit) 
    'users/friends/page-(?<page_number>\d+)' => 'modules/users/friends/page-$1', 
    'users/friends/edit/page-(?<page_number>\d+)' => 'modules/users/friends/edit/page-$1', 
    'users/friends/edit' => 'modules/users/friends/edit', 
    'users/friends/' => 'modules/users/friends/', 
    'users/online' => 'modules/users/online/' , 
    'users/online/page-(?<page_number>\d+)' => 'modules/users/online/page-$1', 
    'users/create' => 'modules/users/create', 
    'users/settings' => 'modules/users/settings', 
    'users/logout(?<page_number>\d+)' => 'modules/users/logout', 
    'users/login' => 'modules/users/login', 
    'users/home' => 'modules/users/home', 

    //forums 
    'forums/' => 'modules/forums/index', 
    'forums/viewthread/(?<id_number>\d+)' => 'modules/forums/viewthread/$1', 
    'forums/viewforum/(?<id_number>\d+)' => 'modules/forums/viewforum/$1', 
    'forums/viewthread/(?<id_number>\d+)/page-(?<page_number>\d+)' => 'modules/forums/viewthread/$1/page-$2', 
    'forums/viewforum/(?<id_number>\d+)/page-(?<page_number>\d+)' => 'modules/forums/viewforum/$1/page-$2', 

    // TESTING new method to define class and page better! 
    'users/home' => array('PAGE CLASS NAME', 'ACTION NAME') 

    //blog routes coming soon 
    //mail message routes coming soon 
    //various other routes coming soon 
); 

////////////////////////////////// 
class Router 
{ 
    public function __construct() 
    { 
    } 

    public function get_route($uri, array $uri_routes) 
    { 
     foreach ($uri_routes as $rUri => $rRoute) { 
      if (preg_match("#^{$rUri}$#Ui", $uri, $uri_digits)) { 
       //if page number and ID number in uri then set it locally 
       $page_number = (isset($uri_digits['page_number']) ? $uri_digits['page_number'] : null); 
       $id_number = (isset($uri_digits['id_number']) ? $uri_digits['id_number'] : null); 
       echo '<hr> $page_number = ' . $page_number . '<BR><hr> $id_number = ' . $id_number; 
       $uri = preg_replace("#^{$rUri}$#Ui", $rRoute, $uri); 
       echo '<BR><BR>Match found: ' . $uri_routes . '<BR><BR>'; 
       break; 
      } 
     } 
     $uri = explode('/', $uri); 
    } 
} 

$uri = new Router(); 
$uri = $uri->get_routes($_GET['uri'], $uri_route_map); 

?> 



NOTA

el código anterior ES TODO CÓDIGO DE PRUEBA Y SERÁ CAMBIADO, ES SOLO EL CONCEPTO

S o como puede ver, estoy planeando que index.php obtenga el URI, lo verifique contra rutas válidas, si se encuentra uno, incluirá o creará una sección de encabezado, luego compilará la sección de contenido, y finalmente la sección de pie de página de la página.

Si se va a acceder, por ejemplo ... www.test.com/blogs/userid-32423/page-23

El la página haría ...

  • acumulación de cabecera()
  • cree objetos blog ... $ blogs = new Blogs;
  • llamada $ blogs-> viewbyID ($ userID, $ paginación); // $ ID de usuario sería 32423 y $ paginación sería del 23
  • la acumulación en el pie de página URI

Ahora basado en mi estructura de carpetas. Creo que el archivo de clase de blogs en nuestro ejemplo anterior se consideraría CONTROLLER. Si estoy correcto hasta ahora, entonces esta clase de blogs que llama blogs-> viewbyID (ID, PAGE) el método viewbyID configuraría algún código, consultaría la base de datos y configuraría algunas variables para la página y luego podría incluir un blog archivo de plantilla.Este archivo de plantilla de blogs podría considerarse el VIEWS.

Ahora podría tener todo este concepto mal, y es por eso que publiqué tanto código y texto para tratar de explicar mi punto de vista sobre él, por favor dame pensamientos, sugerencias, dime dónde estoy completamente equivocado, y dónde podría estar en el camino correcto, agradeceré mucho cualquier crítica constructiva o pensamientos. Si tengo razón en mi uso anterior de la porción Vista, Controlador del patrón MVC, ¿qué parte de mi código se consideraría Modal? Esto es algo confuso para mí por alguna razón.

Pregunta de bonificación ... ¿Qué hay de la publicación del formulario, donde debo procesarlos? En mi ejemplo me estoy enfocando en el módulo de blog, digamos POST para agregar nueva entrada de blog y POST para editar entradas de blog, ¿dónde deberían procesarse (modal, view, controller)?

+3

'producto terminado ... Puedo usarlo para desarrollar otros proyectos ...' Para ser justos, realmente debería usarlo para aprender/tomar sus bultos, pero vaya con un producto desarrollado profesionalmente como CakePHP, Symfony , CodeIgniter, Zend u otra de las soluciones bien utilizadas y documentadas. :) –

Respuesta

5

El trabajo del controlador es examinar la entrada del usuario y determinar lo que se está solicitando. Una vez que se determina, se invocan los modelos. El controlador toma la carga útil del modelo y la muestra.

Básicamente, el modelo es modelo del negocio. ¿Quieres añadir una publicación de blog? Luego, el modelo de Blog tendrá un método ->add o (que el controlador llamará. El controlador del blog también puede tener un método add, pero no es para hablar con la base de datos. Es para examinar la entrada y luego llamar al modelo para hacer el ahorro real). Los métodos modelo no siempre interactúan con una base de datos, pero generalmente lo hacen.

En cuanto a agregar/editar, casi siempre comparten la misma vista y pueden compartir los mismos métodos de control si es factible.

Solo recuerde que el controlador es el punto de entrada para todos sus clientes. Cada URL manejada por su aplicación debe asignarse a un método de controlador. Luego, el controlador le dice al modelo qué hacer y le pasa la información del usuario.

+0

gracias esto me ha tomado MUCHO tiempo para finalmente "OBTENERLO", pero creo que lo tengo ahora – JasonDavis

3

Sus modelos deben ser los que consulten la base de datos, no su Controlador. Su modelo está ahí para manejar todas las acciones de CRUD y, cuando sea necesario, pasar los resultados al controlador para entregar a la vista. flujo habitual sería

Controller > Model > Controller > View 
Cuestiones relacionadas