Использование компонента Symfony Dependency Injection с другими классами php - PullRequest
3 голосов
/ 29 ноября 2011

Я немного растерялся. Я создаю файл начальной загрузки с сервисным контейнером:

require_once '/path/to/lib/sfServiceContainerAutoloader.php';
sfServiceContainerAutoloader::register();

$sc = new sfServiceContainerBuilder();

$sc->register('database', 'PDO')->
  addArgument('mysql:host=localhost;dbname=my_dbname')->
  addArgument('user')->
  addArgument('password')->
  addArgument(array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));

Теперь я хочу создать класс и использовать базу данных

class Foo {
   functon runSomeQuery() {
     // Here I want to use database
   }
}

Как я мог сделать это элегантно?

1 Ответ

0 голосов
/ 30 ноября 2011

Вы можете попробовать:

class Foo {

    /**
     * @var PDO
     */
    private $_adapter = null;

    public function __construct(PDO $adapter = null) {
        if (!$adapter) {
            // assuming you have your generated DI container set there
            $this->_adapter = Zend_Registry::get('diContainer')->getDatabase();
        } else {
            $this->_adapter = $adapter;
        }
    }
}

Вы также можете сделать это другими подобными способами, например, реализовать setAdapter (адаптер PDO $).Ну, в любом случае, вы поняли идею.Или вы можете просто использовать это так:

public function __construct() {
     // assuming you have your generated DI container set there
     $this->_adapter = Zend_Registry::get('diContainer')->getDatabase();
}

Есть несколько способов сделать это хорошим способом, зависит от того, как вы действительно хотите, чтобы все было.Основные довольно приятные варианты:1. Внедрить через конструктор + в конструкторе (если не указано как параметр конструктора)2. вводить в конструктор только через DI-контейнер3. вводить отдельным методом4. зависит от того, что вы делаете / хотите сделать, может просто взять зарегистрированный сервис через DI-контейнер и просто использовать его, не сохраняя его в классе.(пример:Zend_Registry :: получить ( 'diContainer') -> getDatabase () -> подготовить ( '>> << SQL');</p>

...