Как внедрить сервис-класс как singleton

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Spot
Сообщения: 74
Зарегистрирован: 2013.04.09, 04:04

Как внедрить сервис-класс как singleton

Сообщение Spot »

Сервис-класс

Код: Выделить всё

<?php
namespace app\services;

class MyService
{
	protected $attribute;

	public function setAttribute($attribute)
	{
		$this->attribute = $attribute;
	}
}
Контроллер

Код: Выделить всё

<?php

namespace app\controllers;

use Yii;
use app\services\MyService;

class MyController extends \yii\web\Controller
{
    protected $myService;

    public function __construct($id, $module, MyService $myService, $config = [])
    {
        $this->myService = $myService;
        parent::__construct($id, $module, $config);
    }

    public function actionSet()
    {
        $this->myService->setAttribute('Атрибут');
        var_dump($this->myService);        
    }

    public function actionGet()
    {
        var_dump($this->myService);
    }  
}
Хочу чтоб в localhodst/my/get вышел объект с установленным значением ('Атрибут')
Аватара пользователя
ElisDN
Сообщения: 5841
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как внедрить сервис-класс как singleton

Сообщение ElisDN »

На каждый запрос производится новый чистый запуск PHP и после завершения всё исчезает.

Сохраняйте такие значения в сессию или БД.
Spot
Сообщения: 74
Зарегистрирован: 2013.04.09, 04:04

Re: Как внедрить сервис-класс как singleton

Сообщение Spot »

А как же соединение с БД работает?
С каждым запросом новое соединение? Тогда синглтон для чего?
Аватара пользователя
ElisDN
Сообщения: 5841
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как внедрить сервис-класс как singleton

Сообщение ElisDN »

Spot писал(а): 2021.04.17, 12:14 С каждым запросом новое соединение?
Да, в Apache и PHP-FPM работа производится по отдельному запуску на каждый запрос.

На каждый HTTP-запрос из браузера запускается index.php с фреймворком и открывается новое соединение к БД.
Spot писал(а): 2021.04.17, 12:14 Тогда синглтон для чего?
Чтобы внутри одного HTTP-запроса оставалось одно соединение, если код в нескольких местах дёргает БД. Иначе расплодятся пять подключений на один экшен.
Последний раз редактировалось ElisDN 2021.04.17, 12:50, всего редактировалось 1 раз.
Spot
Сообщения: 74
Зарегистрирован: 2013.04.09, 04:04

Re: Как внедрить сервис-класс как singleton

Сообщение Spot »

Ясно, спасибо за подробное объяснение.
Аватара пользователя
ElisDN
Сообщения: 5841
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как внедрить сервис-класс как singleton

Сообщение ElisDN »

А чтобы это был вечный синглтон для нескольких запросов вместо Apache или PHP-FPM нужно запускать свой консольный асинхронный PHP-сервер вроде RoadRunner или Swoole.

Там фреймворк с подключениями запускается всего один раз вначале и уже сам в цикле обрабатывает все запросы из сокета.
Ответить