【问题标题】:In Slim v3 how to access $container properties in routes?在 Slim v3 中如何访问路由中的 $container 属性?
【发布时间】:2018-08-06 09:32:48
【问题描述】:

我的设置是这样的:

我从这个文件中请求我的设置并将它们存储在设置变量中。

$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...");

    }
}

为什么它不起作用?

【问题讨论】:

    标签: php slim


    【解决方案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...");
    
        }
    }
    

    【讨论】:

    • 感谢它确实有效。我仍然想知道是否有更好的方法来做到这一点?
    • 如何更好?您可以在容器中创建一个返回控制器实例的工厂,您可以在该工厂中进行设置。我会更新我的答案。
    • 我的意思是不必在每个类的构造函数中手动重复相同的代码......我不确定!?
    • 我个人对loggerview 等常见所需依赖项所做的是创建一个BaseController 并在该类的构造函数中设置公共依赖项,然后扩展所有其他控制器从那个 BaseController 类。如果需要,我将覆盖__construct($container) 方法,因此设置公共依赖项就像调用parent::__construct($container); 一样简单,我也可以进行特定于类的设置。我认为这将是另一个问题,将其添加到此处的答案中没有多大意义。
    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 2018-12-23
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    相关资源
    最近更新 更多