PHPackages                             olegv/cement - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. olegv/cement

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

olegv/cement
============

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

00PHPCI passing

Since Jan 6Pushed 4mo agoCompare

[ Source](https://github.com/OlegVashkevich/cement)[ Packagist](https://packagist.org/packages/olegv/cement)[ RSS](/packages/olegv-cement/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

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

[](#cement---фабрика-вариантов-для-brick-компонентов)

[![PHP](https://camo.githubusercontent.com/4a3501997c3b637d1379d42bd6a5548e93415fe0a04078ee66f76594a5cb346e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e322532422d3737374242343f7374796c653d666c6174266c6f676f3d706870266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/4a3501997c3b637d1379d42bd6a5548e93415fe0a04078ee66f76594a5cb346e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e322532422d3737374242343f7374796c653d666c6174266c6f676f3d706870266c6f676f436f6c6f723d7768697465)[![PHPUnit](https://camo.githubusercontent.com/8556f3adf6c39b5d03c2bcd1af19f6128bc8c1e35bf7a72ed009c67b0ee63138/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f504850556e69742d7465737465642d3336364339433f7374796c653d666c6174266c6f676f3d706870266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/8556f3adf6c39b5d03c2bcd1af19f6128bc8c1e35bf7a72ed009c67b0ee63138/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f504850556e69742d7465737465642d3336364339433f7374796c653d666c6174266c6f676f3d706870266c6f676f436f6c6f723d7768697465)[![PHPStan](https://camo.githubusercontent.com/0ed0f0f95bf396cbf01751057d30bed394c7c6dc2c62f16baf3935bb62d3ad47/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048505374616e2d6c6576656c2532304d41582d3845343441443f7374796c653d666c6174266c6f676f3d706870266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/0ed0f0f95bf396cbf01751057d30bed394c7c6dc2c62f16baf3935bb62d3ad47/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048505374616e2d6c6576656c2532304d41582d3845343441443f7374796c653d666c6174266c6f676f3d706870266c6f676f436f6c6f723d7768697465)[![PSR-12](https://camo.githubusercontent.com/de7417bdd869e0f506cff0ebc235f106f3c656d005c0ff48bdf29abf6cb0f868/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f64652532307374796c652d5053522d2d31322d3145393046463f7374796c653d666c6174266c6f676f3d706870266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/de7417bdd869e0f506cff0ebc235f106f3c656d005c0ff48bdf29abf6cb0f868/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f64652532307374796c652d5053522d2d31322d3145393046463f7374796c653d666c6174266c6f676f3d706870266c6f676f436f6c6f723d7768697465)

[![Tests](https://camo.githubusercontent.com/c494861ced66006e57e5d0ef2e4c8e953c0d006359182e3b84a83f0f05d6e643/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f4f6c6567566173686b65766963682f63656d656e742f74657374732e796d6c3f6c6162656c3d5465737473)](https://camo.githubusercontent.com/c494861ced66006e57e5d0ef2e4c8e953c0d006359182e3b84a83f0f05d6e643/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f4f6c6567566173686b65766963682f63656d656e742f74657374732e796d6c3f6c6162656c3d5465737473)[![Analise](https://camo.githubusercontent.com/f5d24c0653592c83679676da39ef0ccf3d0c7a13d5007921f5ab570222553ccd/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f4f6c6567566173686b65766963682f63656d656e742f7374616e2e796d6c3f6c6162656c3d416e616c697365)](https://camo.githubusercontent.com/f5d24c0653592c83679676da39ef0ccf3d0c7a13d5007921f5ab570222553ccd/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f4f6c6567566173686b65766963682f63656d656e742f7374616e2e796d6c3f6c6162656c3d416e616c697365)

[![License](https://camo.githubusercontent.com/72e47bd9e917d841a452cb640c04e1e0128763382af692ad7ffa42d8be687eb1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f4f6c6567566173686b65766963682f63656d656e743f7374796c653d666c6174)](https://camo.githubusercontent.com/72e47bd9e917d841a452cb640c04e1e0128763382af692ad7ffa42d8be687eb1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f4f6c6567566173686b65766963682f63656d656e743f7374796c653d666c6174)[![Immutable Components](https://camo.githubusercontent.com/7a94dd5d992e4381d9bfd6cd7ffe0c8b97be801836636802e91d61100e438d32/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6d706f6e656e74732d496d6d757461626c652d626c756576696f6c6574)](https://camo.githubusercontent.com/7a94dd5d992e4381d9bfd6cd7ffe0c8b97be801836636802e91d61100e438d32/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6d706f6e656e74732d496d6d757461626c652d626c756576696f6c6574)[![Server-side](https://camo.githubusercontent.com/84e707af7918769bbe6fdf725a5258b4948f0c5f9096f85ed51ab6ff2caa3254/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656e646572696e672d5365727665722d2d736964652d626c7565)](https://camo.githubusercontent.com/84e707af7918769bbe6fdf725a5258b4948f0c5f9096f85ed51ab6ff2caa3254/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656e646572696e672d5365727665722d2d736964652d626c7565)

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

> Часть проекта **[Brick UI Component System](https://github.com/OlegVashkevich/brick)**

Установка
---------

[](#установка)

```
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
---

[](#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, позволяя создавать библиотеки стандартных компонентов и упрощать работу со сложными структурами.

###  Health Score

18

—

LowBetter than 8% of packages

Maintenance52

Moderate activity, may be stable

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity12

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/791b13b30e50e389b5dc53f9badbf7b5614b81a54404ead08495bae08c06d178?d=identicon)[OlegVashkevich](/maintainers/OlegVashkevich)

---

Top Contributors

[![OlegVashkevich](https://avatars.githubusercontent.com/u/13260371?v=4)](https://github.com/OlegVashkevich "OlegVashkevich (13 commits)")

### Embed Badge

![Health badge](/badges/olegv-cement/health.svg)

```
[![Health](https://phpackages.com/badges/olegv-cement/health.svg)](https://phpackages.com/packages/olegv-cement)
```

###  Alternatives

[yahnis-elsts/admin-notices

A utility library for WordPress plugins that makes it easier to create admin notices. Supports persistently dismissible notices.

311.1k](/packages/yahnis-elsts-admin-notices)[jahvi/magento2-copy-theme-override

Magento 2 command to automatically copy files into active theme

124.5k](/packages/jahvi-magento2-copy-theme-override)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
