Commit cfce8230 authored by Taylor Otwell's avatar Taylor Otwell

improved view file loading performance.

parent 363b7c54
......@@ -23,6 +23,7 @@
- Added "to_array" method to the base Eloquent model.
- Added "$hidden" static variable to the base Eloquent model.
- Added "sync" method to has_many_and_belongs_to Eloquent relationship.
- Improved View performance by only loading contents from file once.
<a name="upgrade-3.2"></a>
## Upgrading From 3.1
......
......@@ -37,6 +37,13 @@ class View implements ArrayAccess {
*/
public static $names = array();
/**
* The cache content of loaded view files.
*
* @var array
*/
public static $cache = array();
/**
* The Laravel view loader event name.
*
......@@ -286,12 +293,7 @@ class View implements ArrayAccess {
*/
public function render()
{
// To allow bundles or other pieces of the application to modify the
// view before it is rendered, we'll fire an event, passing in the
// view instance so it can modified.
$composer = "laravel.composing: {$this->view}";
Event::fire($composer, array($this));
Event::fire("laravel.composing: {$this->view}", array($this));
// If there are listeners to the view engine event, we'll pass them
// the view so they can render it according to their needs, which
......@@ -315,6 +317,11 @@ class View implements ArrayAccess {
{
$__data = $this->data();
// The contents of each view file is cached in an array for the
// request since partial views may be rendered inside of for
// loops which could incur performance penalties.
$__content = $this->load();
ob_start() and extract($__data, EXTR_SKIP);
// We'll include the view contents for parsing within a catcher
......@@ -322,12 +329,12 @@ class View implements ArrayAccess {
// will throw it out to the exception handler.
try
{
include $this->path;
eval('?>'.$__contents);
}
// If we caught an exception, we'll silently flush the output
// buffer so that no partially rendered views get thrown out
// to the client and confuse the user.
// to the client and confuse the user with junk.
catch (\Exception $e)
{
ob_get_clean(); throw $e;
......@@ -336,6 +343,23 @@ class View implements ArrayAccess {
return ob_get_clean();
}
/**
* Get the contents of the view file from disk.
*
* @return string
*/
protected function load()
{
if (isset(static::$cache[$this->path]))
{
return static::$cache[$this->path];
}
else
{
return static::$cache[$this->path] = include $this->path;
}
}
/**
* Get the array of view data for the view instance.
*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment