Problème récupération de données (formation Mise en pratique POO)

Par tomus, il y a 8 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.
Actuellement je suis le cours de Grafikart sur la mise en pratique de la POO en PHP, et je bloque au chapitre 7, vers les 5 premières minutes, là où il récupère ses articles depuis sa base de données. Seulement l'erreur que j'obtiens est assez bizarre, il me dit que blog.show attends les paramètres [slug, id], sauf que j'envoie les paramètres [slug, id], je vous montre le code ci-dessous, car actuellement je ne comprends pas l'erreur.

Ce que j'obtiens

127.0.0.1:56506 [500]: /news - Uncaught Zend\Expressive\Router\Exception\InvalidArgumentException: Route `blog.show` expects at least parameter values for [slug,id], but received [slug,id] in /home/thomas/Documents/php/cvgest/vendor/zendframework/zend-expressive-fastroute/src/FastRouteRouter.php:305 Stack trace: #0 /home/thomas/Documents/php/cvgest/src/Framework/Router.php(54): Zend\Expressive\Router\FastRouteRouter->generateUri('blog.show', Array) #1 /home/thomas/Documents/php/cvgest/src/Framework/Router/RouterTwigExtension.php(29): Framework\Router->generateUri('blog.show', Array) #2 /home/thomas/Documents/php/cvgest/vendor/twig/twig/lib/Twig/Environment.php(378) : eval()'d code(51): Framework\Router\RouterTwigExtension->pathFor('blog.show', Array) #3 /home/thomas/Documents/php/cvgest/vendor/twig/twig/lib/Twig/Template.php(188): __TwigTemplate_49b9d1bddc400461aa442d7d9cf31f8b6b96570e5af091838c155ac2139959c5->block_body(Array, Array) #4 /home/thomas/Documents/php/cvgest/vendor/twig/twig/lib/Twig/Environment.php(378) : eval()'d code(56): T in /home/thomas/Documents/php/cvgest/src/Blog/views/index.twig on line 12

Cela fait une heure que je bloque sur cela, et si quelqu'un sait comment y remédier, cela me sera très utile !

Merci

25 réponses

SimonDevelop, il y a 8 ans

Le code ? :)

tomus, il y a 8 ans

Bonjour

index.twig

{% extends 'layout.twig' %} {% block title "Accueil" %} {% block body %} <h1>Bienvenue</h1> <ul> {% for cv in cvs %} <li> <a href="{{ path('blog.show', {slug: cv.slug, id: cv.id}) }}"> {{ cv.name }}d </a> </li> {% endfor %} </ul> {% endblock %}

BlogAction.php

<?php namespace App\Blog\Actions; use Framework\Renderer\RendererInterface; use Psr\Http\Message\ServerRequestInterface as Request; class BlogAction { /** * @var RendererInterface */ private $renderer; /** * @var \PDO */ private $pdo; public function __construct(RendererInterface $renderer, \PDO $pdo) { $this->renderer = $renderer; $this->pdo = $pdo; } public function __invoke(Request $request) { $slug = $request->getAttribute('slug'); if ($slug) { return $this->show($slug); } return $this->index(); } public function index(): string { $cvs = $this->pdo ->query('SELECT pdf_link FROM cv') ->fetchAll(); return $this->renderer->render('@blog/index', compact('cvs')); } public function show(string $slug): string { return $this->renderer->render('@blog/show', [ 'slug' => $slug ]); } }

BlogModule.php

<?php namespace App\Blog; use App\Blog\Actions\BlogAction; use Framework\Module; use Framework\Renderer\RendererInterface; use Framework\Router; class BlogModule extends Module { const DEFINITIONS = __DIR__ . '/config.php'; const MIGRATIONS = __DIR__ . '/db/migrations'; const SEEDS = __DIR__ . '/db/seeds'; public function __construct(string $prefix, Router $router, RendererInterface $renderer) { $renderer->addPath('blog', __DIR__ . '/views'); $router->get($prefix, BlogAction::class, 'blog.index'); $router->get($prefix . '/{slug:[a-z\-0-9]+}-{id:[0-9]+}', BlogAction::class, 'blog.show'); } }

Dis moi si tu as besoin d'autre chose

tomus, il y a 8 ans

Ah au fait oui j'ai rajouté un 'd' dans index.twig mais ce n'est pas ce qui fait bloquer le système

SimonDevelop, il y a 8 ans

C'est bien ce que je pensais, l'erreur vien de twig, remplace ça:

<a href="{{ path('blog.show', {slug: cv.slug, id: cv.id}) }}">

par ceci:

<a href="{{ path('blog.show', {'slug': cv.slug, 'id': cv.id}) }}">
tomus, il y a 8 ans

Malheureusement j'ai toujours la même erreur 500, peut-être je devrais update twig ou autres librairies ?

