我找不到我的错误。当我在我的瘦api中尝试一条路线时,我得到了下面的TypeError。错误是:
传递给HCC\API\Controllers\FacultyController::__construct()的参数1必须是PDO的实例,即给定的Slim\Container实例
此控制器的构造函数是:
public function __construct(\PDO $db, \MongoDB\Client $mongo, \Monolog\Logger $applogger, \Monolog\Logger $seclogger)我放入容器中的DI工厂是:
$container['FacultyController'] = function($c) {
return new FacultyController($c->get('db'), $c->get('mongo'), $c->get('appLogger'), $c->get('secLogger'));
};我尝试将每个变量设置为自己的变量,并传入这些变量,但效果相同。我已经成功地运行了一个测试,它只是加载了这个瘦应用程序,并检查容器是否有一个FacultyController类的对象,并且它有我有一个控制器的消息,所以我99%确信控制器确实被放入了容器中。我想这条路可能出了什么问题。我在控制器中有一个构造方法和一个调用方法,它们都是相同的。
我在其他帖子中发现了这个错误,但我发现的是不把一些东西传递给构造方法的问题,这似乎是传递给我的错误的参数。
我不想将整个容器传递到每个控制器中,因为这些控制器只需要设置依赖项,对于控制器来说,其中有很多不必要的项。
发布于 2018-12-02 05:41:57
这主要是因为Slim无法在依赖容器中找到HCC\API\Controllers\FacultyController类(因为您用字符串'FacultyController'而不是类的完全限定名注册了它)。
当Slim在依赖容器中找不到它时,默认情况下,Slim尝试自己创建HCC\API\Controllers\FacultyController并将容器实例传递给FacultyController构造函数。但是,由于您将FacultyController的构造函数声明为PDO类的类型提示,所以PHP抱怨这种类型不匹配。
解决方案是尝试将'FacultyController'替换为全名,包括名称空间,以使Slim可以在依赖容器中找到控制器。
所以不是,
$container['FacultyController'] = function($c) {
return new FacultyController(
$c->get('db'),
$c->get('mongo'),
$c->get('appLogger'),
$c->get('secLogger')
);
};你应该使用
$container[\HCC\API\Controllers\FacultyController::class] = function($c) {
return new \HCC\API\Controllers\FacultyController(
$c->get('db'),
$c->get('mongo'),
$c->get('appLogger'),
$c->get('secLogger')
);
};或
use \HCC\API\Controllers\FacultyController;
$container[FacultyController::class] = function($c) {
return new FacultyController(
$c->get('db'),
$c->get('mongo'),
$c->get('appLogger'),
$c->get('secLogger')
);
};然后,在路由声明中,您可以使用,例如:
$app->get('/faculty', \HCC\API\Controllers\FacultyController::class); 有关::class的更多信息
更新
如果您使用上面的代码,FacultyController将被视为可调用类,这意味着它将实现__invoke()方法。
class FacultyController
{
public function __invoke($request, $response, $args)
{
//handle the request
}
}如果不想使用可调用类而使用普通方法来处理请求,则在安装路由时包括方法名称。
$app->get('/faculty', \HCC\API\Controllers\FacultyController::class . ':getFacultyCollection');将调用getFacultyCollection()方法来处理请求。
class FacultyController
{
public function getFacultyCollection($request, $response, $args)
{
//handle the request
}
}如果如您在注释中所说,getFacultyCollection()调用会导致应用程序崩溃,那么它是完全不同的问题。也许你有未终止的循环?
调用()魔术方法
https://stackoverflow.com/questions/53574032
复制相似问题