Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: MVC php-login project

  1. #1
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202

    MVC php-login project

    Ciao a tutti,

    Eccomi qui, con il 1000 post dall'iscrizione in questo forum.
    Colgo l'occasione di ringraziare alcune persone che mi hanno aiutato fino ad oggi, permettendomi di intraprendere questo bruttissimo e bellissimo lavoro.
    Sicuramente non eccello come programmatore come standard, ma la fortuna mi ha fatto essere presente al momento giusto nel posto giusto, potendomi così aggiudicare in questo settore.
    In particolare voglio ringraziare :
    Al_katraz984
    Santino83_02
    Alhazred
    satifal (anche se un po burbero nelle risposte scherzo)

    e sicuramente tutte le altre persone che mi sto dimenticando...

    Tornando al problema, io mi sto cimentando nel pattern MVC.
    Per inziare ad avvicinarmi ho cercato un progettino scheletro già costruito che potesse aiutarmi a capire la logica... e ho trovato questo :

    http://www.php-login.net/

    Mi pare un progettino ben strutturato e anche relativamente semplice da comprendere (A voi giudizi positivi o negativi in base alle vs. esperienze)

    Allora...
    Sto modificando l'entità login (anche se avrei preferito esistesse un'entità $user ma va be poco cambia).
    Ho un metodo nel controller register() il quale viene richiamato quando l'utente amministratore preme nel menu la funzione per registrare un nuovo utente
    Codice PHP:
    class LoginModel
    {
        function 
    register()
        {
            
    $shop_model $this->loadModel('shop');
            
    $this->view->Shops $shop_model->getShops();
            
    $this->view->render('login/register');
        }

    Inizialmente questo metodo faceva semplicemente il render della view.
    Ora io ho costruito controller/model/view di una mia entità "Shop".
    In particolare ho la necessità di istanziare $shop_model, perchè mi restituisca la lista degli "shop" presenti nel db.

    Prima domanda.
    E' corretto che il metodo register LoginModel istanzi un altro Model per accedere ai suoi metodi
    (Vedi caso : $shop_model = $this->loadModel('shop'); $this->view->Shops = $shop_model->getShops()?

    Poi la seconda cosa che non ho capito ma che ho intuito vedendo come altri metodi passano le variabili alla view è il seguente :
    $this->view->Shops = $shop_model->getShops();

    Qui in particolare non riesco a capire perchè utilizza $this-> per richiamare la view

    e poi come cavolo fa con questo $this->view->Shops a passare la variabile, è come se creasse nella classe view una propietà al volo.

    Il tutto comunque funziona, ma proprio non riesco a capire il funzionamento.
    Per completezza specifico che il getShop() restituisce un array multidimensionale che ciclo nella view e che stampo come checkbox
    Che mestiere difficile.....essere da soli ancora di più

  2. #2
    Ringrazio per gli apprezzamenti che ho ricevuto!

    Quote Originariamente inviata da Fractals87 Visualizza il messaggio
    Prima domanda.
    E' corretto che il metodo register LoginModel istanzi un altro Model per accedere ai suoi metodi
    (Vedi caso : $shop_model = $this->loadModel('shop'); $this->view->Shops = $shop_model->getShops()?
    Diciamo che non è sbagliato, ma non sarebbe neanche giusto.. bisognerebbe definire cosa si intende per "model" in questo contesto. Ad occhio il Model gestisce l'intera parte "M Model" del sistema senza sezionarne le competenze quindi può essere corretto come approccio.
    Un modulo può aver bisogno di altri moduli per operare. Se pensi anche solamente ad un "nodo" (contenuto)
    il modulo "Node" potrebbe usare il modulo "Tag" per la selezione dei tags da associare al nodo, oppure il modulo "User" per sapere a che utente appartiene.. ect ect..
    Anche se c'è da dire che spezzando il Model in sub-pack avresti una gestione migliore del sistema (SRP)

    Poi la seconda cosa che non ho capito ma che ho intuito vedendo come altri metodi passano le variabili alla view è il seguente :
    $this->view->Shops = $shop_model->getShops();

    Qui in particolare non riesco a capire perchè utilizza $this-> per richiamare la view
    La view globale è "iniettata" per aggregazione al controllore che in questo modo la può modificare a piacimento

    La logica spiccia è:
    Codice PHP:
    // layer 0 - index.php
    $layout = new view();

    $fc = new FrontController()
    $fc->run$layout, ... );

    // layer n - modules\userController.php
    // in questo modo il controller può modificare la view globale
    $c = new userController$layout ); 
    e poi come cavolo fa con questo $this->view->Shops a passare la variabile, è come se creasse nella classe view una propietà al volo.
    è una funzione normale della view, si fa tramite i magic methods __get e __set

    daje e studia!!!
    Questa volta, più che un voto.. è favoreggiamento.

  3. #3
    Posso sapere perchè si chiama LoginModel ma usa delle cose da "Controller" come un "view"? E' il framework che usa questa nomenclatura? Se si, cambia framework

    Considera che:

    Il Model è la rappresentazione del tuo dominio, quindi tutti i dati che la tua applicazione manipola (esempio: Utenti, Negozi, Clienti, Fornitori, etc..) e normalmente è strettamente collegato (via PDO) alla base dati utilizzata

    La View si preoccupa di mostrare il risultato della manipolazione effettuato dal controller. Normalmente il controller passa alla view i dati necessari alla view per mostrare l'output. La view si occupa solo del rendering e non possiede logiche da controller (non fà query ad esempio alla base dati)

    Il Controller gestisce la richiesta usando i models e la view per produrre un risultato. Controlla i permessi dell'utente, controlla i parametri della richiesta, interroga i models per avere i dati che servono alla view, istanzia la view le passa tutti i parametri che servono e poi passa il controllo alla view usando normalmente la funzione "render" o analoghe


    Detto questo: LoginModel che è? :F
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  4. #4
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Ad occhio il Model gestisce l'intera parte "M Model" del sistema senza sezionarne le competenze quindi può essere corretto come approccio.
    Un modulo può aver bisogno di altri moduli per operare. Se pensi anche solamente ad un "nodo" (contenuto)
    il modulo "Node" potrebbe usare il modulo "Tag" per la selezione dei tags da associare al nodo, oppure il modulo "User" per sapere a che utente appartiene.. ect ect..
    Ok mi è chiarissimo.

    Anche se c'è da dire che spezzando il Model in sub-pack avresti una gestione migliore del sistema (SRP)
    Ok presumo che questa articolazione la potro trovare in un vero framework.
    Tipo Synfony?
    Ho già provveduto a creare una vm con ubutu e configurare lamp inziando con la guida synfony2 di html.it mi sembra ben fatto.
    Ma volevo iniziare con un progettino già pronto che permettesse di afferrare bene in concetto mvc, pur basilare che possa essere.

    La view globale è "iniettata" per aggregazione al controllore che in questo modo la può modificare a piacimento
    ok chiaro, presumo ti riferisca proprio a questa riga di codice giusto?
    Sarebbe il controller principale dell'applicazione
    Codice PHP:
    class Controller
    {
        function 
    __construct()
        {
            
    Session::init();

            
    // user has remember-me-cookie ? then try to login with cookie ("remember me" feature)
            
    if (!isset($_SESSION['user_logged_in']) && isset($_COOKIE['rememberme'])) {
                
    header('location: ' URL 'login/loginWithCookie');
            }

            
    // create database connection
            
    try {
                
    $this->db = new Database();
            } catch (
    PDOException $e) {
                die(
    'Database connection could not be established.');
            }

            
    // create a view object (that does nothing, but provides the view render() method)
            
    $this->view = new View();
        } 
    E presumo che " $this->view = new View();" utilizzi sempre i __set magico che crea al volo la proprietà.
    Ulteriore domanda sta nel prossimo punto.

    è una funzione normale della view, si fa tramite i magic methods __get e __set

    daje e studia!!!
    Ok li conoscevo quei metodi, anche se non li avevo mai usati.
    Però mi aspettavo che fossero dichiarati esplicitamente in questo modo :

    Codice PHP:
        public function __set($name$value) {
            
    $this->$name $value;
        } 
    A questo punto mi viene solo da pensare che funzion ano anche se non sono dichiarati esplicitamente, in quanto queste righe di codice non ci sono.








    ---------------------------------------------------------------------------------------------------------------------------------------------

    Risposte a Santino

    Posso sapere perchè si chiama LoginModel ma usa delle cose da "Controller" come un "view"? E' il framework che usa questa nomenclatura? Se si, cambia framework
    E infatti hai ragione, quello che ho chiamato LoginModel, in realtà è il controllore del Login che istanzia il model che si occupa della comunicazione col db...
    Azz non si può sbagliare niente

    Sicuramente non lo chiamo framework perchè non lo è ma secondo me è molto semplice da capire e modificare (e mi pare abbastanza corretto come è impostato), utile per la prima esperienza mvc.

    Detto questo: LoginModel che è? :F
    Anche io sono d'accordo con te (sempre sperando che stiamo pensando alla stessa cosa).

    Preferivo avere non un login_controller, login_model, login_view... ma un user_controller, user_model, user_view(di cui una era la login).

    Ma in questo caso è statu strutturato come se il login fosse un'entità.
    Poco male (almeno dal mio punto di vista profano), me lo tengo cosi (anche se all'interno del login_model l'ho modificato integrando una classe user, che sicuramente dal tuo punto di vista sarà un accrocchio terribile, ma non avevo voglia di modificare tutto il login, me lo tengo e pace)

    Parallelamente sto cercando di costruire degli oggetti in modo più corretto ES
    una delle entità è negozio, il quale deve avere un metodo per la registrazione degli incassi percui :

    Codice PHP:
    class shop extends Controller
    {
        function 
    __construct()
        {
            
    parent::__construct();
        }

        function 
    writeIncassi()
        {
            
    $this->view->render('shop/incasso');
        }
        
        function 
    writeIncassi_action()
        {
            
    $shop_model $this->loadModel('shop');
            
    $write_successful $shop_model->writeIncasso();

            if (
    $write_successful == true) {
                
    header('location: ' URL 'login/index');
            } else {
                
    header('location: ' URL 'login/register');
            }        
        }    


    Codice PHP:
    class shopModel
    {
        
    /**
         * Constructor, expects a Database connection
         * @param Database $db The Database object
         */
        
    public function __construct(Database $db)
        {
            
    $this->db $db;
        }

        
    /**
         * writeIncassi
         * @return bool success state
         */
        
    public function getShops()
        {
            
    // write new users data into database
            
    $sql "SELECT * FROM negozi";
            
    $query $this->db->prepare($sql);
            
    $query->execute();
            
    $result $query->fetchAll();
            return 
    $result;
        }

        public function 
    writeIncasso()
        {
        
    //non ti indico tutto il pippone ma qui faccio la scrittura in base al $_POST sul db 
    Ti riporto per completezza uda delle view... quella per l'incasso... poi ne seguiranno molte altre.
    Codice PHP:
    <div class="content">
        <!-- echo out the system feedback (error and success messages) -->
        <?php $this->renderFeedbackMessages(); ?>

        <div class="incassi-default-box">
            <h1>Registra il tuo incasso</h1>
            <!-- register form -->
            <form method="post" action="<?php echo URL?>shop/writeIncassi_action" name="incassiform">
                <!-- the user name input field uses a HTML5 pattern check -->
                <label for="incassi_input_data">
                    Data
                </label>
                <input id="incassi_input_data" class="incassi_input" type="text" name="data" value="<?=date("d/m/Y")?>" required /><br />
                <label for="incassi_input_numeroClienti">
                    Numero Clienti 
                </label>
                <input id="incassi_input_numeroClienti" class="incassi_input" type="text" pattern="[0-9]" name="num_clienti" required /><br />
                <label for="incassi_input_contanti">
                    Contanti
                </label>
                <input id="incassi_input_contanti" class="incassi_input" type="text" pattern="[0-9]" name="contanti" required /><br />
                <label for="incassi_input_carteCredito">
                    Carte di Credito
                </label>
                <input id="incassi_input_carteCredito" class="incassi_input" type="text" pattern="[0-9]" name="carte_credito" required /><br />
                <label for="incassi_input_assegni">
                    Assegni
                </label>
                <input id="incassi_input_assegni" class="incassi_input" type="text" pattern="[0-9]" name="assegni" required /><br />
                <label for="incassi_input_trattamenti">
                    Trattamenti
                </label>
                <input id="incassi_input_trattamenti" class="incassi_input" type="text" pattern="[0-9]" name="trattamenti" required /><br />
                <label for="incassi_input_prodotti">
                    Prodotti
                </label>
                <input id="incassi_input_prodotti" class="incassi_input" type="text" name="prodotti" required /><br />

                <input type="submit"  name="writeIncassi" value="Invia Dati" />
            </form>
        </div>
    </div>



    in definitiva dopo tutto questo pippone.
    Quello che ho interpretato come poco corretto è quello che pensavi anche tu?

    Il mio modo di proseguire ha una parverza di essere corretto????
    Ultima modifica di Fractals87; 28-11-2014 a 13:43
    Che mestiere difficile.....essere da soli ancora di più

  5. #5
    Scusa, ma a me sinceramente rivedere per l'ennesima volta la ricreazione di un framework da 0 stomaca alquanto. Partendo dal presupposto che l'MVC è un pattern abbastanza semplice da capire, la sua implementazione fatta come si deve richiede parecchio lavoro. Soprattutto quando parli di "M", li le cose si complicano alquanto. Quindi ti suggerirei alcune strade:

    1) Usi un framework serio e completo (Symfony ad esempio) che ha tutto quello che ti serve per sviluppare e per capire quello che stai facendo

    2) Usi vari framework per realizzarne uno tuo fatto a mano, in maniera da andare proprio dentro all'implementazione di un MVC ma con della roba già pronta

    http://fabien.potencier.org/article/...ponents-part-1
    http://twig.sensiolabs.org/
    http://www.doctrine-project.org/

    3) Parti da 0 proprio senza prendere spunto da script strani dal nome improbabile e ti scrivi tutto a manella (buona fortuna)

    Anche perchè per implementare la M ci sono mille modi diversi:

    http://www.oracle.com/technetwork/ja...ct-138824.html
    http://msdn.microsoft.com/en-us/library/ff649690.aspx
    http://martinfowler.com/eaaCatalog/index.html

    etc etc etc per ogni punto del framework che andrai a vedere. L'approccio che piu preferisco è il repository pattern, dove hai il model che è una classe POJO semplice semplice con le relazioni uno/molti, molti/molti, etc con gli altri models, e poi hai i repository che forniscono i metodi per interrogare i singoli model (ad esempio nel tuo caso avresi uno ShopRepository col metodo "findAll" che ritorna una collezione di model Shop)
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  6. #6
    Quote Originariamente inviata da Fractals87 Visualizza il messaggio
    Ok presumo che questa articolazione la potro trovare in un vero framework.
    Tipo Synfony?
    si o Laravel che è bellino bellino

    ok chiaro, presumo ti riferisca proprio a questa riga di codice giusto?
    Sarebbe il controller principale dell'applicazione
    Codice PHP:
    class Controller
    {
        function 
    __construct()
        {
            
    // create a view object (that does nothing, but provides the view render() method)
            
    $this->view = new View();
        } 
    E presumo che " $this->view = new View();" utilizzi sempre i __set magico che crea al volo la proprietà.
    si è questo il punto ma come scrivono sul commento, la classe View messa li cosi, non ha molto senso di esistere...

    I magic methods sono implementati dalla classe View, vai sul listato di View e vedrai che li trovi come li hai scritti

    A questo punto mi viene solo da pensare che funzion ano anche se non sono dichiarati esplicitamente, in quanto queste righe di codice non ci sono.
    NO... è impossibile che il programma giri se il codice non è scritto!!

    +1 per questo link: http://martinfowler.com/eaaCatalog/index.html
    Questa volta, più che un voto.. è favoreggiamento.

  7. #7
    Quote Originariamente inviata da Al_katraz984 Visualizza il messaggio
    si o Laravel che è bellino bellino

    +1 per questo link: http://martinfowler.com/eaaCatalog/index.html
    Il libro cartaceo è uno spettacolo. Suggerisco anche http://martinfowler.com/books/eip.html
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  8. #8
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Quote Originariamente inviata da Santino83_02 Visualizza il messaggio
    Scusa, ma a me sinceramente rivedere per l'ennesima volta la ricreazione di un framework da 0 stomaca alquanto. Partendo dal presupposto che l'MVC è un pattern abbastanza semplice da capire, la sua implementazione fatta come si deve richiede parecchio lavoro. Soprattutto quando parli di "M", li le cose si complicano alquanto.
    Capisco perfettamente, ma il mio intento era di iniziare a capire mvc da un piccolo progetto.
    A questo punto mi viene da pensare che per come è costruita la logica mvc in questo mini framework sia un pò errata, e tanto vale utilizzarlo.
    Proverò allora ad utilizzare subito symfony sperando di capirci e non andare a casaccio.

    NO... è impossibile che il programma giri se il codice non è scritto!!
    non ti sto prendendo in giro :

    Codice PHP:
    <?php

    /**
     * Class View
     *
     * Provides the methods all views will have
     */
    class View
    {
        
    /**
         * simply includes (=shows) the view. this is done from the controller. In the controller, you usually say
         * $this->view->render('help/index'); to show (in this example) the view index.php in the folder help.
         * Usually the Class and the method are the same like the view, but sometimes you need to show different views.
         * @param string $filename Path of the to-be-rendered view, usually folder/file(.php)
         * @param boolean $render_without_header_and_footer Optional: Set this to true if you don't want to include header and footer
         */
        
    public function render($filename$render_without_header_and_footer false)
        {
            
    // page without header and footer, for whatever reason
            
    if ($render_without_header_and_footer == true) {
                require 
    VIEWS_PATH $filename '.php';
            } else {
                require 
    VIEWS_PATH '_templates/header.php';
                require 
    VIEWS_PATH $filename '.php';
                require 
    VIEWS_PATH '_templates/footer.php';
            }
        }

        
    /**
         * renders the feedback messages into the view
         */
        
    public function renderFeedbackMessages()
        {
            
    // echo out the feedback messages (errors and success messages etc.),
            // they are in $_SESSION["feedback_positive"] and $_SESSION["feedback_negative"]
            
    require VIEWS_PATH '_templates/feedback.php';

            
    // delete these messages (as they are not needed anymore and we want to avoid to show them twice
            
    Session::set('feedback_positive'null);
            
    Session::set('feedback_negative'null);
        }

        
    /**
         * Checks if the passed string is the currently active controller.
         * Useful for handling the navigation's active/non-active link.
         * @param string $filename
         * @param string $navigation_controller
         * @return bool Shows if the controller is used or not
         */
        
    private function checkForActiveController($filename$navigation_controller)
        {
            
    $split_filename explode("/"$filename);
            
    $active_controller $split_filename[0];

            if (
    $active_controller == $navigation_controller) {
                return 
    true;
            }
            
    // default return
            
    return false;
        }

        
    /**
         * Checks if the passed string is the currently active controller-action (=method).
         * Useful for handling the navigation's active/non-active link.
         * @param string $filename
         * @param string $navigation_action
         * @return bool Shows if the action/method is used or not
         */
        
    private function checkForActiveAction($filename$navigation_action)
        {
            
    $split_filename explode("/"$filename);
            
    $active_action $split_filename[1];

            if (
    $active_action == $navigation_action) {
                return 
    true;
            }
            
    // default return of not true
            
    return false;
        }

        
    /**
         * Checks if the passed string is the currently active controller and controller-action.
         * Useful for handling the navigation's active/non-active link.
         * @param string $filename
         * @param string $navigation_controller_and_action
         * @return bool
         */
        
    private function checkForActiveControllerAndAction($filename$navigation_controller_and_action)
        {
            
    $split_filename explode("/"$filename);
            
    $active_controller $split_filename[0];
            
    $active_action $split_filename[1];

            
    $split_filename explode("/"$navigation_controller_and_action);
            
    $navigation_controller $split_filename[0];
            
    $navigation_action $split_filename[1];

            if (
    $active_controller == $navigation_controller AND $active_action == $navigation_action) {
                return 
    true;
            }
            
    // default return of not true
            
    return false;
        }
    }
    Che mestiere difficile.....essere da soli ancora di più

  9. #9
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    A quanto pare sembra che i metodi magici funzionino a prescindere dal fatto che __set sia dichiarato esplicitamente.
    Codice PHP:
    <?php
    class test
    {
        public 
    $tmp "ciao";
        
        function 
    __construct(){
            
    $this->tmp2 "mondo";
        }
    }

    $test = new test();

    print_r($test);
    ?>
    result print_r : test Object ( [tmp] => ciao [tmp2] => mondo )
    Che mestiere difficile.....essere da soli ancora di più

  10. #10
    Quote Originariamente inviata da Fractals87 Visualizza il messaggio
    A quanto pare sembra che i metodi magici funzionino a prescindere dal fatto che __set sia dichiarato esplicitamente.
    Codice PHP:
    <?php
    class test
    {
        public 
    $tmp "ciao";
        
        function 
    __construct(){
            
    $this->tmp2 "mondo";
        }
    }

    $test = new test();

    print_r($test);
    ?>
    result print_r : test Object ( [tmp] => ciao [tmp2] => mondo )
    quella li è semplicemente la classe che se non dichiari la proprietà ma la inizializzi nel costruttore, la crea come pubblica di default.. i __set e __get si usano diversamente

    cambia framework di base !!!
    Questa volta, più che un voto.. è favoreggiamento.

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.