mirror of
https://github.com/archtechx/livewire-access.git
synced 2025-12-12 12:24:03 +00:00
Support Livewire-namespaced traits. Resolve #1
This commit is contained in:
parent
2cc9881905
commit
0e45cfdc6e
3 changed files with 66 additions and 2 deletions
|
|
@ -6,18 +6,32 @@ namespace Lean\LivewireAccess;
|
||||||
|
|
||||||
use ReflectionMethod;
|
use ReflectionMethod;
|
||||||
use ReflectionProperty;
|
use ReflectionProperty;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
use ReflectionClass;
|
||||||
|
|
||||||
trait WithExplicitAccess
|
trait WithExplicitAccess
|
||||||
{
|
{
|
||||||
protected function methodIsPublicAndNotDefinedOnBaseClass($methodName)
|
protected function methodIsPublicAndNotDefinedOnBaseClass($methodName)
|
||||||
{
|
{
|
||||||
|
$livewireMethods = collect((new ReflectionClass($this))->getTraits()) // Get all traits
|
||||||
|
->filter(fn ($reflection, $traitName) => Str::startsWith($traitName, 'Livewire\\')) // Filter those in Livewire namespace
|
||||||
|
->map(fn (ReflectionClass $trait) => $trait->getMethods()) // Get their methods
|
||||||
|
->map(fn (array $methods) => collect($methods)->map(fn (ReflectionMethod $method) => $method->getName())) // Convert the methods to collections of method names
|
||||||
|
->flatten(); // Flatten the collection to get merge the inner collections with method names
|
||||||
|
|
||||||
return parent::methodIsPublicAndNotDefinedOnBaseClass($methodName)
|
return parent::methodIsPublicAndNotDefinedOnBaseClass($methodName)
|
||||||
&& count((new ReflectionMethod($this, $methodName))->getAttributes(FrontendAccess::class)) > 0;
|
&& ($livewireMethods->contains($methodName) || (count((new ReflectionMethod($this, $methodName))->getAttributes(FrontendAccess::class)) > 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function propertyIsPublicAndNotDefinedOnBaseClass($propertyName)
|
public function propertyIsPublicAndNotDefinedOnBaseClass($propertyName)
|
||||||
{
|
{
|
||||||
|
$livewireProperties = collect((new ReflectionClass($this))->getTraits()) // Get all traits
|
||||||
|
->filter(fn ($reflection, $traitName) => Str::startsWith($traitName, 'Livewire\\')) // Filter those in Livewire namespace
|
||||||
|
->map(fn (ReflectionClass $trait) => $trait->getProperties()) // Get their properties
|
||||||
|
->map(fn (array $properties) => collect($properties)->map(fn (ReflectionProperty $method) => $method->getName())) // Convert the methods to collections of property names
|
||||||
|
->flatten(); // Flatten the collection to get merge the inner collections with property names
|
||||||
|
|
||||||
return parent::propertyIsPublicAndNotDefinedOnBaseClass($propertyName)
|
return parent::propertyIsPublicAndNotDefinedOnBaseClass($propertyName)
|
||||||
&& count((new ReflectionProperty($this, $propertyName))->getAttributes(FrontendAccess::class)) > 0;
|
&& ($livewireProperties->contains($propertyName) || (count((new ReflectionProperty($this, $propertyName))->getAttributes(FrontendAccess::class)) > 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
28
tests/PaginatedComponent.php
Normal file
28
tests/PaginatedComponent.php
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Lean\LivewireAccess\Tests;
|
||||||
|
|
||||||
|
use Lean\LivewireAccess\WithExplicitAccess;
|
||||||
|
use Lean\LivewireAccess\FrontendAccess;
|
||||||
|
use Livewire\Component;
|
||||||
|
use Livewire\WithPagination;
|
||||||
|
|
||||||
|
class PaginatedComponent extends Component
|
||||||
|
{
|
||||||
|
use WithExplicitAccess, WithPagination;
|
||||||
|
|
||||||
|
public string $foo = 'foo';
|
||||||
|
|
||||||
|
#[FrontendAccess]
|
||||||
|
public string $bar = 'bar';
|
||||||
|
|
||||||
|
public function abc() {}
|
||||||
|
|
||||||
|
#[FrontendAccess]
|
||||||
|
public function def() {}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
22
tests/PaginationTest.php
Normal file
22
tests/PaginationTest.php
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Lean\LivewireAccess\Tests;
|
||||||
|
|
||||||
|
use Livewire\Livewire;
|
||||||
|
|
||||||
|
class PaginationTest extends TestCase
|
||||||
|
{
|
||||||
|
/** @test */
|
||||||
|
public function livewire_trait_methods_are_supported()
|
||||||
|
{
|
||||||
|
Livewire::test(PaginatedComponent::class)
|
||||||
|
->call('gotoPage', 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @test */
|
||||||
|
public function livewire_trait_properties_are_supported()
|
||||||
|
{
|
||||||
|
Livewire::test(PaginatedComponent::class)
|
||||||
|
->call('$set', 'page', 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue