Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    59

    Strutturazione software

    Salve, scrivo qui perchè mi sembra il forum più autorevole per php,
    io sto realizzando un gestionale in php, e man mano che vado avanti mi rendo
    conto che c'è bisogno di un'astrazione maggiore per realizzarlo come si deve,
    siccome provengo dalla programmazione c++, volevo capire come di solito vengono
    strutturati i software in php, esempio avevo pensato di realizzare un file php con
    al suo interno tutte le classi che occorrono al software, ma poi mi sono reso conto
    che per poterle utilizzare devo dichiararle all'inizio di ogni file di ogni pagina php
    e quindi fare un include "fileclassi.php" all'inizio di ogni pagina e poi al suo interno
    utilizzare le classi, la mia domanda è se così facendo procedo nella maniera corretta
    oppure rischio di appesantire troppo tutto il software? e altra domanda,
    se così non è corretto come posso strutturarlo, come funziona la visibilità delle classi
    tra i vari file php?
    insomma ho bisogno di capire bene che cosa si fà in questi casi e come procedete
    voi nel realizzare un software, quello che però vorrei evitare è comporre il codice html
    in maniera modulare, cioè io vorrei che le pagine che realizzo abbiano il codice html pulito
    e dove occorre inserire le parti in php senza stare a realizzare un parser dei pezzi di codice html,
    secondo voi è fattibile?


    Sincero di una vostra risposta saluto e ringrazio cordialmente

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2009
    Messaggi
    114
    Amico mio... un topic di 1000 pagine non basterebbe

    Se vieni dalla programmazione hai sicuramente dalla tua una base piu ordinata di quanto php non abbia di suo. Purtroppo (e per fortuna) php è un linguaggio debolmente tipizzato che ti permette di fare cose straordinarie ma anche cose molto disordinate e con poco criterio ma che... funzionano lo stesso.

    Ho passato la tua stessa esperienza e posso dire, con senno di poi, che se vuoi sviluppare un gestionale (con tutte le sue possibili sfaccettature) devi partire molto da lontano e pianificare con attenzione ogni componente e passaggio.

    A mio parere potresti trovare molto interessante il design pattern MVC (mode - view - controller). Ci vorrebbe tempo per entrare nei dettagli sul mvc qui online. Potresti iniziare dallo Zend Framework che oltre a garantirti una mole di classi molto utili per le piu disparate funzionalita in php (dalla gestione dei database all'invio di mail) si basa proprio sul design pattern mvc.

    Infine, per quanto riguarda html e php... è buona pratica separare html e php utilizzando magari un template engine (senza buttarsi necessariamente su smarty che è il più famoso ma anche pesante e macchinoso).

    Gabriele

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    59
    capisco, infatti gironzolando su internet ho notato questo modo di strutturare che và di moda adesso che si chiama MVC, però intendevo prima un'attimo "farmi le ossa" procedendo per passi, e quindi magari fare prima esperienza creando un file index.php che generi il tutto e poi passare con calma al modello MVC, solo che avrei un'attimo bisogno di un qualche programma fatto nella maniera "old style" per poi passare ad altro, giusto per capire il meccanismo di base, conosci qualche programma semplicissimo che posso "smembrare" per capirne il funzionamento, quello di cui ho bisogno è di capire bene come posso creare un index.php che assembla le parti di programma che si visualizzano poi a browser, senza nemmeno essere troppo astratti una cosa semplice

  4. #4
    Beh l'idea di base e' che la tua applicazione e' sostanzialmente composta da due parti: l'elaborazione dei dati e la loro visualizzazione tramite output HTML per il browser. La naturale separazione tra queste due fasi ha portato alla realizzazione ed all'utilizzo di strumenti come framework MVC e template engine. Credo che anche imparando sia importante tenere separato il codice che elabora informazioni dal markup che genera l'output.

    Esempio:

    Codice PHP:
    <?php
    $today 
    date('d/m/Y'time()); // data odierna
    $news = ... // array creato tramite interrogazione del database
                // contenente un elenco di news

    // ogni altra necessaria elaborazione e creazione di variabili
    ?>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>Notizie del <?php echo $today?></title>
    </head>

    <body>
    <table>
    <?php foreach ($news as $line): ?>
    <tr><td><?php echo $line?></td></tr>
    <?php endforeach; ?>
    </table>    
    </body>

    </html>
    questo e' un esempio semplicissimo, ma la struttura e' questa.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2009
    Messaggi
    114
    Il pattern mvc non è particolarmente complesso, e puo anche essere semplificato per essere piu digeribile.
    Dunque, se non vuoi fare una cosa troppo complicata potresti agire cosi:

    tramite un file .htaccess reindirizzi tutte le richieste http alla index
    Il codice potrebbe essere simile a questo:
    Codice PHP:
    AddType text/css .css
    Options 
    -Indexes +FollowSymLinks
    RewriteEngine on
    RewriteRule 
    ^(it/|en/|fr/|de/|)([a-z0-9\/_-]+).htmlindex.php?lingua=$1&azione=$2&%{QUERY_STRING} [L
    Cosa fa?
    Semplicemente qualsiasi richiesta viene inviata alla index.php.
    Esempio di indirizzo:
    http://www.nomesito.it/contentuto/le...lo/123456.html

    nella tua index avrai $_GET['azione']="contentuto/leggi/articolo/123456";
    Alternativamente puoi anche gestire le lingue, per esempio
    http://www.nomesito.it/en/contentuto...lo/123456.html
    nella tua index avrai $_GET['azione']="contentuto/leggi/articolo/123456"; e $_GET['lingua']="en";

    Come puoi vedere dall'htaccess, la lingua è opzionale (it/|en/|fr/|de/| significa che può essere it en fr de o niente, in tal caso sta a te inizializzare e gestire i contenuti e le lingue impostandone una di default (supponiamo l'italiano).

    Ora concentriamoci su $_GET['azione']="contentuto/leggi/articolo/123456". E' qui che avviene tutto il meccanismo di routing.
    Direttamente nella index dovresti:

    a - richiamare eventuali file di configurazione per inizializzare la connessione al db, definire tue funzioni personalizzate, importare eventuali file di lingua, gestire la sessione e via dicendo
    b - scomporre $_GET['azione'] con un "explode("/",$_GET['azione']). Otterrai cosi un array con cui definiremo classe, metodo e eventuali altri parametri.
    Esempio

    Codice PHP:
    //nella index dopo aver incluso file di funzione e via dicendo

    $azione=explode("/",$_GET['azione']);
    $classe=$azione[0];  //la classe che andremo a utilizzare
    $metodo=$azione[1];  //il metodo della classe che richiameremo
    $parametriarray_slice($azione,2); //array contenente altri campi passati nella url, in questo caso "articolo" e "123456"

    require_once("percorso_classi/classe_".$classe.".php");
    $obj= new $classe($parametri); //costruisce un oggetto della classe richiamata, in questo caso "contenuto", passandogli l'array di parametri (articolo e 123456)
    $obj->$metodo(); //esegue il metodo richiesto, in questo caso "leggi()"; 
    La tua classe contenuto potrebbe essere qualcosa di simile

    Codice PHP:

    class contenuto {

        private 
    $parametri;
        
        public function 
    __construct($parametri) {
            
    $this->parametri=$parametri;
        }
        
        public function 
    leggi() {
            
    $tipo_contenuto=$this->parametri[0];
            
    $id_contenuto=$this->parametri[1];
            
            
    //recupera da db il testo del contenuti con id 123456
            //inizializza il template
            //stampa avideo il template
        
    }
        
        private 
    funcion metodo_privato1() {
            ....
            ...
        }
        
        private 
    funcion metodo_privato2() {
            ....
            ...
        }

    Questo significa che se vuoi abilitare un nuovo tipo di indirizzo come http://www.nomesito.it/contenuto/sta...contenuto.html (dove id contenuto è chiaramente sempre l'id del contenuto da stampare) ti basta aggiungere un metodo pubblico "stampa" alla classe "contenuto".
    Ogni volta che richiamo un metodo della classe contenuto, esso puo accedere anche ai metodi privati della sua classe

    Ovviamente questa è una infarinatura, ti faccio qualche considerazioneimportanete:

    1. tutte le classi andrebbero chiaramente inserite in una cartella non visibile all'esterno (quindi un livello sotto public_html)
    2. tutte le classi dovrebbero estendere una "superclasse", che potrebbe chiamarsi class router, che fornisce cosi metodi comuni ad ogni classe (per esempio un metodo per richiamre il template dell'azione richiamata), o il costruttore in comune
    3. con un template engine, dovresti creare un file .html per ogni metodo di ogni classe. Per esempio avere una cartella con il file tpl.contenutoLeggi.html che andrai a richiamare, parsare e restituire quando un url del tipo contenuto/leggi..." viene richiamato
    4. nella tua index, prima di richiamare il metodo della classe richiesta, dovresti integrare una serie di funzioni o classi a tuo piacimento per inizializzare e gestire collegamenti mysql, template principale del sito, autenticazione e via dicendo (insomma un tuo piccolo framework)
    5. sarebbe consigliabile inserire nella index un codice simile
    Codice PHP:
    try {
     
    //..azioni della index che esplode l'azione e richiama la classe e il metodo
    }
    catch (
    eccezione $exception) {    
        
    //gestione dell'eccezione con redirect 404 e store dell'errore

    in questo modo puoi gestire le eccezioni e gli errori di tutto il tuo applicativo (per esempio potresti lanciare una eccezione all'interno di contenuto->leggi se il contenuto 123456 non esiste!


    I vantaggi di questa struttura sono notevoli:

    1. sai sempre dove andare a guardare quando hai un problema in una pagina. questo perche sai che un indirizzo del tipo www.nomesito.it/newsletter/iscriviti.html richiama esattamente il metodo "iscriviti" della classe "newsletter"
    2. tieni i file php e html completamente separati da loro (chiaramente i file html conterrano istruzioni php, come la stampa del titolo e testo di un contenuto, ma questo è la normale struttura di un template engine)
    3. classi e template non sono pubblici, perche li puoi tenere sotto alla public_html, tenendo in pucli_html solo index, htaccess ed cartelle di img, js, css...
    4. puoi accumulare in una variabile la stringa html che rappresenta il template, e stamparla solo alla fine dello script se non si sono verificati errori
    5. con il try catch puoi gestire ogni tipo di errore o situazione ambigua chiudendo velocemente l'esecuzione

    Ovviamente il discorso andrebbe ulteriormente approfondito. Per la gestione dei template ti consiglio raintpl (http://www.raintpl.com/?lang=ita).

    Gabriele

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    92
    mxdesign veramente complimenti per l'esauriente esposizione, stavo cercando altre cose sul forum e mi sono imbattuto in questa interessantissima discussione.

    Sapresti per caso indicarmi qualche risorsa / articolo online? La tua mi sembra un'ottima base e vorrei documentarmi ancora di più su quanto presente oggi sulla scena.

    Ciao e grazie

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    anch'io ho la tua esperienza e lavoro in c++ ma ti consiglio di studiare i pattern(magari il libro della gang of four)ma soprattutto di appoggiarsi ad un framework tipo symfony o zend_framework, per un progetto di medio/grosse dimensioni ti semplificano molto la vita , davvero.
    Io sto utilizzando symfony e mi trovo benissimo.
    Questi framework non solo hanno numerose funzioni o classi , ma soprattutto ti permettono di procedere in modo molto ordinato , la pecca di php.
    ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2009
    Messaggi
    114
    Originariamente inviato da giuseppe500
    anch'io ho la tua esperienza e lavoro in c++ ma ti consiglio di studiare i pattern(magari il libro della gang of four)ma soprattutto di appoggiarsi ad un framework tipo symfony o zend_framework

    Originariamente inviato da ilNotturn0
    mxdesign veramente complimenti per l'esauriente esposizione, stavo cercando altre cose sul forum e mi sono imbattuto in questa interessantissima discussione.

    Sapresti per caso indicarmi qualche risorsa / articolo online?
    La migliore risposta te l'ha appena data giuseppe500. A mio parere partire da zend framework è la scelta piu intelligente: considerate che è il framework sviluppato dai creatori e gestori di php.
    Sempre aggiornato (fin troppo) e molto valido.

    http://framework.zend.com/

    Gabriele

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    7
    Ragazzi ho un problema che non riesco a risolvere. Allora io voglio accedere nella parte amministratore del mio sito mettendo come link di riferimento nel template Admin/Login e non un file statico.

    il file index.php

    $inizio = new IndexControllore();
    $inizio->Invio();

    Il metodo Invio controlla url mi vede se sono nella pagina principale e mi fa partire index.tpl richiamndo la classe e il metodo necessario e questo mi funziona.
    Ma se devo far partire la pagina dell'amministratore allora dovrà scomporre l'url e comporre la classe e il metodo necessario da far partire per esemio la classe AdminControllore.class.php con il metodo login.

    function Invio($default = 'Index' )
    {


    $uri = explode( '?', $_SERVER['REQUEST_URI'];
    $input = explode( '/', $uri[ 0 ] );


    if( strlen( $input[ 1 ] ) < 1 ) // default Controller
    $input[ 1 ] = 'Index';

    if( strlen( $input[ 2 ] ) < 1 ) // default function
    $input[ 2 ] = 'Index';

    $method = $input[ 2 ];
    $controller_name = "{$input[1]}Controller";

    if( class_exists( $controller_name ) )
    {
    $controller = new $controller_name;

    if( strlen( $method ) == 0 )
    $method = 'Index';

    if( method_exists( get_class( $controller ), $method ) )
    {

    $controller->$method( $input[ 3 ], $input[ 4 ] );

    exit;
    }
    }

    }

    io nell'index.tpl ho un link a Admin/Login che mi compone l'url. Qunado io premo su questo link mi dice pagine non trovata. Mentre dovrebbe ripartire l'index.php però questa volta avendo come url http://www.nomesito.it/Admin/Login. in modo tale da fare l'operazione precedentemente descritta, prendendo Admin come classe e Login come metodo e quindi far partire il template admin.tpl.

    Ecco quello che mi domando se questo che sto facendo è giusto oppure no. Perchè non funziona?. Un'altra cosa centra per caso il file .htaccess per ridenominare il path dell'url.

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    7
    Ragzzi ho provato a vedere con un file .htacces ma mi da errore 500. Non ho ben capito come funziona quello che ho scritto è

    RewriteEngine on
    RewriteRule .* index.php

    Il mio ragionamento è che ogni volta che faccio partire per esempio Admin/Logn dovrebbe reindirizzarmi al file index.php che mi riscatena quello detto precedentemente, cioè mi fa partire il file AdminControllore.class.php. Non so se mi sono spiegato bene. Vi prego aiutatemi perchè sto impazzendo. Se avete altre soluzioni su come risolvere il problema anche più semplici, se mi sto imbattendo in qualche cosa di troppo complicato aiutatemi.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.