Php: // ввод данных о потере при изменении url, чтобы не включать index.php

Итак, я создаю настраиваемую конечную точку API, в которую мне нужно отправлять данные из Laravel. Мне понадобится тонна URL-адресов, и я хотел бы сделать это как можно более чистым, но при этом должен делать это с нуля, без фреймворка.

Я пытался создать следующую конечную точку

/ API / категории / создать /

Теперь я могу отправить сообщение с помощью Guzzle в /api/categories/create/index.php и получить содержимое с помощью file_get_contents('php://input'). И я знаю, что когда я удаляю index.php, он все еще отправляется в нужное место, потому что я могу отправить ответ «Hello» в качестве ответа, и я его получаю ».

Отчасти озадаченный, почему file_get_contents('php://input') может получить данные, которые я отправляю, но только когда я явно указываю index.php в конце URL-адреса.

Вот мой запрос, хотя я не думаю, что это связано с ошибкой ...

$client = new Client([
    'base_uri' => 'http://example.test/'
]);

$course = [
    'title'       => $request->title,
    'description' => $request->description,
    'site'        => $request->site
];

$response = $client->post('api/categories/create', [
    'json' => ['course' => $course]
]);

Любые идеи?

0
0
82
1

Ответы 1

вам необходимо добавить файл .htaccess, который определяет index.php как единую точку доступа.

шаблон перезаписи должен быть (похож на) controller/method/id, например:

<IfModule mod_rewrite.c>

    RewriteEngine On
    RewriteBase /

    # remove trailing slash
    RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/(.*)/(\d+)$ /index.php?controller=$1&method=$2&id=$3 [L,NC,QSA]

</IfModule>

за которыми следуют другие шаблоны, которые перезаписываются без id, а также без method (по умолчанию индексируется).

Для api/categories/create потребуется шаблон, похожий на ~ ^(.*)/(.*)/(.*)$ /index.php?controller=$1&subject=$2&method=$3 [L,NC,QSA]. можно также определить возможные значения с помощью логического OR, подобного ^(.*)/(.*)/(create|read|update|destroy)(/|)$.

Для чего нужны метод и идентификатор контроллера? Предполагается, что у меня есть только один файл для всего API?

Octoxan 13.09.2018 22:00

Тогда в вашем примере будет index.php в корне? В настоящее время у меня есть /api/categories/create/index.php и /api/categories/destroy/index.php и т. д.

Octoxan 13.09.2018 22:04

например, даже в Laravel есть класс Controller: laravel.com/docs/5.7/controllers#defining-controllers ... в то время как это будет один index.php, который может инициализировать приложение, а затем использовать контроллеры подключаемых модулей по запросу. например, структура каталогов наподобие /webroot/index.php и /controller/api.php - при этом контроллеры даже не должны находиться в корневом веб-каталоге (по-прежнему должны находиться в файловой системе сервера). большинство MVC работает так же, в то время как API не имеет представлений.

Martin Zeitler 13.09.2018 22:05

Другие вопросы по теме