Добавление пользовательских классов / методов - PullRequest
0 голосов
/ 25 августа 2011

Я создал задачу в Symfony 1.4, которая загружает некоторые CSV-файлы в таблицу - очень просто ->

protected function execute($arguments = array(), $options = array())
{
    $databaseManager = new sfDatabaseManager($this->configuration);
    $connection = $databaseManager->getDatabase($options['connection'])->getConnection();

    ......

    $query = "LOAD DATA INFILE '" . $cdrfile . "'
       INTO TABLE .... 

    etc

    $connection->execute($query);
}

Но я хочу использовать этот раздел кода еще где - Итак, я создаюновый класс PHP и создал новый статический метод с именем loadDataFromCSV.

Я поместил весь код в этот метод и затем вызвал class::loadDataFromCSV ...

Это вызвало у меня некоторые проблемы -Во-первых, ключевое слово $this в методе недопустимо, поскольку класс не является объектом (т.е. не создан), поэтому я мог бы создать экземпляр класса и затем вызвать метод class->loadDataFromCSV - следующая проблема - $this->configuration впервая строка - нужно ли передать конфигурацию методу, чтобы он заработал?

Какой самый простой способ создать простой метод для запуска простого куска кода - без необходимости передавать множество переменных вокруг.

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Краткий ответ: используйте DI-контейнер.

Длинный ответ: Вы в основном спрашиваете, как установить зависимости объекта, поскольку ваш класс зависит от объекта конфигурации. Есть два способа сделать это. Зависимость жесткого кода в вашем классе. например Registry::getInstance()->get('config'); и использовать внедрение зависимостей. Внедрение зависимостей - лучшее решение, если вы можете передать любой экземпляр конфигурации. Существующий объект, новый объект, фиктивный объект для модульного тестирования или другая реализация конфигурации. Существует два типа внедрения зависимостей. ввести зависимость через конструктор (например, new Object(new Dependency())) или через сеттер.

$o = new Object();
$o->setDependency($dependency);

Если у вашего объекта много зависимостей, код может стать немного нечитаемым в обоих направлениях. Решение состоит в том, чтобы использовать Dependency Injection Container, который автоматически внедрит все зависимости для вас. Код вашего клиента - это еще одна простая строка: DIContainer::create('object');. Метод create создает экземпляр класса, внедряет все зависимости и возвращает объект.

0 голосов
/ 25 августа 2011

Для использования вашего подхода со статическим методом вы должны:

  1. Заменить все это-> ключевые слова на себя ::
  2. Переместите все настройки конфигурации в один файл и загрузите их, например, в класс Config, который будет реализовывать шаблон Singleton.
  3. Вызов будет выглядеть как Config :: getInstance () -> getSection ('your_section');

Относительно инициализации БД:

  1. Создать класс реестра с двумя статическими методами, установленными / полученными
  2. Создать объект БД в файле начальной загрузки.
  3. Использовать $ connection = Registry :: get ('db') -> getConnection ();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...