Статьи

10 веских причин для использования Zend Framework

Пытаетесь решить, какие рамки использовать для вашего нового проекта? В этой статье мы подробно расскажем о том, почему Zend Framework обязательно должен быть вашим PHP-фреймворком.


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


Zend Framework — это полностью объектно-ориентированная среда, и поэтому она использует множество объектно-ориентированных (ОО) концепций, таких как наследование и интерфейсы. Это делает большинство, если не все, компоненты ZF расширяемыми до некоторой точки. Это позволяет разработчикам реализовывать свои собственные специальные варианты отдельных компонентов без необходимости взломать саму кодовую базу ZF. Возможность настраивать ZF таким способом позволяет вам создавать функциональные возможности, которые являются уникальными для вашего проекта, но благодаря своей объектно-ориентированной природе вы сможете использовать эту функциональность и в других проектах.

Zend Framework имеет очень обширный компонент проверки, который вы можете использовать для проверки данных, поступающих из форм. В ZF формы также обрабатываются как объекты и представлены компонентом Zend_Form.

Предположим, вы хотите создать собственный валидатор URL, чтобы ограничить ввод URL от пользователя. Самый быстрый способ сделать это — просто проверить ввод, используя что-то вроде:

1
$isValid = filter_var($submitted_url, FILTER_VALIDATE_URL);

Но это не будет соответствовать ОО-природе объектов формы, поскольку она не используется в контексте формы. Чтобы решить эту проблему, мы можем создать новый класс Zend_Validator, расширив класс Zend_Validate_Abstract:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class Zend_Validate_Url extends Zend_Validate_Abstract
{
    const INVALID_URL = ‘invalidUrl’;
     
    protected $_messageTemplates = array(
        self::INVALID_URL => «‘%value%’ is not a valid URL.»,
    );
     
    public function isValid($value)
    {
        $valueString = (string) $value;
        $this->_setValue($valueString);
         
        if (!Zend_Uri::check($value)) {
            $this->_error(self::INVALID_URL);
            return false;
        }
        return true;
    }
}

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<?php
class Form_Site extends Zend_Form
{
    public function init()
    {
        $this->setMethod(‘POST’);
        $this->setAction(‘/index’);
         
        $site= $this->createElement(‘text’, ‘siteurl’);
        $site->setLabel(‘Site URL’);
        $site->setRequired(true);
         
        // Adding the custom validator here!
        $site->addValidator(new Zend_Validate_Url());
        $this->addElement($site);
        $this->addElement(‘submit’, ‘sitesubmit’, array(‘label’ => ‘Submit’));
    }
 
}

