继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

View.php

墨色风雨
关注TA
已关注
手记 295
粉丝 75
获赞 350

<?php

 

namespace Illuminate\View;

 

use Exception;

use Throwable;

use ArrayAccess;

use BadMethodCallException;

use Illuminate\Support\Str;

use Illuminate\Support\MessageBag;

use Illuminate\Contracts\Support\Arrayable;

use Illuminate\View\Engines\EngineInterface;

use Illuminate\Contracts\Support\Renderable;

use Illuminate\Contracts\Support\MessageProvider;

use Illuminate\Contracts\View\View as ViewContract;

// namespace about the view

class View implements ArrayAccess, ViewContract

{// class view implements arrayAccess,ViewContact

    /**

     * The view factory instance.

     *

     * @var \Illuminate\View\Factory

     */

    protected $factory;//The view factory instance.

 

    /**

     * The engine implementation.

     *

     * @var \Illuminate\View\Engines\EngineInterface

     */

    protected $engine;//The engine implementation

 

    /**

     * The name of the view.

     *

     * @var string

     */

    protected $view;//The name of the view.

 

    /**

     * The array of view data.

     *

     * @var array

     */

    protected $data;//The array of view data.

 

    /**

     * The path to the view file.

     *

     * @var string

     */

    protected $path;//The path to the view file.

 

    /**

     * Create a new view instance.

     *

     * @param  \Illuminate\View\Factory  $factory

     * @param  \Illuminate\View\Engines\EngineInterface  $engine

     * @param  string  $view

     * @param  string  $path

     * @param  array   $data

     * @return void

     */

    public function __construct(Factory $factory, EngineInterface $engine, $view, $path, $data = [])

    {// create a new instance about this

        $this->view = $view;

        $this->path = $path;

        $this->engine = $engine;

        $this->factory = $factory;

 

        $this->data = $data instanceof Arrayable ? $data->toArray() : (array) $data;

    }// something about the view

 

    /**

     * Get the string contents of the view.

     *

     * @param  callable|null  $callback

     * @return string

     */

    public function render(callable $callback = null)

    {//Get the string contents of the view.

        try {

            $contents = $this->renderContents();// get the contents

 

            $response = isset($callback) ? call_user_func($callback, $this, $contents) : null;

// get response

            // Once we have the contents of the view, we will flush the sections if we are

            // done rendering all views so that there is nothing left hanging over when

            // another view gets rendered in the future by the application developer.

            $this->factory->flushSectionsIfDoneRendering();// flush Sections

 

            return ! is_null($response) ? $response : $contents;// is_null

        } catch (Exception $e) {

            $this->factory->flushSections();

 

            throw $e;//Exception

        } catch (Throwable $e) {

            $this->factory->flushSections();

 

            throw $e;

        }

    }

 

    /**

     * Get the contents of the view instance.

     *

     * @return string

     */

    protected function renderContents()

    {// render contents

        // We will keep track of the amount of views being rendered so we can flush

        // the section after the complete rendering operation is done. This will

        // clear out the sections for any separate views that may be rendered.

        $this->factory->incrementRender();// inc render

 

        $this->factory->callComposer($this);// call composer

 

        $contents = $this->getContents();// getContents

 

        // Once we've finished rendering the view, we'll decrement the render count

        // so that each sections get flushed out next time a view is created and

        // no old sections are staying around in the memory of an environment.

        $this->factory->decrementRender();// decrement Render

 

        return $contents;

    }

 

    /**

     * Get the sections of the rendered view.

     *

     * @return array

     */

    public function renderSections()

    {

        return $this->render(function () {

            return $this->factory->getSections();

        });

    }//render Sections

 

    /**

     * Get the evaluated contents of the view.

     *

     * @return string

     */

    protected function getContents()

    {

        return $this->engine->get($this->path, $this->gatherData());

    }// get contents

 

    /**

     * Get the data bound to the view instance.

     *

     * @return array

     */

    protected function gatherData()

    {//Get the data bound to the view instance

        $data = array_merge($this->factory->getShared(), $this->data);

 

        foreach ($data as $key => $value) {

            if ($value instanceof Renderable) {

                $data[$key] = $value->render();

            }

        }

 

        return $data;

    }//gather the shared and this data

 

    /**

     * Add a piece of data to the view.

     *

     * @param  string|array  $key

     * @param  mixed   $value

     * @return $this

     */

    public function with($key, $value = null)

    {// add a piece of data to the view

        if (is_array($key)) {// is array

            $this->data = array_merge($this->data, $key);

        } else {

            $this->data[$key] = $value;

        }

 

        return $this;

    }// return this

 

    /**

     * Add a view instance to the view data.

     *

     * @param  string  $key

     * @param  string  $view

     * @param  array   $data

     * @return $this

     */

    public function nest($key, $view, array $data = [])

    {

        return $this->with($key, $this->factory->make($view, $data));

    }//Add a view instance to the view data

 

    /**

     * Add validation errors to the view.

     *

     * @param  \Illuminate\Contracts\Support\MessageProvider|array  $provider

     * @return $this

     */

    public function withErrors($provider)

    {

        if ($provider instanceof MessageProvider) {

            $this->with('errors', $provider->getMessageBag());

        } else {

            $this->with('errors', new MessageBag((array) $provider));

        }// set errors

 

        return $this;

    }//Add validation errors to the view

 

    /**

     * Get the view factory instance.

     *

     * @return \Illuminate\View\Factory

     */

    public function getFactory()

    {

        return $this->factory;

    }//big get

 

    /**

     * Get the view's rendering engine.

     *

     * @return \Illuminate\View\Engines\EngineInterface

     */

    public function getEngine()

    {

        return $this->engine;

    }//get

 

    /**

     * Get the name of the view.

     *

     * @return string

     */

    public function name()

    {

        return $this->getName();

    }//get

 

    /**

     * Get the name of the view.

     *

     * @return string

     */

    public function getName()

    {

        return $this->view;

    }//get

 

    /**

     * Get the array of view data.

     *

     * @return array

     */

    public function getData()

    {

        return $this->data;

    }//get

 

    /**

     * Get the path to the view file.

     *

     * @return string

     */

    public function getPath()

    {

        return $this->path;

    }//get

 

    /**

     * Set the path to the view.

     *

     * @param  string  $path

     * @return void

     */

    public function setPath($path)

    {

        $this->path = $path;

    }//set

 

    /**

     * Determine if a piece of data is bound.

     *

     * @param  string  $key

     * @return bool

     */

    public function offsetExists($key)

    {

        return array_key_exists($key, $this->data);

    }//set

 

    /**

     * Get a piece of bound data to the view.

     *

     * @param  string  $key

     * @return mixed

     */

    public function offsetGet($key)

    {

        return $this->data[$key];

    }//set

 

    /**

     * Set a piece of data on the view.

     *

     * @param  string  $key

     * @param  mixed   $value

     * @return void

     */

    public function offsetSet($key, $value)

    {

        $this->with($key, $value);

    }//set

 

    /**

     * Unset a piece of data from the view.

     *

     * @param  string  $key

     * @return void

     */

    public function offsetUnset($key)

    {

        unset($this->data[$key]);

    }//set

 

    /**

     * Get a piece of data from the view.

     *

     * @param  string  $key

     * @return mixed

     */

    public function &__get($key)

    {

        return $this->data[$key];

    }// very good get type

 

    /**

     * Set a piece of data on the view.

     *

     * @param  string  $key

     * @param  mixed   $value

     * @return void

     */

    public function __set($key, $value)

    {

        $this->with($key, $value);

    }

 

    /**

     * Check if a piece of data is bound to the view.

     *

     * @param  string  $key

     * @return bool

     */

    public function __isset($key)

    {

        return isset($this->data[$key]);

    }

 

    /**

     * Remove a piece of bound data from the view.

     *

     * @param  string  $key

     * @return bool

     */

    public function __unset($key)

    {

        unset($this->data[$key]);

    }

 

    /**

     * Dynamically bind parameters to the view.

     *

     * @param  string  $method

     * @param  array   $parameters

     * @return \Illuminate\View\View

     *

     * @throws \BadMethodCallException

     */

    public function __call($method, $parameters)

    {

        if (Str::startsWith($method, 'with')) {

            return $this->with(Str::snake(substr($method, 4)), $parameters[0]);

        }

 

        throw new BadMethodCallException("Method [$method] does not exist on view.");

    }//Dynamically bind parameters to the view.

 

    /**

     * Get the string contents of the view.

     *

     * @return string

     */

    public function __toString()

    {

        return $this->render();

    }// to String

}

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP