带有可选参数的Zend Expressive Route

时间:2019-01-16 08:02:20

标签: zend-framework zend-expressive

我想使用一条路线获取完整的馆藏,如果可以的话,还可以得到一个经过过滤的馆藏。

所以我的路线:

$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中,此路由定义可以正常工作。所以我很困惑。 为什么我的可选参数不起作用?

1 个答案:

答案 0 :(得分:3)

那是因为您使用的是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');