wiki/content/20201117112017-required.md

1.3 KiB
Raw Permalink Blame History

date id title
2020-11-17 269a4976-5800-4914-b49e-4bf16dd64797 @required

Description

When autowiring is enabled for a service, you can also configure the container to call methods on your class when its instantiated. For example, suppose you want to inject the logger service, and decide to use setter-injection:

// src/Util/Rot13Transformer.php
namespace App\Util;

class Rot13Transformer
{
    private $logger;

    /**
     * @required
     */
    public function setLogger(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function transform($value)
    {
        $this->logger->info('Transforming '.$value);
        // ...
    }
}

Autowiring will automatically call any method with the @required annotation above it, autowiring each argument. If you need to manually wire some of the arguments to a method, you can always explicitly configure the method call.

Despite property injection has some drawbacks, autowiring with @required annotation can also be applied to public typed properties:

namespace App\Util;

class Rot13Transformer
{
    /** @required */
    public LoggerInterface $logger;

    public function transform($value)
    {
        $this->logger->info('Transforming '.$value);
        // ...
    }
}