PHP Slim 3 Framework - 在自定义中使用 MonoLog Class - 在不在对象上下文中时使用 $this

PHP Slim 3 Framework - Use MonoLog in Custom Class - Using $this when not in object context

我正在使用 Slim 3 骨架并尝试在我创建的自定义 class 中使用 MonoLog,它被称为实用程序。

Utilities.php - index.php

需要
<?php

class Utilities {

    protected $logger;

    function __construct($c) {
        $this->logger = $logger;
    }

    static function checkPerms() {
        $this->logger->info("checkPerms() permissions of user id valid.");
        return true;
    }

}

Dependencies.php - 我添加了以下内容:

$container['utilities'] = function ($c) {
    return new Utilities($c->get('logger'));   
};

但我收到以下错误:

Message: Using $this when not in object context

File: /Applications/MAMP/htdocs/project/src/utilities.php

我一定是遗漏了什么,但我不确定是什么?

我至少建议两件重要的事情。

首先是静态方法不能调用$this。在 Slim Skeleton 中,您会看到记录器是通过魔术方法 __invoke 调用的。它不一定是一个神奇的方法,只是不是一个 "static function" 来访问 $this.

第二个是构造函数。即使在您的依赖项中您指定要从容器中检索记录器,您当前的构造函数也不会引用它。您在 Slim 骨架样板中再次看到了这一点。如果你不想使用 "use" 声明,你可以这样做:

function __construct(\Psr\Log\LoggerInterface $logger) {
    $this->logger = $logger;
}

这样,容器将为您获取所需的 $logger,然后您可以使用非静态方法调用它。

<?php
namespace App\Action;

use Slim\Views\Twig;
use Psr\Log\LoggerInterface;
use Slim\Http\Request;
use Slim\Http\Response;

final class HomeAction
{
    private $view;
    private $logger;

    public function __construct(Twig $view, LoggerInterface $logger)
    {
        $this->view = $view;
        $this->logger = $logger;
    }

    public function __invoke(Request $request, Response $response, $args)
    {
        $this->logger->info("Home page action dispatched");

        $this->view->render($response, 'home.twig');
        return $response;
    }
}

祝你好运

我会重构 Utilities.php 一点:

<?php

class Utilities
{

    protected $logger;

    function __construct($logger)
    {
        $this->logger = $logger;
    }

    public function checkPerms()
    {
        $this->logger->info("checkPerms() permissions of user id valid.");

        return true;
    }

}