Cette conférence présente deux grands motifs de conception : l'observateur et l'injection de dépendance. Ce sujet allie à la fois théorie et pratique. Le composant autonome EventDispatcher de Symfony ainsi que le conteneur d'injection de dépendance Pimple sont mis à l'honneur avec des exemples pratiques d'usage. Ces cas pratiques combinent du code de l'ORM Propel ainsi que le composant autonome Zend\Search\Lucene du Zend Framework 2
8. use SymfonyComponentEventDispatcherEvent;
use SymfonyComponentEventDispatcherEventDispatcher;
use AFUPArticleListener;
$dispatcher = new EventDispatcher();
// Déclaration des écouteurs
$listener1 = array(new ArticleListener(), 'onDelete');
$listener2 = array(new ArticleListener(), 'onSave');
// Enregistrement des écouteurs
$dispatcher->addListener('article.delete', $listener1);
$dispatcher->addListener('article.pre_save', $listener2);
// Notification des écouteurs
$dispatcher->dispatch('article.pre_save', new Event());
17. namespace AFUPEvent;
use SymfonyComponentEventDispatcherEvent;
use AFUPModelArticle;
class ArticleEvent extends Event
{
private $article;
public function __construct(Article $article)
{
$this->article = $article;
}
public function getArticle()
{
return $this->article;
}
}
19. namespace AFUPListener;
use AFUPEventArticleEvent;
use dflydevmarkdownMarkdownParser;
class ArticleListener
{
public function onPreSave(ArticleEvent $event)
{
$article = $event->getArticle();
$markdown = $article->getContent();
$parser = new MarkdownParser();
$html = $parser->transformMarkdown($markdown);
$article->setHtmlContent($html);
}
}
20. namespace AFUPListener;
use ZendSearchLuceneDocument;
use ZendSearchLuceneDocumentField;
use AFUPEventArticleEvent;
use AFUPModelArticlePeer;
class LuceneListener
{
public function onPostSave(ArticleEvent $event)
{
$article = $event->getArticle();
// ...
}
}
21. namespace AFUPListener;
// ...
class LuceneListener
{
public function onPostSave(ArticleEvent $event)
{
$article = $event->getArticle();
$index = ArticlePeer::getLuceneIndex();
// remove existing entries
foreach ($index->find('pk:'.$article->getId()) as $hit) {
$index->delete($hit->id);
}
$doc = new Document();
$doc->addField(Field::Keyword('pk', $article->getId()));
$doc->addField(Field::UnStored('title', $article->getTitle()));
$doc->addField(Field::UnStored('content', $article->getContent()));
$index->addDocument($doc);
$index->commit();
}
}
23. use SymfonyComponentEventDispatcherEventDispatcher;
use AFUPListenerArticleListener;
use AFUPListenerLuceneListener;
use AFUPModelArticle;
// Déclaration des écouteurs
$listener1 = array(new ArticleListener(), 'onPreSave');
$listener2 = array(new LuceneListener(), 'onPostSave');
// Enregistrement des écouteurs
$dispatcher = new EventDispatcher();
$dispatcher->addListener('article.pre_save', $listener1);
$dispatcher->addListener('article.post_save', $listener2);