Ответы пользователя по тегу Zend Framework
  • Как работают и зачем нужны ленивые сервисы в Zend Framework 2?

    "ленивая загрузка" - то есть использование объекта при необходимости, если надо будет, она возьмёт объект и загрузит его. В ZF2 это всё дело разруливается через ServiceManager с типом конфигурации invokables, там вы можете помещать как непосредственно классы, так и службы (по сути одно и тоже, только семантика разная). Например, вы создали какую то уникальную обработку данных для какого то конкретного случая, и вы хотите её использовать в своём модуле, или даже в конкретном контроллере какого то модуля (а потом оказалось, что вам её нужно ещё где-то использовать). И вот как раз на помощь приходит "ленивая загрузка", где вам нужно класс с уникальной обработкой данных указать в конфигурационном файле. Теперь, как только вашему приложению понадобится этот функционал (например пользователь запросил какие то ресурсы, которые обрабатываются на сервере именно вашей уникальной обработкой данных), то он (ServiceManager) возьмёт этот класс, то есть при необходимости подгрузит. К стати, как я выше писал в скобках, что возможно вам понадобится ещё где-то использовать, то вы можете ещё дальше пойти, то есть уже в конфигурационном файле указать тип factories, где поместить ранее созданный класс фабрики реализованный с помощью FactoryInterface, и после чего класс с уникальной обработкой данных будет создан независимо от возможных требований лишь тогда, когда он был первый раз вызван, а дальше вы его можете использовать на уровне всего приложения. То есть в одном месте объявили, вызвали его, а дальше вызываете его где угодно и сколько угодно. Стоит заметить, что при повторном вызове, возвращается один и тоже объект, и если вам всё таки понадобится новый объект для какого то конкретного случая, то нужно сделать кое какую поправку, и вы получите новый объект.
    Ответ написан
    4 комментария
  • Обьсните пользу многочисленных абстракций на примере zfcUser?

    1. ZF2 - это "чистый" PHP на основе php-patteens. В нём нет готовых решений для реализации того или иного функционала, всё надо делать вручную. Чтобы понять его низкоуровневый слой абстракции, нужно на очень высоком уровне знать сам PHP, его тонкости и нюансы, встроенные особенности, и понимать php-patteens, ибо их там немереное количество. Я очень люблю сравнивать PHP-framework с музыкой, и ZF2 у меня асоциюеться с Rammstein, то есть ну ОООчень жесткий (hardcore), к чему я это всё виду - к тому, что у этого framework-а очень большой порог вхождения, и в изучении затруднительный даже для продвинутых разработчиков. Это не значит что он плох, да - он сложный, но web-приложение на нём будет будет радовать вас своей производительности, с которой не сравнится ни один PHP-framework. (при условии, что вы не используете готовые сторонние решения, такие как объектно-реляционное отображение, шаблонизаторы, и т.д.)
    2. Насчёт слоёв абстракции, в большинстве случаев вы будете иметь дело с ServiceManager - это всего лишь контейнер других экземпляров классов. То есть если вы создали форму, то вы можете поместить её в этот контейнер, а позже, когда она вам понадобится, просто извлечь её оттуда. (по умолчанию возвращается один и тот же объект, но вы можете это изменить, возвратить конкретно для какого то случая новый объект). Так же вы можете определить какой то класс бизнес-логики как службу, и использовать её на уровне всего приложения (так же можете её настроить как хотите). Можете ещё к всему этому подключить в дело компонент EventManager - и делать какие то действия, когда произойдёт любое событие в web-приложении.
    3. Гидратор - это процесс заполнение объекта данными, или наоборот - извлечение этих данных из объекта. Данные - это в большинстве случаев обычные свойства класса, и на выходите вы получите объект в виде массива, то есть объект без методов, лишь с одними свойствами. Вот как это работает в ZF2: пользователь вводит данные в форму и отправляет их на сервер, система их получает, преобразует обычные строковые данные с помощью гидратора в объект-прототип (то, что я выше писал, в объект в виде массива). Что же этот объект-прототип из себя представляет?! Как выше писалось, это обычный класс с одними свойствами. Свойства должны быть либо защищёнными, или приватными, а также в этом классе допускается использовать методы доступа к этим свойствам (get и set). После того, как наш объект-прототип наполнился данными, мы можем с ними манипулировать, например поместить в базу данных (разумеется мы должны данные фильтровать и проверять на валидность как при получение с формы, так и помещении в БД). Процессом заполнения данных в БД тоже занимается гидратор.
    4. Если вы работали с ORM, то наверняка заметили большое сходство. По большому счёту, то что я выше описал, реализовано в самой DoctrineORM. Получается что ZF2 реализовал свой "собственный велосипед", какой пока ещё не доведён до совершенства. Хотя если сравнять производительность, то ZF2 вне конкуренции. Но если надо будет реализовать крупную систему, то альтернатива ZF2 ещё пока не подходит, она не сможет проявить весь ваш потенциал системы. Можно попытаться дописать этот "велосипед", или на его основе создать собственную систему объектно-реляционного отображения, но для этого надо иметь очень большие знания в этой области. К стати, чтобы добиться производительности, надо использовать расширение mysqli, а не PDO.
    5. На основе выше мною сказанного, вы должны понимать, что возможно для ваших задач вполне подойдёт Symfony, ибо вам придётся очень много потратить ресурсов, чтобы хоть как то сделать что-то стоящее на ZF2. Ведь если добавить в ZF2 DoctrineORM и шаблонизатор-Twig, то сам framework станет не лучше SF2, я бы сказал что ещё хуже, ибо упадёт производительность и будет очень сложно поддерживать. Поэтому я лично для себя решил, если мне надо что-то сделать действительное стоящее, с большой производительностью, и чтобы это был сугубо только чистый PHP, то я выберу Zend Framework; а если мне нужно web-приложение с умеренной производительностью, и сделать его приложив при этом минимальные усилия, то я выберу Symfony. В любом случае, выбирайте то, что подходит лучше для вашей задачи, выбор за вами.
    Ответ написан
    Комментировать
  • Как правильно организовать структуру приложения?

    Во-первых, зачем использовать в Zend Framework 2 Doctrine ORM 2? Вся идея и фишка самого ZF2 в том, что это чистый PHP. Именно поэтому он лучше всех показывает себя в производительности. Наверное ещё и шаблонизатор какой то используете, например twig...
    Во-вторых, если вы и вздумали использовать ORM, тогда используйте framework Symfony 2, там она очень хорошо интегрирована, и предоставляются всевозможные решение той или иной задачи.
    В-третьих, насчёт организации, действительно сущность должна хранить защищённые/приватные свойства, и методы доступа к ним. Все операции над получением данных, вы можете поместить в директорию Repository, и поместить методы в класс EntityRepository (вместо Entity вставьте наименование вашей сущности), так это делается в SF2. На самом деле вы вольны в выборе организации, и вы можете делать так, как того пожелаете. Например можете поместить всё это дело либо в Model, или в Service. Разумеется можно просто это дело запихнуть в Controller, но так делать не следует.
    Выбор за вами...
    Ответ написан
    4 комментария