Get rid of event subscribers that resolve services too early

Refs .
This commit is contained in:
Franz Liedke 2018-12-15 17:09:44 +01:00
parent df42580f7e
commit c22c74553f
6 changed files with 81 additions and 130 deletions

@ -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);
},

@ -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;

@ -1,35 +0,0 @@
<?php
/*
* This file is part of Flarum.
*
* (c) Toby Zerner <toby.zerner@gmail.com>
*
* 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);
}
}

@ -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] : []);
}
}
}

@ -0,0 +1,47 @@
<?php
/*
* This file is part of Flarum.
*
* (c) Toby Zerner <toby.zerner@gmail.com>
*
* 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] : []);
}
}
}

@ -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'];