Если мы хотим проверить, что наши URL-адреса являются действительными URL-адресами видео YouTube, мы могли бы сделать что-то вроде этого:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class Zend_Validate_YouTubeUrl extends Zend_Validate_Abstract
{
    const INVALID_URL = ‘invalidUrl’;
     
    protected $_messageTemplates = array(
        self::INVALID_URL => «‘%value%’ is not a valid URL.»,
    );
     
    public function isValid($value)
    {
        $valueString = (string) $value;
        $this->_setValue($valueString);
         
        if (strpos($value, «http://www.youtube.com/watch?v=») !== 0) {
            $this->_error(self::INVALID_URL);
            return false;
        }
        return true;
    }
}

Если мы добавим это в объект формы нашего сайта в качестве валидатора, это обеспечит, чтобы все отправленные URL начинались с правильного префикса URL видео на YouTube.



Изображение предоставлено http://www.developer.com

В Zend Framework все является объектом, как доказано в нашем примере выше. Это создает свои недостатки, такие как усложнение кода. Тем не менее, его главное преимущество заключается в возможности повторного использования кода, и поскольку никто не любит повторяться, это очень хорошая вещь.

У нас уже есть классы Zend_Validate_Url и Form_Site из нашего примера выше, поэтому давайте повторно используем их в этом примере.

1
<?php class IndexController extends Zend_Controller_Action { public function indexAction() { $siteform = new Form_Site();

Вот как это будет выглядеть в браузере:

Если вы попытались отправить неверный URL, вы можете увидеть наш валидатор URL на работе:

Здесь вы можете увидеть, что произойдет, если вы введете правильный URL:

Как видите, нам никогда не приходилось повторять код объекта формы.

«Классы Zend_Validate можно использовать и другими способами, не только в контексте классов Zend_Form. Вы просто создаете экземпляр класса Zend_Validate и вызываете метод isValid ($ parameter), передавая ему значение, которое вы хотите проверить».


Изображение предоставлено http://dev.juokaz.com

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

Если вы просматривали другие статьи по фреймворку, вы, вероятно, слышали о термине « фреймворк» ZF по умолчанию является клеевым фреймворком. Его разделенная природа позволяет легко использовать его в качестве «клея» для уже существующего приложения.

Существует спор между использованием клеевых фреймворков и фреймворков с полным стеком. Фреймворки с полным стеком — это те, которые предоставляют вам все необходимое для создания вашего проекта, например, реализацию ORM, генерацию кода или создание скаффолдинга. Платформы с полным стеком требуют минимальных усилий для создания проекта, но им не хватает гибкости, поскольку это накладывает строгие соглашения на ваш проект.

Допустим, вам нужен способ получения информации о конкретном видео на YouTube. Zend_Gdata_Youtube — это компонент ZF, который позволяет получать доступ к данным с YouTube через API GData. Получение информации о видео так же просто, как:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
//Make sure you load the Zend_Gdata_Youtube class, this assume ZF is in your PHP’s include_path
include_once «Zend/Gdata/Youtube.php»;
 
$yt = new Zend_Gdata_YouTube();
// getVideoEntry takes in the YouTube video ID, which is usually the letters at the end
// of a YouTube URL eg http://www.youtube.com/watch?v=usJhvgWqJY4
$videoEntry = $yt->getVideoEntry(‘usJhvgWqJY4’);
echo ‘Video: ‘ .
echo ‘Video ID: ‘ .
echo ‘Updated: ‘ .
echo ‘Description: ‘ .
echo ‘Category: ‘ .
echo ‘Tags: ‘ .
echo ‘Watch page: ‘ .
echo ‘Flash Player Url: ‘ .
echo ‘Duration: ‘ .
echo ‘View count: ‘ .

Пример кода предоставлен Google Developer’s Guide

Этот код будет выводить:

Здесь следует отметить одну вещь: этот компонент Zend Framework (GData) является официальной библиотекой PHP, поддерживаемой Google для доступа к ее API. Раздвоенная природа фреймворка позволяет нам использовать компонент в любом проекте, независимо от фреймворка, который мы использовали для его создания.


В Zend Framework мне больше всего нравится то, что в нем много компонентов. Нужен способ аутентификации пользователя? Используйте Zend_Auth. Нужно контролировать доступ к своим ресурсам? Посмотрите на Zend_Acl. Нужно создать несколько форм? У нас есть Zend_Form. Нужно читать RSS-канал? Вы можете использовать Zend_Feed для этого. Это в основном швейцарский армейский нож классов PHP!

Zend на самом деле поставляется с некоторыми демонстрациями, которые показывают, как использовать его различные компоненты:

Чтобы просмотреть их, лучше всего просто загрузить полную версию пакета Zend Framework и протестировать их на своем компьютере.

Полный список всех компонентов вы можете найти в руководстве Zend Framework .


Изображение предоставлено http://www.vintagecomputing.com

На самом деле это одна из причин, по которой большинство разработчиков не используют Zend Framework — у него нет собственной реализации Model. Для тех, кто не знает, что такое Модель, это M в MVC , который обозначает «Model-View-Controller», архитектуру программирования, которая используется большинством PHP Frameworks.

Да и нет.

Да, это фреймворк VC, потому что он не имеет собственной реализации Model. Это затрудняет использование ZF для некоторых людей, особенно если они исходят из фреймворка, который имеет реализацию Model (например, CakePHP, Symfony или даже Ruby on Rails).

С другой стороны, нет, это также и инфраструктура MVC, поскольку помимо предоставления общих способов доступа к базе данных (используя Zend_Db), она на самом деле все еще зависит от некоторой реализации модели. То, что он делает по-другому, — это то, что он оставляет этот вид реализации на усмотрение разработчика — что, как говорят некоторые, должно быть так, поскольку модели на самом деле находятся там, где находится бизнес-логика приложения, и, следовательно, они не могут быть разработаны как общий компонент. Zend Framework Philosophy заявляет, что реализации моделей являются уникальными для проекта — невозможно создать абстрактную реализацию этого проекта, поскольку они действительно не знают, что вам нужно. Они считают, что модели должны быть реализованы самими разработчиками.

Отсутствие реализации Model означает, что разработчик может свободно использовать любые средства, которые он должен реализовать, или даже просто интегрировать существующие реализации. Будучи свободным от предопределенных ограничений, разработчик может создавать более сложные реализации, а не просто простые представления таблиц, как обычно создаются реализации модели. Модели содержат вашу бизнес-логику . Они не должны быть ограничены таблицами вашей базы данных; скорее, они должны диктовать связи этих таблиц друг с другом. Это позволяет вам поместить большую часть вашего программного кода в ваши Модели, тем самым удовлетворяя парадигме MVC «Тонкие контроллеры, толстые модели».

Учебник Zend Framework Quickstart для начинающих покажет нам хороший способ реализации моделей. В этом руководстве они реализуют подход ORM к моделям, в котором вы создадите три файла — фактическую модель, которая является абстрактным представлением вашего объекта; Mapper, который отображает данные из базы данных в вашу модель; и объект таблицы базы данных, который используется картографом для получения данных. Вы можете проверить код в руководстве ZF Quickstart , где они использовали этот подход для реализации модели простого приложения Гостевая книга.

Для тех, кто спрашивает: «Почему я должен кодировать это сам, в то время как другие фреймворки делают за меня работу?», Это идеальный переход к моей следующей причине …


Разъединенная природа Zend Framework позволяет легко интегрировать другие библиотеки, которые вы хотите использовать. Допустим, вы хотите использовать Smarty в качестве системы шаблонов. Это можно сделать, просто создав класс-оболочку для Zend_View_Abstract, который использует экземпляр Smarty для визуализации представления .

Это работает в обоих направлениях, так как вы можете интегрировать ZF в другие библиотеки. Например, вы можете интегрировать ZF в Symfony. Они планируют сделать это с Symfony 2, используя компоненты Zend_Cache и Zend_Log из ZF.

Для нашего примера мы попробуем использовать Doctrine для реализации нашей Модели. Продолжая приведенный выше пример с нашим сайтом, скажем, вы уже реализовали свою таблицу БД следующим образом:

1
2
3
4
5
CREATE TABLE `site` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(100) CHARACTER SET latin1 NOT NULL,
  PRIMARY KEY (`id`)
);

Чтобы интегрировать Doctrine в ZF, мы должны убедиться, что определены правильные настройки. Я следовал этому уроку с dev.juokaz.com об использовании Doctrine с ZF.

Предполагая, что все работает, вам просто нужно сгенерировать файлы модели, запустив php-файл doctrine-cli.php из учебника следующим образом:

1
php doctrine-cli.php generate-models-db

Вы должны увидеть это сообщение об успехе:

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

Тогда в нашем классе контроллеров мы можем просто использовать наш класс модели сайта.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
 
class IndexController extends Zend_Controller_Action
{
 
    public function indexAction()
    {
        $siteform = new Form_Site();
 
        if( $this->_request->isPost() && $siteform->isValid($this->_request->getPost()) ) {
            //stuff to do if the input is correct
            $site = new Model_Site();
            $site->url = $this->_request->getParam(‘siteurl’);
            $site->save();
            //redirect to our success page
            $this->_redirect(«/index/correct»);
        }
        $this->view->siteform = $siteform;
    }
 
    public function correctAction()
    {
        // Yay, we’re re-using our Form_Site object!
        $this->view->siteform = new Form_Site();
    }
}

Если мы проверим таблицу наших сайтов , мы увидим, что наши записи там

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


Zend Framework разработан в сочетании с очень обширным Руководством для участников , в котором в основном говорится:

  1. Каждый участник, предоставляющий как документацию, так и / или код, на любом уровне (несколько строк кода, исправление или даже новый компонент) должен подписать лицензионное соглашение Contribute (CLA) .
  2. Код ДОЛЖЕН быть проверен и покрыт модульным тестом с использованием PHPUnit. И…
  3. Код должен соответствовать строгим стандартам кодирования

Эти строгие правила гарантируют, что вы используете только читаемый, высококачественный код, который был тщательно протестирован.


Изображение предоставлено http://www.codesmack.com/

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

  1. Думает о возможных вариантах использования его кода
  2. Создает белый список ввода и вывода
  3. Упрощает рефакторинг его кода
  4. Облегчает передачу кода от одного человека другому

Цикл разработки, управляемый тестом
Изображение предоставлено Википедией

Zend Framework позволяет легко создавать TDD через Zend_Test, который использует PHPUnit, популярную платформу для модульного тестирования. PHPUnit позволяет вам тестировать не только ваши контроллеры, но также функции вашей библиотеки и модели. Чтобы добавить к этому, Zend_Tool, утилита скаффолдинга Zend Framework, уже предоставляет условия для PHPUnit, когда вы используете его для создания своего проекта.

Настроить Zend Framework и PHPUnit не так сложно. По сути, как только вы закончите с этим, вы сможете использовать ту же настройку для ваших будущих проектов. Как примечание, следующие шаги предполагают, что вы использовали Zend_Tool для создания структуры и файлов вашего проекта, но это должно быть относительно просто изменить для других установок.

Для начала нам нужно установить PHPUnit. Лучший способ — установить его через PEAR:

1
2
pear channel-discover pear.phpunit.de
pear install phpunit/PHPUnit

После этого мы откроем наш phpunit.xml, файл XML, сгенерированный Zend_Tool. Вы найдете его в папке tests в корневом каталоге вашего проекта. Добавьте следующие строки:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<phpunit bootstrap=»./TestHelper.php» colors=»true»>
    <testsuite name=»Zend Framework Unit Testing»>
        <directory>.</directory>
    </testsuite>
 
    <filter>
        <whitelist>
            <directory suffix=».php»>../library</directory>
            <directory suffix=».php»>../application</directory>
            <exclude>
                <directory suffix=».phtml»>../application</directory>
            </exclude>
        </whitelist>
    </filter>
</phpunit>

После сохранения phpunit.xml создайте новый файл в той же папке, что и phpunit.xml, с именем TestHelper.php. Этот файл PHP поможет нам настроить среду для наших тестов.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?php
// start output buffering
ob_start();
 
// set our app paths and environments
define(‘BASE_PATH’, realpath(dirname(__FILE__) . ‘/../’));
define(‘APPLICATION_PATH’, BASE_PATH . ‘/application’);
define(‘APPLICATION_ENV’, ‘testing’);
 
// Include path
set_include_path(
    ‘.’
    .
    .
);
 
// We wanna catch all errors en strict warnings
error_reporting(E_ALL|E_STRICT);
 
require_once ‘ControllerTestCase.php’;

Затем мы создаем наш родительский класс Controller Test Case, который расширят все наши контроллеры. Это поможет реализовать методы, которые обычно будут одинаковыми во всех тестовых классах Controller.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
require_once ‘Zend/Application.php’;
require_once ‘Zend/Test/PHPUnit/ControllerTestCase.php’;
 
abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    public $application;
 
    public function setUp()
    {
        $this->application = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH .
        );
 
        $this->bootstrap = $this->application;
        parent::setUp();
    }
 
    public function tearDown()
    {
        $this->resetRequest();
        $this->resetResponse();
        parent::tearDown();
    }
}