SimonDevelop, il y a 8 ans

Les erreurs twig sont partie au moins ? il ne te reste que l'erreur 500 ?

tomus, il y a 8 ans

Non j'ai strictement pareil

SimonDevelop, il y a 8 ans

Au niveau de ton routeur c'est normal ça ?

$router->get($prefix . '/{slug:[a-z\-0-9]+}-{id:[0-9]+}', BlogAction::class, 'blog.show');

C'est pas plutôt :

$router->get($prefix . '/{slug:[a-z\-0-9]+}/{id:[0-9]+}', BlogAction::class, 'blog.show');

J'ai pas suivis en entier cette formation, mais il s'agit bien de slim pour le routeur non ?

tomus, il y a 8 ans

Non le regex est correct selon moi, j'ai testé quand même ta modification mais le problème reste toujours le même

tomus, il y a 8 ans

Également j'ai téléchargé les sources du chapitre et il s'avère que j'obtienne la même erreur (en ayant adapté ma DB avec ses sources évidemment)

SimonDevelop, il y a 8 ans

Ah ? il s'agit sans doute d'un problème de mise à jours.
Mais en regardant bien l'erreur le soucis viens du routeur, si tu retire la route pour l'affichage d'un article, le reste fonctionne ?

SimonDevelop, il y a 8 ans

Je ne vois que le slug dans ton 'BlogAction.php'

<?php public function show(string $slug): string { return $this->renderer->render('@blog/show', [ 'slug' => $slug ]); }

Or dans ta route tu demande aussi un id

tomus, il y a 8 ans

Oui, la page s'affiche, c'est juste la boucle for de twig qui pose problème

tomus, il y a 8 ans

Non, mais je ne pense pas que la fonction show() ait quelque chose en rapport avec l'erreur, les 'articles' ne s'affichent pas dans l'index

tomus, il y a 8 ans

Enfin, même si j'ai update twig à sa dernière version (2.4.6) il y'a toujours la même erreur

SimonDevelop, il y a 8 ans

fait un var_dump() de tes articles dans le controllers sans afficher la vue, vérifie que tu as bien les 'slug' et 'id' de récupéré. Si ça bloque avant ça viens du routeur, après c'est twig.

Mais après avoir corriger les (') dans ta fonction path de twig je vois pas ou est le problème :/
D'ailleurs je viens de le voir que maintenant mais ton erreur 500 tu l'as sur ta route '/news' ? Oo

tomus, il y a 8 ans

Normalement les articles doivent apparaître dans localhost:8000/news
Donc je ne pense pas qu'il y ait un problème de ce niveau là

SimonDevelop, il y a 8 ans

Je viens de saisir le fonctionnement de ton controller, j'avais pas remarqué l'invok.
Tu n'as pas partagé ton show.twig d'ailleurs :/

tomus, il y a 8 ans

Etant donné que j'ai mis une vingtaine d'entrées dans ma table, je te renvoie juste un seul array
(pdf_link étant une colonne de ma table de type string, où j'ai rentré des phrases random pour l'instant)
{ [0]=> object(stdClass)#176 (1) { ["pdf_link"]=> string(42) "La liberté de changer en toute sécurité" }

tomus, il y a 8 ans

Le show.twig n'a selon moi aucun rapport, je l'ai juste mis dans mon index.twig afin faire un lien (qui ne marcherais pas puisque je n'ai pas fait la suite du code). Je n'arrive juste pas à afficher toutes les entrées de ma DB dans l'index, et on me renvoie une erreur 500

Warzik, il y a 8 ans

Salut, dans ton controller BlogAction, lors de ta requête tu ne récupères ni le slug ni l'id mais tu récupères uniquement le pdf_link, fait plutôt un SELECT *.

tomus, il y a 8 ans

Non, cela ne fonctionne pas

SimonDevelop, il y a 8 ans

Ah l'index !
Vu que tu parlais de slug et id je pensais l'affichage d'un article selectionné.

Le soucis viens des données récupéré, ce que tu as envoyé dernièrement, l'article est composé que d'une colonne 'pdf_link' qui retourne 'La liberté de changer en toute sécurité'.

Hors dans ta vue tu cherches à récupérer la colonne slug et id. Du coup l'erreur twig viens du fait que tu récupères des données inexistantes de ton objet injecté dans ta vue, autrement dit null.

tomus, il y a 8 ans

En effet j'avais mal fait la distinction avec les colonnes de ma DB, merci encore Simon

Young147, il y a 7 ans

Select the disk storage location where you lost data and click "Scan". EaseUS Data Recovery Wizard will start a quick scan first. Choose the file(s) you want to recover by file types from the scanning results. Click "Recover" button to recover the selected files. https://mobdro.ooo