Slim 4-Uncaught TypeError:传递给{closure}的参数1必须是RouterCollectorProxy的实例

问题描述

我遵循苗条4的指南来创建路由组,但是在尝试测试已部署的heroku应用程序时出现此错误

PHP Fatal error:  Uncaught TypeError: Argument 1 passed to {closure}() must be an instance of RouterCollectorProxy,instance of Slim\Routing\RouteCollectorProxy given,called in /app/vendor/slim/slim/Slim/Routing/RouteGroup.PHP on line 75 and defined in /app/index.PHP:17

我的代码有什么问题?也许我错过了什么?

<?PHP 

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
use Updater\DeFinitionUpdater;

require __DIR__.'/vendor/autoload.PHP';

$app = AppFactory::create();

$app->get('/',function(Request $request,Response $response,$args){
    $response->getBody()->write('Hello World!');
    return $response;
});
$app->group('/api/v1',function(RouteCollectorProxy $group){
/**/
$app->get('/list',$args){
    $list = DeFinitionUpdater::updateList();
    $response->getBody()->write( json_encode($list,JSON_UnesCAPED_SLASHES) );
    return $response->withHeader( 'Content-Type','application/json' );
})->setName('privacy');
/**/
$app->get('/privacy',$args){
    $privacy = DeFinitionUpdater::updatePrivacy();
    $response->getBody()->write( json_encode($privacy,'application/json' );
})->setName('privacy');
/**/
$app->get('/cookie',$args){
    $cookie = DeFinitionUpdater::updateCookie();
    $response->getBody()->write( json_encode($cookie,'application/json' );
})->setName('cookie');

});

$app->run();
$app->addErrorMiddleware(true,true,true);

?>

解决方法

您将提示$group输入为RouteCollectorProxy。编译器需要知道类的完全限定名称,因此有两个选项:

  1. 在类型提示时使用类的完全限定名称(不推荐):

    $app->group('/api/v1',function( Slim\Routing\RouteCollectorProxy $group){});
    
  2. 添加另一个use语句:

    use Slim\Routing\RouteCollectorProxy;
    

您的代码还有另一个问题。在路由组回调中,您应使用$group添加实际路由:

use Slim\Routing\RouteCollectorProxy;
$app->group('/api/v1',function(RouteCollectorProxy $group){
    $group->get('/list',function(Request $request,Response $response,$args){
        //
    });
});

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...