在Slim v3中,如何访问路由中的$ container属性?

时间:2018-08-06 09:32:48

标签: php slim

我的设置是这样的:

我从此文件请求设置,并将其存储在settings变量中。

$settings = require __DIR__ . '/settings.php';

接下来,像这样创建一个新的Slim实例:

$app = new \Slim\App($settings);

$container = $app->getContainer();

$container['logger'] = function($c) {
    $settings = $c->get('settings')['logger'];
    $logger = new \Monolog\Logger($settings['name']);
    $file_handler = new \Monolog\Handler\StreamHandler($settings['path']);
    $logger->pushHandler($file_handler);
    return $logger;
};

然后我正在呼叫路线:

$this->get('/testlogger, __testReq::class . ':test);

以上路线在我的课程中调用了“ test”方法。通过自动加载加载。在我正在尝试访问容器的班级(控制器)下方,如Slim网站上所述。

class __testReq {
   function test($request, $response){
       //According to Documentation i am supposed to be able to call logger like so:
       $this->logger->addInfo("YEY! I am logging...");

    }
}

为什么不起作用?

1 个答案:

答案 0 :(得分:1)

来自Slim documentation(文档使用HomeController类作为示例):

  

Slim首先在容器中查找HomeController的条目,如果找到它将使用该实例,否则它将使用容器作为第一个参数调用其构造函数。

因此,在您的class __testReq构造函数中,您需要设置对象:

class __testReq {

    // logger instance
    protected $logger;

    // Use container to set up our newly created instance of __testReq
    function __construct($container) {
        $this->logger= $container->get('logger');
    }

    function test($request, $response){
        // Now we can use $this->logger that we set up in constructor
        $this->logger->addInfo("YEY! I am logging...");

    }
}