具有理论访问权限的Symfony静态/全局Logger

时间:2020-09-04 10:01:04

标签: php symfony service doctrine

也许我尝试了不可能的事情,但是我尝试将这样的日志系统存档,在这里我可以使用Logger :: info('some info')或纯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 / doctrine设置。

我也研究过monolog,但这是同样的问题,我不能在没有控制器/命令外部声明的情况下使用它。

任何人都暗示我如何访问默认的(基于env的)学说连接,或者如何在不声明(如静态)并将其提供给实体管理器的情况下在控制器/命令内部/外部使用服务。< / p>

(第二种方法的解决方案会很不错,因此我可以使用相同的解决方案“升级”到某天的独白)

1 个答案:

答案 0 :(得分:0)

通过将服务传递给控制器​​中的函数,可以在Symfony中使用Injecting Services/Config into a Service

您的服务

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