Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/manage view references with redis #310

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
7ac75c5
install predis and snc-redis-bundle to use redis
Charlie-Lucas Jan 7, 2016
d9305db
Create a manager to make operation on redis for references
Charlie-Lucas Jan 7, 2016
35c3ef1
Create a repository to query the redis server for references
Charlie-Lucas Jan 7, 2016
5b8996c
create a class to have some usefull method to work with redis
Charlie-Lucas Jan 7, 2016
0403273
Create a class to bind redis references and ViewReference
Charlie-Lucas Jan 7, 2016
8e9d4ca
Create a class to manage urls
Charlie-Lucas Jan 7, 2016
a15b4e2
declare redis and url services
Charlie-Lucas Jan 7, 2016
7f37823
use redis driver to manage view references
Charlie-Lucas Jan 7, 2016
76af1eb
create a listener to manage specific viewReference
Charlie-Lucas Jan 7, 2016
88e9aff
create viewReferencebundleEvents
Charlie-Lucas Jan 7, 2016
2eb6ea3
create a viewReferenceEvent Class
Charlie-Lucas Jan 7, 2016
9775225
when a view reference is create/edit/remove dispatch an event
Charlie-Lucas Jan 7, 2016
898f08a
implement create/update/remove for businessEntity associated ref
Charlie-Lucas Jan 7, 2016
4d716e6
set the parent to viewReference if we have one
Charlie-Lucas Jan 7, 2016
bf61d51
transform a pure array of value to viewReference rather than array['v…
Charlie-Lucas Jan 7, 2016
b3ce4bc
rewrite phpdoc
Charlie-Lucas Jan 7, 2016
411ebe3
the param is a entity not a BusinessEntity
Charlie-Lucas Jan 7, 2016
005e2db
don't remove url if it's an empty string
Charlie-Lucas Jan 7, 2016
b93945a
prototype url with a / if is empty
Charlie-Lucas Jan 7, 2016
6090c12
remove xml cache
Charlie-Lucas Jan 7, 2016
2f4746c
inheritors must be cascade persist/remove to create the doctrine pers…
Charlie-Lucas Jan 7, 2016
f4a959f
add the config for test for redis bundle
Charlie-Lucas Jan 7, 2016
56e9a3d
cascade persist on parent can include unexpected operations
Charlie-Lucas Jan 7, 2016
8fae3f2
add some tests for sitemap
Charlie-Lucas Jan 7, 2016
49825e0
update View References doc
Charlie-Lucas Jan 7, 2016
692fab3
Add the documentation for redis
Charlie-Lucas Jan 8, 2016
7f6576d
start redis-server for travis
Charlie-Lucas Jan 8, 2016
d35e68d
style CI fix
Charlie-Lucas Jan 8, 2016
7f72bde
move redis manager/repository in a separate service to be able to cha…
Charlie-Lucas Jan 12, 2016
b3e4e3b
update services and controllers that use viewreference According to t…
Charlie-Lucas Jan 12, 2016
e0c03a8
add redis install documentation
Charlie-Lucas Jan 12, 2016
0ff3ff3
style CI fix
Charlie-Lucas Jan 12, 2016
42ed986
move doc from connector manager/repository to interfaces
Charlie-Lucas Jan 12, 2016
eb73963
fix style CI
Charlie-Lucas Jan 12, 2016
256b953
remove driver and fixing url build
Charlie-Lucas Jan 13, 2016
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ language: php
php:
- 5.6

services:
- redis-server

before_script:
- phpenv config-add travis.php.ini
- npm install less
Expand Down
21 changes: 14 additions & 7 deletions Bundle/AnalyticsBundle/Helper/AnalyticsViewHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,29 @@
use Doctrine\ORM\EntityManager;
use Victoire\Bundle\BlogBundle\Entity\Article;
use Victoire\Bundle\PageBundle\Helper\PageHelper;
use Victoire\Bundle\ViewReferenceBundle\Cache\Xml\ViewReferenceXmlCacheRepository;
use Victoire\Bundle\ViewReferenceBundle\Connector\ViewReferenceRepository;

/**
* Analytics View helper
* ref: victoire_analytics.view_helper.
*/
class AnalyticsViewHelper
{
protected $viewCacheRepository;
protected $viewReferenceRepository;
protected $entityManager;
protected $pageHelper;

public function __construct(ViewReferenceXmlCacheRepository $viewCacheRepository, EntityManager $entityManager, PageHelper $pageHelper)
/**
* AnalyticsViewHelper constructor.
*
* @param ViewReferenceRepository $viewReferenceRepository
* @param EntityManager $entityManager
* @param PageHelper $pageHelper
*/
public function __construct(ViewReferenceRepository $viewReferenceRepository, EntityManager $entityManager, PageHelper $pageHelper)
{
$this->entityManager = $entityManager;
$this->viewCacheRepository = $viewCacheRepository;
$this->viewReferenceRepository = $viewReferenceRepository;
$this->pageHelper = $pageHelper;
}

Expand All @@ -40,7 +47,7 @@ public function getMostReadByViewType($viewNamespace, $number)
$repo = $this->entityManager->getRepository($viewNamespace);
//get pages and viewReferenceIds
foreach ($repo->getAll()->run() as $key => $page) {
$viewReference = $this->viewCacheRepository->getOneReferenceByParameters(
$viewReference = $this->viewReferenceRepository->getOneReferenceByParameters(
[
'viewNamespace' => $viewNamespace,
'viewId' => $page->getId(),
Expand All @@ -63,7 +70,7 @@ public function getMostReadByViewType($viewNamespace, $number)
break;

default:
# code...
// code...
break;
}

Expand All @@ -85,7 +92,7 @@ public function getMostReadArticlesByBlog($blog, $number, $excludeUnpublished =
->run();

foreach ($articles as $key => $article) {
if ($viewReference = $this->viewCacheRepository->getOneReferenceByParameters(
if ($viewReference = $this->viewReferenceRepository->getOneReferenceByParameters(
[
'entityNamespace' => 'Victoire\Bundle\BlogBundle\Entity\Article',
'entityId' => $article->getId(),
Expand Down
2 changes: 1 addition & 1 deletion Bundle/AnalyticsBundle/Resources/config/services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ services:
victoire_analytics.view_helper:
class: %victoire_analytics_view_helper_class%
arguments:
- @victoire_view_reference.cache.repository
- @victoire_view_reference.repository
- @doctrine.orm.entity_manager
- @victoire_page.page_helper
3 changes: 3 additions & 0 deletions Bundle/BlogBundle/Builder/BlogReferenceBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ public function buildReference(View $view, EntityManager $em)
$viewReference->setViewId($view->getId());
$viewReference->setSlug($view->getSlug());
$viewReference->setViewNamespace($em->getClassMetadata(get_class($view))->name);
if ($parent = $view->getParent()) {
$viewReference->setParent(ViewReferenceHelper::generateViewReferenceId($parent));
}

return $viewReference;
}
Expand Down
2 changes: 1 addition & 1 deletion Bundle/BlogBundle/Controller/ArticleController.php
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ public function deleteAction(Article $article)
]
);

$blogViewReference = $this->container->get('victoire_view_reference.cache.repository')->getOneReferenceByParameters(
$blogViewReference = $this->container->get('victoire_view_reference.repository')->getOneReferenceByParameters(
[
'viewId' => $article->getBlog()->getId(),
]
Expand Down
2 changes: 1 addition & 1 deletion Bundle/BlogBundle/Controller/BlogController.php
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ public function settingsAction(Request $request, BasePage $blog)
$entityManager->flush();

/** @var ViewReference $reference */
$reference = $this->container->get('victoire_view_reference.cache.repository')
$reference = $this->get('victoire_view_reference.repository')
->getOneReferenceByParameters(['viewId' => $blog->getId()]);

return new JsonResponse([
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,31 +6,39 @@
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\UnitOfWork;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Victoire\Bundle\BusinessEntityBundle\Entity\BusinessEntity;
use Victoire\Bundle\BusinessEntityBundle\Helper\BusinessEntityHelper;
use Victoire\Bundle\BusinessPageBundle\Builder\BusinessPageBuilder;
use Victoire\Bundle\BusinessPageBundle\Entity\BusinessPage;
use Victoire\Bundle\BusinessPageBundle\Entity\BusinessTemplate;
use Victoire\Bundle\BusinessPageBundle\Helper\BusinessPageHelper;
use Victoire\Bundle\BusinessPageBundle\Repository\BusinessPageRepository;
use Victoire\Bundle\ViewReferenceBundle\Event\ViewReferenceEvent;
use Victoire\Bundle\ViewReferenceBundle\ViewReferenceEvents;

class BusinessEntitySubscriber implements EventSubscriber
{
protected $viewCacheManager;
protected $viewCacheDriver;
protected $businessPageBuilder;
protected $dispatcher;

/**
* @param BusinessPageBuilder $businessPageBuilder
* @param BusinessEntityHelper $businessEntityHelper
* @param BusinessPageHelper $businessPageHelper
* @param BusinessPageBuilder $businessPageBuilder
* @param BusinessEntityHelper $businessEntityHelper
* @param BusinessPageHelper $businessPageHelper
* @param EventDispatcherInterface $dispatcher
*/
public function __construct(BusinessPageBuilder $businessPageBuilder,
BusinessEntityHelper $businessEntityHelper,
BusinessPageHelper $businessPageHelper
BusinessPageHelper $businessPageHelper,
EventDispatcherInterface $dispatcher
) {
$this->businessPageBuilder = $businessPageBuilder;
$this->businessEntityHelper = $businessEntityHelper;
$this->businessPageHelper = $businessPageHelper;
$this->dispatcher = $dispatcher;
}

/**
Expand All @@ -42,6 +50,8 @@ public function getSubscribedEvents()
{
return [
'postUpdate',
'postPersist',
'preRemove',
];
}

Expand All @@ -66,6 +76,15 @@ public function postUpdate(LifecycleEventArgs $eventArgs)
);
}
}
$this->updateViewReference($eventArgs);
}

/**
* @param LifecycleEventArgs $eventArgs
*/
public function postPersist(LifecycleEventArgs $eventArgs)
{
$this->updateViewReference($eventArgs);
}

/**
Expand Down Expand Up @@ -130,4 +149,122 @@ public function updateBusinessPages($entity, BusinessEntity $businessEntity, Ent
}
}
}

/**
* This method throw an event if needed for a view related to a businessEntity.
*
* @param LifecycleEventArgs $eventArgs
*
* @throws \Exception
*/
private function updateViewReference(LifecycleEventArgs $eventArgs)
{
$entity = $eventArgs->getEntity();
//if it's a businessEntity we need to rebuild virtuals (BPs are rebuild in businessEntitySubscriber)
if ($businessEntity = $this->businessEntityHelper->findByEntityInstance($entity)) {
$em = $eventArgs->getEntityManager();
//find all BT that can represent the businessEntity
$businessTemplates = $em->getRepository('VictoireBusinessPageBundle:BusinessTemplate')->findPagePatternByBusinessEntity($businessEntity);
foreach ($businessTemplates as $businessTemplate) {
if ($page = $em->getRepository('Victoire\Bundle\BusinessPageBundle\Entity\BusinessPage')->findPageByBusinessEntityAndPattern($businessTemplate, $entity, $businessEntity)) {
//if it's a BP we update the BP
$this->businessPageBuilder->updatePageParametersByEntity($page, $entity);
} else {
$page = $this->businessPageBuilder->generateEntityPageFromTemplate(
$businessTemplate,
$entity,
$em
);
}
//update the reference
$event = new ViewReferenceEvent($page);
$this->dispatcher->dispatch(ViewReferenceEvents::UPDATE_VIEW_REFERENCE, $event);
}
}
//if it a businessTemplate we have to rebuild virtuals or update BP
if ($entity instanceof BusinessTemplate) {
$em = $eventArgs->getEntityManager();
$businessEntityId = $entity->getBusinessEntityId();
$businessEntity = $this->businessEntityHelper->findById($businessEntityId);
//find all entities
$entities = $this->businessPageHelper->getEntitiesAllowed($entity, $em);
foreach ($entities as $be) {
if ($page = $em->getRepository('Victoire\Bundle\BusinessPageBundle\Entity\BusinessPage')->findPageByBusinessEntityAndPattern($entity, $be, $businessEntity)) {
//rebuild page if its a BP
$this->businessPageBuilder->updatePageParametersByEntity($page, $be);
} else {
$page = $this->businessPageBuilder->generateEntityPageFromTemplate(
$entity,
$be,
$em
);
}
// update reference
$event = new ViewReferenceEvent($page);
$this->dispatcher->dispatch(ViewReferenceEvents::UPDATE_VIEW_REFERENCE, $event);
}
}
}

/**
* @param LifecycleEventArgs $eventArgs
*
* @throws \Exception
*/
public function preRemove(LifecycleEventArgs $eventArgs)
{
$entity = $eventArgs->getEntity();

//if we remove a BP we need to remplace by a VBP ref
if ($entity instanceof BusinessPage) {
//remove BP ref
$event = new ViewReferenceEvent($entity);
$this->dispatcher->dispatch(ViewReferenceEvents::REMOVE_VIEW_REFERENCE, $event);
$em = $eventArgs->getEntityManager();
$businessTemplate = $entity->getTemplate();
$page = $this->businessPageBuilder->generateEntityPageFromTemplate(
$businessTemplate,
$entity->getBusinessEntity(),
$em
);
//create VBP ref
//TODO :: dont rebuild if businessEntity or businessTemplate doesn't exist
$event = new ViewReferenceEvent($page);
$this->dispatcher->dispatch(ViewReferenceEvents::UPDATE_VIEW_REFERENCE, $event);
}

//if it's a businessEntity, we need to remove all BP and VBP ref
if ($businessEntity = $this->businessEntityHelper->findByEntityInstance($entity)) {
$em = $eventArgs->getEntityManager();
$businessTemplates = $em->getRepository('VictoireBusinessPageBundle:BusinessTemplate')->findPagePatternByBusinessEntity($businessEntity);
foreach ($businessTemplates as $businessTemplate) {
if ($page = $em->getRepository('Victoire\Bundle\BusinessPageBundle\Entity\BusinessPage')->findPageByBusinessEntityAndPattern($businessTemplate, $entity, $businessEntity)) {
$event = new ViewReferenceEvent($page);
$this->dispatcher->dispatch(ViewReferenceEvents::REMOVE_VIEW_REFERENCE, $event);
} else {
$page = $this->businessPageBuilder->generateEntityPageFromTemplate(
$businessTemplate,
$entity,
$em
);
$event = new ViewReferenceEvent($page);
$this->dispatcher->dispatch(ViewReferenceEvents::REMOVE_VIEW_REFERENCE, $event);
}
}
}
//if we remove a businessTemplate remove all VBT ref (BP cascade remove)
if ($entity instanceof BusinessTemplate) {
$em = $eventArgs->getEntityManager();
$entities = $this->businessPageHelper->getEntitiesAllowed($entity, $em);
foreach ($entities as $be) {
$page = $this->businessPageBuilder->generateEntityPageFromTemplate(
$entity,
$be,
$em
);
$event = new ViewReferenceEvent($page);
$this->dispatcher->dispatch(ViewReferenceEvents::REMOVE_VIEW_REFERENCE, $event);
}
}
}
}
1 change: 1 addition & 0 deletions Bundle/BusinessEntityBundle/Resources/config/services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ services:
- @victoire_business_page.business_page_builder
- @victoire_core.helper.business_entity_helper
- @victoire_business_page.business_page_helper
- @event_dispatcher
tags:
- { name: doctrine.event_subscriber, connection: default }

Expand Down
5 changes: 4 additions & 1 deletion Bundle/BusinessPageBundle/Builder/BusinessPageBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ public function __construct(BusinessEntityHelper $businessEntityHelper, UrlBuild
* Generate update the page parameters with the entity.
*
* @param BusinessTemplate $businessTemplate
* @param BusinessEntity $entity
* @param entity $entity
*
* @return VirtualBusinessPage
*/
public function generateEntityPageFromTemplate(BusinessTemplate $businessTemplate, $entity, EntityManager $em)
{
Expand All @@ -72,6 +74,7 @@ public function generateEntityPageFromTemplate(BusinessTemplate $businessTemplat
}

//find Victoire\Bundle\BusinessEntityBundle\Entity\BusinessEntity object according to the given $entity

$businessEntity = $this->businessEntityHelper->findByEntityInstance($entity);

if ($businessEntity !== null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ public function buildReference(View $businessPage, EntityManager $em)
$businessPageReference->setEntityId($businessPage->getBusinessEntity()->getId());
$businessPageReference->setEntityNamespace($em->getClassMetadata(get_class($businessPage->getBusinessEntity()))->name);
$businessPageReference->setViewNamespace($em->getClassMetadata(get_class($businessPage))->name);
if ($parent = $businessPage->getParent()) {
$businessPageReference->setParent(ViewReferenceHelper::generateViewReferenceId($parent));
}

return $businessPageReference;
}
Expand Down
2 changes: 1 addition & 1 deletion Bundle/BusinessPageBundle/Entity/BusinessTemplate.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class BusinessTemplate extends Template
protected $seo;

/**
* @ORM\OneToMany(targetEntity="\Victoire\Bundle\BusinessPageBundle\Entity\BusinessPage", mappedBy="template")
* @ORM\OneToMany(targetEntity="\Victoire\Bundle\BusinessPageBundle\Entity\BusinessPage", mappedBy="template", cascade={"remove"})
*/
protected $inheritors;

Expand Down
21 changes: 10 additions & 11 deletions Bundle/BusinessPageBundle/Helper/BusinessPageHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
use Victoire\Bundle\BusinessPageBundle\Entity\BusinessTemplate;
use Victoire\Bundle\CoreBundle\Helper\UrlBuilder;
use Victoire\Bundle\QueryBundle\Helper\QueryHelper;
use Victoire\Bundle\ViewReferenceBundle\Cache\Xml\ViewReferenceXmlCacheRepository;
use Victoire\Bundle\ViewReferenceBundle\Connector\ViewReferenceRepository;
use Victoire\Bundle\ViewReferenceBundle\ViewReference\BusinessPageReference;

/**
Expand All @@ -21,22 +21,22 @@
class BusinessPageHelper
{
protected $queryHelper = null;
protected $viewCacheRepository = null;
protected $viewReferenceRepository = null;
protected $businessEntityHelper = null;
protected $parameterConverter = null;
protected $urlBuilder = null;

/**
* @param QueryHelper $queryHelper
* @param ViewReferenceXmlCacheRepository $viewCacheRepository
* @param BusinessEntityHelper $businessEntityHelper
* @param ParameterConverter $parameterConverter
* @param UrlBuilder $urlBuilder
* @param QueryHelper $queryHelper
* @param ViewReferenceRepository $viewReferenceRepository
* @param BusinessEntityHelper $businessEntityHelper
* @param ParameterConverter $parameterConverter
* @param UrlBuilder $urlBuilder
*/
public function __construct(QueryHelper $queryHelper, ViewReferenceXmlCacheRepository $viewCacheRepository, BusinessEntityHelper $businessEntityHelper, ParameterConverter $parameterConverter, UrlBuilder $urlBuilder)
public function __construct(QueryHelper $queryHelper, ViewReferenceRepository $viewReferenceRepository, BusinessEntityHelper $businessEntityHelper, ParameterConverter $parameterConverter, UrlBuilder $urlBuilder)
{
$this->queryHelper = $queryHelper;
$this->viewCacheRepository = $viewCacheRepository;
$this->viewReferenceRepository = $viewReferenceRepository;
$this->businessEntityHelper = $businessEntityHelper;
$this->parameterConverter = $parameterConverter;
$this->urlBuilder = $urlBuilder;
Expand Down Expand Up @@ -208,8 +208,7 @@ public function guessBestPatternIdForEntity($refClass, $entityId, $em, $original
'entityId' => $entityId,
'entityNamespace' => $originalRefClassName,
];

$viewReference = $this->viewCacheRepository->getOneReferenceByParameters($parameters);
$viewReference = $this->viewReferenceRepository->getOneReferenceByParameters($parameters);
}

if (!$viewReference) {
Expand Down
Loading