php - Slim 4 - 未捕获的类型错误:传递给 {closure}() 的参数 1 必须是 RouterCollectorProxy 的实例
问题描述
我正在按照 slim 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', function(Request $request, Response $response, $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', function(Request $request, Response $response, $args){
$privacy = DefinitionUpdater::updatePrivacy();
$response->getBody()->write( json_encode($privacy, JSON_UNESCAPED_SLASHES) );
return $response->withHeader( 'Content-Type', 'application/json' );
})->setName('privacy');
/**/
$app->get('/cookie', function(Request $request, Response $response, $args){
$cookie = DefinitionUpdater::updateCookie();
$response->getBody()->write( json_encode($cookie, JSON_UNESCAPED_SLASHES) );
return $response->withHeader( 'Content-Type', 'application/json' );
})->setName('cookie');
});
$app->run();
$app->addErrorMiddleware(true, true, true);
?>
解决方案
您键入提示$group
为RouteCollectorProxy
. 编译器需要知道类的完全限定名,所以有两种选择:
类型提示时使用类的完全限定名(不推荐):
$app->group('/api/v1', function( Slim\Routing\RouteCollectorProxy $group){});
添加另一个使用语句:
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){
//
});
});
推荐阅读
- machine-learning - 为什么我们不需要在多元线性回归中进行特征缩放
- javascript - 如何正确使用 querySelectorAll 和 addEventListener
- shell - /busybox/sh:语法错误:使用 Tekton 替换错误
- excel - SSRS 单元自动合并
- cytoscape.js - 如何获得用于创建弯曲点的段距离和段权重的准确值?
- ssis - 使用 DTS.Events 进行 SSIS 日志记录
- python - 如何使 DataFrame / Series / array for 循环?
- .net - .NET 中 DynamoDb ScanCondition 的不同条件运算符
- excel - 从工作表中填充组合框并相应地填写用户表单?
- prolog - 如何检查 Prolog 中是否存在特定常量?