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...)
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'];
};
// 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.
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 ?
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.
@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.
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
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 :
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 .
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 !
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 :)
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 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.
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())
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) ...
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?
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
- 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.
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
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
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?
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.
le maitre du kremlin
#RTFM #AskGoogle and Have a nice code Day
#RTFM #AskGoogle and Have a nice code Day
#RTFM #AskGoogle and Have a nice code Day