无法注册与方法 GET 匹配的两条路由
Cannot register two routes matching for method GET
我正在用 PHP 和 Slim Framework 构建一个 API,但我的路由器有问题。当我尝试使用具有相同 HTTP 谓词的不同路由时,我得到 FastRoute\BadRouteException。有没有办法对不同的路由使用相同的 HTTP 动词?
routes.php
<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
$routes = file(_APP . '/config/routes.cfg');
foreach ($routes as $index => $line) {
if (strpos($line, '#') !== FALSE) {
continue;
} else if (count(explode(' ', $line)) < 3) {
continue;
}
$line = str_replace("\n", "", $line);
$line = preg_replace('/\s+/', ' ', $line);
$route = explode(' ', $line);
$mapping1 = $app->{$route[0]}($route[1] . '/', explode('::', $route[2]));
$mapping2 = $app->{$route[0]}($route[1], explode('::', $route[2]));
if (isset($route[3]) && strlen($route[3]) > 0) {
if (strpos($route[3], '|') !== FALSE) {
$middlewares = explode('|', $route[3]);
foreach ($middlewares as $middleware) {
if (strlen($middleware) > 0) {
$mapping1->add(explode('::', $middleware));
$mapping2->add(explode('::', $middleware));
}
}
} else {
$mapping1->add(explode('::', $route[3]));
$mapping2->add(explode('::', $route[3]));
}
}
}
routes.cfg
# User Routes
GET /user UserController::select Middleware::connection
POST /user UserController::insert Middleware::connection
PUT /user UserController::update Middleware::connection
PUT /user UserController::changePassword Middleware::connection
DELETE /user UserController::delete Middleware::connection
完整堆栈:
Slim Application Error
The application could not run because of the following error:
Details
Type: FastRoute\BadRouteException
Message: Cannot register two routes matching "/usuario/" for method "PUT"
File: /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php
Line: 55
Trace
#0 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php(18): FastRoute\DataGenerator\RegexBasedAbstract->addStaticRoute('PUT', Array, 'route6')
#1 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/nikic/fast-route/src/RouteCollector.php(36): FastRoute\DataGenerator\RegexBasedAbstract->addRoute('PUT', Array, 'route6')
#2 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/Router.php(227): FastRoute\RouteCollector->addRoute(Array, '/usuario/', 'route6')
#3 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/nikic/fast-route/src/functions.php(24): Slim\Router->Slim\{closure}(Object(FastRoute\RouteCollector))
#4 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/Router.php(238): FastRoute\simpleDispatcher(Object(Closure), Array)
#5 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/Router.php(191): Slim\Router->createDispatcher()
#6 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/App.php(546): Slim\Router->dispatch(Object(Slim\Http\Request))
#7 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/App.php(470): Slim\App->dispatchRouterAndPrepareRoute(Object(Slim\Http\Request), Object(Slim\Router))
#8 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(122): Slim\App->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response))
#9 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/App.php(370): Slim\App->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response))
#10 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/App.php(295): Slim\App->process(Object(Slim\Http\Request), Object(Slim\Http\Response))
#11 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/index.php(55): Slim\App->run()
#12 {main}
Is there a way to use the same HTTP verb for different routs?
你问的是相同的 HTTP 动词和不同的路由,但在你的代码中,你有相同的 HTTP 动词和相同的路由 PUT /user
。
路由签名应该是唯一的,以便进程可以唯一地将 route
映射到 conroller@action
。路由签名是 [http verb] [route]
请尝试不同的路由或不同的 HTTP 动词。
// different route (suggested in your case)
PUT /user/reset-password
// different HTTP verb
PATCH /user
我正在用 PHP 和 Slim Framework 构建一个 API,但我的路由器有问题。当我尝试使用具有相同 HTTP 谓词的不同路由时,我得到 FastRoute\BadRouteException。有没有办法对不同的路由使用相同的 HTTP 动词?
routes.php
<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
$routes = file(_APP . '/config/routes.cfg');
foreach ($routes as $index => $line) {
if (strpos($line, '#') !== FALSE) {
continue;
} else if (count(explode(' ', $line)) < 3) {
continue;
}
$line = str_replace("\n", "", $line);
$line = preg_replace('/\s+/', ' ', $line);
$route = explode(' ', $line);
$mapping1 = $app->{$route[0]}($route[1] . '/', explode('::', $route[2]));
$mapping2 = $app->{$route[0]}($route[1], explode('::', $route[2]));
if (isset($route[3]) && strlen($route[3]) > 0) {
if (strpos($route[3], '|') !== FALSE) {
$middlewares = explode('|', $route[3]);
foreach ($middlewares as $middleware) {
if (strlen($middleware) > 0) {
$mapping1->add(explode('::', $middleware));
$mapping2->add(explode('::', $middleware));
}
}
} else {
$mapping1->add(explode('::', $route[3]));
$mapping2->add(explode('::', $route[3]));
}
}
}
routes.cfg
# User Routes
GET /user UserController::select Middleware::connection
POST /user UserController::insert Middleware::connection
PUT /user UserController::update Middleware::connection
PUT /user UserController::changePassword Middleware::connection
DELETE /user UserController::delete Middleware::connection
完整堆栈:
Slim Application Error
The application could not run because of the following error:
Details
Type: FastRoute\BadRouteException
Message: Cannot register two routes matching "/usuario/" for method "PUT"
File: /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php
Line: 55
Trace
#0 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php(18): FastRoute\DataGenerator\RegexBasedAbstract->addStaticRoute('PUT', Array, 'route6')
#1 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/nikic/fast-route/src/RouteCollector.php(36): FastRoute\DataGenerator\RegexBasedAbstract->addRoute('PUT', Array, 'route6')
#2 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/Router.php(227): FastRoute\RouteCollector->addRoute(Array, '/usuario/', 'route6')
#3 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/nikic/fast-route/src/functions.php(24): Slim\Router->Slim\{closure}(Object(FastRoute\RouteCollector))
#4 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/Router.php(238): FastRoute\simpleDispatcher(Object(Closure), Array)
#5 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/Router.php(191): Slim\Router->createDispatcher()
#6 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/App.php(546): Slim\Router->dispatch(Object(Slim\Http\Request))
#7 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/App.php(470): Slim\App->dispatchRouterAndPrepareRoute(Object(Slim\Http\Request), Object(Slim\Router))
#8 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(122): Slim\App->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response))
#9 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/App.php(370): Slim\App->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response))
#10 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/vendor/slim/slim/Slim/App.php(295): Slim\App->process(Object(Slim\Http\Request), Object(Slim\Http\Response))
#11 /opt/lampp/htdocs/projetos/soccerama/soccerama_api/index.php(55): Slim\App->run()
#12 {main}
Is there a way to use the same HTTP verb for different routs?
你问的是相同的 HTTP 动词和不同的路由,但在你的代码中,你有相同的 HTTP 动词和相同的路由 PUT /user
。
路由签名应该是唯一的,以便进程可以唯一地将 route
映射到 conroller@action
。路由签名是 [http verb] [route]
请尝试不同的路由或不同的 HTTP 动词。
// different route (suggested in your case)
PUT /user/reset-password
// different HTTP verb
PATCH /user