Отправка форм Slim 4 PUT и DELETE
Как мне выполнить PUT и DELETE отправленные формы в Slim 4? У меня следующий маршрут:
$group->get('/sites/create', SitesController::class . ':create')->setName('sites_create');
$group->get('/sites/{id}/edit', SitesController::class . ':edit')->setName('sites_edit');
$group->post('/sites', SitesController::class . ':createSubmit')->setName('sites_create_submit');
$group->put('/sites', SitesController::class . ':editSubmit')->setName('sites_edit_submit');
Вот мой:
<form action="/sites" method="POST">
<label for="name">Site name</label>
<input type="text" class="form-control" id="name" name="name">
<input type="hidden" name="_METHOD" value="PUT">
<button type="submit">Submit</button>
</form>
Вот как я бы сделал это в Slim 3.
Но это не относится к методу editSubmit, вместо этого он переходит к методу createSubmit.
Как отправить с помощью этих методов?
1 ответ
Решение
Согласно документации Slim 4, вы все равно можете переопределить метод формы, используя_METHOD
параметр в POST
тело запроса, или используя X-Http-Method-Override
заголовок.
Важным моментом (из документации) является то, что вам нужно добавитьSlim\Middleware\MethodOverrideMiddleware
в ваше приложение, чтобы иметь возможность переопределить метод формы.
Вот полностью рабочий пример:
<?php
require __DIR__ . '/../vendor/autoload.php';
use Slim\Factory\AppFactory;
$app = AppFactory::create();
$app->addRoutingMiddleware();
$app->add(new Slim\Middleware\MethodOverrideMiddleware);
$app->get('/', function($request, $response){
$form =<<<form
<form action="/put" method="post">
<input type="hidden" name="_METHOD" value="PUT"/>
<button type="submit">Send PUT request</button>
</form>
<form action="/delete" method="post">
<input type="hidden" name="_METHOD" value="DELETE"/>
<button type="submit">Send DELETE request</button>
</form>
form;
$response->getBody()->write($form);
return $response;
});
$app->put('/put', function($request, $response){
$response->getBody()->write('The request method is: ' . $request->getMethod());
return $response;
});
$app->delete('/delete', function($request, $response){
$response->getBody()->write('The request method is: ' . $request->getMethod());
return $response;
});
$app->run();