Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

improved view file loading performance.

  • Loading branch information...
commit cfce823095fccc5843a78e017a5e9947399f3e0d 1 parent 363b7c5
@taylorotwell taylorotwell authored
Showing with 33 additions and 8 deletions.
  1. +1 −0  changes.md
  2. +32 −8 laravel/view.php
View
1  changes.md
@@ -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
View
40 laravel/view.php
@@ -38,6 +38,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.
*
* @var string
@@ -286,12 +293,7 @@ public static function render_each($view, array $data, $iterator, $empty = 'raw|
*/
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 @@ public function get()
{
$__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 @@ public function get()
// 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;
@@ -337,6 +344,23 @@ public function get()
}
/**
+ * 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.
*
* The shared view data will be combined with the view data.
Please sign in to comment.
Something went wrong with that request. Please try again.