Partage
  • Partager sur Facebook
  • Partager sur Twitter

Cours Architecture PHP professionnelle / Questions

    7 août 2016 à 12:22:46

    Alors pour donner le dénouement, bah je n'ai rien fait de plus entre cette nuit et ce matin, à part redémarrer le pc, chose que j'avais déjà testé...Donc mon conseil, passez une bonne nuit et ça marchera le lendemain (Attention, solution non garantie...) ;)

    Merci quand même pour la réponse lvdesign

    • Partager sur Facebook
    • Partager sur Twitter
      7 août 2016 à 20:00:04

      Salut a tous... j'ai toujours pas recu ma note du tp 'mybooks' alors que j'ai fait ma part du taff... avez vous un conseil a le donné svp....?
      • Partager sur Facebook
      • Partager sur Twitter
      @mga
        7 août 2016 à 21:31:38

        Patience, c'est le mois d'août...
        • Partager sur Facebook
        • Partager sur Twitter
        La chute n'est pas un échec, l'échec c'est de rester là où on est tombé!
          10 août 2016 à 15:22:14

          Sauciss

          La vitesse de correction dépend de l'affluence qu'à le cour. En période creuse, ça prend fatalement beaucoup plus de temps.

          • Partager sur Facebook
          • Partager sur Twitter
            12 août 2016 à 3:06:29

            slt! aidez moi a modifier mon mot de passe de wampser et easyphp?
            • Partager sur Facebook
            • Partager sur Twitter

            le maitre du kremlin

              18 août 2016 à 1:16:57

              ....

              -
              Edité par smaine 18 août 2016 à 1:23:46

              • Partager sur Facebook
              • Partager sur Twitter

              #RTFM #AskGoogle and Have a nice code Day

                14 octobre 2016 à 22:20:19

                L'encodeur de mot de passe utilisé par défaut par le composant de sécurité de symfony a changé (digest > bcrypt). Les mots de passes dans les jeux de données proposés au chapitre "Itération 8 : gestion de la sécurité > Sécurisation de l'application" ne correspondent donc pas à ceux attendus.

                Pour résoudre le problème rapidement :

                $app['security.default_encoder'] = function ($app) {
                    return $app['security.encoder.digest'];
                };

                Mais la meilleure solution serait de réencoder les mots de passe des jeux de données avec l'encodeur bcrypt : http://silex.sensiolabs.org/doc/master/providers/security.html#usage

                Générer un mot de passe :

                // find the encoder for a UserInterface instance
                $encoder = $app['security.encoder_factory']->getEncoder($user);
                
                // compute the encoded password for foo
                $password = $encoder->encodePassword('foo', $user->getSalt());

                La solution rapide :

                /* raw password is 'john' */
                insert into t_user values
                (1, 'JohnDoe', '$2y$13$x0xZ0hCjtySCb.FU/4.pn.uDHifnt/Gt7GLsHaUWoHgaJ6vIS7lki', 'YcM=A$nsYzkyeDVjEUa7W9K', 'ROLE_USER');
                /* raw password is 'jane' */
                insert into t_user values
                (2, 'JaneDoe', '$2y$13$CWATADbnKKhjISsQhiuGkeo1L9p8Z4.Bb1jzEgci1w0At65q8603e', 'dhMTBkzwDKxnD;4KNs,4ENy', 'ROLE_USER');



                Zadobah a écrit:

                Bonjour à tous,

                Je suis en train de faire le cours et j'ai un petit problème.

                Itération 8 - Gestion de la sécurité

                Arrivé à la fin de l'itération, au moment de tester la connexion, j'ai ce message d'erreur :
                 Login failed! Bad credentials.

                J'ai vérifié mon code plusieurs fois, il se trouve être quasiment identique ! La seule différence se trouve être le namespace.
                Je ne vois donc absolument pas pourquoi j'ai ce message qui s'affiche au moment de l'authentification.

                Cela vous est-il arrivé ? 

                -
                Edité par Zadobah 21 juillet 2016 à 11:10:00



                -
                Edité par Mouts 14 octobre 2016 à 22:30:32

                • Partager sur Facebook
                • Partager sur Twitter
                  10 novembre 2016 à 5:42:17

                  Bonjour,

                  Merci Professeur.

                  -
                  Edité par KossiDoji 10 novembre 2016 à 6:07:07

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Kossi
                    1 décembre 2016 à 21:42:00

                    Bonjour,

                    je cherche à définir une logique métier dans les classes Article et Comment. Comment faire pour créer une méthode Article.getComments() qui retourne un tableau d'instances de la classe Comment associés à l'article courant ?

                    -
                    Edité par grewdivers 1 décembre 2016 à 21:43:51

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 décembre 2016 à 8:39:32

                      @grewdivers En gros tu veux récupérer tous les comments liés à un article ?
                      • Partager sur Facebook
                      • Partager sur Twitter

                      #RTFM #AskGoogle and Have a nice code Day

                        2 décembre 2016 à 9:28:02

                        Bonjour,

                        Je suis en train de mettre le cours à jour pour intégrer les changements apparus avec la version 2 du framework Silex.

                        En attendant que ce soit terminé, vous pouvez consulter les nouvelles sources à cette adresse : https://github.com/bpesquet/OC-MicroCMS-Silex2. Chaque branche du dépôt correspond à un chapitre du cours.

                        Je publierai un message dans ce forum quand la mise à jour du cours sera faite.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 décembre 2016 à 11:21:47

                          @smaine oui, je voudrais qu'une instance de la classe Article puisse récupérer un tableau d'instance de la classe Comments.

                          Je peux résoudre ce problème en allant chercher tous les commentaires d'un article lorsque l'instance de la classe ArticleDAO instancie l'objet Article mais ça impliquerait une surcharge mémoire et d'accès à la BDD. Je préfère donc avoir une méthode dans la classe Article qui sera chargée d'aller chercher les instance de la classe Comments en fonction des besoins.

                          J'espère avoir été assez clair.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            2 décembre 2016 à 18:27:22

                            Qqch comme ça par exemple : article->getComments($id_article); getComments($id_article){ $commentTab = new Array() $result = ton tableau depuis la bdd foreach $result as $row{ $id = $row[id]; $com[$id] = new Comment; $com[id] = setId($row[id]); $com[id] = setContent($row[content]); .... $commentTab[id] = $com[id]; } Return $commenTab; } Desole pour l'indentation je suis mon téléphone il n'y a pas la balise de code

                            c'est la même chose que dans ce Cours pour récupérer les liens selon l'auteur 

                            -
                            Edité par smaine 2 décembre 2016 à 18:34:42

                            • Partager sur Facebook
                            • Partager sur Twitter

                            #RTFM #AskGoogle and Have a nice code Day

                              5 décembre 2016 à 0:30:35

                              Bonjour

                              Dans l'itération 6 j'ai l'erreur suivante :

                              Twig_Error_Runtime in Template.php line 653:Neither the property "request" nor one of the methods "request()", "getrequest()"/"isrequest()" or "__call()" exist and have public access in class "Silex\Application" in "index.html.twig" at line 7.

                              Je ne trouve pas de différence entre mon code et le vôtre. Les lignes concernées :

                              {# index.html.trig #}
                              
                                  <link href="{{ app.request.basepath }}/lib/bootstrap/css/bootstrap.min.css" rel="stylesheet">
                              
                                  <link href="{{ app.request.basepath }}/css/microcms.css" rel="stylesheet">



                              Autrement :

                              // index.php
                              
                              <?php
                              
                              require_once __DIR__.'/../vendor/autoload.php';
                              
                              $app = new Silex\Application();
                              
                              require __DIR__.'/../app/config/dev.php';
                              
                              require __DIR__.'/../app/app.php';
                              
                              require __DIR__.'/../app/routes.php';
                              
                              $app->run();

                              Sinon, j'en profite pour poser une question concernant l'url pour accéder au site. Vous proposez la création d'un virtual host à mettre à la racine de localhost. C'est tout à fait possible sur une installation neuve, ça l'est moins quand il y a déjà plein d'autres sites, avec une organisation déjà établie. Votre cours n'est pas le premier que je suis, et en dehors des cours, j'expérimente, j'essaye, j'ai mes sites en ligne, etc. J'aurais préféré mettre minicms dans localhost/cours/et rediriger vers avec .htaccess http;//localhost/cours/minicms vers http;//localhost/cours/minicms/web/index.php . Mais je ne trouve pas. Faut dire que j'ai rarement autant le sentiment d'avoir affaire à de la magie noire qu'avec le rewriting et .htaccess. Mais en matière de magie noire, la configuration de Virtual Host n'est pas mal non plus.

                              Je suis sous Mint, le serveur LAMP se trouve à /var/www/html . Des liens symboliques dans ce dossier pointent vers des dossiers à ~/developpement/www .

                              Merci d'avance

                              Alex



                              • Partager sur Facebook
                              • Partager sur Twitter
                                9 décembre 2016 à 13:40:36

                                Bonjour, je suis bloqué dès l'intégration de Silex. Rien à faire, quoi que je fasse, page blanche. Même en essayant avec le dossier correction fournit dans le cours la page ne s'affiche pas. Essaie avec le cours des premiers pas sur Silex, même problème rencontré. Je rajoute un echo 'test'; en première ligne, histoire de bien vérifier que ce n'est pas un problème d'hôte virtuel : eh bien non "test" s'affiche bien. Mais rien à faire : impossible d'afficher quoi que ce soit avec Silex ...

                                Une petite idée pour m'aider ?

                                EDIT : Re ! en bossant sur un projet perso, j'ai découvert que display errors dans php.ini était sur off  (j'ai formaté mon ordi hier, j'ai donc du réinstaller php). Après quoi, mon problème s'est réglé en 15 secondes et je peux continuer le cours !

                                -
                                Edité par Barbolise 9 décembre 2016 à 15:54:14

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  12 décembre 2016 à 17:08:46

                                  Bonjour à tous, 

                                  Je rencontre au niveau de l'itération 11, dans la seconde partie : 
                                  https://openclassrooms.com/courses/evoluez-vers-une-architecture-php-professionnelle/iteration-11-preparation-pour-la-production#/id/r-2626019 

                                  Tout semble fonctionner sauf la toolbar qui me génère une popup: an error occured while loading the web debug toolbar (500: Internal Server Error)
                                   

                                  Erreur via le profiler dans le navigateur :

                                  Twig_Error_SyntaxinParser.php line 174:

                                  Unexpected tag name "with" (expecting closing tag for the "set" tag defined near line 75) in "@WebProfiler/Profiler/layout.html.twig" at line 75

                                  Et les logs

                                  2016-12-12 16:04:09] MicroCMS.INFO: Matched route "_profiler". {"route_parameters":{"_controller":"web_profiler.controller.profiler:panelAction","token":"c21dfe","_route":"_profiler"},"request_uri":"http://172.17.0.4/_profiler/c21dfe"} []
                                  
                                  [2016-12-12 16:04:09] MicroCMS.INFO: Populated the TokenStorage with an anonymous Token. [] []
                                  
                                  [2016-12-12 16:04:09] MicroCMS.INFO: > GET /_profiler/c21dfe [] []
                                  
                                  [2016-12-12 16:04:09] MicroCMS.CRITICAL: Twig_Error_Syntax: Unexpected tag name "with" (expecting closing tag for the "set" tag defined near line 75) in "@WebProfiler/Profiler/layout.html.twig" at line 75 (uncaught exception) at /var/www/improve-potato/vendor/twig/twig/lib/Twig/Parser.php line 174 {"exception":"[object] (Twig_Error_Syntax(code: 0): Unexpected tag name \"with\" (expecting closing tag for the \"set\" tag defined near line 75) in \"@WebProfiler/Profiler/layout.html.twig\" at line 75 at /var/www/improve-potato/vendor/twig/twig/lib/Twig/Parser.php:174)"} []
                                  
                                  [2016-12-12 16:04:09] MicroCMS.INFO: < 500 [] []
                                  
                                  

                                  Je refais le tuto deux fois mais toujours la même erreur... 

                                  Deux différences notables, j'utilise un docker avec nginx au lieu d'apache (du coup pas de localhost).

                                  Vous auriez une idée ? :) 



                                  PS: l'erreur cible la ligne 75 du fichier layout.html.twig dans : vendor > symfony > web-profiler-bundle > Ressources > views > Profiler > layout.html.twig

                                                              {% set menu -%}
                                                                  {% with { collector: profile.getcollector(name), profiler_markup_version: profiler_markup_version } %}
                                                                      {{ block('menu', template) }}
                                                                  {% endwith %}
                                                              {%- endset %}



                                  PS2 - Problème réglé après une bonne nuit de sommeil. 
                                  Le tag with de twig a été ajouté dans la version 1.28.0 de twig. 
                                  J'ai changé la version 1.21.* à 1.28.* de twig/twig dans le composer.json :) 

                                  -
                                  Edité par dantevgp 13 décembre 2016 à 9:49:12

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    14 décembre 2016 à 16:44:20

                                    Bonjour à tous,

                                    Tout d'abord merci au rédacteur de ce cours qui est bien enrichissant !

                                    Je suis bloqué à l'itération 11 au niveau de l'affichage de la toolbar, mais celle ci me génère une erreur 500 :

                                    "An error occurred while loading the web debug toolbar (500: Internal Server Error).
                                    Do you want to open the profiler?"

                                    Le profiler s'ouvre bien si je fais ok mais le pop up revient à chaque pages.

                                    Dans mes logs j'arrive à voir ceci lorsque je me rend sur le site :

                                    [2016-12-14 16:36:11] CMS.INFO: Matched route "{route}". {"route":"home","route_parameters":{"_controller":"[object] (Closure: {})","_route":"home"},"request_uri":"http://cms/","method":"GET"} []
                                    
                                    [2016-12-14 16:36:11] CMS.INFO: Populated the TokenStorage with an anonymous Token. [] []
                                    
                                    [2016-12-14 16:36:11] CMS.INFO: Matched route "{route}". {"route":"_wdt","route_parameters":{"_controller":"web_profiler.controller.profiler:toolbarAction","token":"653601","_route":"_wdt"},"request_uri":"http://cms/_profiler/wdt/653601","method":"GET"} []
                                    
                                    [2016-12-14 16:36:11] CMS.INFO: Populated the TokenStorage with an anonymous Token. [] []
                                    
                                    [2016-12-14 16:36:11] CMS.CRITICAL: Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("Warning: strtr() expects parameter 1 to be string, object given"). (uncaught exception) at /var/www/html/CMS/vendor/symfony/web-profiler-bundle/Resources/views/Collector/request.html.twig line 271 {"exception":"[object] (Twig_Error_Runtime(code: 0): An exception has been thrown during the rendering of a template (\"Warning: strtr() expects parameter 1 to be string, object given\"). at /var/www/html/CMS/vendor/symfony/web-profiler-bundle/Resources/views/Collector/request.html.twig:271, Symfony\\Component\\Debug\\Exception\\ContextErrorException(code: 0): Warning: strtr() expects parameter 1 to be string, object given at /var/www/html/CMS/vendor/symfony/twig-bridge/Extension/CodeExtension.php:196)"} []
                                    


                                    Je précise juste que j'ai fait tout le reste du cours en suivant la version 2 du code : https://github.com/bpesquet/OC-MicroCMS-Silex2 et que jusque là tout allait pour le mieux.

                                    J'ai bien vérifier la présence du :

                                    $app->register(new Silex\Provider\HttpFragmentServiceProvider());


                                    dans le fichier app.

                                    Si vous avez une piste pour m'éclairer svp car là je sèche totalement..

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      19 décembre 2016 à 17:00:47

                                      Bonjour,

                                      Je viens de finir la mise à jour du cours pour Silex 2. Les principaux changements sont :

                                      • Prise en compte des évolutions de Silex 2.
                                      • Nouvel algorithme de cryptage (bcrypt).
                                      • Nouvelle gestion des classes formulaires.
                                      • Suppression de la barre d'outils Symfony, instable dans la version actuelle.
                                      • Intégration des dernières versions de Bootstrap et de jQuery.

                                      Les changements dans le code source de la version finale sont visibles sur GitHub. Toutes les branches sont à jour.

                                      Merci à AidanVIII pour m'avoir fourni le code il y a déjà trop longtemps ;), à Sonkeng Maldini et au colonel Moutarde pour leurs propositions d'améliorations.

                                      Il s'agit d'une mise à jour conséquente. Merci de me signaler tout oubli éventuel.

                                      Bonne continuation !

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        19 décembre 2016 à 20:23:02

                                        Bonjour tout le monde,

                                        Je viens de débuter le cours et j'ai une petite question... J'ai l'habitude pour ma part quand je récupère des données en db de faire:

                                        $q = $db->query('SELECT ....');

                                        while($donnees = $q->fetch())

                                        {

                                        }

                                        mais dans ce cours c mis:

                                        foreach($articles as article)

                                        Je sais PDOStatement est traversable donc aucun souci mais l'utilité du fetch alors? C'est juste une question d'habitude j'ai appris depuis le début d'utiliser le fetch sans trop me soucier du reste mais en voyant l'exemple de ce début de cours j'ai été voir la doc et je me dis dans le fond ou la réelle utilité de ce fetch?

                                        parce que c'est exactement la même chose de faire foreach($articles as article) et while($article = $articles->fetch())

                                        Quelqu'un peeut il m'éclairer?

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          20 décembre 2016 à 1:50:30

                                          Je ne suis pas un expert mais j'imagine que parfois, tu peux avoir besoin de manipuler un array plutôt qu'un PDOStatement (pour le passer dans une fonction par exemple ?) :)
                                          De même, fetch peut te permettre d'instancier direct un objet (PDO::FETCH_CLASS) ...

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            21 décembre 2016 à 22:42:39

                                            Ok ok merci pour ta réponse et j'ai une autre question...

                                            je suis a la fin de la partie une et bon c pas trop difficile a comprend cependant je vois:

                                            $app->get('/', function () {....
                                            $app->run();

                                            Et là quand je vais voir les classes se chargeant de ces fonctions c'est plus compliqué... je comprend pas tout... donc faut il suivre ce cours sans se soucier de voir comment ces fonctions fonctionnent ou est il bien de s'intérresser a le savoir?



                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              21 décembre 2016 à 23:37:53

                                              Hum, l'intérêt du matos fait par d'autres c'est de pouvoir l'utiliser sans forcément avoir à jeter un œil sous le capot systématiquement. Évidemment, c'est riche d'enseignement de le faire contre donc c'est super de le faire.

                                              Mais si tu comprends pas tout d'un coup c'est dramatique, tu pourras toujours revenir plus tard, quand tu seras meilleur, pour revoir ce que tu avais pas compris avec un œil plus fin. C'est ce que je fais perso: je regarde, si ça me dépasse je reviens une semaine après et ainsi de suite :)

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                22 décembre 2016 à 11:52:01

                                                a sup

                                                -
                                                Edité par AlexandreDeschamps1 22 décembre 2016 à 11:52:39

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  22 décembre 2016 à 19:48:39

                                                  Bonjour tout le monde, j'aimerais si quelqu'un sait... savoir comment fonctionne la fonction get() de Application.php de Silex:

                                                   public function get($pattern, $to = null)
                                                      {
                                                          return $this['controllers']->get($pattern, $to);
                                                      }
                                                  

                                                  Je cherche mais je patauge un peu lol....Qu'est ce contrôleur? Où est il instancié? Enfin j'aimerais en savoir plus...

                                                  Merci ;-)

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    23 décembre 2016 à 8:17:08

                                                    La fonction get() de Application.php


                                                    - Qu'est ce que $app['controllers']? Où est il instancié?

                                                    $this['controllers'] est une instance de la classe ControllerCollection qui construit un controleur à partir d'une route (instance de la classe Silex\\Route).
                                                    Confère lignes 74 - 85 du fichier Application.php.

                                                    - Comment fonctionne la fonction get() de l'Application.php

                                                    La fonction get() de l'Application Silex lie une route ( $pattern ) à une fonction de rappel ou un callback ( $to ) lors d'une requête http GET.

                                                    Les détails sont dans les classes Silex\Route et Symfony\ControllerCollection.

                                                    -
                                                    Edité par KossiDoji 25 décembre 2016 à 9:22:43

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Kossi
                                                      23 décembre 2016 à 20:46:57

                                                      Merci beaucoup pour ta réponse je vois beaucoup plus clair et je comprend mieux comment les choses s'imbriquent dans ce framework... ben c super bien écrit... je ne saurais absolument pas pondre un truc pareil pour l'instant.. Enfin un jour peut être.

                                                      Je ne suis pas du tout habitué à faire $this['...'] = ....

                                                      Et bon j'aime savoir comment les choses fonctionnent derrière... là je comprend les grandes lignes mais bon pas évident encore merci

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        25 décembre 2016 à 23:03:35

                                                        Très bon cours pas si difficile si on se contente de suivre les chapitres sans aller voir derrière ce qui se passe. Je sais c'est un framework et ça inclue de ne pas forcément aller voir derrière mais bon je pense que c'est un très bon exercice. Je galère parfois pour comprendre comment les choses sont faites mais a force je vois plus ou moins. Est ce que quelqu'un a un avis là dessus? est ce utile de voir derrière?

                                                        -
                                                        Edité par kid_jonath 25 décembre 2016 à 23:59:06

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          26 décembre 2016 à 13:32:06

                                                          Ca prend du temps. Mais, c'est formatif.

                                                          Du courage.

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Kossi
                                                            29 décembre 2016 à 10:27:35

                                                            Bonjour professeur,

                                                            A propos de la méthode findAllByArticle dans CommentDAO classe.

                                                            La procédure adoptée en ne récupérant qu'une seule fois l'article associée aux commentaires, qui permet de se passer de la récupération de la colonne art_id dans la commande sql et par la suite dans le foreach, améliore extrêmement la performance de l'application.

                                                            Honnêtement, je récupérerais art_id dans la commande sql, ensuite l'article associée dans le foreach.

                                                            Ma question: est-ce une technique adoptée dans le développement d'application? Dans quels contextes l'utilise-t-on?

                                                            Merci d'avance.

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                            Kossi

                                                            Cours Architecture PHP professionnelle / Questions

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown