master

laravel/framework

Last updated at: 29/12/2023 09:25

PhpEngine.php

TLDR

The PhpEngine.php file in the Illuminate\View\Engines namespace contains the PhpEngine class. This class implements the Engine interface and is responsible for evaluating the contents of a view file written in PHP.

Methods

__construct(Filesystem $files)

This method is the constructor of the PhpEngine class. It takes a Filesystem instance as a parameter and assigns it to the $files property.

get($path, array $data = [])

This method is defined in the Engine interface and implemented in the PhpEngine class. It takes the path of the view file and an optional array of data. It calls the evaluatePath method passing the path and data, and returns the evaluated contents of the view file as a string.

evaluatePath($path, $data)

This method is a helper method used by the get method to evaluate the contents of the view file. It starts output buffering, loads the view file using the getRequire method of the $files property, and catches any exceptions that occur during the evaluation. It then returns the evaluated contents of the view file.

handleViewException(Throwable $e, $obLevel)

This method is a helper method used by the evaluatePath method to handle any exceptions that occur during the evaluation of the view file. It cleans up any output buffering that may have been started in the evaluatePath method before re-throwing the exception.

Classes

PhpEngine

This class implements the Engine interface and is responsible for evaluating the contents of a view file written in PHP. It contains the $files property, which is an instance of the Filesystem class. The PhpEngine class has a constructor that takes a Filesystem instance and assigns it to the $files property. It also defines the get method, the evaluatePath method, and the handleViewException method, as described in the Methods section above.

<?php

namespace Illuminate\View\Engines;

use Illuminate\Contracts\View\Engine;
use Illuminate\Filesystem\Filesystem;
use Throwable;

class PhpEngine implements Engine
{
    /**
     * The filesystem instance.
     *
     * @var \Illuminate\Filesystem\Filesystem
     */
    protected $files;

    /**
     * Create a new file engine instance.
     *
     * @param  \Illuminate\Filesystem\Filesystem  $files
     * @return void
     */
    public function __construct(Filesystem $files)
    {
        $this->files = $files;
    }

    /**
     * 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();

        // 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 {
            $this->files->getRequire($path, $data);
        } catch (Throwable $e) {
            $this->handleViewException($e, $obLevel);
        }

        return ltrim(ob_get_clean());
    }

    /**
     * Handle a view exception.
     *
     * @param  \Throwable  $e
     * @param  int  $obLevel
     * @return void
     *
     * @throws \Throwable
     */
    protected function handleViewException(Throwable $e, $obLevel)
    {
        while (ob_get_level() > $obLevel) {
            ob_end_clean();
        }

        throw $e;
    }
}