magicmvc/framework

a framework for implementing the MVC pattern

v0.2.1 2024-12-14 17:16 UTC

This package is not auto-updated.

Last update: 2025-06-07 14:51:03 UTC


README

Разделы

Источники данных\

Всё что как либо связано с источниками данных, это различные соединения к SQL, FTP, SMTP, файлами CSV, WEB API, и т.д. и .т.п.\

Запрос от клиента\

Всё что как либо связано с вызовом из вне, это касается URL строки, POST данных, запрашиваемого контроллера и построения к нему предпологаемой цепочки (пути).\

Инструменты\

Какие либо вспомогательные механизмы, используемые в работе.\

Модели\

API Data Access Layer, тоесть некий слой реализованный для того чтобы отделить бизнес логику от работы с источниками данных, чтобы бизнес логика ничего не знала об источниках.\

Визуализация\

Механизм позволяющий отделить непосредственно вывод HTML от бизнес логики.\

Контроллеры\

Всё что связано непосредственно с контроллерами и их функциями (инструмент для реализации бизнес логики).

Интерфэйсы

РазделИнтерфейс
Источники данныхConnectionInterface
Источники данныхConnectionsPoolInterface
Запрос от клиентаURLInterface
Запрос от клиентаControllerQueryChainBuilderInterface
Запрос от клиентаControllerQueryChainInterface
Запрос от клиентаControllerQueryInterface
ИнструментыInvokerInterface
ИнструментыUuid
МоделиModelFactoryInterface
МоделиModelInterface
МоделиModelMethodInterface
МоделиModelMethodParametersInterface
ВизуализацияViewFactoryInterface
КонтроллерыControllerInterface
КонтроллерыControllerFactoryInterface
КонтроллерыAllowedQueryControllerInterface
КонтроллерыParametersControllerInterface
КонтроллерыParentControllerInterface
КонтроллерыSingletoneControllerInterface
КонтроллерыReaderControllerInterface

Источники данных

ConnectionInterface

Описывает механизм соединения с каким либо источником, источники все крайне уникальны и каждый тип источника может иметь обсалютно какой то свой объет обозначающий соединение, класс реализующий интерфейс ConnectionInterface это лишь некая обертка позволяющая им управлять и при необходимости как либо взаимодействовать.

function getInstance() : mixed;
function openConnection() : void;
function closeConnection() : void;
function isOpenConnection() : bool;

function getInstance() : mixed; >Возвращает уникальный объект который используется в работе с этим типом источника.

function openConnection() : void; >Открывает соединение с этим источником.

function closeConnection() : void; >Закрывает соединение с этим источником.

function isOpenConnection() : bool; >Возвращает состояние соединения с этим источником.

ConnectionsPoolInterface

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

function add(string $code, ConnectionInterface $connection) : void;
function contains(string $code) : bool;
function getOpenConnection(string $code) : ConnectionInterface;
function closeConnection() : void;

function add(string $code, ConnectionInterface $connection) : void; >Добавляет соединение в набор соединений по указанному коду (тоесть по этому коду будет доступно добавляемое соединение).

function contains(string $code) : bool; >Проверяет есть ли уже в наборе соединение с указанным кодом.

function getOpenConnection(string $code) : ConnectionInterface; >Открывает соединение с указанным кодом если оно ещё небыло открыто и возвращает его обертку.

function closeConnection() : void; >Закрывает обсалютно все соединения в наборе которые находятся в открытом состоянии (тоесть их функция isOpenConnection() возвращает true).

Запрос от клиента

URLInterface

Описывает инструмент по обработке входящих данных запроса от клиента, таких как URL и её параметры и якорь, а также POST данные запроса если они есть

function getPathOriginal() : string;
function getPath() : ?string;
function readPath() : ?string;
function resetPath() : void;
function getPostData() : string;
function getURLFragment() : string;
function getURLQueryOriginal() : string;
function createURLQuery() : string;
function getURLQuery(string $key) : ?string;
function setURLQuery(string $key, string $value) : void;
function unsetURLQuery(string $key) : void;
function issetURLQuery(string $key) : bool;

function getPathOriginal() : string; >Возвращает оригинальый путь указанный в URL строке (в виде обычной строки).

function getPath() : ?string;

Возвращает текущее значение узла пути на которое указывает некий внутренний индекс, если индекс находится за пределами некоего массива узлов пути то возвращается null

