olegv/cement

Фабрика вариантов для Brick-компонентов

Installs: 0

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 0

Open Issues: 0

pkg:composer/olegv/cement

v1.0.1 2026-01-06 10:33 UTC

This package is auto-updated.

Last update: 2026-01-06 10:35:46 UTC


README

PHP PHPUnit PHPStan PSR-12

Tests Analise

License Immutable Components Server-side

Фабрика для создания вариантов компонентов Brick. Регистрируйте прототипы, создавайте экземпляры с переопределениями.

Часть проекта Brick UI Component System

Установка

composer require olegv/cement

Быстрый старт

use OlegV\Cement;
use OlegV\Components\Button;
use OlegV\Components\Card;

$cement = new Cement();

// Регистрация вариантов
$cement->add(Button::class, new Button('Submit', 'primary'), 'submit');
$cement->add(Button::class, new Button('Cancel', 'secondary'), 'cancel');

// Создание
$button = $cement->build(Button::class, [], 'submit'); // Button('Submit', 'primary')
$custom = $cement->build(Button::class, ['text' => 'Save'], 'submit'); // Button('Save', 'primary')

API

Конструктор

new Cement(
    string $errorMode = Cement::ERROR_FALLBACK,
    ?bool $isProduction = null
)

Режимы ошибок:

  • Cement::ERROR_STRICT - бросает исключения (development)
  • Cement::ERROR_FALLBACK - возвращает заглушку (по умолчанию)

Окружение:

  • Автоопределение из APP_ENV
  • CLI всегда production
  • По умолчанию - production
// Development с заглушками
$cement = new Cement(Cement::ERROR_FALLBACK, false);

// Автоопределение
$cement = new Cement(); // ERROR_FALLBACK + auto-detect

Основные методы

// Регистрация
$cement->add(string $className, Brick $prototype, string $variant = 'default');

// Создание с переопределениями  
$cement->build(string $className, array $overrides = [], string $variant = 'default'): ?Brick;

// Проверка
$cement->has(string $className, string $variant = 'default'): bool;
$cement->variants(string $className): array;
$cement->getPrototype(string $className, string $variant = 'default'): ?Brick;

// Очистка
$cement->clear(): void;

Примеры

Вложенные компоненты

$cement->add(Button::class, new Button('Action', 'primary'), 'default');
$cement->add(Card::class, new Card('Title', new Button('Action')), 'default');

$card = $cement->build(Card::class, [
    'title' => 'Custom',
    'button' => $cement->build(Button::class, ['text' => 'Nested'], 'default')
], 'default');
//или
$card2 = $cement->build(Card::class, [
    'title' => 'Custom',
    'button' => new Button('Nested', 'primary')
], 'default');

Полный сценарий

$cement = new Cement();

// Регистрация
$cement->add(Button::class, new Button('Submit', 'primary'), 'primary');
$cement->add(Button::class, new Button('Cancel', 'secondary'), 'secondary');

$cement->add(Card::class, new Card(
    title: 'Product',
    button: new Button('Buy', 'primary')
), 'product');

// Использование
$button = $cement->build(Button::class, [], 'primary');
$custom = $cement->build(Button::class, ['text' => 'Save'], 'primary');

$card = $cement->build(Card::class, [
    'title' => 'iPhone',
    'button' => $cement->build(Button::class, ['text' => 'Buy Now'], 'primary')
], 'product');

// Очистка
$cement->clear();

Принципы

  • Иммутабельность - прототипы readonly, возвращаются как есть без переопределений
  • Типобезопасность - строгие проверки PHP 8.2+
  • Безопасность по умолчанию - production-режим, заглушки при ошибках
  • KISS - минимальный API, одна ответственность

Cement дополняет Brick, позволяя создавать библиотеки стандартных компонентов и упрощать работу со сложными структурами.