У меня есть приложение 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)
}
//...
}
Выдает ошибку при установке экземпляра службы БДв сервисе сеансов.Ошибка выглядит следующим образом:
Вызывается метод __construct
для DB, который принимает 4 аргумента (определенных глобально в services.yaml
), которые я не предоставляю при создании экземпляраслужба БД внутри службы Session.
Но это не тот случай, когда я таким образом создаю службу БД непосредственно в контроллере.
Кроме того, не является ли одним из преимуществ использования __construct
с аргументами службы, установленными в services.yaml
, чтобы избежать необходимости каждый раз передавать эти аргументы?
Symfony знает, что нужно запускать __construct
, когда вызывается служба БД, и необходимые ей аргументы устанавливаются прямо в services.yaml
- что дает?