Completed
Push — master ( 8f7ef0...484cdc )
by Sebastian
02:37
created

CompileRenderDirective   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 31
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 1

Importance

Changes 0
Metric Value
wmc 4
lcom 0
cbo 1
dl 0
loc 31
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A __invoke() 0 20 3
1
<?php
2
3
namespace Spatie\ViewComponents;
4
5
use Illuminate\Contracts\Support\Htmlable;
6
use InvalidArgumentException;
7
8
final class CompileRenderDirective
9
{
10
    /** @var \Spatie\ViewComponents\ComponentFinder */
11
    private $componentFinder;
12
13
    public function __construct(ComponentFinder $componentFinder)
14
    {
15
        $this->componentFinder = $componentFinder;
16
    }
17
18
    public function __invoke(string $expression): string
19
    {
20
        $expressionParts = explode(',', $expression, 2);
21
22
        $componentClass = $this->componentFinder->find($expressionParts[0]);
23
24
        if (!class_exists($componentClass)) {
25
            throw new InvalidArgumentException("View component [{$componentClass}] not found.");
26
        }
27
28
        if (!array_key_exists(Htmlable::class, class_implements($componentClass))) {
29
            throw new InvalidArgumentException(
30
                "View component [{$componentClass}] must implement Illuminate\Support\Htmlable."
31
            );
32
        }
33
34
        $props = trim($expressionParts[1] ?? '[]');
35
36
        return "<?php echo app()->make({$componentClass}::class, {$props})->toHtml(); ?>";
37
    }
38
}
39