1. Go to this page and download the library: Download alterway/component-workflow library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
alterway / component-workflow example snippets
namespace BlogEngine\Domain\Specification;
use Alterway\Component\Workflow\ContextInterface;
use Alterway\Component\Workflow\SpecificationInterface;
class DraftableArticleSpecification implements SpecificationInterface
{
public function isSatisfiedBy(ContextInterface $context)
{
// an article can always be drafted
return true;
}
}
class PublishableArticleSpecification implements SpecificationInterface
{
public function isSatisfiedBy(ContextInterface $context)
{
// an article needs two reviews to be published
return 1 < count($context->get('article')->getReviews());
}
}
class DeletableArticleSpecification implements SpecificationInterface
{
public function isSatisfiedBy(ContextInterface $context)
{
// an article can always be deleted if requested
return 'delete' === $context->get('action');
}
}
class ArchivableArticleSpecification implements SpecificationInterface
{
public function isSatisfiedBy(ContextInterface $context)
{
// an article needs to be one month old to be archived
$publishedAtPlusOneMonth = clone $context->get('publishedAt');
$publishedAtPlusOneMonth->modify('+1 month');
return 'archive' === $context->get('action') && $publishedAtPlusOneMonth < $context->get('now');
}
}
namespace BlogEngine\Domain\Service;
use Alterway\Component\Workflow\Builder;
use Alterway\Component\Workflow\ContextInterface;
use BlogEngine\Domain\Event\ArticleSubscriber;
use BlogEngine\Domain\Specification\DraftableArticleSpecification;
use BlogEngine\Domain\Specification\PublishableArticleSpecification;
use BlogEngine\Domain\Specification\DeletableArticleSpecification;
use BlogEngine\Domain\Specification\ArchivableArticleSpecification;
use BlogEngine\Util\Context;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class ArticleService
{
private $workflow;
public function __construct(EventDispatcherInterface $eventDispatcher)
{
$this->workflow = (new Builder($eventDispatcher))
->open('article.draft', new DraftableArticleSpecification())
->link('article.draft', 'article.published', new PublishableArticleSpecification())
->link('article.published', 'article.deleted', new DeletableArticleSpecification())
->link('article.published', 'article.archived', new ArchivableArticleSpecification())
->getWorkflow();
$eventDispatcher->addSubscriber(new ArticleSubscriber());
}
public function create(Article $article)
{
$this->advance($article, new Context());
}
public function publish(Article $article)
{
$context = new Context();
$context->set('article', $article);
$this->advance($article, $context);
}
public function delete(Article $article)
{
$context = new Context();
$context->set('action', 'delete');
$this->advance($article, $context);
}
public function archive(Article $article)
{
$context = new Context();
$context->set('action', 'archive');
$context->set('publishedAt', $article->getPublishedAt());
$context->set('now', new \DateTime());
$this->advance($article, $context);
}
private function advance($article, ContextInterface $context)
{
try {
$this->workflow->initialize($article->getToken())->next($context);
} catch (\LogicException $e) {
// the workflow reports a problem
}
}
}
namespace BlogEngine\Domain\Event;
use Alterway\Component\Workflow\Event;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ArticleSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
'article.draft' => array('onDraft', 0),
'article.published' => array('onPublished', 0),
'article.deleted' => array('onDeleted', 0),
'article.archived' => array('onArchived', 0),
);
}
public function onDraft(Event $event) { /* ... */ }
public function onPublished(Event $event) { /* ... */ }
public function onDeleted(Event $event) { /* ... */ }
public function onArchived(Event $event) { /* ... */ }
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.