Skip to content

Commit

Permalink
[LiveComponent] Add priority to PreReRender hook
Browse files Browse the repository at this point in the history
analogue with Pre- & PostMount hooks in AsTwigComponent
  • Loading branch information
sneakyvv committed Aug 24, 2023
1 parent 2609c67 commit 73bd74b
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 6 deletions.
10 changes: 8 additions & 2 deletions src/LiveComponent/src/Attribute/AsLiveComponent.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,15 @@ public static function isActionAllowed(object $component, string $action): bool
*
* @return \ReflectionMethod[]
*/
public static function preReRenderMethods(object $component): \Traversable
public static function preReRenderMethods(object $component): iterable
{
yield from self::attributeMethodsFor(PreReRender::class, $component);
$methods = iterator_to_array(self::attributeMethodsFor(PreReRender::class, $component));

usort($methods, static function (\ReflectionMethod $a, \ReflectionMethod $b) {
return $a->getAttributes(PreReRender::class)[0]->newInstance()->priority <=> $b->getAttributes(PreReRender::class)[0]->newInstance()->priority;
});

return array_reverse($methods);
}

/**
Expand Down
7 changes: 7 additions & 0 deletions src/LiveComponent/src/Attribute/PreReRender.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,11 @@
#[\Attribute(\Attribute::TARGET_METHOD)]
final class PreReRender
{
/**
* @param int $priority If multiple hooks are registered in a component, use to configure
* the order in which they are called (higher called earlier)
*/
public function __construct(public int $priority = 0)
{
}
}
28 changes: 24 additions & 4 deletions src/LiveComponent/tests/Unit/Attribute/AsLiveComponentTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

use PHPUnit\Framework\TestCase;
use Symfony\UX\LiveComponent\Attribute\AsLiveComponent;
use Symfony\UX\LiveComponent\Attribute\PreReRender;
use Symfony\UX\LiveComponent\Tests\Fixtures\Component\Component5;

/**
Expand All @@ -36,12 +37,31 @@ public function testCanGetPostHydrateMethods(): void
$this->assertSame('method5', $methods[0]->getName());
}

public function testCanGetPreReRenderMethods(): void
public function testPreMountHooksAreOrderedByPriority(): void
{
$methods = iterator_to_array(AsLiveComponent::preReRenderMethods(new Component5()));
$hooks = AsLiveComponent::preReRenderMethods(
new class() {
#[PreReRender(priority: -10)]
public function hook1()
{
}

$this->assertCount(1, $methods);
$this->assertSame('method3', $methods[0]->getName());
#[PreReRender(priority: 10)]
public function hook2()
{
}

#[PreReRender]
public function hook3()
{
}
}
);

$this->assertCount(3, $hooks);
$this->assertSame('hook2', $hooks[0]->name);
$this->assertSame('hook3', $hooks[1]->name);
$this->assertSame('hook1', $hooks[2]->name);
}

public function testCanGetLiveListeners(): void
Expand Down

0 comments on commit 73bd74b

Please sign in to comment.