Zend Expressive Route с необязательным параметром

Я хочу использовать маршрут для получения полной коллекции и, если возможно, отфильтрованной коллекции.

Итак, мой маршрут:

$app->get("/companies", \App\Handler\CompanyPageHandler::class, 'companies');

Мой обработчик для этого маршрута:

use App\Entity\Company;
use App\Entity\ExposeableCollection;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

class CompanyPageHandler extends AbstractHandler
{
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        $categories = new ExposeableCollection();
        foreach (['test', 'test1', 'test3'] as $name) {
            $category = new Company();
            $category->setName($name);

            $categories->addToCollection($category);
        }

        return $this->publish($categories);
    }
}

При получении этого маршрута /companies я получаю ожидаемую коллекцию

[{"name":"test"},{"name":"test1"},{"name":"test3"}]

Так что теперь я меняю маршрут

$app->get("/companies[/:search]", \App\Handler\CompanyPageHandler::class, 'companies');

Все нормально, когда я просматриваю /companies. Но если я попробую необязательный параметр /companies/test1, то получу ошибку

Не удается получить http://localhost:8080/companies/test1

мой композитор требует раздела:

"require": {
    "php": "^7.1",
    "zendframework/zend-component-installer": "^2.1.1",
    "zendframework/zend-config-aggregator": "^1.0",
    "zendframework/zend-diactoros": "^1.7.1 || ^2.0",
    "zendframework/zend-expressive": "^3.0.1",
    "zendframework/zend-expressive-helpers": "^5.0",
    "zendframework/zend-stdlib": "^3.1",
    "zendframework/zend-servicemanager": "^3.3",
    "zendframework/zend-expressive-fastroute": "^3.0"
},

В Zend Framework 2 и Symfony4 это определение маршрута работает нормально. Так что я в замешательстве. Почему мой необязательный параметр не работает?


person rob    schedule 16.01.2019    source источник


Ответы (1)


Это потому, что вы используете маршрутизатор https://github.com/nikic/FastRoute, и правильный синтаксис будет :

$app->get("/companies[/{search}]", \App\Handler\CompanyPageHandler::class, 'companies');

или быть более строгим и проверить параметр поиска примерно так:

$app->get("/companies[/{search:[\w\d]+}]", \App\Handler\CompanyPageHandler::class, 'companies');
person Vytautas    schedule 16.01.2019