Государственные машины и рамки

Я пытаюсь понять, как должны использоваться фреймворки. Я работаю над пользовательским фреймворком, т.е. построенным с использованием основных компонентов Symphony2.

Итак, мы понимаем, что MVC есть контроллер, который обрабатывает наши методы маршрутизации. Помимо этого у нас есть модели & репо (в случае реализации типа Symphony2).

Что меня смущает, так это как я интегрирую или внедряю конечные автоматы. Я хотел бы знать, какая часть идет куда.

Я хотел бы использовать следующую библиотеку,

https://github.com/yohang/Finite

Теперь мое текущее состояние сохраняется в столбце таблицы.

Так, где я могу реализовать интерфейс конечного автомата, модели? Где инициализировать конечный автомат, контроллер?

1

Решение

Что касается модели, у вас просто есть объект модели, реализующий StatefullInterface. Если, например, вы используете Doctrine 2, тогда ваш модельный объект — просто обычный объект php. Реализуйте интерфейс по вашей ссылке, и все готово.

Для ваших конечных автоматов я бы сделал пользовательские конечные автоматы:

class MyStateMachine extends StateMachine
{
public function __construct()
{
$this->addState(new State('s1', StateInterface::TYPE_INITIAL));
$this->addState('s2');
$this->addState('s3');
$this->addState(new State('s4', StateInterface::TYPE_FINAL));

$this->addTransition('t12', 's1', 's2');
$this->addTransition('t23', 's2', 's3');
$this->addTransition('t34', 's3', 's4');
$this->addTransition('t42', 's4', 's2');

И тогда вы можете создать и инициализировать объект в вашем контроллере. В качестве альтернативы используйте инъекцию зависимостей и создайте фабричный сервис.

Я полагаю, вы также можете встроить конечный автомат непосредственно в вашу сущность. Наверное, не очень хорошая идея.

Конечный автомат, с которым вы связаны, кажется немного базовым. Поддерживает только одно состояние на объект? Я не проверял код, но переходы также кажутся довольно примитивными. Убедитесь, что он отвечает вашим потребностям, прежде чем тратить на это слишком много времени. Я всегда просто создаю нестандартные машины.

1

Другие решения

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

Сущность предоставит API для вызова переходов, чтения своего состояния и перечисления доступных переходов (как отражение, но с учетом текущего состояния). Остальная часть приложения может спрашивать отдельные экземпляры объекта о том, что можно сделать дальше, и отображать соответствующие части пользовательского интерфейса. Например, он может показать кнопку для удаления объекта, который имеет delete Переход доступен в его текущем состоянии. И когда нажимается кнопка удаления, она вызывает переход удаления на заданном автомате. Я нашел этот подход очень универсальным.

Некоторое время назад я создал Smalldb рамки, которые реализуют такие конечные автоматы. Он реализует уровень модели веб-приложения и позволяет вам определять конечные автоматы для отдельных сущностей и реализовывать их переходы в PHP. Он также проверяет, кому из пользователей разрешено вызывать какие переходы, и имеет несколько полезных функций, таких как визуализация конечных автоматов, с использованием Graphviz и REST API для непосредственного взаимодействия с конечными автоматами из JS (хорошо для приложений SPA).

1

По вопросам рекламы [email protected]