我有一个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');
}
//...
}
配置/ services.yaml
services:
App\Services\Database:
arguments:
$host: '1.2.3.4.5'
$name: 'database_name'
$user: 'username'
$pass: 'password'
我在Login控制器使用的Sessions服务中使用此服务。
登录控制器
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)
}
//...
}
在Session服务中设置DB服务实例时会引发错误。错误如下:
调用DB的__construct
方法,它接受4个参数(在services.yaml
中全局定义),在Session服务中实例化DB服务时,我没有提供这些参数。
但是,当我直接在控制器中以这种方式实例化DB服务时,情况永远不会发生。
此外,使用__construct
和services.yaml
中设置的服务参数以避免每次都必须传递这些参数的好处之一是什么?
Symfony知道在调用数据库服务时触发__construct
,它所需的参数是在services.yaml
中设置的 - 什么给出了?
答案 0 :(得分:3)
简而言之,您需要使用依赖注入。
你是正确的,通过在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)
}
}