Проблема маршрутизации с Slim framework

Я только что начал с Slim. Мое приложение на данный момент выглядит примерно так:

<?php require 'vendor/autoload.php'; $app = new \Slim\Slim([ 'debug' => true ]); var_dump($app->request()); $app->get('/:name', function ($name) { echo "Hello, $name"; }); $app->get('/', function () { echo 'hello world'; }); $app->run(); 

Я запускаю его на localhost, используя PHP, встроенный в веб-сервер. Для каждого запроса, который я пытаюсь использовать в браузере (или Postman, или CURL), я получаю всегда «привет мир», как если бы первый маршрут не рассматривался. Более того, если я удалю второй маршрут, я всегда получаю 404.

Я что-то забыл?

Для целей отладки, какой HTTP-заголовок используется SLIM для определения маршрута?

Вы не можете удалить второй маршрут $app->get('/') поскольку это маршрут по умолчанию по умолчанию, и вполне нормально получить 404, потому что $app->get('/:name', function ($name) {}) ожидает, что аргумент функции обратного вызова 'name' отсутствует.

Вы пытаетесь сделать следующее:

 http://localhost/mysite/ --- Outputs Hello World http://localhost/mysite/marcosh --- Outputs a 404 ?? 

Если это так, то, как предположил a77icus5, нам может понадобиться изучить ваш htacess-файл и структуру структуры проекта …

У меня есть новая установка Slim Skeleton, и я решил поделиться с вами своей конфигурацией …

Каталог моего веб-проекта выглядит следующим образом:

 Webroot -htaccess - public -- htaccess -- assets --- js --- css - templates - app - vendor -- Slim -- Twig 

В первом .htaccess расположенном в корневом каталоге проекта, я добавил:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule> 

Здесь public соответствует имени общей папки приложения

Затем в .htaccess расположенном в общей папке, я добавил:

 <IfModule mod_php5.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L] </IfModule> 

Затем в SLIM -> Environment.php (строка 142 – Виртуальный путь) и попробуйте изменить следующим образом:

  // Virtual path // $env['PATH_INFO'] = substr_replace($requestUri, '', 0, strlen($physicalPath)); // <-- Remove physical path $env['PATH_INFO'] = str_replace(str_replace('/public', "", dirname($_SERVER['PHP_SELF'])), '', "/".$requestUri); // remove public from URI $env['PATH_INFO'] = str_replace('?' . $queryString, '', $env['PATH_INFO']); // <-- Remove query string $env['PATH_INFO'] = '/' . ltrim($env['PATH_INFO'], '/'); // <-- Ensure leading slash 

Вам нужно какое-то переписывание URL для Slim для работы. Поскольку вы используете внутренний веб-сервер PHP, вы не можете использовать mod_rewrite . Вместо этого создайте файл route.php в той же папке, что и index.php со следующим кодом.

 <?php # Used only for running the app with internal PHP webserver # php -S localhost:8080 route.php if (file_exists(__DIR__ . "/" . $_SERVER["REQUEST_URI"])) { return false; } else { include_once "index.php"; } 

Затем запустите его с php -S localhost:8080 route.php . Все работает сейчас, как ожидалось.

 $ curl --include http://localhost:8080/foo HTTP/1.1 200 OK Host: localhost:8080 Connection: close X-Powered-By: PHP/5.6.2 Content-type: text/html;charset=UTF-8 Hello, foo 

В конце концов, я узнал, что проблема была вызвана неправильным корнем документа.

Я запускал приложение из основной папки моего проекта, используя php -S localhost:8080 public/index.php и это заставило заголовок PATH_INFO HTTP-запроса не компилироваться.

Изменение каталога на ./public и запуск приложения с использованием php -S localhost:8080 index.php решил проблему