2011-02-03 10 views
5

Sto cercando di creare un framework PHP valido per uso personale. Mi rendo conto che ce ne sono molti esistenti ma questa è una grande esperienza di apprendimento che copre una vasta maggioranza di diverse sfide e mi insegna molto, oltre ad avere un prodotto finito quando ho finito che posso sperare di utilizzare altri progetti e dal momento che lo sto costruendo, non ci dovrebbe essere alcuna curva di apprendimento su come usarlo.Ecco come utilizzare un pattern MVC in PHP OO

Alcuni degli obiettivi di base,
- Uso di Object Oriented PHP anziché procedurale.
- Usa un MVC o qualcosa di simile per saperne di più su questo stile.
- essere leggero e veloce/buona prestazione

Ecco il mio previsto struttura del sito, ad esclusione delle altre cartelle per javascript, immagini, css, alcune funzioni helper/file, ecc

/// struttura del sito ////////// /////////////

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 

ho deciso di instradare tutte le richieste attraverso un unico punto di ingresso, index.php
I wi Costruirò una classe/oggetto Router che abbinerà l'URI a una mappa di possibili destinazioni usando le espressioni regolari. Ecco un frammento di quello che ho per ora questa 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

il codice qui sopra È TUTTO CODICE TEST E SARANNO CAMBIATI, È SOLO IL CONCETTO

S o come puoi vedere Sto pianificando di avere index.php per ottenere l'URI, confrontarlo con percorsi validi, se uno viene trovato, includerà o costruirà una sezione di intestazione, quindi costruirà la sezione content, quindi infine la sezione footer di la pagina.

Se si dovesse accedere, per esempio ... www.test.com/blogs/userid-32423/page-23

La pagina sarebbe ... intestazione

  • accumulo()
  • creare blog oggetto ... $ blogs = nuovi blog;
  • chiamata $ blog-> viewbyID ($ userID, $ paging); // $ userID sarebbe 32423 e $ paging sarebbe 23 dalla URI
  • sezione accumulo footer

Ora in base alla mia struttura di cartelle. Credo che il file di classe dei blog nel nostro esempio sopra sarebbe considerato il CONTROLLER. Se sono corretto finora, allora questa classe blog che sta chiamando blog-> ID viewby (ID, PAGE) il metodo viewbyID dovrebbe impostare un po 'di codice, interrogare il database e impostare alcune variabili per la pagina e quindi potrebbe includere un blog file di modello.Questo file modello di blog potrebbe essere considerato come VIEWS.

Ora potrei avere l'intero concetto sbagliato, ed è per questo che ho postato così tanto codice e testo per cercare di spiegare il mio punto di vista su di esso, per favore mi dia pensieri, suggerimenti, dimmi dove sono completamente sbagliato, e dove potrebbe essere sulla strada giusta, apprezzerò molto qualsiasi critica o pensiero costruttivo. Se ho ragione nel mio uso sopra della sezione View, Controller del pattern MVC, quale parte del mio codice verrebbe considerata come Modal? Questo è un po 'di confusione per me per qualche motivo.

Domanda bonus ... Che dire del modulo post, dove dovrei elaborarli? Nel mio esempio mi concentro sul modulo blog, quindi diciamo POST per l'aggiunta di nuovo post di blog e POST per la modifica di post di blog, dove dovrebbero essere elaborati (modale, visualizzazione, controller)?

+3

'prodotto finito ... posso ... utilizzare per sviluppare altri progetti ...' In tutta onestà, dovresti davvero usarlo per imparare/prendere i tuoi grumi, ma andare con un prodotto sviluppato professionalmente come CakePHP, Symfony , CodeIgniter, Zend o una delle altre soluzioni ben utilizzate e documentate. :) –

risposta

5

lavoro del controllore è quello di esaminare l'input dell'utente e determinare ciò che viene richiesto. Una volta determinato, il modello (i) viene invocato. Il controller quindi prende il carico utile del modello e lo dà alla vista.

Fondamentalmente, il modello è un modello dell'attività. Vuoi aggiungere un post sul blog? Quindi il modello Blog avrà un metodo ->add o (che viene chiamato dal controller.Il controller del blog potrebbe anche avere un metodo add, ma non è per parlare con il database. È per esaminare l'input e quindi chiamare il modello per fai il vero risparmio). I metodi del modello non sempre interagiscono con un database ma di solito lo fanno.

Per quanto riguarda l'aggiunta/modifica, condividono quasi sempre la stessa vista e possono condividere gli stessi metodi del controller se fattibile.

Basta ricordare che il controller è il punto di ingresso per tutti i client. Ogni URL gestito dalla tua applicazione deve essere associato a un metodo di controllo. Il controller quindi dice al modello cosa fare, passando l'input dell'utente ad esso.

+0

grazie, mi ci è voluto molto tempo per "OTTENERLO", ma penso di averlo capito ora – JasonDavis

3

I tuoi modelli dovrebbero essere quelli che interrogano il database, non il tuo Controller. Il tuo modello è in grado di gestire tutte le azioni CRUD e, se necessario, passare i risultati al Controller per passare alla vista. flusso di consueto sarebbe

Controller > Model > Controller > View