2017-08-19 30 views
0

Slim FrameworkでPHPを使用してAPIを構築していて、ルータに問題があります。同じHTTP動詞で異なるルートを使用しようとすると、FastRoute \ BadRouteExceptionとなります。異なるルートに同じHTTP動詞を使用する方法はありますか?メソッドGETに一致する2つのルートを登録できません

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} 
+0

'PUT /ユーザーUserControllerで::更新ミドルウェア::接続 PUT /ユーザーUserControllerで:: CHANGEPASSWORDミドルウェア:: connection' 同じルート同じ動詞? – Farkie

+0

コントローラのメソッドが異なります。 –

+0

'PUT/user'を2回マッピングすることはできません。プロセスはどのコントローラ@ actionを呼び出すべきかを区別することができません。ルート署名は一意でなければなりません。署名は '[http verb] route'です。 – RaghavGarg

答えて

3

異なるHTTP用の同じ動詞を異なる方法で使用する方法はありますか?

同じHTTP動詞と異なるルートについては、コード内に同じHTTP動詞と同じルートPUT /userを入力しています。

ルートシグネチャはユニークである必要があります。プロセスはを[email protected]に一意にマップできます。ルート署名は[http verb] [route]

別のルートまたは別のHTTP動詞を試してください。

// different route (suggested in your case) 
PUT /user/reset-password 

// different HTTP verb 
PATCH /user 
+0

私はフレームワークがコントローラを取ってルートに含めるという印象を受けていましたが、これは起こらないとわかりました。助けてくれてありがとう。 –

関連する問題