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)?
'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. :) –