1
0
Fork 0
mirror of https://github.com/archtechx/livewire-access.git synced 2026-02-04 09:24:04 +00:00

Support Livewire-namespaced traits. Resolve #1

This commit is contained in:
Samuel Štancl 2021-04-25 19:44:35 +02:00
parent 2cc9881905
commit 0e45cfdc6e
3 changed files with 66 additions and 2 deletions

View file

@ -6,18 +6,32 @@ namespace Lean\LivewireAccess;
use ReflectionMethod;
use ReflectionProperty;
use Illuminate\Support\Str;
use ReflectionClass;
trait WithExplicitAccess
{
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)
&& 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)
{
$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)
&& count((new ReflectionProperty($this, $propertyName))->getAttributes(FrontendAccess::class)) > 0;
&& ($livewireProperties->contains($propertyName) || (count((new ReflectionProperty($this, $propertyName))->getAttributes(FrontendAccess::class)) > 0));
}
}