71 lines
1.7 KiB
PHP
71 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace Illuminate\View\Engines;
|
|
|
|
use Exception;
|
|
use Throwable;
|
|
use Illuminate\Contracts\View\Engine;
|
|
use Symfony\Component\Debug\Exception\FatalThrowableError;
|
|
|
|
class PhpEngine implements Engine
|
|
{
|
|
/**
|
|
* Get the evaluated contents of the view.
|
|
*
|
|
* @param string $path
|
|
* @param array $data
|
|
* @return string
|
|
*/
|
|
public function get($path, array $data = [])
|
|
{
|
|
return $this->evaluatePath($path, $data);
|
|
}
|
|
|
|
/**
|
|
* Get the evaluated contents of the view at the given path.
|
|
*
|
|
* @param string $__path
|
|
* @param array $__data
|
|
* @return string
|
|
*/
|
|
protected function evaluatePath($__path, $__data)
|
|
{
|
|
$obLevel = ob_get_level();
|
|
|
|
ob_start();
|
|
|
|
extract($__data, EXTR_SKIP);
|
|
|
|
// We'll evaluate the contents of the view inside a try/catch block so we can
|
|
// flush out any stray output that might get out before an error occurs or
|
|
// an exception is thrown. This prevents any partial views from leaking.
|
|
try {
|
|
include $__path;
|
|
} catch (Exception $e) {
|
|
$this->handleViewException($e, $obLevel);
|
|
} catch (Throwable $e) {
|
|
$this->handleViewException(new FatalThrowableError($e), $obLevel);
|
|
}
|
|
|
|
return ltrim(ob_get_clean());
|
|
}
|
|
|
|
/**
|
|
* Handle a view exception.
|
|
*
|
|
* @param \Exception $e
|
|
* @param int $obLevel
|
|
* @return void
|
|
*
|
|
* @throws \Exception
|
|
*/
|
|
protected function handleViewException(Exception $e, $obLevel)
|
|
{
|
|
while (ob_get_level() > $obLevel) {
|
|
ob_end_clean();
|
|
}
|
|
|
|
throw $e;
|
|
}
|
|
}
|