Как использовать singleton?

В Symfony фреймворке нет прямого встроенного паттерна Singleton, так как философия Symfony рекомендует использовать инъекцию зависимостей для создания и управления экземплярами объектов. Однако, вы можете реализовать свой собственный класс Singleton, если считаете, что это необходимо.

Паттерн Singleton предоставляет механизм, который гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.

Вот пример, как вы можете реализовать одиночку в Symfony:

<?php

namespace MyAppSingleton;

class Singleton
{
    private static $instance; // статическая переменная для хранения экземпляра

    private function __construct()
    {
        // приватный конструктор для предотвращения создания новых экземпляров
    }

    public static function getInstance(): self
    {
        if (null === self::$instance) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    public function doSomething(): void
    {
        // реализация метода
    }
}

Теперь, когда у нас есть класс Singleton, мы можем использовать его в нашем Symfony приложении. Например, в сервисе:

# services.yaml

services:
    AppMyService:
        public: true
        class: 'AppMyService'
        arguments:
            - '@my_singleton' # внедряем singleton как аргумент
<?php

namespace App;

use MyAppSingletonSingleton;

class MyService
{
    private $singleton;

    public function __construct(Singleton $singleton)
    {
        $this->singleton = $singleton;
    }

    public function doSomethingWithSingleton(): void
    {
        $this->singleton->doSomething();
    }
}

Теперь, когда мы создаем экземпляр MyService, Symfony будет автоматически внедрять экземпляр Singleton в конструктор, используя инъекцию зависимостей.

$myService = new MyService();
$myService->doSomethingWithSingleton();

Обратите внимание, что в примере Singleton реализован стандартным способом, а не с использованием контейнера сервисов Symfony, поскольку Symfony рекомендует использовать инъекцию зависимостей вместо паттернов Singleton. Однако, если у вас есть особая потребность в реализации Singleton в Symfony, вы можете внедрить его как сервис в контейнере сервисов и получать его через dependency injection.