Skip to content

Zend Framework / Laminas

Общее описание

Zend Framework — это мощный, объектно-ориентированный, открытый PHP-фреймворк с акцентом на надежность, гибкость и профессиональную разработку. Он был создан компанией Zend Technologies и активно развивался с 2006 года. В 2019 году проект был передан сообществу и переименован в Laminas Project как часть процесса модернизации и упрощения использования.

Основные особенности:

  • Полностью объектно-ориентированная структура
  • Поддержка MVC (Model–View–Controller)
  • Широкий набор компонентов для работы с базами данных, кэшированием, логированием, формами, REST API и т.д.
  • Интеграция с PSR стандартами
  • Подходит для корпоративной разработки
  • Легко внедряется в существующие приложения

Версии Zend Framework / Laminas

Название Год выпуска Особенности
Zend Framework 1.x 2006 Устаревшая версия, несовместима с более новыми
Zend Framework 2.x 2012 ООП, модульность, использование namespaces
Zend Framework 3.x 2016 Улучшенная поддержка Composer, PSR-7, PSR-11
Laminas Project 2019 Переименование Zend Framework после перехода к сообществу
Mezzio 2020 Современный PSR-15 микросервисный фреймворк от Laminas

Примечание: Zend Framework официально больше не развивается. Все новые разработки происходят в рамках Laminas Project.


Установка Laminas и Mezzio

Установка Laminas через Composer:

composer create-project laminas/laminas-skeleton-application path/to/install

Следуйте инструкциям установщика.

Установка Mezzio:

composer create-project mezzio/mezzio-skeleton path/to/mezzio

Выберите: - Router (FastRoute, Aura.Router, Symfony Routing) - Container (Laminas ServiceManager, Pimple, Auryn) - Template engine (Plates, Twig, Latte или без шаблонизатора)


Архитектура Laminas

Laminas следует принципам SOLID, использует PSR стандарты, имеет мощную систему сервис-менеджера и полностью модульную архитектуру.

Основные компоненты Laminas:

  • Laminas\Mvc — реализация MVC
  • Laminas\ServiceManager — контейнер зависимостей
  • Laminas\Form — работа с формами
  • Laminas\Db — ORM и SQL-запросы
  • Laminas\Cache — кэширование
  • Laminas\Authentication — аутентификация
  • Laminas\Authorization — авторизация
  • Laminas\Validator — валидация данных
  • Laminas\Filter — фильтрация данных
  • Laminas\Session — работа с сессиями
  • Laminas\View — система представлений
  • Laminas\I18n — международизация

Mezzio — современный PSR-15 фреймворк

Mezzio (ранее известный как Laminas-Mezzio) — это легковесный, высокопроизводительный фреймворк для создания веб-сервисов, микросервисов и REST API. Он основан на стандартах PSR-7 (HTTP messages), PSR-11 (Container interface) и PSR-15 (Middleware).

Основные особенности:

  • Поддержка middleware
  • Работает с любым HTTP-роутером
  • Возможность использовать любой DI-контейнер
  • Отлично подходит для микросервисов и API
  • Минимальное количество зависимостей

Структура проекта Laminas

Стандартная структура Laminas-приложения:

/config               # Конфигурационные файлы
/data                 # Вспомогательные данные
/module               # Модули приложения
/public               # Точка входа (index.php), статические файлы
/vendor               # Зависимости Composer
/autoload.php         # Автозагрузка классов
/development.config.php.dist # Конфиг разработки

Каждый модуль содержит:

/Module.php           # Точка входа модуля
/src                  # Исходный код
/config               # Конфиг модуля
/view                 # Шаблоны

Создание контроллера и маршрута

Генерация модуля:

./vendor/bin/laminas module MyModule

Создание контроллера:

./vendor/bin/laminas controller MyController --module=MyModule

Настройка маршрутов в config/routes.config.php:

return [
    'routes' => [
        'my-route' => [
            'type' => Segment::class,
            'options' => [
                'route' => '/my-page[/:id]',
                'defaults' => [
                    'controller' => Controller\MyController::class,
                    'action' => 'index',
                ],
            ],
        ],
    ],
];

Работа с базой данных

Использование Laminas\Db:

use Laminas\Db\TableGateway\TableGateway;

class UserTable {
    private $tableGateway;

    public function __construct(TableGateway $tableGateway) {
        $this->tableGateway = $tableGateway;
    }

    public function fetchAll() {
        return $this->tableGateway->select();
    }
}

Настройка в config/autoload/local.php:

