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.
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
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.
Bonjour
{% 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 %}
<?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
]);
}
}
<?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
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}) }}">
Malheureusement j'ai toujours la même erreur 500, peut-être je devrais update twig ou autres librairies ?
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 ?
Non le regex est correct selon moi, j'ai testé quand même ta modification mais le problème reste toujours le même
É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
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
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
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 :/
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é" }
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 *
.
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