Commit cfce8230 authored by Taylor Otwell's avatar Taylor Otwell

improved view file loading performance.

parent 363b7c54
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
- Added "to_array" method to the base Eloquent model. - Added "to_array" method to the base Eloquent model.
- Added "$hidden" static variable 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. - 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> <a name="upgrade-3.2"></a>
## Upgrading From 3.1 ## Upgrading From 3.1
......
...@@ -37,6 +37,13 @@ class View implements ArrayAccess { ...@@ -37,6 +37,13 @@ class View implements ArrayAccess {
*/ */
public static $names = array(); public static $names = array();
/**
* The cache content of loaded view files.
*
* @var array
*/
public static $cache = array();
/** /**
* The Laravel view loader event name. * The Laravel view loader event name.
* *
...@@ -286,12 +293,7 @@ class View implements ArrayAccess { ...@@ -286,12 +293,7 @@ class View implements ArrayAccess {
*/ */
public function render() public function render()
{ {
// To allow bundles or other pieces of the application to modify the Event::fire("laravel.composing: {$this->view}", array($this));
// 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));
// If there are listeners to the view engine event, we'll pass them // 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 // the view so they can render it according to their needs, which
...@@ -315,6 +317,11 @@ class View implements ArrayAccess { ...@@ -315,6 +317,11 @@ class View implements ArrayAccess {
{ {
$__data = $this->data(); $__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); ob_start() and extract($__data, EXTR_SKIP);
// We'll include the view contents for parsing within a catcher // We'll include the view contents for parsing within a catcher
...@@ -322,12 +329,12 @@ class View implements ArrayAccess { ...@@ -322,12 +329,12 @@ class View implements ArrayAccess {
// will throw it out to the exception handler. // will throw it out to the exception handler.
try try
{ {
include $this->path; eval('?>'.$__contents);
} }
// If we caught an exception, we'll silently flush the output // If we caught an exception, we'll silently flush the output
// buffer so that no partially rendered views get thrown out // 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) catch (\Exception $e)
{ {
ob_get_clean(); throw $e; ob_get_clean(); throw $e;
...@@ -336,6 +343,23 @@ class View implements ArrayAccess { ...@@ -336,6 +343,23 @@ class View implements ArrayAccess {
return ob_get_clean(); 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. * 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