IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Organisation de fichiers PHP - MVC [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut Organisation de fichiers PHP - MVC
    Bonjour,

    Etant confronté à un site prenant une ampleur assez considérable, je migre celui-ci en MVC.

    Cependant, j'ai quelque soucis à comprendre la différence entre le contrôleur et le modèle

    Voici un exemple concret où je désirerais que l'on m'explique comment départager mon code entre un contrôleur et un modèle.

    P.S : Je ne pose que le minimum.

    1) je crée un classe de connexion avec des requêtes de bases

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    <?php
    define('DB_HOST','localhost');
    define('DB_USER','****');
    define('DB_PASS','***');
    define('DB_NAME','****');
    class DbConnect{
        private $host = DB_HOST;
        private $user = DB_USER;
        private $pass = DB_PASS;
        private $dbname = DB_NAME;
        private $stmt;
        public $db;
     
        public function __construct(){
            $dsn = 'mysql:host='.$this->host.';dbname='.$this->dbname;
            $options = array(
                PDO::ATTR_PERSISTENT => true,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
            );
            // Create a new PDO instanace
            try{
                $this->db = new PDO($dsn, $this->user, $this->pass, $options);
            }
            // Catch any errors
            catch(PDOException $e){
                die($e->getMessage());
            }
        }
        public function query($query){
            $this->stmt = $this->db->prepare($query);
        }
        public function execute(){
            return $this->stmt->execute();
        }
        public function resultset(){
            $this->execute();
            return $this->stmt->fetchAll(PDO::FETCH_OBJ);
        }
        public function single(){
            $this->execute();
            return $this->stmt->fetch(PDO::FETCH_OBJ);
        }    
    }
    ?>

    2) Mon login en entrée de la page d'accueil si pas de session ouverte:
    (C'est là ou j'ai du mal à différencier model et controller)

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $DB = new DbConnect();
    $error = '';
    if(!empty($_POST)){
        $DB->query('SELECT * FROM users WHERE u_login="admin"');
        $row = $DB->single();
        echo "<pre>";
        print_r($row);
        echo "</pre>";
    }else{
        $error .= ' Veuillez entrer vos identifiants'; 
    }

    Et ma partie view du mvc que je comprends.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <form action="login" name="login" method="post">
        <input type="text" name="login">
        <input type="password" name="pswd">
        <input type="submit" value="Connexion">
    </form>
    Merci d'avance,
    David

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Je te donne un exemple : l'extraction des données de l'utilisateur relève du modèle, le contrôle de la validité du mot de passe saisi relève du contrôleur.

  3. #3
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    Oui, cela je l'ai lu partout. Mais c'est du Cambodgien pour moi. J'aimerai que de par mon exemple, que l'on m'explique. C'est pr cela que j'ai mis le mini minimum

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Ok, tiens à peu près la même question aujourd'hui ici
    Tu devrais voir la différence entre le contrôleur et le modèle qui ne font absolument pas la même chose.

  5. #5
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    Merci rawsrc mais c'est MON message ;-)

    Ou alors ton lien n'est pas correct.

    Merci d'avance

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12

  7. #7
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    Merci du lien que j'ai lu avec attention. C'est trop d'infos et de remise en question... Donc retour case départ pour moi. J'aimerais simplement, qu'avc l'exemple de mon premier poster que l'on me dise ce que je dois mettre dans le controller et ce que je dois mettre de le model.

    Si j'ai bien compris, le modele devrait traiter les requetes et le controller les erreurs de champs, mauvaises address email etc???

    C 'est un peu une masturbation du cerveau non?

    Puis je ne vois pas l'intérêt de créer un fichier de model avec 5 ou 10 lignes juste pour "faire" joli dans le modele MVC

    Merci de vos réponses

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par andaman Voir le message
    C 'est un peu une masturbation du cerveau non?

    Puis je ne vois pas l'intérêt de créer un fichier de model avec 5 ou 10 lignes juste pour "faire" joli dans le modele MVC
    Oui et non.

    Oui si ton site fait 10 pages, tu peux allègrement t'en passer.

    Et non, parce que les sites embarquent maintenant tellement de fonctionnalités que tu n'as pas trop le choix : il faut organiser intelligemment ton code de manière à ce que tu puisses t'y retrouver facilement d'une part et le maintenir d'autre part (c'est le plus important). Et là, rentre en ligne de compte le patron de conception MVC qui pose cette organisation, non d'après une théorie quelconque mais d'après la pratique, d'après ce qui a été constaté et analysé sur de nombreux très gros sites.

    Le MVC est suffisamment abstrait pour convenir à quasiment toutes les situations et suffisamment souple pour faire l'objet de quelques fluctuations ou adaptations sans le dénaturer.

    Le MVC possède des tas d'atouts et de bonnes pratiques qui proviennent toutes de l'expérience éprouvée de plein de développeurs et je ne vais pas te le cacher, dès que le projet devient sérieux, la maîtrise de ce patron est indispensable.

    A vrai dire je me suis rendu compte de son utilité quand pour la première fois je suis tombé sur le code source d'un site de 300 fichiers à maintenir. Là j'ai bien été content de pouvoir naviguer dans le code et me repérer sans difficultés parce que l'organisation collait bien au MVC. Et 300 fichiers c'est peanuts maintenant...

  9. #9
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    Merci de la réponse. Effectivement je commence à voir l'utilité du MVC.

    Mais dans un exemple basic de chez basique comme ci-dessous, je comprends la différence entre les couches mais je ne suis pas capable de scinder mon code. Voilà pourquoi j'ai besoin d'aide du moins pour avoir un exemple concret. Ensuite à moi de réfléchir.

    Je viens de l'univers procédural + mysqli donc bouffer du POO & MVC sur le même jour , je cale un peu

    Je dois gérer un site qui fait +/- 65000 pages et tout a été fait en pur html. Gloups...

    Voilà où j'en suis. Et dans ma partie vue, je n'ai que le Html.
    Autre chose me chipote, c'est que dans chaque fonction que je crée, je dois remettre global $ DB C'est un peu pénible...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    class Auth{
        private $login;
        private $password;
        private $email;
     
        public function ConnectSecure(){
            global $DB;
            if(isset($_POST['login_submit'])){
                if(empty($_POST['login']) || empty($_POST['password'])){
                    Message::ShowError('veuillez remplir tous les champs');
                }else{
                    $this->login = $_POST['login'];
                    $this->password = md5(sha1($_POST['password']));
                    $DB->query('SELECT u_login,u_password FROM users WHERE u_login = :login AND u_password = :password');
                    $DB->bind(':login', $this->login);
                    $DB->bind(':password', $this->password);
                    $row = $DB->single();
                    $count = $DB->rowCount();  
                    if($DB->rowCount() > 0){
                        echo 'super';
                    }else{
                        echo 'pas là';
                    }
                }
            }
        } 
    }
    et ma classe PDO de base avec contruction des requetes + connexion:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    <?php
    class DataBase{
        private $host = 'localhost';
        private $user = 'root';
        private $pswd = '';
        private $dbname = 'travel_portal';
        private $db;
        private $stmt;
     
        function __construct() {
            $dsn = 'mysql:host='.$this->host.';dbname='.$this->dbname;
            $options = array(
                PDO::ATTR_PERSISTENT => true,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,
                PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'            
            );    
            try{
                $this->db = new PDO($dsn, $this->user, $this->pswd, $options);
            }
            // Catch any errors
            catch(PDOException $e){
                die($e->getMessage());
            }
        }
        public function query($query){
            $this->stmt = $this->db->prepare($query);
        }
        public function bind($param, $value, $type = null){
            if(is_null($type)){
                switch(true){
                    case is_int($value):
                        $type = PDO::PARAM_INT;
                        break;
                    case is_bool($value):
                        $type = PDO::PARAM_BOOL;
                        break;
                    case is_null($value):
                        $type = PDO::PARAM_NULL;
                        break;
                    default:
                        $type = PDO::PARAM_STR;
                }
            }
            $this->stmt->bindValue($param, $value, $type);
        }
        public function execute(){
            return $this->stmt->execute();
        }    
        public function resultset(){
            $this->execute();
            return $this->stmt->fetchAll(PDO::FETCH_OBJ);
        }
        public function single(){
            $this->execute();
            return $this->stmt->fetch(PDO::FETCH_OBJ);
        }
        public function rowCount(){
            return $this->stmt->rowCount();
        }
        public function lastInsertId(){
            return $this->db->lastInsertId();
        }
        public function beginTransaction(){
            return $this->db->beginTransaction();
        }
        public function endTransaction(){
            return $this->db->commit();
        }
        public function cancelTransaction(){
            return $this->db->rollBack();
        }
        public function debugDumpParams(){
            return $this->stmt->debugDumpParams();
        }
    }
    ?>

    Merci d'avance

  10. #10
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Autre chose me chipote, c'est que dans chaque fonction que je crée, je dois remettre global $ DB C'est un peu pénible...
    On glisse tranquillement vers la problématique des dépendances entre composants là.

    Qu'a cela ne tienne. Une solution envisageable à ce problème est de considérer la classe Application comme un aggrégateur de dépendances. En gros, c'est sur Application qu'on va mettre les objets dont vont avoir besoin les composants de notre application, dans notre cas, les contrôleurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    <?php
     
    class Application extends Pimple {
     
        public function configure (array $config = array()) {
            $app = $this;
     
            // generic configuration
     
            $this['db_type'] = "mysql";
            $this['db_host'] = "localhost";
            $this['db_user'] = "root";
            $this['db_pass'] = "";
            $this['db_base'] = "mybase";
     
            $this['database'] = $this->share(function ($app) {
                try {
                    $dns = "{$app['db_type']}:dbname={$app['db_base']};host={$app['db_host']}";
                    return new PDO($dsn, $app['db_user'], $app['db_pass']);
                }
                catch (PDOException $e) {
                    return null;
                }
            });
     
            $this['article-factory'] = $this->share(function ($app) {
                if (!$db = $this['database'])
                    throw new RuntimeException("unable to open database connection");
     
                return function ($id) use ($db) {
                    return new Article($db, $id);
                };
            });
     
            // custom configuration
     
            foreach ($config as $key => $value)
                $this[$key] = $value;
        }
    }
     
    // ... from the controller base classe
     
    abstract class BaseController implements Component {
     
        protected $_app;
     
        public function __construct (Application $app) {
            $this->_app = $app;
        }
     
        // all controller have at least an index method
        abstract public function index ();
    }
     
    // ... a specific controller
     
    class ArticleController extends BaseController {
     
        public function index () {
            $factory = $this->_app['article-factory'];
     
            // obtenir l'article #123
            $article = $factory(123);
     
            return $this->_app['view']->render(compact('article'));
        }
    }
    Dans notre exemple, la classe Application est un conteneur de dépendances Pimple qui permet d'offrir aux autre composants sur lesquels il est attaché tout ce dont ils ont besoin. Grâce à la méthode share, on est capable d'effectuer la construction des différents composants "à la dernière minute" c'est à dire quand on en a besoin. Par exemple, on a pas besoin d'instancier PDO avant d'avoir à instancier Article. On créé donc un factory d'article qui ne frabriquera implicitement l'objet PDO qu'au moment où on va l'utiliser.

    C'est de cette façon que les application PHP modernes sont construites.

  11. #11
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    Merci Benjamin. Cela commence tout doucement à être plus clair. Cependant, quelqu'un pourrait répondre à ma question quant à la scission de mon code dans le post précédent?

    J'ai vu des tonnes d'exemples mais pas assez concret à mon goût; je me dit qu'avec un bout que code que je vais utiliser cela serait plus simple de comprendre étant donné que je vais l'appliquer

    Merci d'avance

  12. #12
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Cependant, quelqu'un pourrait répondre à ma question quant à la scission de mon code dans le post précédent?
    Heu... C'est justement de ça que je parle: de la répartition des responsabilités au travers de composants qui dépendent des uns des autres au travers d'un gestionnaire de dépendances (Pimple dans l'exemple).

    Ah et au passage ta classe DataBase est complêtement fausse car elle caractérise à la fois le connecteur (PDO) et la requête (PDOStatement), il n'est jamais bon qu'un type (classe) ait a gêrer plus d'un aspect.

    Par ailleurs ta classe Auth n'est pas assez générique: elle devrait exploiter un data provider plutôt que de fabriquer et d'exécuter la requête elle-même.

    Si tu as besoin de mieux comprendre l'architecture orientée composant, tu peux lire mon article d'introduction.

    Quand à te fournir un exemple complêt ce serait trop fastidieux sans pour autant être juste. Comme chaque développeur, j'ai ma façon de travailler et la forme que je donne à mes applications est certainement différente de la tienne donc à moins de te donner des dizaines de pavetons de classes à lire, je préfère que tu comprenne le principe et que tu en tire tes propres conclusion pour travailler avec dans ton propre contexte.

  13. #13
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    Merci.

    donc en gros:

    1) une classe de connexion
    2) une classe "générique" de requete extends la classe de connexion comme dans ton exemple

    Mais cela ne rentre pas dans le dossier modeles... si oui comment le nommer de façon significative?

    Par ailleurs ta classe Auth n'est pas assez générique: elle devrait exploiter un data provider plutôt que de fabriquer et d'exécuter la requête elle-même.
    data provider? késako?
    merci pour le lien, je lis ce soir tranquillement car ici c'est le déluge

  14. #14
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Pourquoi faire des classes pour rien ? PDO ne te suffit pas ? Et PDOStatment n'a pas toutes les fonctionnalités dont tu as besoin ?

    Y'a une façon simple de procéder: quand tu pense avoir besoin d'un type (classe) ou d'un composant, essaie de lui trouver un nom parlant. Si tu n'arrives pas à trouver quelque chose de précis et de sémantiquement valide c'est que quelque chose ne va pas: soit tu n'as pas besoin de ce composant, soit il a trop de responsabilités.

    Par exemple une classe Article est un composant qui fait partie de la couche modèle et qui utilise une instance de PDO et génère/manipule des PDOStatement pour fournir des méthodes propres a la gestion des articles.

    Un data-provider est un composant chargé de fournir une donnée à un autre composant. Dans le cas de Auth, il s'agit par exemple de l'instance modèle qui fait les requêtes en base ou bien dans un fichier de configuration (par exemple DatabaseAuth et FileAuth).

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    <?php
     
    class Auth {
     
        protected $_adapter;
     
        public function __construct (AuthAdapter $adapter) {
            $this->_adapter = $adapter;
        }
     
        public function authenticate ($login, $password) {
            if (!$this->_adapter->exists($login))
                return false;
     
            if (!$privileges = $this->_adapter->valid($login, $password))
                return false;
     
            return $this->_session->set('USER', (object)compact('login','password','privileges'));
        }
    }
     
    interface AuthAdapter {
     
        public function exists ($login);
     
        public function valid ($login, $password);
     
    }
     
    class DatabaseAuthAdapter extends Model implements AuthAdapter {
     
        public function exists ($login) {
            return (boolean)$this->_select('count(*)')
                ->from(self::TABLE)
                ->where('login=:login')
                ->execute(compact('login'))
                ->fetchCol();
        }
     
        public function valid ($login, $password) {
            return $this->_select('user,privileges')
                ->from(self::TABLE)
                ->where('login=:login and password=:password')
                ->execute(compact('login', 'password'))
                ->fetchAssoc();
        }
    }
     
    class FileAuthAdapter extends SplFileObject implements AuthAdapter {
     
        public function exists ($login) {
            return isset($this->_data[$login]);
        }
     
        public function valid ($login, $password) {
            if (!$this->exists($login))
                return false;
     
            return $this->_data[$login]['password'] == $password ? $this->_data[$login]['privileges'];
        }
    }
    Les contrôleurs (ou tout composant ayant besoin de la politique d'authentification) utilisent l'instance de Auth pour travailler et n'ont même pas besoin de savoir d'où viennent les données. On peut aussi imaginer d'avoir un composant qui prends plusieurs adaptateurs et retourne le premier match.

  15. #15
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    Me dire cela ou me parler en langue papou c'est la même chose.

    Je débute dans la poo et le mvc; comment veux tu que je comprenne ce que tu dis?

    Et puis pondre 200 lignes de code en sachant que 10 lignes sont suffisante pour maintenir le code / mise à jours j'ai vraiment l'impression de créer des fonctions de fonctions et qui on encore des fonctions.

    je voudrais juste que l'on m'explique basiquement en fonction de l'exemple concret que j'ai posté. Je ne demande pas une masturbation du cerveau

    après, quand j'aurais compris réellement la structure, je pourrais poster et faire évoluer mon mvc

    merci d'avance de vos réponses

  16. #16
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    Après avoir lu et replu pas mal de tutos, l'orienté objet est encore assez absrait pour moi...

    Bien, voici ou j'en suis en fonction de l'aide que j'ai reçue ici:

    En PDO sans me pattern MVC, c'est ceci (Fonctionne impecc) :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <?php
    $db = new DbConnect();
    $error = '';
    if(isset($_POST['login_submit'])){
       if(empty($_POST['login']) || empty($_POST['password'])){
           $error = 'All fields required';
       }else{
           $db->query('SELECT * FROM users WHERE u_login = :login AND u_password = :password');
           $db->bind(':login', $_POST['login']);
           $db->bind(':password', md5(sha1($_POST['password'])));
           $row = $db->single();
           if($db->rowCount() > 0){
               echo 'I can save some informations by sessions';
               echo '<pre>';
               print_r($row);
               echo '</pre>';
           }else{
               $error .= 'Not find in the Data Base';
           }
       } 
    }
    if(!empty($error)){
        echo $error;
    }
    ?>
    <form action="login" method="post" name="login">
    <label for="login">Login:
        <input type="text" name="login" id="login">
    </label>
    <label for="password">Mot de passe:
        <input type="password" name="password" id="password">
    </label>
    <input type="submit" name="login_submit" value="Se connecter">

    En essayant de scinder mon code et en voulant m'approcher le plus du pattern MVC j'arrive à ceci:

    1)Ma vue:

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <form action="login" method="post" name="login">
    <label for="login">Login:
        <input type="text" name="login" id="login">
    </label>
    <label for="password">Mot de passe:
        <input type="password" name="password" id="password">
    </label>
    <input type="submit" name="login_submit" value="Se connecter">

    2)Mon model:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    class Auth extends DbConnect{
        protected $login;
        protected $password;
        protected $email;
     
        public function ConnectSecure(){
            if(isset($_POST['login_submit'])){
                CheckPostLogin();
                $this->query('SELECT * FROM users WHERE u_login = :login AND u_password = :password');
                $this->bind(':login', $_POST['login']);
                $this->bind(':password', md5(sha1($_POST['password'])));
                $this->single();
                if($this->rowCount() > 0){
                    echo 'OK and I put some informations by sessions';
                }else{
                    echo 'No in DB or error combination user/password';
                }
                echo '<pre>';
                print_r($result);
                echo '</pre>';
            }
        }
    }
    3)Mon controller

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php 
    require 'models/model.login.php';
    function CheckPostLogin(){
        if(empty($_POST['login']) || empty($_POST['password'])){
            Message::ShowError('All fields required.');
            return false;
        }
    }
    ?>

    J'ai également créer une classe avec des fonctions statiques qui permettront de gérer les messages d'erreurs, de succès, de mise à jour,...

    En voici un extrait:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Message{
        public static function ShowError($message){
            echo $message;
        }
    }

    J'aimerai savoir si ma structure est correcte.

    Cependant une chose me dérange: Le controlleur est censé gérer les erreurs telles que erreur de formulaire,...
    Et dans mon model, je compte le nbr de résultat de la requete (ligne 14). Logiquement cela devrait etre dans le controlleur. Comment je peux faire?

    Merci d'avance de vos lumières.

    David

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP-JS] utilisation javascript dans fichier php model mvc
    Par ramdamriddim dans le forum Langage
    Réponses: 3
    Dernier message: 19/05/2009, 14h57
  2. Ouvrir un fichier.php d'une ihm
    Par Shandler dans le forum MFC
    Réponses: 3
    Dernier message: 02/05/2005, 14h00
  3. Réponses: 2
    Dernier message: 19/08/2004, 17h12
  4. où se trouve le fichier php.ini ?
    Par teko dans le forum Apache
    Réponses: 5
    Dernier message: 28/07/2004, 12h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo