代码之家  ›  专栏  ›  技术社区  ›  yevg

symfony php-在另一个服务中使用服务

  •  0
  • yevg  · 技术社区  · 6 年前

    我有一个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');
        }
    
        //...
    }
    

    配置/服务.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)
        }
        //...
    }
    

    在会话服务中设置db服务实例时,这将引发错误。错误如下: enter image description here

    这个 β-构造 调用db的方法,该方法接受4个参数(在 服务.yaml )我在会话服务内实例化db服务时没有提供。

    但是,当我直接在控制器中以这种方式实例化db服务时,就不会出现这种情况。

    而且,使用 β-构造 在中设置了服务参数 服务.yaml 为了避免每次都要传递这些论点?

    symfony知道开火 β-构造 当数据库服务被调用时,它需要的参数就设置在 服务.yaml -给什么?

    1 回复  |  直到 6 年前
        1
  •  3
  •   fubar    6 年前

    简而言之,您需要使用依赖注入。

    通过注册 Database 类参数 services.yml ,symfony能够在实例化期间注入这些值。但是,这仅在使用依赖项注入容器时自动完成。

    你需要在你的 LoginController 在你 Session 服务。

    登录控制器

    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)
        }
    }