Saltar al contenido

Servicio de registro de Symfony 3.4

este problema se puede resolver de diferentes formas, por lo tanto te damos la solución más completa en nuestra opinión.

Solución:

Como se indica en Symfony 3.4, el logger servicio proporcionado por el MonologBundle y todos los demás servicios, están configurados como privados de forma predeterminada. [sic]

Para solucionar el problema, el método recomendado es utilizar la inyección de dependencia. http://symfony.com/doc/3.4/logging.html

namespace AppBundleController;

use PsrLogLoggerInterface;
use SymfonyBundleFrameworkBundleControllerController;

class DefaultController extends Controller

     public function indexAction(LoggerInterface $logger)
     
        $logger->info('Your Message');
     

Referencia del código fuente: https://github.com/symfony/monolog-bundle/blob/v3.1.0/Resources/config/monolog.xml#L17

Para las definiciones de servicio, la inyección de dependencia está disponible cuando autowire está habilitado. [sic]

#app/config/services.yml

services:
    # default configuration for services in *this* file
    _defaults:
        # automatically injects dependencies in your services
        autowire: true
        # automatically registers your services as commands, event subscribers, etc.
        autoconfigure: true
        # this means you cannot fetch services directly from the container via $container->get()
        # if you need to do this, you can override this setting on individual services
        public: false

    # makes classes in src/AppBundle available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    AppBundle:
        resource: '../../src/AppBundle/*'
        # you can exclude directories or files
        # but if a service is unused, it's removed anyway
        exclude: '../../src/AppBundle/Entity,Repository,Tests'

    #enables dependency injection in controller actions
    AppBundleController:
        resource: '../../src/AppBundle/Controller'
        public: true
        tags: ['controller.service_arguments']

   #all of your custom services should be below this line
   #which will override the above configurations

    #optionally declare an individual service as public
    #AppBundleServiceMyService: 
    #    public: true

    #alternatively declare the namespace explicitly as public
    #AppBundleService:
    #    resource: '../../src/AppBundle/Service/*'
    #    public: true

Luego, para inyectar la dependencia en el servicio, agrega la sugerencia de tipo para el argumento al constructor.

namespace AppBundleService;

use PsrLogLoggerInterface;

class MyService


    private $logger;
    
    public function __construct(LoggerInterface $logger)
    
         $this->logger = $logger;
    
   

Si autowire está deshabilitado, puede definir manualmente sus servicios para inyectar el alias del registrador.

#app/config/services.yml

services:

    AppBundleServiceMyService:
        arguments: ['@logger']
        public: true

Alternativamente, para forzar que el alias del registrador sea accesible públicamente desde el contenedor, puede volver a declarar el alias del servicio en la configuración de servicios de su aplicación.

#app/config/services.yml

services:

    #...
    
    logger:
        alias: 'monolog.logger'
        public: true

En lugar de anular el valor en la configuración, también puede configurar el registrador como un servicio público en una pasada del compilador. https://symfony.com/doc/4.4/service_container/compiler_passes.html

Symfony Flex

// src/Kernel.php
namespace App;

use SymfonyBundleFrameworkBundleKernelMicroKernelTrait;
use SymfonyComponentDependencyInjectionCompilerCompilerPassInterface;
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentHttpKernelKernel as BaseKernel;

class Kernel extends BaseKernel implements CompilerPassInterface

    use MicroKernelTrait;

     public function process(ContainerBuilder $container)
     
        // in this method you can manipulate the service container:
        // for example, changing some container service:
        $container->getDefinition('logger')->setPublic(true);
    


Paquete Symfony

// src/AppBundle/AppBundle.php
namespace AppBundle;

use SymfonyComponentHttpKernelBundleBundle;
use SymfonyComponentDependencyInjectionContainerBuilder;
use AppBundleDependencyInjectionCompilerCustomPass;

class AppBundle extends Bundle

    public function build(ContainerBuilder $container)
    
        parent::build($container);

        $container->addCompilerPass(new CustomPass());
    

// src/AppBundle/DependencyInjection/Compiler/CustomPass.php
namespace AppBundleDependencyInjectionCompiler;

use SymfonyComponentDependencyInjectionCompilerCompilerPassInterface;
use SymfonyComponentDependencyInjectionContainerBuilder;

class CustomPass implements CompilerPassInterface

    public function process(ContainerBuilder $container)
    
        $container->getDefinition('logger')->setPublic(true);
    

$this->container->get('logger') falla porque el registrador ahora (a partir de 3.2) está marcado como un servicio privado, todos los servicios son privados de forma predeterminada, lo que significa que estos servicios no se pueden devolver desde el contenedor y, en su lugar, deben inyectarse dependencias (el constructor de la clase debe tomar el registrador como parámetro y convertirse en una propiedad de la clase para ser accesible), o marcado como público en la configuración del servicio, y dado que el registrador es un componente de Symfony, la configuración del servicio está dentro del proyecto Symfony, tendrías que copiar el registrador configuración de Symfony a la configuración del servicio de su proyecto y agregue public: true, para acceder a la instancia del registrador desde el contenedor.

Al final de todo puedes encontrar las referencias de otros usuarios, tú igualmente tienes la libertad de dejar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *