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 и функциональное тестирование