'db' => [
    'driver'   => 'Pdo_Mysql',
    'database' => 'test_db',
    'username' => 'root',
    'password' => '',
],

Формы и валидация

Создание формы:

use Laminas\Form\Form;

class ContactForm extends Form {
    public function __construct($name = null) {
        parent::__construct('contact');

        $this->add([
            'name' => 'email',
            'type' => 'email',
            'options' => ['label' => 'Email'],
        ]);

        $this->add([
            'name' => 'submit',
            'type' => 'submit',
            'attributes' => ['value' => 'Send'],
        ]);
    }
}

Валидация:

use Laminas\Validator\EmailAddress;

$validator = new EmailAddress();
if ($validator->isValid($email)) {
    // ok
} else {
    // error
}

Шаблонизация

Использование Plates:

use Laminas\View\Renderer\PhpRenderer;
use Laminas\View\Resolver\TemplatePathStack;

$renderer = new PhpRenderer();
$resolver = new TemplatePathStack(['script_paths' => [__DIR__.'/views']]);
$renderer->setResolver($resolver);

$template = $renderer->render('my-template', ['name' => 'Alice']);
echo $template;

Аутентификация и авторизация

Аутентификация:

use Laminas\Authentication\Adapter\DbTable as AuthAdapter;

$authAdapter = new AuthAdapter($dbAdapter, 'users', 'username', 'password');
$authAdapter->setIdentity($username)->setCredential($password);

$result = $authAdapter->authenticate();
if ($result->isValid()) {
    // успешно вошел
}

Авторизация:

use Laminas\Permissions\Acl\Acl;
use Laminas\Permissions\Acl\Role\GenericRole as Role;
use Laminas\Permissions\Acl\Resource\GenericResource as Resource;

$acl = new Acl();
$acl->addRole(new Role('guest'));
$acl->addResource(new Resource('page'));
$acl->allow('guest', 'page');

if ($acl->isAllowed('guest', 'page')) {
    echo "Access granted";
}

API и REST

Пример REST контроллера:

namespace Application\Controller;

use Laminas\Mvc\Controller\AbstractRestfulController;
use Laminas\View\Model\JsonModel;

class ApiController extends AbstractRestfulController {
    public function getList() {
        return new JsonModel(['data' => ['item1', 'item2']]);
    }

    public function get($id) {
        return new JsonModel(['id' => $id]);
    }
}

Middleware в Mezzio

Пример простого middleware:

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class HelloMiddleware implements MiddlewareInterface {
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface {
        $response = $handler->handle($request);
        return $response->withHeader('X-Hello', 'World');
    }
}

Безопасность

Рекомендации:

  • Использовать htmlspecialchars() для вывода HTML
  • Использовать filter_var() для проверки email, URL
  • Использовать prepared statements для SQL-запросов
  • Использовать CSRF-токены в формах
  • Хранить секреты в .env или зашифрованных файлах
  • Использовать HTTPS

Производительность и оптимизация

Рекомендации:

  • Использовать APCu/XCache для кэширования
  • Кэшировать конфигурации и шаблоны
  • Использовать CDN для статики
  • Минимизировать запросы к БД
  • Использовать Redis/Memcached
  • Использовать OPcache

Логирование и диагностика

Использование Laminas\Log:

use Laminas\Log\Logger;
use Laminas\Log\Writer\Stream;

$logger = new Logger();
$writer = new Stream('data/logs/app.log');
$logger->addWriter($writer);

$logger->info('Application started');
$logger->err('Database connection failed');

Тестирование

PHPUnit + Laminas\Test:

use Laminas\Test\PHPUnit\Controller\AbstractHttpControllerTestCase;

class IndexControllerTest extends AbstractHttpControllerTestCase {
    public function setUp(): void {
        $this->setApplicationConfig(include __DIR__ . '/../../config/application.config.php');
        parent::setUp();
    }

    public function testIndexActionCanBeAccessed() {
        $this->dispatch('/');
        $this->assertResponseStatusCode(200);
    }
}

Запуск тестов:

vendor/bin/phpunit

CI/CD и автоматизация

Laminas и Mezzio отлично подходят для автоматизации: - GitHub Actions - GitLab CI - Jenkins - Docker - Kubernetes

Также можно использовать: - Phing — сборка проекта - PHP-CS-Fixer — форматирование кода - PHPStan / Psalm — статический анализ - Codeception / Behat — BDD и функциональное тестирование


Сообщество и поддержка

Официальные источники: