我正在使用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
我肯定想念什么,但是我不确定吗?
答案 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;
}
}