Bonjour, j’ai un gros problème avec ce tuto sur youtube, La POO en PHP : Middleware => https://www.youtube.com/watch?v=w1FviidvxJc
Dès que je créé le premier middleware $trailingSlash j’ai une page d’erreurs qui s’affiche et bloque tout.
J’ai déjà vidé les cookie mais rien n’y fait.
1) j’ai bien php 7.1
2) j’ai essayé avec mamp et même avec docker ça ne marche pas.
3) j’ai aussi essayé avec php -S localhost:8000 et ça non plus.
Voici la page d’erreurs :
![Message d'erreurs] https://www.hostingpics.net/viewer.php?id=765139Middleware.jpg
et mon code :
<?php
require_once 'vendor/autoload.php';
// phpinfo(); exit;
use function Http\Response\send;
use Psr\Http\Message\ServerRequestInterface;
$trailingSlash = function (ServerRequestInterface $request, callable $next) {
$url = (string)$request->getUri();
if (!empty($url) && $url[-1] === '/') {
$response = new \GuzzleHttp\Psr7\Response();
return $response
->withHeader('Location', substr($url, 0, -1))
->withStatus(301);
}
return $next($request);
};
$request = \GuzzleHttp\Psr7\ServerRequest::fromGlobals();
$response = $trailingSlash($request, function ($request) {
$response = new \GuzzleHttp\Psr7\Response();
$url = $request->getUri()->getPath();
if ($url === '/blog') {
$response->getBody()->write('Je suis sur le blog');
} elseif ($url === '/contact') {
$response->getBody()->write('Me contacter');
} else {
$response->getBody()->write('Not Found');
$response = $response->withStatus(404);
}
return $response;
});
/*
ce qui marchait avant
$response = new \GuzzleHttp\Psr7\Response();
$url = $request->getUri()->getPath();
if ($url === '/blog') {
$response->getBody()->write('Je suis sur le blog');
} elseif ($url === '/contact') {
$response->getBody()->write('Me contacter');
} else {
$response->getBody()->write('Not Found');
$response = $response->withStatus(404);
}
*/
send($response);
Salut,
Il semblerait que tu aies une boucle infini.
Vérifie dans ton $trailingSlash
que $url[-1]
vaut bien /
et que substr($url, 0, -1)
correspond bien à ton url sans le trailing slash.
Fais également ton test avec une url qui possède un trailing slash (localhost:800/blog/).
Bonjour, j'ai réussi je ne sais pas comment mais pour l'instant ça marche, j'ai créé un .htaccess avec le code suivant et quand je mets un slash après blog ça marche.
PS: Petite précision, je travail avec Docker mon adresse est donc 192.168.24.100/blog et pas localhost:8000/blog car je ne sais pas comment php7.1 en natif sur mon mac, et même d'ailleurs si c'est possible.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
Bonjour, j'ai terminé le tuto sans problème sauf que dès je revient à la racine du site ça me remet cette erreur, bizarre non ?
Et une dernière qui m'étonne : quand je fais un var_dump($request); exit; dans un middleware ça me renvoie une ServerRequest de GuzzleHttp alors que la méthode process() demande une ServerRequestInterface du Psr\Http\Message\ServerRequestInterface ? C'est sûrement normal mais je trouve étonnant de demander quelque chose de précis si ça sert à rien, merci.
<?php
namespace App;
use function GuzzleHttp\Psr7\stream_for;
use Interop\Http\ServerMiddleware\DelegateInterface;
use Interop\Http\ServerMiddleware\MiddlewareInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class QuoteMiddleware implements MiddlewareInterface {
public function process(ServerRequestInterface $request, DelegateInterface $delegate)
{
var_dump($request); exit;
$response = $delegate->process($request);
$body = stream_for('"'.((string)$response->getBody()).'"');
return $response->withBody($body);
}
}