Наконец, мы создаем класс тестирования контроллера:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?php
require_once realpath(dirname(__FILE__) . ‘/../../ControllerTestCase.php’);
 
class IndexControllerTest extends ControllerTestCase
{
    public function testCallingRootTriggersIndex()
    {
        $this->dispatch(‘/’);
        $this->assertController(‘index’);
        $this->assertAction(‘index’);
    }
   
    public function testCallingBogusTriggersError()
    {
        $this->dispatch(‘/bogus’);
        $this->assertController(‘error’);
        $this->assertAction(‘error’);
        $this->assertResponseCode(404);
    }
}

Осталось только запустить наш тест. Откройте командную строку и перейдите в папку тестов и введите:

Ваша командная строка должна вывести следующее:


Учебное пособие по настройке PHPUnit и Zend Framework и код предоставлены http://www.dragonbe.com

Благодаря множеству компонентов, сложности и полностью объектно-ориентированному подходу Zend Framework имеет очень крутой курс обучения. Это становится легче изучать из-за полноты его документации и ее процветающего сообщества. Прежде всего, Справочное руководство программиста Zend Framework может похвастаться полным руководством по всем компонентам ZF с примерами, кодом и теориями использования.

Помимо этого, существует множество блогов, которые делятся советами и приемами Zend Framework. Например, Phly, boy, phly , блог Мэтью Вейера О’Пинни, основного участника Zend Framework, предоставляет множество идей, умных способов использования и объяснения компонентов для Zend Framework. У Zend также есть сайт под названием Zend Developer Zone , на котором помимо публикации учебных пособий для Zend Framework есть такие вещи, как веб-семинары Zend Framework, подкасты и статьи о PHP в целом. Другой сайт под названием Zend Casts предлагает множество полезных видеоуроков по различным компонентам Zend Framework. И последнее, но не менее важное: есть бесплатная онлайн-книга под названием Zend Framework: Surviving the Deep End, написанная P-draic Brady, другим участником Zend Framework.

Как видите, нет недостатка в поддержке со стороны сообщества, документации и разработчиков. Если у вас есть какие-либо вопросы или вам нужны пояснения, быстрый поиск по правильным ключевым словам почти всегда даст вам релевантные результаты. Если нет, то есть списки рассылки Zend Framework , официальные форумы Zend Framework , неофициальные форумы Zend Framework или неофициальный IRC-канал Zend Framework


Если вы все еще не уверены в изучении и использовании Zend Framework, эта причина, на мой взгляд, больше всего отличает Zend Framework от всех остальных. Zend предлагает не только сертификацию Zend Framework, но и сертификацию PHP. Предлагая сертификаты, Zend помогает вам использовать свой опыт в PHP и Zend Framework, чтобы увеличить ваше портфолио или резюме. На сайте Zend Certification перечислены несколько причин для получения сертификата, некоторые из которых:

  1. Отличайтесь от конкурентов при поиске новой работы
  2. Получите ваше резюме / CV заметили
  3. Ваш профиль отображается в Желтых страницах Zend для профессионалов PHP
  4. Станьте частью группы Linkedin исключительно для ZCE
  5. Получите специальные скидки на конференции Zend PHP по всему миру

Просто чтобы сохранить баланс, вот краткий список причин, по которым вы можете не использовать Zend Framework:

  1. ОЧЕНЬ крутая кривая обучения. Это не очень сложно для опытных пользователей PHP, но для начинающих есть чему поучиться!
  2. Большой след. Поскольку Zend Framework имеет много компонентов, его общий размер относительно выше, чем у других платформ. Например, системная папка CodeIgniter занимает 1,5 МБ по сравнению с 28 МБ в Zend Framework.
  3. Нет твердых строительных лесов. Хотя Zend_Tool предлагает некоторую функциональность, он не сильно отличается от утилит скаффолдинга сред полного стека, таких как CakePHP или Symfony.
  4. Не поделился веб-хостинг дружественным. Структура папок, сгенерированная Zend_Tool, предполагает, что общая папка является единственным каталогом, доступным через http — что предполагает, что пользователь может создать виртуальный хост для проекта. Это то, что вы не можете сделать в большинстве сред общего веб-хостинга.
  5. Слишком клейкий. Поскольку все в отдельных классах, иногда трудно представить, как все работает. Это не будет проблемой для фреймворков с полным стеком, поскольку они в основном позаботятся обо всем за вас. Без Zend_Tool было бы чрезвычайно сложно настроить рабочую структуру проекта

