Skip to content
Closed
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: 28 additions & 1 deletion src/BlazeServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\View;
use Illuminate\View\Engines\CompilerEngine;
use function is_object;
use function method_exists;
use function spl_object_id;

class BlazeServiceProvider extends ServiceProvider
{
Expand Down Expand Up @@ -59,12 +62,36 @@ protected function registerBlazeRuntime(): void
}

// Avoid injecting the BlazeRuntime into non-Blade views (like Statamic's Antlers)
if ($view->getEngine() instanceof CompilerEngine) {
if ($this->resolveCompilerEngine($view->getEngine()) instanceof CompilerEngine) {
$view->with('__blaze', $this->app->make(BlazeRuntime::class));
}
});
}

protected function resolveCompilerEngine($engine): ?CompilerEngine
{
$seen = [];

while (true) {
if ($engine instanceof CompilerEngine) {
return $engine;
}

if (! is_object($engine) || ! method_exists($engine, 'getEngine')) {
return null;
}

$objectId = spl_object_id($engine);

if (isset($seen[$objectId])) {
return null;
}

$seen[$objectId] = true;
$engine = $engine->getEngine();
}
}

/**
* Register @blaze, @unblaze, and @endunblaze Blade directives.
*/
Expand Down
29 changes: 28 additions & 1 deletion tests/IntegrationTest.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?php

use Illuminate\Contracts\View\Engine;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Blade;
use Livewire\Blaze\Blaze;
Expand Down Expand Up @@ -49,4 +50,30 @@
// Make sure our hooks do not break views
// rendered using the regular php engine.
view('php-view')->render();
})->throwsNoExceptions();
})->throwsNoExceptions();

test('injects blaze runtime when blade engine is decorated', function () {
Artisan::call('view:clear');

$resolver = app('view.engine.resolver');
$bladeEngine = $resolver->resolve('blade');

$resolver->register('blade', function () use ($bladeEngine) {
return new class ($bladeEngine) implements Engine
{
public function __construct(protected Engine $engine) {}

public function get($path, array $data = [])
{
return $this->engine->get($path, $data);
}

public function getEngine(): Engine
{
return $this->engine;
}
};
});

view('inputs')->render();
})->throwsNoExceptions();