diff --git a/src/ServiceProvider.php b/src/ServiceProvider.php index 284072e..be87087 100644 --- a/src/ServiceProvider.php +++ b/src/ServiceProvider.php @@ -11,6 +11,7 @@ namespace TwigBridge; +use Illuminate\View\Factory as LaravelFactory; use Illuminate\View\ViewServiceProvider; use InvalidArgumentException; use Twig\Environment; @@ -22,6 +23,7 @@ use Twig\Loader\ArrayLoader; use Twig\Loader\ChainLoader; use Twig\RuntimeLoader\ContainerRuntimeLoader; +use TwigBridge\View\Factory; /** * Bootstrap Laravel TwigBridge. @@ -284,6 +286,19 @@ function () { $this->app['config']->get('twigbridge.twig.globals', []) ); }); + + $this->app->extend('view', function (LaravelFactory $view, $app) { + $factory = new Factory($view->getEngineResolver(), $view->getFinder(), $view->getDispatcher()); + + // We will also set the container instance on this view environment since the + // view composers may be classes registered in the container, which allows + // for great testable, flexible composers for the application developer. + $factory->setContainer($app); + + $factory->share('app', $app); + + return $factory; + }); } /** diff --git a/src/View/Factory.php b/src/View/Factory.php new file mode 100644 index 0000000..5b19be2 --- /dev/null +++ b/src/View/Factory.php @@ -0,0 +1,19 @@ +getEngineFromPath($path); + if ($engine instanceof Twig) { + return new View($this, $engine, $view, $path, $data); + } + + return parent::viewInstance($view, $path, $data); + } +} diff --git a/src/View/View.php b/src/View/View.php new file mode 100644 index 0000000..304e61e --- /dev/null +++ b/src/View/View.php @@ -0,0 +1,33 @@ +factory->incrementRender(); + $this->factory->callComposer($this); + + /** @var \TwigBridge\Engine\Compiler */ + $compiler = $this->engine->getCompiler(); + $contents = $compiler->load($this->path)->renderBlock($fragment, $this->gatherData()); + + $this->factory->decrementRender(); + $this->factory->flushStateIfDoneRendering(); + + return $contents; + } catch (Throwable $e) { + $this->factory->flushState(); + + throw $e; + } + } +}