function readPath() : ?string;

Возвращает текущее значение узла пути на которое указывает некий внутренний индекс, если индекс находится за пределами некоего массива узлов пути то возвращает null, при этом после прочтения сдвигает указать текущего узла пути на следующий.

function resetPath() : void;

Сбрасывает внутренний индекс указателя узла пути на первый в массиве который не равен пустой строке.

function getPostData() : string;

Возвращает бинарную строку содержащую содержимое POST данных

function getURLFragment() : string;

Возвращает значение якоря ( того что указано в URL после знака # )

function getURLQueryOriginal() : string;

Возвращает в виде строке всё что в URL строке относится к GET параметрам в том виде в котором оно было получено

function createURLQuery() : string;

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

function getURLQuery(string $key) : ?string;

Возвращает значение одного из параметров URL строки

function setURLQuery(string $key, string $value) : void;

Устанавливает значение одного из параметров URL строки

function unsetURLQuery(string $key) : void;

Удаляет один из параметров URL строки

function issetURLQuery(string $key) : bool;

Проверяет наличие параметра в URL строке

ControllerQueryChainBuilderInterface

Оприсывает объект включающий в себя всё необходимое для построения цепочки контроллеров (пути до контроллера) который запросили из вне.

function getUrl() : URLInterface;
function getControllerClassName() : string;

function getUrl() : URLInterface; >Возвращает объект содержащий в себе все данные о запросе, на случай если понадобится динамически метять в пути "родительский" контроллер (контроллер который в будущем потенциально предполагается как вызвавший этот).

function getControllerClassName() : string; >Возвращает имя класса запрашиваемого контроллера, этот тот самый класс контроллера который запросили из вне (например через WEB API).

ControllerQueryChainInterface

Описывает класс хранящий цепочку контроллеров до запрашиваемого из вне контроллера, стоит отметить то что этот путь может не соответствовать реальности так как в процессе следования по нему развитие событий может пойти вовсе по другому пути (например у пользователя не будет прав на выполнение какого либо контроллера в цепочке), но его основная задача определить какой контроллер необходимо вызвать первым, для того чтобы попытаться выполнить запрашиваемый. Наследуется от IteratorAggregate, ArrayAccess, Serializable, Countable

static function createInstance(ControllerFactoryInterface $controllerFactory, ControllerQueryChainBuilderInterface $query) : ControllerQueryChainInterface;
function reverse() : ControllerQueryChainInterface;
function getIndexByClassName(string $className) : int;
function getController(string $className) : ?ControllerInterface;
function getNextController(string $className) : ?ControllerInterface;

static function createInstance(ControllerFactoryInterface $controllerFactory, ControllerQueryChainBuilderInterface $query) : ControllerQueryChainInterface; >Статический конструктор цепочки контроллеров (предполагаемого пути следования), от самого родительского контроллера, до вызываемого. Для построения цепочки необходима фабрика контроллеров, позволяющая создавать их экземпляры с учетом всех их свойст, а также информация о запросе из вне необходимая для динамически вычисляемого родителя.

function reverse() : ControllerQueryChainInterface; >Возвращает перевернутую цепочку контроллеров

function getIndexByClassName(string $className) : int; >Возвращает порядковый индекс контроллера в цепочке, чей класс соответствует указанному. Если контроллер с таким классом в цепочке не найден должна вернуть -1

function getController(string $className) : ?ControllerInterface; >Возвращает экземпляр контроллера из цепочки чей класс соответствует указанному. Если такой экземпляр не найден возвращает null.

function getNextController(string $className) : ?ControllerInterface; >Возвращает следующий экземпляр в цепочке контроллеров, идущий после экземпляра соответствующего указанному классу, если контроллер с указанным классом не найден в цепочке то возвращает null.

ControllerQueryInterface

Хранит полную информацию о запросе, эта информация в должна быть в итоге передана в каждую функцию любого контроллера который будет вызван.

function getUrl() : URLInterface;
function getQueryChain() : ControllerQueryChainInterface;

function getUrl() : URLInterface; >Возвращает полную информацию о пришедшем запросе полученную из URL и области POST

function getQueryChain() : ControllerQueryChainInterface; >Возвращает запрашиваемую (предполагаемую) цепочку контроллеров, от начального до запрашиваемого

Инструменты

InvokerInterface

Описывает инструмент позволяющий создавать отложенные вызовы функций и методов классов, с заранее заданными параметрами.

static function createInstance(callable $func, ?array $parameters = null) : InvokerInterface;
function onInstance() : void;
function getCallBack() : callable;
function getParameters() : ?array;
function __invoke() : mixed;

static function createInstance(callable $func, ?array $parameters = null) : InvokerInterface; >Статический конструктор который создает экземпляр инструмента, в него передается функция которую нужно выполнить (или метод класса), и параметры, если функция не требует параметров то можно передать в параметры null

function onInstance() : void; >Метод выполняется после создания экземпляра класса отложенного вызова и заданию ему всех необходимых свойств. Можно использовать для перегрузки чтобы после создания экземпляра что то доинициализировать при желании.

function getCallBack() : callable; >Возвращает заданную функцию

function getParameters() : ?array; >Возвращает заданные параметры

function __invoke() : mixed; >Выполняет функцию с заданными параметрами, если параметры не заданы - выполняет её без параметров.

Uuid

static function getEmpty() : UuidInterface;
static function createInstance() : UuidInterface;
function getValue() : string;
function __toString() : string;

static function getEmpty() : UuidInterface; >Возвращает объект обозначающий пустой Uuid

static function createInstance() : UuidInterface; >Возвращает случайно сгенерированный Uuid

function getValue() : string; >Возвращает значение Uuid

function __toString() : string; >Возвращает значение Uuid сконвертированное в строку (фактически в данный момент это тоже самое что getValue)

Модели

ModelFactoryInterface

Интерфейс описывающий фабрику по работе с моделями (модели в понимании моей MVC это некий слой API предоставляющий контроллерам возможность обращаться к данным через этот слой ничего не зная об источниках данных)

function getModelsNamespace() : string;
function getConnectionsPool() : ConnectionsPoolInterface;
function createModelInstance(string $modelName) : ModelInterface;
function __invoke(string $modelName) : ModelInterface;

function getModelsNamespace() : string; >Возвращает пространство имен где расположены папки (директории) моделей, в каждой папке находятся методы моделей описанные классами.

function getConnectionsPool() : ConnectionsPoolInterface; >Возвращает ссылку на объект набора соединений, через этот объект можно запрашивать различные соединения по коду.

function createModelInstance(string $modelName) : ModelInterface; >Попрождает модель (некую обертку позволяющую выполнять методы модели), необходимо передать имя модели, это папка в пространстве getModelsNamespace, в которой лежат методы модели.

function __invoke(string $modelName) : ModelInterface; >Можно обратится к фабрике моделей как к методу, и она вернет ссылку на модель, практически тоже самое что createModelInstance за исключением одного нюанса, если экземпляр модели с указанным именем был ранее создан, то повторно этот экземпляр не должен быть создан, а сыылка должна вернутся на ранее созданную модель (типа синглтон только в рамках фабрики).

ModelInterface

Описывает модель, некий инструмент который объединяет в себе методы по работе с какой либо сущностью данных (ну например модель Пользователи, или модель Пункты меню).

static function createInstance(ModelFactoryInterface $modelFactory, string $modelNamespace) : ModelInterface;
function onInstance() : void;
function getModelNamespace() : string;
function getModelFactory() : ModelFactoryInterface;
function convertMethodNameToClassName(string $methodName) : string;
function createMethodInstance(string $methodClassName) : ModelMethodInterface;
function __call(string $name, ?array $params) : mixed;

static function createInstance(ModelFactoryInterface $modelFactory, string $modelNamespace) : ModelInterface; >Статический конструктор модели, в него передается фабрика которая хочет породить эту модель, и пространство имен в котором находятся все методы модели.

function onInstance() : void; >Метод вызывается после инициализации модели фабрикой.

function getModelNamespace() : string; >Вовзращает пространство имен, в котором находятся методы модели

function getModelFactory() : ModelFactoryInterface; >Возвращает фабрику моделей которая породила эту модель.

function convertMethodNameToClassName(string $methodName) : string; >Преобразует короткое имя метода в его полное имя класса

function createMethodInstance(string $methodClassName) : ModelMethodInterface; >Порождает экземпляр метода модели, метод нужен для выполнения какой либо атомарной задачи по работе с данными

function __call(string $name, ?array $params) : mixed; >Вызывет метод модели по короткому имени, если метод предполагает наличие параметров, то он должен быть вызыван с указанными параметрами в полном соответствии с их колличеством и порядком. Предполагается что если экземпляр метода был ранее создан, то повторно он создаваться не должен (ну тоесть он тоже как бы синглтон в рамках модели)

ModelMethodInterface

Интерфейс описывающий один метод модели.

static function createInstance(ModelInterface $model) : ModelMethodInterface;
function onInstance() : void;
function getModel() : ModelInterface;
function getOpenConnectionInstance(string $connectionCode) : mixed;
function __invoke() : mixed;

static function createInstance(ModelInterface $model) : ModelMethodInterface; >Статический конструктор метода модели, в качестве параметра передается модель которая этот экземпляр хочет породить.

function onInstance() : void; >Вызывается из статического конструктора после того как был полностью в нем проиницилизирован экземпляр

function getModel() : ModelInterface; >Возвращает модель породившую экземпляр метода

function getOpenConnectionInstance(string $connectionCode) : mixed; >Возвращает открытое соединение к запрашиваемому источнику, соответствующему казанному коду в наборе соединений.

function __invoke() : mixed; >Выполняет метод модели, результат произвольный в зависимости от реализации метода.

ModelMethodParametersInterface

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

function getParametersArrayKeys() : array;

function getParametersArrayKeys() : array; >Вовзращает массив, который должен содержать имена публичных свойств метода модели, порядок следования этих публичных свойств должен быть в строгом соответствии с ожидаемым порядком в котором они будут указаны при вызове метода по короткому имени в экземпляре модели этого метода, смотри ModelInterface, метод __call

Визуализация

ViewFactoryInterface

Интерфейс описывающий фабрику выполняющую загрузку и передачу безымянных функций визуализации

function getView(ControllerInterface $controller, string $viewName) : callable;

function getView(ControllerInterface $controller, string $viewName) : callable; >Метод который возвращает безымянную функцию визуализатора

Контроллеры

ControllerInterface

Интерфейс описывающий контроллер, котроллер это класс содержащий функцию какого либо бизнес процесса, которую можно вызывать из функции другого контроллера, либо запросить её выполнение из вне.

static function createInstance(ModelFactoryInterface $modelFactory, ViewFactoryInterface $viewFactory, ControllerFactoryInterface $controllerFactory) : ControllerInterface;
function onInstance() : void;
function getModelFactory() : ModelFactoryInterface;
function getViewFactory() : ViewFactoryInterface;
function getControllerFactory() : ControllerFactoryInterface;
function getExecutor() : ?ControllerInterface;
function findExecutorByClassName(string $className) : ?ControllerInterface;
function getCustomInvoker(string $methodName, ?array $parameters = null) : InvokerInterface;
function getInvoker(ControllerQueryInterface $query, ?ControllerInterface $executor) : InvokerInterface;
function getView(string $viewName) : callable;
function __invoke(ControllerQueryInterface $query, ?ControllerInterface $executor) : void;

static function createInstance(ModelFactoryInterface $modelFactory, ViewFactoryInterface $viewFactory, ControllerFactoryInterface $controllerFactory) : ControllerInterface; >Статический конструктор порождающий экземпляр контроллера, на вход получает ссылки на фабрики модели, визуализатора и фабрики контроллеров которая хочет породить экземпляр этого контроллера.

function onInstance() : void; >Вызывается по завершению инициализации контроллера статическим конструктором

function getModelFactory() : ModelFactoryInterface; >Возвращает фабрику модели

function getViewFactory() : ViewFactoryInterface; >Возвращает фабрику визуализатора

function getControllerFactory() : ControllerFactoryInterface; >Возвращает фабрику котроллеров

function getExecutor() : ?ControllerInterface; >Возвращает ссылку на экземпляр контроллера который вызвал функцию этого контроллера, либо null, по этому значению можно построить цепочку контроллеров как начиная с главной страницы программа добралась через все ветвления контроллеров к именно этому контроллеру.

function findExecutorByClassName(string $className) : ?ControllerInterface; >Ищет иерархически в ветке вызова по свойствам getExecutor() контроллер с указанным классом

function getCustomInvoker(string $methodName, ?array $parameters = null) : InvokerInterface; >Создаёт функцию отложенного вызова какого либо метода этого контроллера с указанными (или не указанными) параметрами

function getInvoker(ControllerQueryInterface $query, ?ControllerInterface $executor) : InvokerInterface; >Создаёт функцию отложенного вызова метода __invoke этого контроллера

function getView(string $viewName) : callable; >Возвращает безымянную функцию визуализатора этого контроллера по её имени

function __invoke(ControllerQueryInterface $query, ?ControllerInterface $executor) : void; >Основная функция бизнес процесса этого контроллера, получает на вход запрос из вне, а также ссылку на контроллер который её вызвал

ControllerFactoryInterface

Описывает фабрику контроллеров, некая фабрика которая порождает экземпляры контроллеров проводя их инициализацию.

static function createInstance(string $namespace, ModelFactoryInterface $modelFactory, ViewFactoryInterface $viewFactory) : ControllerFactoryInterface;
function onInstance() : void;
function getNamespace() : string;
function getModelFactory() : ModelFactoryInterface;
function getViewFactory() : ViewFactoryInterface;
function convertControllerNameToClassName(string $controllerName) : string;
function createControllerInstance(string $className) : ControllerInterface;
function createControllerInstanceByName(string $controllerName) : ControllerInterface;

static function createInstance(string $namespace, ModelFactoryInterface $modelFactory, ViewFactoryInterface $viewFactory) : ControllerFactoryInterface; >Статический конструктор фабрики, принимает на вход пространство имет в котором лежат все контроллеры, ссылку на фабрику модели и фабрику визуализатора

function onInstance() : void; >метод выполняется после инициализации экземпляра контроллера статическим конструктором

function getNamespace() : string; >Возвращает пространство имен в котором находятся все контроллеры

function getModelFactory() : ModelFactoryInterface; >Возвращает ссылку на фабрику модели

function getViewFactory() : ViewFactoryInterface; >Возвращает ссылку на фабрику визуализатора

function convertControllerNameToClassName(string $controllerName) : string; >Преобразовывает короткое имя контроллера в полное имя класса контроллера (можно сказать что controllerName это некий один алиас контроллера);

function createControllerInstance(string $className) : ControllerInterface; >Порождает экземпляр контроллера указанного класса

function createControllerInstanceByName(string $controllerName) : ControllerInterface; >Порождает экземпляр контроллера указанного короткого имени контроллера

AllowedQueryControllerInterface

Дополнительное свойство контроллера, говорит о том что вызов этого контроллера разрешен из вне (например через URL). Проверяется при построении предполагаемой цепочки вызова этого контроллера.

ParametersControllerInterface

Дополнительное свойство контроллера, говорит о том что этот контроллер имеет внутренние параметры к которым он предоставляет доступ другим контроллерам по некоему ключу.

function initParameters() : void;
function getParameterValue(string $key) : mixed;

function initParameters() : void; >Функция которая инициализирует внутри контроллера какие либо наборы параметров

function getParameterValue(string $key) : mixed; >Возвращает значение параметра по заданному ключу

ParentControllerInterface

Дополнительное свойство контроллера, говорит о том что вызов функции этого контроллера предполагается из функции друго (родительского в дереве) контроллера.

function createParentController(ControllerQueryChainBuilderInterface $query) : ControllerInterface;

function createParentController(ControllerQueryChainBuilderInterface $query) : ControllerInterface; >Создает экземпляр контроллера который предполагается что в будующем вызовет функцию этого контроллера (тоесть по этим экземплярам будет строится предполагаемый путь)

SingletoneControllerInterface

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

ReaderControllerInterface

Дополнительное свойство контроллера, которое говорит что контроллер должен прочитать значения параметров.

function readParameters(ControllerQueryChainBuilderInterface $query, ControllerQueryChainInterface $chain, ?ControllerInterface $executor) : void;

function readParameters(ControllerQueryChainBuilderInterface $query, ControllerQueryChainInterface $chain, ?ControllerInterface $executor) : void; >Эту функцию вызывает фабрика построения цепочки вызова, для всех контроллеров в цепочке которые реализуют соответствующий интрефейс, для чтения параметров фабрика передает в функцию запрос который был использован для построения цепочки, построенную цепочку, и предыдущий контроллер в цепочке (ну тоесть для самого первого в цепочке контроллера executor будет равен null)