За последние несколько лет в мире фреймворков PHP был достигнут большой прогресс. Скажу честно, в море много рыбы. Есть такие фреймворки, как Codeigniter , CakePHP и Symfony, которые также хороши в использовании. Некоторые из вас могут подумать: «Почему этот парень сосредоточился на Zend Framework? Почему он не запускал тесты производительности для сравнения различных платформ?» На это я отвечаю цитатой из очень интересной статьи под названием «Тесты PHP Framework: занимательно, но в конечном итоге бесполезно», автор P Draic Brady:

Чтобы создать положительный ориентир, вы должны понимать, что все фреймворки были рождены как гнойные груды неоптимизированного вонючего дерьма. Все они родились плохими и с возрастом становятся все хуже Это звучит довольно грустно, но на самом деле это неизбежный компромисс между производительностью и функциями. Это также компромисс между производительностью и простотой использования. Как видите, с производительностью несправедливо сталкиваются два противника: функции и простота использования. Вся производительность жертвуется во имя удовлетворения потребностей быстрой разработки, гибкости, создания прототипов и придания вашему исходному коду более привлекательного вида, чем у другого. Будто.

Что произойдет, если вы отойдете от врагов производительности и окажетесь за кулисами? Вы получаете … ждите этого … кучу дополнительной производительности!

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

Поэтому я приглашаю вас хотя бы попробовать Zend. Если это работает для вас, это здорово! Это для меня. Но если это не очень подходит, попробуйте и другие. Достаточно скоро вы найдете структуру, которая подходит именно вам.