Symfony PHP - Использование сервиса в другом сервисе - PullRequest
0 голосов
/ 06 июня 2018

У меня есть приложение Symfony 4, которое вызывает службу базы данных из службы сеанса.

Служба базы данных имеет __construct методы, которые получают учетные данные БД из services.yaml

Служба БД

namespace App\Services;

class Database {

    private $conn;

    public function __construct($host, $name, $user, $pass){

        $this->conn = mysqli_connect($host,$user,$pass,$name) or die('error: cannot connect');
    }

    //...
}

config/services.yaml

services:
    App\Services\Database:
        arguments:
            $host: '1.2.3.4.5'
            $name: 'database_name'
            $user: 'username'
            $pass: 'password'

Я использую эту службу в службе сеансов, используемой контроллером входа.

Контроллер входа в систему

namespace App\Controller;

use App\Services\Database;
use App\Services\Session;

// ...
// ...
    if($login_valid){
        //...
        $session = new Session();
        $session->create();
    }

Служба сеанса

namespace App\Services;

use App\Services\Database;

class Session {

    private $DB;

    public function __construct(){

        $this->DB = new Database();  // ** ERROR **
    }

    public function create(){

        $this->DB->insert('a new session'); // (pseudo-code)
    }
    //...
}

Выдает ошибку при установке экземпляра службы БДв сервисе сеансов.Ошибка выглядит следующим образом: enter image description here

Вызывается метод __construct для DB, который принимает 4 аргумента (определенных глобально в services.yaml), которые я не предоставляю при создании экземпляраслужба БД внутри службы Session.

Но это не тот случай, когда я таким образом создаю службу БД непосредственно в контроллере.

Кроме того, не является ли одним из преимуществ использования __construct с аргументами службы, установленными в services.yaml, чтобы избежать необходимости каждый раз передавать эти аргументы?

Symfony знает, что нужно запускать __construct, когда вызывается служба БД, и необходимые ей аргументы устанавливаются прямо в services.yaml - что дает?

1 Ответ

0 голосов
/ 06 июня 2018

Короче говоря, вам нужно использовать внедрение зависимостей.

Вы правы, зарегистрировав аргументы класса Database в services.yml, Symfony может внедрить эти значения во время создания.Тем не менее, это выполняется только автоматически при использовании контейнера внедрения зависимостей.

Это необходимо использовать как в LoginController, так и в службе Session.

LoginController

namespace App\Controller

use App\Services\Session;

class LoginController
{
    private $session;

    public function __construct(Session $session)
    {
        $this->session = $session;
    }
}

Сессия

namespace App\Services;

use App\Services\Database;

class Session 
{
    private $db;

    public function __construct(Database $db)
    {
        $this->db = $db;
    }

    public function create(){

        $this->db->insert('a new session'); // (pseudo-code)
    }
}
...