首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Slim 3.11可调用Resolver TypeError

Slim 3.11可调用Resolver TypeError
EN

Stack Overflow用户
提问于 2018-12-01 18:53:06
回答 1查看 772关注 0票数 0

我找不到我的错误。当我在我的瘦api中尝试一条路线时,我得到了下面的TypeError。错误是:

传递给HCC\API\Controllers\FacultyController::__construct()的参数1必须是PDO的实例,即给定的Slim\Container实例

此控制器的构造函数是:

代码语言:javascript
复制
public function __construct(\PDO $db, \MongoDB\Client $mongo, \Monolog\Logger $applogger, \Monolog\Logger $seclogger)

我放入容器中的DI工厂是:

代码语言:javascript
复制
$container['FacultyController'] = function($c) {
    return new FacultyController($c->get('db'), $c->get('mongo'), $c->get('appLogger'), $c->get('secLogger'));
};

我尝试将每个变量设置为自己的变量,并传入这些变量,但效果相同。我已经成功地运行了一个测试,它只是加载了这个瘦应用程序,并检查容器是否有一个FacultyController类的对象,并且它有我有一个控制器的消息,所以我99%确信控制器确实被放入了容器中。我想这条路可能出了什么问题。我在控制器中有一个构造方法和一个调用方法,它们都是相同的。

我在其他帖子中发现了这个错误,但我发现的是不把一些东西传递给构造方法的问题,这似乎是传递给我的错误的参数。

我不想将整个容器传递到每个控制器中,因为这些控制器只需要设置依赖项,对于控制器来说,其中有很多不必要的项。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-02 05:41:57

这主要是因为Slim无法在依赖容器中找到HCC\API\Controllers\FacultyController类(因为您用字符串'FacultyController'而不是类的完全限定名注册了它)。

当Slim在依赖容器中找不到它时,默认情况下,Slim尝试自己创建HCC\API\Controllers\FacultyController并将容器实例传递给FacultyController构造函数。但是,由于您将FacultyController的构造函数声明为PDO类的类型提示,所以PHP抱怨这种类型不匹配。

解决方案是尝试将'FacultyController'替换为全名,包括名称空间,以使Slim可以在依赖容器中找到控制器。

所以不是,

代码语言:javascript
复制
$container['FacultyController'] = function($c) {
     return new FacultyController(
         $c->get('db'), 
         $c->get('mongo'), 
         $c->get('appLogger'), 
         $c->get('secLogger')
     );
};

你应该使用

代码语言:javascript
复制
$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')
     );
};

代码语言:javascript
复制
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')
     );
};

然后,在路由声明中,您可以使用,例如:

代码语言:javascript
复制
$app->get('/faculty', \HCC\API\Controllers\FacultyController::class); 

有关::class的更多信息

更新

如果您使用上面的代码,FacultyController将被视为可调用类,这意味着它将实现__invoke()方法。

代码语言:javascript
复制
class FacultyController 
{
    public function __invoke($request, $response, $args)
    {
          //handle the request
    }
}

如果不想使用可调用类而使用普通方法来处理请求,则在安装路由时包括方法名称。

代码语言:javascript
复制
$app->get('/faculty', \HCC\API\Controllers\FacultyController::class . ':getFacultyCollection');

将调用getFacultyCollection()方法来处理请求。

代码语言:javascript
复制
class FacultyController 
{
    public function getFacultyCollection($request, $response, $args)
    {
          //handle the request
    }
}

如果如您在注释中所说,getFacultyCollection()调用会导致应用程序崩溃,那么它是完全不同的问题。也许你有未终止的循环?

调用()魔术方法

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53574032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档