diff options
Diffstat (limited to 'src/Wallabag/CoreBundle/Event')
4 files changed, 202 insertions, 0 deletions
diff --git a/src/Wallabag/CoreBundle/Event/Listener/LocaleListener.php b/src/Wallabag/CoreBundle/Event/Listener/LocaleListener.php new file mode 100644 index 00000000..b435d99e --- /dev/null +++ b/src/Wallabag/CoreBundle/Event/Listener/LocaleListener.php | |||
@@ -0,0 +1,44 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Event\Listener; | ||
4 | |||
5 | use Symfony\Component\EventDispatcher\EventSubscriberInterface; | ||
6 | use Symfony\Component\HttpKernel\Event\GetResponseEvent; | ||
7 | use Symfony\Component\HttpKernel\KernelEvents; | ||
8 | |||
9 | /** | ||
10 | * @see http://symfony.com/doc/current/cookbook/session/locale_sticky_session.html | ||
11 | */ | ||
12 | class LocaleListener implements EventSubscriberInterface | ||
13 | { | ||
14 | private $defaultLocale; | ||
15 | |||
16 | public function __construct($defaultLocale = 'en') | ||
17 | { | ||
18 | $this->defaultLocale = $defaultLocale; | ||
19 | } | ||
20 | |||
21 | public function onKernelRequest(GetResponseEvent $event) | ||
22 | { | ||
23 | $request = $event->getRequest(); | ||
24 | if (!$request->hasPreviousSession()) { | ||
25 | return; | ||
26 | } | ||
27 | |||
28 | // try to see if the locale has been set as a _locale routing parameter | ||
29 | if ($locale = $request->attributes->get('_locale')) { | ||
30 | $request->getSession()->set('_locale', $locale); | ||
31 | } else { | ||
32 | // if no explicit locale has been set on this request, use one from the session | ||
33 | $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale)); | ||
34 | } | ||
35 | } | ||
36 | |||
37 | public static function getSubscribedEvents() | ||
38 | { | ||
39 | return [ | ||
40 | // must be registered before the default Locale listener | ||
41 | KernelEvents::REQUEST => [['onKernelRequest', 17]], | ||
42 | ]; | ||
43 | } | ||
44 | } | ||
diff --git a/src/Wallabag/CoreBundle/Event/Listener/UserLocaleListener.php b/src/Wallabag/CoreBundle/Event/Listener/UserLocaleListener.php new file mode 100644 index 00000000..367cdfb0 --- /dev/null +++ b/src/Wallabag/CoreBundle/Event/Listener/UserLocaleListener.php | |||
@@ -0,0 +1,37 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Event\Listener; | ||
4 | |||
5 | use Symfony\Component\HttpFoundation\Session\Session; | ||
6 | use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; | ||
7 | |||
8 | /** | ||
9 | * Stores the locale of the user in the session after the | ||
10 | * login. This can be used by the LocaleListener afterwards. | ||
11 | * | ||
12 | * @see http://symfony.com/doc/master/cookbook/session/locale_sticky_session.html | ||
13 | */ | ||
14 | class UserLocaleListener | ||
15 | { | ||
16 | /** | ||
17 | * @var Session | ||
18 | */ | ||
19 | private $session; | ||
20 | |||
21 | public function __construct(Session $session) | ||
22 | { | ||
23 | $this->session = $session; | ||
24 | } | ||
25 | |||
26 | /** | ||
27 | * @param InteractiveLoginEvent $event | ||
28 | */ | ||
29 | public function onInteractiveLogin(InteractiveLoginEvent $event) | ||
30 | { | ||
31 | $user = $event->getAuthenticationToken()->getUser(); | ||
32 | |||
33 | if (null !== $user->getConfig()->getLanguage()) { | ||
34 | $this->session->set('_locale', $user->getConfig()->getLanguage()); | ||
35 | } | ||
36 | } | ||
37 | } | ||
diff --git a/src/Wallabag/CoreBundle/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php b/src/Wallabag/CoreBundle/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php new file mode 100644 index 00000000..3b4c4cf9 --- /dev/null +++ b/src/Wallabag/CoreBundle/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php | |||
@@ -0,0 +1,70 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Event\Subscriber; | ||
4 | |||
5 | use Doctrine\Common\EventSubscriber; | ||
6 | use Doctrine\ORM\Event\LifecycleEventArgs; | ||
7 | use Wallabag\CoreBundle\Entity\Entry; | ||
8 | use Doctrine\Bundle\DoctrineBundle\Registry; | ||
9 | |||
10 | /** | ||
11 | * SQLite doesn't care about cascading remove, so we need to manually remove associated stuf for an Entry. | ||
12 | * Foreign Key Support can be enabled by running `PRAGMA foreign_keys = ON;` at runtime (AT RUNTIME !). | ||
13 | * But it needs a compilation flag that not all SQLite instance has ... | ||
14 | * | ||
15 | * @see https://www.sqlite.org/foreignkeys.html#fk_enable | ||
16 | */ | ||
17 | class SQLiteCascadeDeleteSubscriber implements EventSubscriber | ||
18 | { | ||
19 | private $doctrine; | ||
20 | |||
21 | /** | ||
22 | * @param \Doctrine\Bundle\DoctrineBundle\Registry $doctrine | ||
23 | */ | ||
24 | public function __construct(Registry $doctrine) | ||
25 | { | ||
26 | $this->doctrine = $doctrine; | ||
27 | } | ||
28 | |||
29 | /** | ||
30 | * @return array | ||
31 | */ | ||
32 | public function getSubscribedEvents() | ||
33 | { | ||
34 | return [ | ||
35 | 'preRemove', | ||
36 | ]; | ||
37 | } | ||
38 | |||
39 | /** | ||
40 | * We removed everything related to the upcoming removed entry because SQLite can't handle it on it own. | ||
41 | * We do it in the preRemove, because we can't retrieve tags in the postRemove (because the entry id is gone). | ||
42 | * | ||
43 | * @param LifecycleEventArgs $args | ||
44 | */ | ||
45 | public function preRemove(LifecycleEventArgs $args) | ||
46 | { | ||
47 | $entity = $args->getEntity(); | ||
48 | |||
49 | if (!$this->doctrine->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver || | ||
50 | !$entity instanceof Entry) { | ||
51 | return; | ||
52 | } | ||
53 | |||
54 | $em = $this->doctrine->getManager(); | ||
55 | |||
56 | if (null !== $entity->getTags()) { | ||
57 | foreach ($entity->getTags() as $tag) { | ||
58 | $entity->removeTag($tag); | ||
59 | } | ||
60 | } | ||
61 | |||
62 | if (null !== $entity->getAnnotations()) { | ||
63 | foreach ($entity->getAnnotations() as $annotation) { | ||
64 | $em->remove($annotation); | ||
65 | } | ||
66 | } | ||
67 | |||
68 | $em->flush(); | ||
69 | } | ||
70 | } | ||
diff --git a/src/Wallabag/CoreBundle/Event/Subscriber/TablePrefixSubscriber.php b/src/Wallabag/CoreBundle/Event/Subscriber/TablePrefixSubscriber.php new file mode 100644 index 00000000..9013328f --- /dev/null +++ b/src/Wallabag/CoreBundle/Event/Subscriber/TablePrefixSubscriber.php | |||
@@ -0,0 +1,51 @@ | |||
1 | <?php | ||
2 | |||
3 | namespace Wallabag\CoreBundle\Event\Subscriber; | ||
4 | |||
5 | use Doctrine\Common\EventSubscriber; | ||
6 | use Doctrine\ORM\Event\LoadClassMetadataEventArgs; | ||
7 | use Doctrine\ORM\Mapping\ClassMetadataInfo; | ||
8 | |||
9 | /** | ||
10 | * Puts a prefix to each table. | ||
11 | * This way were used instead of using the built-in strategy from Doctrine, using `naming_strategy` | ||
12 | * Because it conflicts with the DefaultQuoteStrategy (that espace table name, like user for Postgres) | ||
13 | * see #1498 for more detail. | ||
14 | * | ||
15 | * Solution from : | ||
16 | * - http://stackoverflow.com/a/23860613/569101 | ||
17 | * - http://doctrine-orm.readthedocs.org/en/latest/reference/namingstrategy.html | ||
18 | */ | ||
19 | class TablePrefixSubscriber implements EventSubscriber | ||
20 | { | ||
21 | protected $prefix = ''; | ||
22 | |||
23 | public function __construct($prefix) | ||
24 | { | ||
25 | $this->prefix = (string) $prefix; | ||
26 | } | ||
27 | |||
28 | public function getSubscribedEvents() | ||
29 | { | ||
30 | return ['loadClassMetadata']; | ||
31 | } | ||
32 | |||
33 | public function loadClassMetadata(LoadClassMetadataEventArgs $args) | ||
34 | { | ||
35 | $classMetadata = $args->getClassMetadata(); | ||
36 | |||
37 | // if we are in an inheritance hierarchy, only apply this once | ||
38 | if ($classMetadata->isInheritanceTypeSingleTable() && !$classMetadata->isRootEntity()) { | ||
39 | return; | ||
40 | } | ||
41 | |||
42 | $classMetadata->setTableName($this->prefix.$classMetadata->getTableName()); | ||
43 | |||
44 | foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) { | ||
45 | if ($mapping['type'] === ClassMetadataInfo::MANY_TO_MANY && isset($classMetadata->associationMappings[$fieldName]['joinTable']['name'])) { | ||
46 | $mappedTableName = $classMetadata->associationMappings[$fieldName]['joinTable']['name']; | ||
47 | $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix.$mappedTableName; | ||
48 | } | ||
49 | } | ||
50 | } | ||
51 | } | ||