Symfony PHP - 在另一个服务中使用服务

时间:2018-06-06 01:20:52

标签: php symfony constructor autowired symfony4

我有一个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服务实例时会引发错误。错误如下: enter image description here

调用DB的__construct方法,它接受4个参数(在services.yaml中全局定义),在Session服务中实例化DB服务时,我没有提供这些参数。

但是,当我直接在控制器中以这种方式实例化DB服务时,情况永远不会发生。

此外,使用__constructservices.yaml中设置的服务参数以避免每次都必须传递这些参数的好处之一是什么?

Symfony知道在调用数据库服务时触发__construct,它所需的参数是在services.yaml中设置的 - 什么给出了?

1 个答案:

答案 0 :(得分:3)

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

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

您需要在LoginControllerSession服务中使用此功能。

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