PHPackages                             jeyroik/extas-foundation - 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. jeyroik/extas-foundation

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

jeyroik/extas-foundation
========================

Extas foundation package

6.22.1(2y ago)04.6k[1 issues](https://github.com/jeyroik/extas-foundation/issues)20PHP

Since Dec 2Pushed 2y agoCompare

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

READMEChangelog (10)Dependencies (9)Versions (81)Used By (20)

[![PHP Composer](https://github.com/jeyroik/extas-foundation/workflows/PHP%20Composer/badge.svg?branch=master)](https://github.com/jeyroik/extas-foundation/workflows/PHP%20Composer/badge.svg?branch=master)[![codecov.io](https://camo.githubusercontent.com/9a3f2af8f70feaa1276f321e87f095834dd0ce38e6b2d3ad06070a3766b38f59/68747470733a2f2f636f6465636f762e696f2f67682f6a6579726f696b2f65787461732d666f756e646174696f6e2f636f7665726167652e7376673f6272616e63683d6d6173746572)](https://camo.githubusercontent.com/9a3f2af8f70feaa1276f321e87f095834dd0ce38e6b2d3ad06070a3766b38f59/68747470733a2f2f636f6465636f762e696f2f67682f6a6579726f696b2f65787461732d666f756e646174696f6e2f636f7665726167652e7376673f6272616e63683d6d6173746572)[![](https://camo.githubusercontent.com/3a72121498466ec64cdeba841376e1ff4c6d5d2c47c8f4503d5d3f0e425cc0c0/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f65633663633362353262313162396233613435332f6d61696e7461696e6162696c697479)](https://codeclimate.com/github/jeyroik/extas-foundation/maintainability)[![Latest Stable Version](https://camo.githubusercontent.com/8b5f2329c16fcbbd916a2e570c7f6d73fce2728899bf3215297728b9c5a0d408/68747470733a2f2f706f7365722e707567782e6f72672f6a6579726f696b2f65787461732d666f756e646174696f6e2f76)](//packagist.org/packages/jeyroik/extas-foundation)[![Total Downloads](https://camo.githubusercontent.com/d8f0a601656d7b7a901864a71abe0de24c969032bf1872dc0d1ad50c4a86a1e5/68747470733a2f2f706f7365722e707567782e6f72672f6a6579726f696b2f65787461732d666f756e646174696f6e2f646f776e6c6f616473)](//packagist.org/packages/jeyroik/extas-foundation)[![Dependents](https://camo.githubusercontent.com/aefabd99e81e853a016dda135988a144bd1f92a2cba38ed4393b5f3acad4880b/68747470733a2f2f706f7365722e707567782e6f72672f6a6579726f696b2f65787461732d666f756e646174696f6e2f646570656e64656e7473)](//packagist.org/packages/jeyroik/extas-foundation)

Описание
========

[](#описание)

Данный пакет содержит базовые сущности для Extas`a:

- `extas\components\Item` Базовый объект, позволяющий использовать из коробки плагины и расширения (см. ниже)
- `extas\components\plugins\Plugin` Плагин. Позволяет реализовывать плагины (подробности см. ниже).
- `extas\components\extensions\Extension` Расширение. Позволяет реализовывать расширения (декораторы) для классов, унаследованных от `Item`.

Требования
==========

[](#требования)

- PHP 7.4+
- Какое-либо хранилище (для тестов по-умолчанию используется JSON-файл).

Установка пакета
================

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

`# composer require jeyroik/extas-foundation:6.*`

Установка extas-совместимого приложения
=======================================

[](#установка-extas-совместимого-приложения)

`# vendor/bin/extas install -t "repo/template/path" -s "repo/classes/save/path"`

Для сущностей доступна стадия `extas\\interfaces\\stages\\IStageBeforeInstallEntity`, подключившись к которой можно проводить дополнительные манипуляции с данными сущности.

Сушности приложения устанавливаются раньше сущностей библиотек.

`# vendor/bin/extas-extra e`

Подробнее про команду `extra` читайте ниже.

Установка прочих сущностей
==========================

[](#установка-прочих-сущностей)

Для установки прочих сущностей, доступна команда `extra`. С помощью плагинов есть возможность подключиться к данной команде и через единый интерфейс этой команды устаналивать любые сущности и вообще выполнять любые действия, которые требуется.

Чтобы посмотреть список доступных опций, используйте помощь по команде:

`# vendor/bin/extas extra -h`

Конфигурация приложения
=======================

[](#конфигурация-приложения)

- Для настройки конфигурации вашего приложения, необходимо создать два файла
    - `extas.app.storage.json` для кофигурации хранилища, плагинов и расширений;
    - `extas.app.json` для конфигурации сущностей.
    - Минимальную конфигурацию можно найти в
        - `extas.app.storage.dist.json`, а также в текущей документации ниже по тексту.
        - `extas.app.dist.json`, а также в текущей документации ниже по тексту.
- Если вы разрабатываете бибилиотеку, то настройки для неё необходимо складывать в
    - `extas.storage.json` - конфигурация хранилища, плагинов и расширений.
    - `extas.json` - конфигурация сущностей.
    - Минимальную конфигурацию можно найти в
        - `extas.storage.dist.json`, а также в текущей документации ниже по тексту.
        - `extas.dist.json`, а также в текущей документации ниже по тексту.

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

[](#запуск-тестов)

`# composer test`

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

[](#использование)

Item
----

[](#item)

Базовую сущность следует использовать как родителя для ваших сущностей (моделей и т.п.).

`class My extends extas\components\Item`

В этом случае вы сразу же получаете:

- поддержку динамических свойств: `$my = new My(); $my->some = 'thing';`
- поддержку интерфейса массива:

```
$my = new My();
$my['fieldName'] = 5;
$val = $my['fieldName'];
echo $val;// 5
isset($my['fieldName']); // true
unset($my['fieldName']);
isset($my['fieldName']); // false
```

- поддержку итератора: `foreach($my as $field => $value)`
- поддержку декораторов: `$my->notExistingMethod($arg1, $arg2)`
- поддержку быстрого доступа к хранилищу: `$my->myTable()->one(...)`
- поддержку плагинов (событий): внутри метода класса `My`
    - создание сущности `.created`, срабатывает при сохранении нового экземпляра сущности в хранилище;
    - инициализация сущности `.init`, срабатывает при инициализации объекта сущности;
    - удаление объекта сущности `.after`, срабатывает при удалении объекта сущности
    - конвертация в массив, строку и целочисленное значение соответственно `.to.array`, `.to.string`, `.to.int`
- поддержку целого ряда вспомогательных методов (каждый из которых предоставляет соответствующее событие для плагинов) вида
    - \_\_toArray()
    - \_\_toJson()
    - \_\_toInt()
    - \_\_equal(IItem $other) - сравнение с другой сущностью.
    - \_\_has('attr1', 'attr2', ...) - проверка наличия необходимых атрибутов.
    - \_\_select('attr1', 'attr2', ...) - получение сущности с ограниченным набором полей.
- поддержку создания новых событий для плагинов:

```
foreach($this->getPluginsByStage('event.name') as $plugin)
{
    $plugin($arg1, $arg2);
}
```

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

Плагин
------

[](#плагин)

Плагин следует использовать как родителя для ваших плагинов.

```
class MyPlugin extends extas\components\plugins\Plugin {}
```

Чтобы реализовать плагин, вам необходимо перегрузить метод `__invoke()`. Аргументы метода зависят от конкретной стадии (события).

Пример реализации плагина можно увидеть ниже.

### Предустановка плагинов

[](#предустановка-плагинов)

В `extas.app.storage.json` для приложения и в `extas.storage.json` для библиотек:

```
{
  "plugins": [
    {
      "class": "class\\Name",
      "stage": "stage.name",
      "priority": 10
    }
  ]
}
```

`priority` - чем выше приоритет, тем раньше (относительно других плагинов на этой стадии) выполнится плагин. Параметр является необязательным.

Расширение
----------

[](#расширение)

Расширение следует использовать как родителя для ваших расширений (декораторов). Расширение позволяет динамически прозрачно добавлять методы сущностям, не трогая их код.

```
class MyExtension extends extas\components\Extension implements IMyExtension{}
```

### Предустановка расширений

[](#предустановка-расширений)

В `extas.app.storage.json` для приложения и в `extas.storage.json` для библиотек:

```
{
  "extensions": [
    {
      "class": "extension\\Class",
      "interface": "extension\\Interface",
      "subject": ["subject.name.1", "subject.name.2", "*"],
      "methods": ["method1", "method2"]
    }
  ]
}
```

### Пример использования каждой сущности по отдельности и вместе

[](#пример-использования-каждой-сущности-по-отдельности-и-вместе)

Item
----

[](#item-1)

```
namespace my\extas;

use extas\components\Item;

class My extends Item
{
    public function getName()
    {
        return $this->config['name'] ?? '';
    }

    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    protected function getSubjectForExtension(): string
    {
        return 'my';
    }
}

$my = new my\extas\My(['name' => 'on init']);
echo $my['name']; // 'on init'
echo $my->getName(); // 'on init'
echo $my->name; // 'on init'
$my['description'] = 'Using Item example';

foreach($my as $field => $value) {
    echo $field . ' = ' . $value;
}

/**
 * Will output:
 * name = on init
 * description = Using Item example
 */
```

Плагин
------

[](#плагин-1)

```
namespace my\extas;

use extas\components\Item;

class My extends Item
{
    public function getName()
    {
        $name = $this->config['name'] ?? '';

        foreach($this->getPluginsByStage('my.name.get') as $plugin) {
            $plugin($name);
        }

        return $name;
    }

    public function setName($name)
    {
        $this->config['name'] = $name;

        return $this;
    }

    protected function getSubjectForExtension(): string
    {
        return 'my';
    }
}

use extas\components\Plugin;

class PluginEmptyName extends Plugin
{
    public function __invoke(&$name)
    {
        $name = $name ?: 'Missed "name"';
    }
}

// extas.storage.json/extas.app.storage.json
{
    "plugins": [
        {
            "class": "my\\extas\\PluginEmptyName",
            "stage": "my.name.get"
        }
    ]
}

// somewhere in a code

$my = new My();
echo $my->getName(); // 'Missed "name"'
```

Внимание! Чтобы вышеуказанный пример сработал, плагин должен быть установлен в системе. Детали см. в разделе `Установка`.

Расширение
----------

[](#расширение-1)

```
namespace my\extas;

use extas\components\Item;

class My extends Item
{
    public function getName()
    {
        $name = $this->config['name'] ?? '';

        foreach($this->getPluginsByStage('my.name.get') as $plugin) {
            $plugin($name);
        }

        return $name;
    }

    public function setName($name)
    {
        $this->config['name'] = $name;

        return $this;
    }

    protected function getSubjectForExtension(): string
    {
        return 'my';
    }
}

/**
 * Для расширений рекомендуется всегда подготавливать интерфейсы.
 * Это помогает при разработке (подсказки) и позволяет удобнее контролировать расширения.
 */
interface IGetMutatedName
{
    /**
     * @return string
     */
    public function getMutatedName(): string;
}

use extas\components\Extension;

class MyGetMutatedName extends Extension implements IGetMutatedName
{
    public string $subject = 'my';

    /**
     * Последним аргументом любого метода, который является расширением,
     * передаётся экземпляр сущности, которая расширяется
     *
     * @param null|My $my
     *
     * @return string
     */
    public function getMutatedName(My $my = null)
    {
        $name = $my->getName();
        return str_replace('.', '\\', $name);
    }
}

// extas.storage.json/extas.app.storage.json
{
    "extensions": [
        {
            "class": "my\\extas\\MyGetMutatedName",
            "interface": "my\\extas\\IGetMutatedName",
            "subject": ["my"],
            "methods": ["getMutatedName"]
        }
    ]
}

// somewhere in a code

$my = new My(['name' => 'extas.extensions.extension.example']);
echo $my->getMutatedName(); // extas\\extensions\\extension\\example
```

Внимание! Чтобы вышеуказанный пример сработал, расширение должно быть установлено в системе. Детали см. в разделе `Установка`.

extas.app.storage.json
======================

[](#extasappstoragejson)

```
{
    "name": "vendor/package",
    "drivers": [
        {
            "driver": "\\driver\\Class",
            "options": {
                "dsn": "{username}:{userpassword}@{host}:{port}/{db} | {path/to/db}",
                "username": "",
                "password": "",
                "host": "",
                "port": "",
                "db": ""
            },
            "tables": ["t1", ...]
        }
    ],
    "tables": {
        "some_entities": {
            "item_class": "",
            "pk": "",
            "aliases": ["alias1", ...],
            "hooks": {
                "create-before": true,
                "update-before": true,
                "update-after": true,
                ...
            },
            "code": {
                "create-before": "echo 'any code you want'; \\extas\\components\\repositories\\RepoItem::throwIfExist($this, $item, ['name'])",
                ...
            }
        },
        ...
    },
    "plugins": [
        {
            ...
        },
        ...
    ],
    "extensions": [
        {
            ...
        },
        ...
    ],
    "envs": [
        "name1": "description"
    ]
}
```

extas.app.json
==============

[](#extasappjson)

Сушности приложения устанавливаются раньше сущностей библиотек.

```
{
    "some_entities": [
        {
            ...
        },
        ...
    ]
}
```

extas.storage.json
==================

[](#extasstoragejson)

`Внимание`: не размещайте в данной конфигурации секцию с настройкой драйверов - она будет игнорироваться. Драйвера настраиваются в `extas.app.storage.json`.

```
{
    "name": "vendor/package",
    "tables": {
        "some_entities": {
            "item_class": "",
            "pk": "",
            "aliases": ["alias1", ...],
            "hooks": {
                "create-before": true,
                "update-before": true,
                "update-after": true,
                ...
            },
            "code": {
                "create-before": "echo 'any code you want';",
                ...
            }
        },
        ...
    },
    "plugins": [
        {
            ...
        },
        ...
    ],
    "extensions": [
        {
            ...
        },
        ...
    ],
    "envs": {
        "name1": "description 1"
    }
}
```

extas.json
==========

[](#extasjson)

```
{
    "some_entities": [
        {
            ...
        },
        ...
    ]
}
```

ENV
===

[](#env)

Чтобы узнать какие требуются переменные окружения, выполните команду `env`:

```
# vendor/bin/extas env
```

Чтобы добавить свои переменные окружения в данный список, добавьте в конфигурации хранилища `extas.app.storage.json` (для библиотек в `extas.storage.json`) раздел `envs` и опишите свои переменные как это показано в примерах соответствующих конфигураций выше.

###  Health Score

37

—

LowBetter than 83% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity22

Limited adoption so far

Community20

Small or concentrated contributor base

Maturity73

Established project with proven stability

 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.

###  Release Activity

Cadence

Every ~17 days

Recently: every ~1 days

Total

79

Last Release

1028d ago

Major Versions

2.1.0 → 3.1.02020-03-23

3.1.0 → 4.0.02020-03-24

4.1.0 → 5.0.02020-03-25

5.14.1 → 6.0.02022-10-26

5.15.0 → 6.9.02023-06-05

### Community

Maintainers

![](https://www.gravatar.com/avatar/2aaec5c4bade6ab2b5d1a0f7d97ab4e0ff2ce83937f76499b2888ad16cde5e04?d=identicon)[jeyroik](/maintainers/jeyroik)

---

Top Contributors

[![jeyroik](https://avatars.githubusercontent.com/u/6348124?v=4)](https://github.com/jeyroik "jeyroik (223 commits)")

---

Tags

extasphp

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/jeyroik-extas-foundation/health.svg)

```
[![Health](https://phpackages.com/badges/jeyroik-extas-foundation/health.svg)](https://phpackages.com/packages/jeyroik-extas-foundation)
```

###  Alternatives

[symfony/maker-bundle

Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.

3.4k111.1M565](/packages/symfony-maker-bundle)[consolidation/robo

Modern task runner

2.7k62.9M408](/packages/consolidation-robo)[symplify/monorepo-builder

Not only Composer tools to build a Monorepo.

5205.3M82](/packages/symplify-monorepo-builder)[friendsoftypo3/content-blocks

TYPO3 CMS Content Blocks - Content Types API | Define reusable components via YAML

96374.6k23](/packages/friendsoftypo3-content-blocks)[shyim/danger-php

Port of danger to PHP

8544.9k](/packages/shyim-danger-php)[php-soap/wsdl

Deals with WSDLs

173.5M12](/packages/php-soap-wsdl)

PHPackages © 2026

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