Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
29 changes: 25 additions & 4 deletions src/Event/PostWasLiked.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,30 @@

class PostWasLiked
{
public function __construct(
public Post $post,
public User $user
) {
/**
* @var Post
*/
public $post;

/**
* @var User
*/
public $user;

/**
* @var User
*/
public $actor;

/**
* @param Post $post
* @param User $user
* @param User $actor
*/
public function __construct(Post $post, User $user, User $actor)
{
$this->post = $post;
$this->user = $user;
$this->actor = $actor;
}
}
29 changes: 25 additions & 4 deletions src/Event/PostWasUnliked.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,30 @@

class PostWasUnliked
{
public function __construct(
public Post $post,
public User $user
) {
/**
* @var Post
*/
public $post;

/**
* @var User
*/
public $user;

/**
* @var User
*/
public $actor;

/**
* @param Post $post
* @param User $user
* @param User $actor
*/
public function __construct(Post $post, User $user, User $actor)
{
$this->post = $post;
$this->user = $user;
$this->actor = $actor;
}
}
76 changes: 76 additions & 0 deletions src/Listener/DispatchEventsTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?php

namespace Flarum\Foundation;

use Flarum\User\User;
use Illuminate\Contracts\Events\Dispatcher;
use LogicException;

trait DispatchEventsTrait
{
/**
* @var Dispatcher
*/
protected $events;

/**
* 分发实体相关的所有事件
*
* @param object $entity 需要分发事件的实体
* @param User|null $actor 执行操作的当前用户
*/
public function dispatchEventsFor($entity, ?User $actor = null): void
{
foreach ($entity->releaseEvents() as $event) {
$this->injectActorToEvent($event, $actor);
$this->events->dispatch($event);
}
}

/**
* 安全地注入 Actor 到事件对象
*
* @param object $event 事件对象
* @param User|null $actor 需要注入的用户
*
* @throws LogicException 当事件不兼容时抛出异常
*/
protected function injectActorToEvent(object $event, ?User $actor): void
{
// 优先使用类型安全的方法注入
if ($event instanceof ActorAwareEventInterface) {
$event->setActor($actor);
return;
}

// 兼容旧版事件的属性注入(带类型检查)
if (property_exists($event, 'actor')) {
if (!$event->actor instanceof User && null !== $event->actor) {
throw new LogicException(
sprintf('Event %s has non-user type for actor property', get_class($event))
);
}

$event->actor = $actor;
return;
}

// 调试模式下的警告记录
if (getenv('FLARUM_DEBUG')) {
error_log(
sprintf('[Deprecation] Event %s does not implement actor injection interface', get_class($event))
);
}
}
}

// 配套接口定义
interface ActorAwareEventInterface
{
/**
* 设置事件关联的操作用户
*
* @param User|null $actor
*/
public function setActor(?User $actor): void;
}