Работали ли вы с Zend Framework?

Ответ

Да, работал с Zend Framework (сейчас Laminas) в enterprise-проектах. Использовал Zend Framework 2 и 3 для создания масштабируемых веб-приложений.

Ключевые компоненты, с которыми работал:

  1. ZendMVC — архитектурный паттерн Model-View-Controller
  2. ZendDb — абстракция для работы с базами данных
  3. ZendForm — создание и валидация форм
  4. ZendAuthentication — система аутентификации
  5. ZendCache — кэширование данных

Пример работы с ZendDb:

// Конфигурация адаптера базы данных
use ZendDbAdapterAdapter;

$adapter = new Adapter([
    'driver'   => 'Pdo_Mysql',
    'hostname' => 'localhost',
    'database' => 'application_db',
    'username' => 'db_user',
    'password' => 'secure_password',
    'charset'  => 'utf8mb4'
]);

// Выполнение запроса с параметрами
$sql = 'SELECT * FROM users WHERE status = :status AND created_at > :date';
$result = $adapter->query($sql, [
    'status' => 'active',
    'date'   => '2023-01-01'
]);

// Использование TableGateway
use ZendDbTableGatewayTableGateway;

$usersTable = new TableGateway('users', $adapter);
$activeUsers = $usersTable->select(['status' => 'active']);

foreach ($activeUsers as $user) {
    echo $user->username;
}

Пример создания модуля в Zend Framework 3:

// Module.php
namespace Application;

use ZendModuleManagerFeatureConfigProviderInterface;

class Module implements ConfigProviderInterface
{
    public function getConfig()
    {
        return include __DIR__ . '/../config/module.config.php';
    }
}

// module.config.php
return [
    'controllers' => [
        'factories' => [
            ControllerIndexController::class => InvokableFactory::class,
        ],
    ],
    'router' => [
        'routes' => [
            'home' => [
                'type' => 'Literal',
                'options' => [
                    'route' => '/',
                    'defaults' => [
                        'controller' => ControllerIndexController::class,
                        'action' => 'index',
                    ],
                ],
            ],
        ],
    ],
    'view_manager' => [
        'template_path_stack' => [
            __DIR__ . '/../view',
        ],
    ],
];

Миграция на Laminas: Участвовал в переходе с Zend Framework на Laminas, который включал:

  • Обновление зависимостей через Composer
  • Замену неймспейсов с Zend на Laminas
  • Обновление конфигураций и фабрик
  • Тестирование совместимости после миграции

Сильные стороны Zend/Laminas:

  • Хорошо документирован
  • Следует стандартам PSR
  • Подходит для больших enterprise-проектов
  • Имеет множество готовых компонентов

Ответ 18+ 🔞

А, Zend Framework, ёпта! Ну это ж классика, как батянин "Запорожец" — громоздкий, своеобразный, но своё дело делал. Работал с ним, да, в таких проектах, где от масштаба голова кругом шла. Сейчас он, правда, переродился в Laminas, но суть-то та же.

С чем, говоришь, водился? Да со всем этим хозяйством, блядь:

  1. ZendMVC — это ж основа основ, где всё по полочкам: модель, вид, контроллер. Без этого — пиздец и бардак.
  2. ZendDb — чтобы с базой данных не костылять, а работать как человек.
  3. ZendForm — формы создавать, которые не развалятся от первого же долбоёба, вбивающего туда всякую хуйню.
  4. ZendAuthentication — чтобы левые чуваки не ломились куда не надо.
  5. ZendCache — потому что без кэша всё будет тормозить так, что терпения ноль ебать.

Вот, смотри, как с базой общались:

// Конфигурация адаптера базы данных
use ZendDbAdapterAdapter;

$adapter = new Adapter([
    'driver'   => 'Pdo_Mysql',
    'hostname' => 'localhost',
    'database' => 'application_db',
    'username' => 'db_user',
    'password' => 'secure_password',
    'charset'  => 'utf8mb4'
]);

// Выполнение запроса с параметрами
$sql = 'SELECT * FROM users WHERE status = :status AND created_at > :date';
$result = $adapter->query($sql, [
    'status' => 'active',
    'date'   => '2023-01-01'
]);

// Использование TableGateway
use ZendDbTableGatewayTableGateway;

$usersTable = new TableGateway('users', $adapter);
$activeUsers = $usersTable->select(['status' => 'active']);

foreach ($activeUsers as $user) {
    echo $user->username;
}

Честно? Иногда хотелось взять этот TableGateway и впиздюрить об стену, когда что-то не так работало, но в целом — норм инструмент.

А модули там — это вообще отдельная песня. Настраиваешь эту хуйню, и чувствуешь себя каким-то архитектором, блядь.

// Module.php
namespace Application;

use ZendModuleManagerFeatureConfigProviderInterface;

class Module implements ConfigProviderInterface
{
    public function getConfig()
    {
        return include __DIR__ . '/../config/module.config.php';
    }
}

// module.config.php
return [
    'controllers' => [
        'factories' => [
            ControllerIndexController::class => InvokableFactory::class,
        ],
    ],
    'router' => [
        'routes' => [
            'home' => [
                'type' => 'Literal',
                'options' => [
                    'route' => '/',
                    'defaults' => [
                        'controller' => ControllerIndexController::class,
                        'action' => 'index',
                    ],
                ],
            ],
        ],
    ],
    'view_manager' => [
        'template_path_stack' => [
            __DIR__ . '/../view',
        ],
    ],
];

Выглядит, конечно, как овердохуища конфигов, но зато потом, когда проект растёт — понимаешь, зачем это всё.

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

Чем хорош был Zend/Laminas?

  • Документация — да, её реально было читать, а не гадать на кофейной гуще.
  • Стандарты PSR — не абы какая самописная хуйня, а что-то цивильное.
  • Для больших проектов — то, что надо. Не для бложика на коленке, а для серьёзного enterprise.
  • Компонентов — вагон и маленькая тележка. Почти на все случаи жизни.

Но, блядь, учить его — это как изучать "Войну и мир". Объёмы были такие, что иногда хотелось кричать "идите вы все нахуй!" и переписать всё на голом PHP. Но зато, когда въезжаешь — работать удобно. Как на хорошем, но жутко прожорливом внедорожнике.