2015-08-15 5 views
1

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

Итак, мы понимаем, что MVC имеет контроллер, который обрабатывает наши методы маршрутизации. Кроме того, у нас есть модели & repo (в случае реализации 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. Он также проверяет, какой пользователь может вызывать, какие переходы и имеет несколько хороших функций, таких как визуализация конечного автомата, используя API Graphviz и REST для непосредственного взаимодействия с государственными машинами из JS (для приложений SPA).

Смежные вопросы