Php Symfony静态/全局记录器,具有条令访问权限

Php Symfony静态/全局记录器,具有条令访问权限,php,symfony,service,doctrine,Php,Symfony,Service,Doctrine,也许我尝试了不可能的事情,但我尝试了归档一个日志系统,在那里我可以用Logger::info('some info')或plain LogInfo(…)之类的东西在任何地方登录 因此,无需使用新的。。或者作为参数/注入(在某些函数中必须使用“动态”参数计数)。我需要在控制器/命令内部使用,在较小的定制类和函数外部使用,这些类和函数由控制器/命令以某种方式调用,但不扩展任何容器 例如,我使用Symfony文档中的MessageGenerator示例 // srcMessageGenerator.p

也许我尝试了不可能的事情,但我尝试了归档一个日志系统,在那里我可以用Logger::info('some info')或plain LogInfo(…)之类的东西在任何地方登录

因此,无需使用新的。。或者作为参数/注入(在某些函数中必须使用“动态”参数计数)。我需要在控制器/命令内部使用,在较小的定制类和函数外部使用,这些类和函数由控制器/命令以某种方式调用,但不扩展任何容器

例如,我使用Symfony文档中的MessageGenerator示例

// srcMessageGenerator.php

namespace App\Library\Util;

use Doctrine\ORM\EntityManagerInterface;

class MessageGenerator
{
    private $em;
    public function setEM(EntityManagerInterface $em){
        $this->em = $em;
        var_dump('a');
    }

    public function getHappyMessage(){
        var_dump($this->em);
        $messages = [
            'You did it! You updated the system! Amazing!',
            'That was one of the coolest updates I\'ve seen all day!',
            'Great work! Keep going!',
        ];
    
        $index = array_rand($messages);
    
        return $messages[$index];
    }
}
我已经尝试将其定义为服务

# config/services.yaml
services:
    App\Library\Util\MessageGenerator:
        arguments: ['@doctrine.orm.entity_manager']
        public: true
问题: 我必须将它注入到我想要使用的每个函数中-这是不可能的

我试着把它当作一个静态函数使用——服务不能是静态的

我试图将它隔离为静态函数,而不使用服务,但是我不知道如何根据我的环境获得config/package/doctor设置

我也研究过独白,但这里有同样的问题,如果没有控制器/命令外的声明,我无法使用它

任何人都知道我如何访问默认的(基于环境的)条令连接,或者我如何在控制器/命令内部/外部使用服务,而无需声明它(类似静态)并向实体管理器提供它

(第二种方式的解决方案会很好,因此我可以在某一天使用相同的解决方案“升级”到monolog)

您可以通过将服务传递到控制器中的函数在Symfony中使用

您的服务:

class MessageGeneratorService
{
    private $em;

    public function __construct(EntityManagerInterface $em){
        $this->em = $em;
    }
    public function getHappyMessage(){
    // the job
    }
}
class MyService
{
    private $messageGeneratorService;

    public __construct(MessageGeneratorService $mGService) {
        $this->messageGeneratorService = $mGService
    }

    // You can use this service like you use MessageGeneratorService
    public makeMeHappy() {
        $messageGeneratorService->getHappyMessage();
    }
}
class MyController
{
    /**
     * @Route("/example", name="page_example")
     */
    public index(MessageGeneratorService $mGService) {
        $mGService->getHappyMessage(); // Now, you can use it
        return $this->render('example/index.html.twig');
    }
}
在其他服务中:

class MessageGeneratorService
{
    private $em;

    public function __construct(EntityManagerInterface $em){
        $this->em = $em;
    }
    public function getHappyMessage(){
    // the job
    }
}
class MyService
{
    private $messageGeneratorService;

    public __construct(MessageGeneratorService $mGService) {
        $this->messageGeneratorService = $mGService
    }

    // You can use this service like you use MessageGeneratorService
    public makeMeHappy() {
        $messageGeneratorService->getHappyMessage();
    }
}
class MyController
{
    /**
     * @Route("/example", name="page_example")
     */
    public index(MessageGeneratorService $mGService) {
        $mGService->getHappyMessage(); // Now, you can use it
        return $this->render('example/index.html.twig');
    }
}
在控制器中:

class MessageGeneratorService
{
    private $em;

    public function __construct(EntityManagerInterface $em){
        $this->em = $em;
    }
    public function getHappyMessage(){
    // the job
    }
}
class MyService
{
    private $messageGeneratorService;

    public __construct(MessageGeneratorService $mGService) {
        $this->messageGeneratorService = $mGService
    }

    // You can use this service like you use MessageGeneratorService
    public makeMeHappy() {
        $messageGeneratorService->getHappyMessage();
    }
}
class MyController
{
    /**
     * @Route("/example", name="page_example")
     */
    public index(MessageGeneratorService $mGService) {
        $mGService->getHappyMessage(); // Now, you can use it
        return $this->render('example/index.html.twig');
    }
}
现在,您可以在控制器或服务中使用MessageGeneratorService的实例:

当发生以下情况时,容器将自动知道通过记录器服务 实例化MessageGenerator


为什么不想使用依赖项注入?这是正确的方式,加上自动布线和自动配置非常容易。您是否考虑过将记录器服务注入类构造函数并将它们保存在属性中?通过只在控制器中使用方法获取服务的方式,其他类只能从构造函数获取服务。正如其他一些人所提到的,熟悉依赖项注入容器是Symfony的方法。对于习惯于单身和通婚的人来说,这似乎是一种痛苦,但最终还是会有回报的。话虽如此,如果您签入index.php,您将注意到$kernel是一个全局变量。所以$kernel->getContainer()->get(MessengerGenerator::class);几乎在任何地方都能用。如果可以的话,我很想使用依赖注入,问题是我需要它来将一个或多或少的遗留项目转换为当前的symfony 5。控制器调用几个类,这些类调用其他类,等等。在每个人中,日志类(可能)都是静态调用的,有些类是通过动态类/函数名和动态参数计数调用的。因此,我必须将实体管理器添加到所有类中,可能只是为了一个日志调用,我需要将管理器传递给日志类。关于$kernel解决方案,我将研究它,谢谢如果我理解它,我必须将它传递给所有想要使用MessageGenerator/服务的子类?或者我可以将它们以某种方式全局传递给我在控制器函数中调用的所有函数类吗?它是具有动态名称和参数的类中的类。将其传递给控制器没有问题,但在以下情况下,它会变得不舒适您必须通过它调用的服务的构造函数传递MessageGeneratorService(请参阅)。每个控制器都会将MessageGeneratorService的方法应用到其他服务中,如答案中所示。