mirror of
https://github.com/flarum/framework.git
synced 2025-03-24 07:35:14 +08:00
Get rid of event subscribers that resolve services too early
Refs flarum/core#1578.
This commit is contained in:
parent
df42580f7e
commit
c22c74553f
@ -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] : []);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
47
extensions/lock/src/Listener/CreatePostWhenDiscussionIsUnlocked.php
Executable file
47
extensions/lock/src/Listener/CreatePostWhenDiscussionIsUnlocked.php
Executable file
@ -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'];
|
||||
|
Loading…
x
Reference in New Issue
Block a user