MVC, dependency injection, ORM в PHP

 
0
 
PHP
ava
FZ14 | 16.03.2012, 18:43
Всем привет!
Хочу знать на сколько сейчас развиты mvc фрэймворки в php? В частности Zend Framework.

1) Есть ли возможность там реализовать ORM, к примеру, как в ASP.NET MVC с помощью Entity Framework. Интересуют подходы Database First(Когда на основе существующей бд генерируется модель) и Code First(Когда можно написать код классов и свойств, соответствующих сущностям бд и в последствии будет создана бд).

2) И второй вопрос, с помощью каких инструментов можно реализовать dependency injection?

В разработке на ASP.NET MVC принято разделять модель предметной области(domain model) от модели представления. Как обстоят с этим дела у php-фрэймворков?
Посоветуйте какое-нибудь решение, которое было бы максимально приближено к ASP.NET MVC.
Ответы (7)
ava
solenko | 16.03.2012, 18:25 #
symfony написан на основе dependency injection контейнера (+ есть отдельный компонент от них же http://components.symfony-project.org/dependency-injection/ ). В состав входит Doctrine
ava
FZ14 | 16.03.2012, 18:40 #
Еще интересует возможность использования паттерна Репозиторий
ava
SamDark | 16.03.2012, 21:20 #
FZ14
1) Есть. Database First чаще всего в виде Active Record. Генератор кода по БД есть, например, в Yii. Также есть отдельные от фреймворков ORM. Наиболее мощные Doctrine и Propel.
2) Разве для DI нужны какие-то инструменты? Если речь про контейнер, то реализации есть в ZF2, Symfony2. Есть и отдельные контейнеры (поискать можно на github, например).

domain model никто не запрещает выделять. Это ведь просто набор классов.

EntityRepository есть в Doctrine, но вообще, как по мне, реализуется и так довольно легко.
ava
Sentox | 12.05.2012, 00:27 #
Цитата (SamDark @ 16.3.2012, 21:20)
FZ14

1) Есть. Database First чаще всего в виде Active Record. Генератор кода по БД есть, например, в Yii. Также есть отдельные от фреймворков ORM. Наиболее мощные Doctrine и Propel.


Он имел ввиду Gateaway Row Record - шлюз записи данных или табличный шлюз, в YII и вообще в веб как в средне нагруженной логике . Скорее всего топикстартер имеет ввиду именно табличный шлюз с Record Set.
ava
FZ14 | 12.05.2012, 07:31 #
Цитата (Sentox @ 12.5.2012, 00:27)
Цитата (SamDark @ 16.3.2012, 21:20)
FZ14


1) Есть. Database First чаще всего в виде Active Record. Генератор кода по БД есть, например, в Yii. Также есть отдельные от фреймворков ORM. Наиболее мощные Doctrine и Propel.




Он имел ввиду Gateaway Row Record - шлюз записи данных или табличный шлюз, в YII и вообще в веб как в средне нагруженной логике . Скорее всего топикстартер имеет ввиду именно табличный шлюз с Record Set.


Нет, на самом деле я имел ввиду подход, в котором используются сущности предметной области(Entity), причем эти сущности ничего не знают о том, что происходит извне, а так же абстрактный DataMapper(репозиторий), который умеет сохранять, извлекать эти сущности. С помощью Dependency Injection абстрактный репозиторий связывается с реализацией(к примеру, есть интерфейс IProductRepository, который определяет набор методов, а реализация - ProductRepository, которую можно заменить легко на любую другую).

В Doctrine 2 этого нет. Там реализован паттерн DataMapper, но в контроллере(К примеру, Symfony 2) идет работа с конкретным репозиторием:

$this->getDoctrine()->getRepository('ExampleBundle:Product'). А сохранением занимается не сам маппер, а EntityManager.

Репозиторий - должен быть фасадом для доступа к данным.

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


Возможно, я не совсем ясно выражаюсь, но тот подход, о котором я говорю описан в следующих докладах на ZendConf:
http://www.zfconf.ru/2010/topics/zend-fram...-mvc-fat-model/
http://www.youtube.com/watch?v=YtN5udggsow...mp;noredirect=1
http://www.youtube.com/watch?v=kr7yJZkmjps...mp;noredirect=1

Но как это сделать, там не говорится.
Возможно кто-нибудь покажет примеры такого подхода:)

Здесь можно посмотреть, как это реализовано в других платформах:
http://www.kewney.com/posts/software-devel...ository-pattern
ava
baldina | 12.05.2012, 10:07 #
Цитата (FZ14 @ 16.3.2012, 18:40 findReferencedText)
интересует возможность использования паттерна

улыбнуло

Цитата (FZ14 @ 12.5.2012, 07:31 findReferencedText)
Возможно кто-нибудь покажет примеры такого подхода

тут например

Добавлено позднее:
Цитата (FZ14 @ 12.5.2012, 07:31 findReferencedText)
я хочу заменить текущее хранилище, на другую реализацию, как это сделать?

Я же хочу работать только с интерфейсом, а реализация должна быть скрыта

FZ14, желание законно и правильно. от ASP или PHP или JEE не зависит. точнее - это можно применять везде, где есть соответствующие языковые возможности: классы/интерфейсы и/или обращение к классу/функции по имени и/или делегаты/передача функции в качестве параметра.
Ясно, что Вы желаете высокоуровневых решений. Их есть в php фреймворках, везде по-своему. Zend Framework целиком на парадигме интерфейса основан, а управление ведется в основном через конфигурационный файл.
ava
FZ14 | 13.05.2012, 17:33 #
Вот здесь описывается паттерн репозиторий:

http://design-pattern.ru/patterns/repository.html
http://blog.byndyu.ru/2011/01/domain-drive...repository.html

Используя в контроллере привязку к Doctrine 2 - абстракции доступа к данным добиться невозможно.
Не понимаю, почему в symfony 2 она так интегрирована, что Entity Manager мы вызываем прямо из контроллера, жестко привязывая весь код именно к Doctrine 2.

$this->getDoctrine...
$em->flush(), вместо того, чтобы использовать $repository->save($entity);

Кто-нибудь может привести пример реализации паттерна repository в Symfony 2?
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  solenko ava  SamDark   baldina   Sentox   FZ14
advanced
Отправить