2015-04-12 3 views
1

Я только что начал с Slim. Мое приложение на данный момент выглядит примерно так:Проблема маршрутизации с Slim framework

<?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(); 

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

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

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

+0

Да, пожалуйста, вы можете поделиться своей структурой проекта веба и файл (ы) .htaccess? Является ли текущий проект тонким скелетом? –

+0

Я не использую Slim скелет. Мой index.php находится в общей папке. Я использую PHP, встроенный в веб-сервер, поэтому у меня нет файла .htaccess. – marcosh

ответ

1

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

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

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

2

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

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

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

Если это так, то, как a77icus5 предложил нам, возможно, придется заглянуть в файл htacess и тем, что структура проекта ...

I есть свежий 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 
1

Для работы с Slim требуется какой-то переписывание URL. Поскольку вы используете внутренний веб-сервер 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 
+0

Я пробовал ваш подход, но без результатов. с/foo, я получаю привет мир и с/я получаю код 404 – marcosh

+0

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

Смежные вопросы