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

时间:2018-10-16 19:56:21

标签: php slim slim-3

我正在使用Slim 3骨架,并尝试在我创建的自定义类(称为实用程序)中使用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'));   
};

但我收到以下错误:

  

消息:在不在对象上下文中时使用$ this

     

文件: /Applications/MAMP/htdocs/project/src/utilities.php

我肯定想念什么,但是我不确定吗?

2 个答案:

答案 0 :(得分:1)

我至少建议两件事。

第一个是静态方法不能调用$ this。在Slim Skeleton中,您可以看到记录器是通过魔术方法__invoke调用的。为了访问$ 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;
    }
}

祝你好运

答案 1 :(得分:1)

我会稍微重构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;
    }

}