delete pathc put symfony routing

408
16 июля 2021, 05:30

Есть пустой проект без фреймворка, но со скачанным 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;
Answer 1
  1. Поскольку в предыдущих роутах явно не указан метод, то принимается любой. И роут contact_show срабатывает и на GET и на DELETE, поскольку паттерн одинаковый. Поднимите роут contact_delete выше чем contact_show или явно пропишите в contact_show метод GET

  2. У вас пропущен один параметр. Перед ['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
));
READ ALSO
Регулярка на php

Регулярка на php

Необходима регулярка на php которая заменяет пустое место после точки на пробелТо бишь "Дерево

341
Wordpress. Как передать данные полученные в Ajax (admin-ajax.php) в свой тег формы (шорткод) contactForms7?

Wordpress. Как передать данные полученные в Ajax (admin-ajax.php) в свой тег формы (шорткод) contactForms7?

Я использую Ajax в wordpress для передачи списка запчастей, а полученные данные хочу передать в форму contactForms7

202
Преобразователь сатоши в биткоин

Преобразователь сатоши в биткоин

Задача такая меня постигла, имеем в базе ячейку money тип ячейки bigint туда пишется баланс сатоши, так как различного рода зачисления удобней...

282