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
Réponse acceptée

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.

Le code ? :)

tomus
Auteur

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
Auteur

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

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
Auteur

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

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

tomus
Auteur

Non j'ai strictement pareil

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
Auteur

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
Auteur

É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)

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 ?

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
Auteur

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

tomus
Auteur

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
Auteur

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

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
Auteur

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à

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
Auteur

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
Auteur

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

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
Auteur

Non, cela ne fonctionne pas

tomus
Auteur

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

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