From c22c74553f83043bf4e7771b3027514f4e4d660e Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Sat, 15 Dec 2018 17:09:44 +0100 Subject: [PATCH] Get rid of event subscribers that resolve services too early Refs flarum/core#1578. --- extensions/lock/extend.php | 29 ++++++-- .../AddDiscussionLockedAttributes.php | 14 +--- .../lock/src/Listener/AddLockedGambit.php | 35 --------- .../CreatePostWhenDiscussionIsLocked.php | 72 ++----------------- .../CreatePostWhenDiscussionIsUnlocked.php | 47 ++++++++++++ .../src/Listener/SaveLockedToDatabase.php | 14 +--- 6 files changed, 81 insertions(+), 130 deletions(-) delete mode 100755 extensions/lock/src/Listener/AddLockedGambit.php create mode 100755 extensions/lock/src/Listener/CreatePostWhenDiscussionIsUnlocked.php diff --git a/extensions/lock/extend.php b/extensions/lock/extend.php index 17d18685f..75c203942 100644 --- a/extensions/lock/extend.php +++ b/extensions/lock/extend.php @@ -9,9 +9,20 @@ * file that was distributed with this source code. */ +use Flarum\Api\Event\Serializing; +use Flarum\Api\Serializer\BasicDiscussionSerializer; +use Flarum\Discussion\Event\Saving; +use Flarum\Event\ConfigureDiscussionGambits; +use Flarum\Event\ConfigureNotificationTypes; +use Flarum\Event\ConfigurePostTypes; use Flarum\Extend; use Flarum\Lock\Access; +use Flarum\Lock\Event\DiscussionWasLocked; +use Flarum\Lock\Event\DiscussionWasUnlocked; +use Flarum\Lock\Gambit\LockedGambit; use Flarum\Lock\Listener; +use Flarum\Lock\Notification\DiscussionLockedBlueprint; +use Flarum\Lock\Post\DiscussionLockedPost; use Illuminate\Contracts\Events\Dispatcher; return [ @@ -23,10 +34,20 @@ return [ ->js(__DIR__.'/js/dist/admin.js'), function (Dispatcher $events) { - $events->subscribe(Listener\AddDiscussionLockedAttributes::class); - $events->subscribe(Listener\AddLockedGambit::class); - $events->subscribe(Listener\CreatePostWhenDiscussionIsLocked::class); - $events->subscribe(Listener\SaveLockedToDatabase::class); + $events->listen(ConfigureDiscussionGambits::class, function (ConfigureDiscussionGambits $event) { + $event->gambits->add(LockedGambit::class); + }); + $events->listen(Serializing::class, Listener\AddDiscussionLockedAttributes::class); + $events->listen(Saving::class, Listener\SaveLockedToDatabase::class); + + $events->listen(ConfigurePostTypes::class, function (ConfigurePostTypes $event) { + $event->add(DiscussionLockedPost::class); + }); + $events->listen(ConfigureNotificationTypes::class, function (ConfigureNotificationTypes $event) { + $event->add(DiscussionLockedBlueprint::class, BasicDiscussionSerializer::class, ['alert']); + }); + $events->listen(DiscussionWasLocked::class, Listener\CreatePostWhenDiscussionIsLocked::class); + $events->listen(DiscussionWasUnlocked::class, Listener\CreatePostWhenDiscussionIsUnlocked::class); $events->subscribe(Access\DiscussionPolicy::class); }, diff --git a/extensions/lock/src/Listener/AddDiscussionLockedAttributes.php b/extensions/lock/src/Listener/AddDiscussionLockedAttributes.php index fbd189f5b..16f3d62e4 100755 --- a/extensions/lock/src/Listener/AddDiscussionLockedAttributes.php +++ b/extensions/lock/src/Listener/AddDiscussionLockedAttributes.php @@ -13,22 +13,10 @@ namespace Flarum\Lock\Listener; use Flarum\Api\Event\Serializing; use Flarum\Api\Serializer\DiscussionSerializer; -use Illuminate\Contracts\Events\Dispatcher; class AddDiscussionLockedAttributes { - /** - * @param Dispatcher $events - */ - public function subscribe(Dispatcher $events) - { - $events->listen(Serializing::class, [$this, 'prepareApiAttributes']); - } - - /** - * @param Serializing $event - */ - public function prepareApiAttributes(Serializing $event) + public function handle(Serializing $event) { if ($event->isSerializer(DiscussionSerializer::class)) { $event->attributes['isLocked'] = (bool) $event->model->is_locked; diff --git a/extensions/lock/src/Listener/AddLockedGambit.php b/extensions/lock/src/Listener/AddLockedGambit.php deleted file mode 100755 index 148e199ae..000000000 --- a/extensions/lock/src/Listener/AddLockedGambit.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Lock\Listener; - -use Flarum\Event\ConfigureDiscussionGambits; -use Flarum\Lock\Gambit\LockedGambit; -use Illuminate\Contracts\Events\Dispatcher; - -class AddLockedGambit -{ - /** - * @param Dispatcher $events - */ - public function subscribe(Dispatcher $events) - { - $events->listen(ConfigureDiscussionGambits::class, [$this, 'configureDiscussionGambits']); - } - - /** - * @param ConfigureDiscussionGambits $event - */ - public function configureDiscussionGambits(ConfigureDiscussionGambits $event) - { - $event->gambits->add(LockedGambit::class); - } -} diff --git a/extensions/lock/src/Listener/CreatePostWhenDiscussionIsLocked.php b/extensions/lock/src/Listener/CreatePostWhenDiscussionIsLocked.php index 3234ad930..7506c22bd 100755 --- a/extensions/lock/src/Listener/CreatePostWhenDiscussionIsLocked.php +++ b/extensions/lock/src/Listener/CreatePostWhenDiscussionIsLocked.php @@ -11,17 +11,10 @@ namespace Flarum\Lock\Listener; -use Flarum\Api\Serializer\BasicDiscussionSerializer; -use Flarum\Discussion\Discussion; -use Flarum\Event\ConfigureNotificationTypes; -use Flarum\Event\ConfigurePostTypes; use Flarum\Lock\Event\DiscussionWasLocked; -use Flarum\Lock\Event\DiscussionWasUnlocked; use Flarum\Lock\Notification\DiscussionLockedBlueprint; use Flarum\Lock\Post\DiscussionLockedPost; use Flarum\Notification\NotificationSyncer; -use Flarum\User\User; -use Illuminate\Contracts\Events\Dispatcher; class CreatePostWhenDiscussionIsLocked { @@ -30,76 +23,25 @@ class CreatePostWhenDiscussionIsLocked */ protected $notifications; - /** - * @param NotificationSyncer $notifications - */ public function __construct(NotificationSyncer $notifications) { $this->notifications = $notifications; } - /** - * @param Dispatcher $events - */ - public function subscribe(Dispatcher $events) - { - $events->listen(ConfigurePostTypes::class, [$this, 'addPostType']); - $events->listen(ConfigureNotificationTypes::class, [$this, 'addNotificationType']); - $events->listen(DiscussionWasLocked::class, [$this, 'whenDiscussionWasLocked']); - $events->listen(DiscussionWasUnlocked::class, [$this, 'whenDiscussionWasUnlocked']); - } - - /** - * @param ConfigurePostTypes $event - */ - public function addPostType(ConfigurePostTypes $event) - { - $event->add(DiscussionLockedPost::class); - } - - /** - * @param ConfigureNotificationTypes $event - */ - public function addNotificationType(ConfigureNotificationTypes $event) - { - $event->add(DiscussionLockedBlueprint::class, BasicDiscussionSerializer::class, ['alert']); - } - - /** - * @param DiscussionWasLocked $event - */ - public function whenDiscussionWasLocked(DiscussionWasLocked $event) - { - $this->lockedChanged($event->discussion, $event->user, true); - } - - /** - * @param DiscussionWasUnlocked $event - */ - public function whenDiscussionWasUnlocked(DiscussionWasUnlocked $event) - { - $this->lockedChanged($event->discussion, $event->user, false); - } - - /** - * @param Discussion $discussion - * @param User $user - * @param $isLocked - */ - protected function lockedChanged(Discussion $discussion, User $user, $isLocked) + public function handle(DiscussionWasLocked $event) { $post = DiscussionLockedPost::reply( - $discussion->id, - $user->id, - $isLocked + $event->discussion->id, + $event->user->id, + true ); - $post = $discussion->mergePost($post); + $post = $event->discussion->mergePost($post); - if ($discussion->user_id !== $user->id) { + if ($event->discussion->user_id !== $event->user->id) { $notification = new DiscussionLockedBlueprint($post); - $this->notifications->sync($notification, $post->exists ? [$discussion->user] : []); + $this->notifications->sync($notification, $post->exists ? [$event->discussion->user] : []); } } } diff --git a/extensions/lock/src/Listener/CreatePostWhenDiscussionIsUnlocked.php b/extensions/lock/src/Listener/CreatePostWhenDiscussionIsUnlocked.php new file mode 100755 index 000000000..c82b101ef --- /dev/null +++ b/extensions/lock/src/Listener/CreatePostWhenDiscussionIsUnlocked.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Lock\Listener; + +use Flarum\Lock\Event\DiscussionWasUnlocked; +use Flarum\Lock\Notification\DiscussionLockedBlueprint; +use Flarum\Lock\Post\DiscussionLockedPost; +use Flarum\Notification\NotificationSyncer; + +class CreatePostWhenDiscussionIsUnlocked +{ + /** + * @var NotificationSyncer + */ + protected $notifications; + + public function __construct(NotificationSyncer $notifications) + { + $this->notifications = $notifications; + } + + public function handle(DiscussionWasUnlocked $event) + { + $post = DiscussionLockedPost::reply( + $event->discussion->id, + $event->user->id, + false + ); + + $post = $event->discussion->mergePost($post); + + if ($event->discussion->user_id !== $event->user->id) { + $notification = new DiscussionLockedBlueprint($post); + + $this->notifications->sync($notification, $post->exists ? [$event->discussion->user] : []); + } + } +} diff --git a/extensions/lock/src/Listener/SaveLockedToDatabase.php b/extensions/lock/src/Listener/SaveLockedToDatabase.php index 04bb90aa7..4784bbc3d 100755 --- a/extensions/lock/src/Listener/SaveLockedToDatabase.php +++ b/extensions/lock/src/Listener/SaveLockedToDatabase.php @@ -15,24 +15,12 @@ use Flarum\Discussion\Event\Saving; use Flarum\Lock\Event\DiscussionWasLocked; use Flarum\Lock\Event\DiscussionWasUnlocked; use Flarum\User\AssertPermissionTrait; -use Illuminate\Contracts\Events\Dispatcher; class SaveLockedToDatabase { use AssertPermissionTrait; - /** - * @param Dispatcher $events - */ - public function subscribe(Dispatcher $events) - { - $events->listen(Saving::class, [$this, 'whenSaving']); - } - - /** - * @param Saving $event - */ - public function whenSaving(Saving $event) + public function handle(Saving $event) { if (isset($event->data['attributes']['isLocked'])) { $isLocked = (bool) $event->data['attributes']['isLocked'];