Есть пустой проект без фреймворка, но со скачанным symfony/router. Вот сам роутинг:
<?php
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
$routes = new RouteCollection();
$routes->add('contacts_all', new Route('/api/v1/contacts', ['_controller' => 'Controllers\ContactController::index']));
$routes->add('contact_show', new Route('/api/v1/contacts/{contact}', ['_controller' => 'Controllers\ContactController::show']));
$routes->add('contact_delete', new Route('/api/v1/contacts/{contact}', ['_controller' => 'Controllers\ContactController::delete'], [], [], '', ['DELETE']));
$routes->add('api_v1', new Route('/api/{any}', ['_controller' => 'Controllers\AppController::errorApi'], ['any' => '.*']));
$routes->add('index', new Route('/', ['_controller' => 'Controllers\AppController::index']));
$routes->add('any', new Route('/{any}', ['_controller' => 'Controllers\AppController::index'], ['any' => '.*']));
return $routes;
Не работает метод DELETE, в чем может быть ошибка?
PS: вообще есть решение у меня, но оно мне не нравится:
<?php
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
$routes = new RouteCollection();
switch($_SERVER['REQUEST_METHOD'])
{
case 'GET':
$routes->add('contacts_all', new Route('/api/v1/contacts', ['_controller' => 'Controllers\ContactController::index']));
$routes->add('contact_show', new Route('/api/v1/contacts/{contact}', ['_controller' => 'Controllers\ContactController::show']));
$routes->add('api_v1', new Route('/api/{any}', ['_controller' => 'Controllers\AppController::errorApi'], ['any' => '.*']));
$routes->add('index', new Route('/', ['_controller' => 'Controllers\AppController::index']));
$routes->add('any', new Route('/{any}', ['_controller' => 'Controllers\AppController::index'], ['any' => '.*']));
break;
case 'DELETE':
$routes->add('contact_delete', new Route('/api/v1/contacts/{contact}', ['_controller' => 'Controllers\ContactController::delete']));
break;
}
return $routes;
Поскольку в предыдущих роутах явно не указан метод, то принимается любой. И роут contact_show срабатывает и на GET и на DELETE, поскольку паттерн одинаковый. Поднимите роут contact_delete выше чем contact_show или явно пропишите в contact_show метод GET
У вас пропущен один параметр. Перед ['DELETE'] вставьте еще один пустой массив
Defining Routes
A full route definition can contain up to eight parts:
$route = new Route(
'/archive/{month}', // path
['_controller' => 'showArchive'], // default values
['month' => '[0-9]{4}-[0-9]{2}', 'subdomain' => 'www|m'], // requirements
[], // options
'{subdomain}.example.com', // host
[], // schemes
[], // methods
'context.getHost() matches "/(secure|admin).example.com/"' // condition
);
$routes->add('contact_delete', new Route(
'/api/v1/contacts/{contact}', //path
['_controller' => 'Controllers\ContactController::delete'], //default values
[], // requirements
[], // options
'', // host
['DELETE'] // !!! sсhemes
));
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости