Как будет структурирован ORM-каркас в PHP? - PullRequest
2 голосов
/ 28 февраля 2009

Я хочу построить небольшой фреймворк ORM ( Object Relational Mapping ) в PHP. Я хочу сделать смесь подхода MVC с тем же подходом контроллер / метод / переменная, который используется CodeIgniter.

Уже есть несколько фреймворков, которые делают это, но такие вещи, как

  • Проверка формы
  • Разбивка
  • CRUD
  • и AJAX

очень сложно сделать в этих рамках. Моя главная цель, помимо того, чтобы все функции системы выполнялись с использованием объектов, - это максимально использовать принцип СУХОЙ. Это в основном означает очень мало повторяющегося кода для проверки формы, CRUD и т. Д.

Я ищу идеи о том, как будет организована такая структура, какова будет архитектура и как типичный запрос, такой как форма регистрации и как его проверить, будет обрабатываться этой структурой.

Пожалуйста, поделитесь своими мыслями / идеями. После завершения он будет выпущен в качестве платформы с открытым исходным кодом.

Ответы [ 6 ]

3 голосов
/ 28 февраля 2009

Я бы, вероятно, предположил, что вместо того, чтобы строить свои правила валидации на основе форм (например, Zend Framework), вы должны строить валидацию внутри своих доменных объектов. Затем отправьте данные формы непосредственно в объект домена для проверки. Я использую Zend Framework, но я использую эту базовую структуру для своих нужд проверки:

/**
 * Contains the domain object properties.
 * @var array
 */
protected $_data = null;

/**
 * @var array
 */
protected $_filters = null;

/**
 * @var array
 */
protected $_validators = null;

public function validate($data = null)
{
    if(!$data) {
        $data = (array) $this->_data;
    } else {
        $data = array_merge((array) $this->_data, $data);
    }

    $this->_input = new Zend_Filter_Input($this->_filters, $this->_validators, $data, $options);
    $this->_input->addValidatorPrefixPath('LP_Validate_', 'LP/Validate/');
    $this->_input->addFilterPrefixPath('LP_Filter_', 'LP/Filter/');

    if($this->_input->isValid()) {
        $this->_data = (object) $this->_input->getEscaped();
        return true;
    } else {
        $this->_data = (object) $data;
        return false;
    }
}

Некоторые ограничения моего текущего подхода с проверкой состоят в том, что я не могу вызвать какие-либо необходимые пользовательские установщики свойств объекта, а также в том, что мне нужно найти способ сохранить исходные данные для объекта доступными после запуска. функция проверки. Но в остальном до сих пор это работало хорошо.

Что касается CRUD, ответ отчасти зависит от сложности проблем, которые вы хотите решить, и отчасти от того, с какими шаблонами вы знакомы, а какие вам нравятся / не нравятся, а какие вы не хотите / не хотите попробуй реализовать.

Очевидно, что наиболее надежный дизайн для реализации - это использование Data Mapper с отдельными доменными объектами, расположенными сверху. Тем не менее, в большинстве случаев это излишне, и поэтому вы можете просто использовать очень (ненадлежащим образом) клеветнический шаблон Active Record. Это в основном то, что CodeIgniter и Zend Framework сделали с тем, что они предоставили.

Мне пришлось создать собственный слой ORM, который использует шаблон Data Mapper, потому что мне нужно было обрабатывать случаи Inheritance Mapping в моем проекте, и он работал довольно гладко, но я сожалею о потере функциональности отображения метаданных, которая пришла с таблицей и реализации Row Gateway в Zend Framework. (Если бы вы могли найти способ эффективно создавать сопоставление метаданных, используя средства отображения данных, я хочу, чтобы вы показали мне, как вы это сделали.: P). Даже при том, что вы пытаетесь создать свой собственный, вы можете рассмотреть Zend Framework, так как он содержит один из лучших PHP-кодов, которые я когда-либо видел, и очень точно следует стандартным шаблонам проектирования.

Одной вещью, которую было бы приятно видеть в классе Pagination, была бы возможность привязки непосредственно к объекту базы данных таким образом, чтобы предложение limit могло быть применено к запросу на основе того, какой диапазон значений должна отображать страница , В противном случае ключевые компоненты с разбивкой на страницы должны отслеживать текущую страницу, количество записей, отображаемых на странице, и какой-либо объект коллекции, содержащий значения, для которых необходимо выполнить итерацию.

По крайней мере, вы хотите убедиться, что не предварительно загружаете всю коллекцию, а затем отображаете только определенный диапазон записей, поскольку это обеспечит огромный удар по производительности.

Что касается запросов Ajax, я бы предложил создать некоторый контекстный помощник, который может проверять, является ли HTTP-запрос XHR или нет, а затем обрабатывать его специально на основе этого контекста.

2 голосов
/ 28 февраля 2009

Существует множество хороших фреймворков с открытым исходным кодом, которые выполняют то, что вы ищете, гораздо проще и быстрее, чем пишете с нуля! Сказав это, у меня был MVC-фреймворк, который я разработал, который многому научил меня в разработке фреймворков и объектно-ориентированном дизайне. Рекомендуется, если у вас много времени и вы хотите сделать это в качестве учебного эксперимента (который может закончиться довольно неплохой структурой).

Что касается вашей идеи структуры ORM ... Я думаю, что может быть некоторая путаница в том, что такое ORM. ORM - это метод, который отображает ваши объекты в вашу реляционную базу данных, обрабатывает поиск и хранение данных. Обычно это один компонент в более крупной структуре, и он не обязательно характеризует саму структуру. Большинство людей используют MVC-фреймворк для базовой архитектуры Model-View-Controller, на которой может быть построено приложение.

Некоторые PHP-фреймворки предоставляют больше готовых функциональных возможностей, например, то, что вам интересно.

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

1 голос
/ 10 марта 2009

Отличный пост от gabriel1836, но одна изящная техника, которую вы могли бы использовать, отмечена Мэтью Вейером О'Финни , где он показывает технику, чтобы "прикрепить" форму к модели и использовать ее для фильтрации входных данных и Проверка. Очень специфично для ZF, но может пригодиться.

0 голосов
/ 30 декабря 2011

Как сказал OT, AJAX и Pagination очень сложно реализовать достаточно гибко. Для того, чтобы быть в курсе того, что находится на вашем экране, требуется среда, но большинство платформ только генерируют HTML и не заботятся о представлении на стороне клиента.

Существует очевидная необходимость в Web User Interface Framework.

Вот почему я предлагаю изучить Agile Toolkit . Вероятно, следующий пример поможет понять мощь встроенного AJAX:

$b=$page->add('Button')->setLabel(rand(1,100));
$b->js('click')->reload();

Это создаст кнопку на странице со случайным числом в качестве метки. Нажатие на кнопку будет использовать запрос AJAX для перезагрузки содержимого кнопки с новым номером.

С таким фундаментом очень просто представить, как построить пагинатор очень удобным для AJAX способом. Жаль, что пагинатор уже реализован и поставляется с инструментарием.

Для освещения других тем. CRUD также является классом / объектом.

$page->add('CRUD')->setModel('User');

И проверка формы выполняется на стороне сервера, но ошибки хорошо отображаются. Все формы отправляются с использованием запросов AJAX.

0 голосов
/ 02 марта 2009

Я бы посоветовал вам взглянуть на http://www.qcodo.com. Это CRUD через «Генератор кода» невероятно мощный и, кажется, удовлетворяет требованиям, которые вы изложили.

0 голосов
/ 28 февраля 2009

Пойдя с Zend, вы можете сделать так, чтобы каждый объект модели был «связан» с каждой из ваших таблиц, он покрывал все, что, как вы сказали, вам нужно, достаточно хорошо.

Взгляните на http://www.zendframeworkinaction.com/, это хорошая книга для начала. Даже если вы не пользуетесь Zend, он многому научит вас как строить (если вы решите, что хотите узнать много о колесах, создавая свои собственные, это тоже отличная отправная точка!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...