Commit 71b0ab8b authored by Taylor Otwell's avatar Taylor Otwell

refactoring container for speed.

parent 4263203d
<?php <?php
return array( return array(
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Class Aliases | Class Aliases
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Here, you can specify any class aliases that you would like registered | Here, you can specify any class aliases that you would like registered
| when Laravel loads. Aliases are lazy-loaded, so add as many as you want. | when Laravel loads. Aliases are lazy-loaded, so add as many as you want.
| |
| Aliases make it more convenient to use namespaced classes. Instead of | Aliases make it more convenient to use namespaced classes. Instead of
| referring to the class using its full namespace, you may simply use | referring to the class using its full namespace, you may simply use
| the alias defined here. | the alias defined here.
| |
| We have already aliased common Laravel classes to make your life easier. | We have already aliased common Laravel classes to make your life easier.
| |
*/ */
'Arr' => 'Laravel\\Arr', 'Arr' => 'Laravel\\Arr',
'Asset' => 'Laravel\\Asset', 'Asset' => 'Laravel\\Asset',
'Auth' => 'Laravel\\Facades\\Auth', 'Auth' => 'Laravel\\Auth',
'Benchmark' => 'Laravel\\Benchmark', 'Benchmark' => 'Laravel\\Benchmark',
'Cache' => 'Laravel\\Cache', 'Cache' => 'Laravel\\Cache',
'Config' => 'Laravel\\Config', 'Config' => 'Laravel\\Config',
'Controller' => 'Laravel\\Controller', 'Controller' => 'Laravel\\Controller',
'Cookie' => 'Laravel\\Facades\\Cookie', 'Cookie' => 'Laravel\\Cookie',
'Crypter' => 'Laravel\\Facades\\Crypter', 'Crypter' => 'Laravel\\Crypter',
'DB' => 'Laravel\\Database\\Manager', 'DB' => 'Laravel\\Database\\Manager',
'Eloquent' => 'Laravel\\Database\\Eloquent\\Model', 'Eloquent' => 'Laravel\\Database\\Eloquent\\Model',
'File' => 'Laravel\\File', 'File' => 'Laravel\\File',
'Form' => 'Laravel\\Form', 'Form' => 'Laravel\\Form',
'Hasher' => 'Laravel\\Facades\\Hasher', 'Hasher' => 'Laravel\\Facades\\Hasher',
'HTML' => 'Laravel\\HTML', 'HTML' => 'Laravel\\HTML',
'Inflector' => 'Laravel\\Inflector', 'Inflector' => 'Laravel\\Inflector',
'Input' => 'Laravel\\Facades\\Input', 'Input' => 'Laravel\\Input',
'IoC' => 'Laravel\\IoC', 'IoC' => 'Laravel\\IoC',
'Lang' => 'Laravel\\Lang', 'Lang' => 'Laravel\\Lang',
'Loader' => 'Laravel\\Loader', 'Loader' => 'Laravel\\Loader',
'Messages' => 'Laravel\\Validation\\Messages', 'Messages' => 'Laravel\\Validation\\Messages',
'Package' => 'Laravel\\Facades\\Package', 'Package' => 'Laravel\\Facades\\Package',
'URI' => 'Laravel\\Facades\\URI', 'URI' => 'Laravel\\URI',
'URL' => 'Laravel\\URL', 'URL' => 'Laravel\\URL',
'Redirect' => 'Laravel\\Redirect', 'Redirect' => 'Laravel\\Redirect',
'Request' => 'Laravel\\Facades\\Request', 'Request' => 'Laravel\\Request',
'Response' => 'Laravel\\Response', 'Response' => 'Laravel\\Response',
'Session' => 'Laravel\\Facades\\Session', 'Session' => 'Laravel\\Facades\\Session',
'Str' => 'Laravel\\Str', 'Str' => 'Laravel\\Str',
'Validator' => 'Laravel\\Validation\\Validator', 'Validator' => 'Laravel\\Validation\\Validator',
'View' => 'Laravel\\Facades\\View', 'View' => 'Laravel\\View',
); );
\ No newline at end of file
<?php <?php
return array( return array(
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Application URL | Application URL
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| The URL used to access your application. No trailing slash. | The URL used to access your application. No trailing slash.
| |
*/ */
'url' => 'http://localhost', 'url' => 'http://localhost',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Application Index | Application Index
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| If you are including the "index.php" in your URLs, you can ignore this. | If you are including the "index.php" in your URLs, you can ignore this.
| |
| However, if you are using mod_rewrite or something similar to get | However, if you are using mod_rewrite or something similar to get
| cleaner URLs, set this option to an empty string. | cleaner URLs, set this option to an empty string.
| |
*/ */
'index' => 'index.php', 'index' => 'index.php',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Application Language | Application Language
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| The default language of your application. This language will be used by | The default language of your application. This language will be used by
| Lang library as the default language when doing string localization. | Lang library as the default language when doing string localization.
| |
*/ */
'language' => 'en', 'language' => 'en',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Application Timezone | Application Timezone
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| The default timezone of your application. This timezone will be used when | The default timezone of your application. This timezone will be used when
| Laravel needs a date, such as when writing to a log file. | Laravel needs a date, such as when writing to a log file.
| |
*/ */
'timezone' => 'UTC', 'timezone' => 'UTC',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Application Character Encoding | Application Character Encoding
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| The default character encoding used by your application. This is the | The default character encoding used by your application. This is the
| character encoding that will be used by the Str, Text, and Form classes. | character encoding that will be used by the Str, Text, and Form classes.
| |
*/ */
'encoding' => 'UTF-8', 'encoding' => 'UTF-8',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Application Key | Auto-Loaded Packages
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Your application key should be a 32 character string that is totally | The packages that should be auto-loaded each time Laravel handles a
| random and secret. This key is used by the encryption class to generate | request. These should generally be packages that you use on almost every
| secure, encrypted strings. | request to your application.
| |
*/ | Each package specified here will be bootstrapped and can be conveniently
| used by your application's routes, models, and libraries.
'key' => '', |
| Note: The package names in this array should correspond to a package
/* | directory in application/packages.
|-------------------------------------------------------------------------- |
| SSL Link Generation */
|--------------------------------------------------------------------------
| 'packages' => array(),
| Many sites use SSL to protect their users data. However, you may not
| always be able to use SSL on your development machine, meaning all HTTPS /*
| will be broken during development. |--------------------------------------------------------------------------
| | Application Key
| For this reason, you may wish to disable the generation of HTTPS links |--------------------------------------------------------------------------
| throughout your application. This option does just that. All attempts to |
| generate HTTPS links will generate regular HTTP links instead. | Your application key should be a 32 character string that is totally
| | random and secret. This key is used by the encryption class to generate
*/ | secure, encrypted strings.
|
'ssl' => true, */
/* 'key' => '',
|--------------------------------------------------------------------------
| Auto-Loaded Packages /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| | SSL Link Generation
| The packages that should be auto-loaded each time Laravel handles a |--------------------------------------------------------------------------
| request. These should generally be packages that you use on almost every |
| request to your application. | Many sites use SSL to protect their users data. However, you may not
| | always be able to use SSL on your development machine, meaning all HTTPS
| Each package specified here will be bootstrapped and can be conveniently | will be broken during development.
| used by your application's routes, models, and libraries. |
| | For this reason, you may wish to disable the generation of HTTPS links
| Note: The package names in this array should correspond to a package | throughout your application. This option does just that. All attempts to
| directory in application/packages. | generate HTTPS links will generate regular HTTP links instead.
| |
*/ */
'packages' => array(), 'ssl' => true,
); );
\ No newline at end of file
<?php <?php
return array( return array(
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Retrieve The Current User | Retrieve The Current User
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| This closure is called by the Auth::user() method when attempting to | This closure is called by the Auth::user() method when attempting to
| retrieve a user by their ID stored in the session. | retrieve a user by their ID stored in the session.
| |
| Simply return an object representing the user with the given ID. Or, if | Simply return an object representing the user with the given ID. Or, if
| no user with the given ID is registered to use your application, you do | no user with the given ID is registered to use your application, you do
| not need to return anything. | not need to return anything.
| |
| Of course, a simple, elegant authentication solution is already provided | Of course, a simple, elegant authentication solution is already provided
| for you using Eloquent and the default Laravel hashing engine. | for you using Eloquent and the default Laravel hashing engine.
| |
*/ */
'user' => function($id) 'user' => function($id)
{ {
if ( ! is_null($id)) return User::find($id); if ( ! is_null($id)) return User::find($id);
}, },
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Authenticate User Credentials | Authenticate User Credentials
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| This closure is called by the Auth::attempt() method when attempting to | This closure is called by the Auth::attempt() method when attempting to
| authenticate a user that is logging into your application. | authenticate a user that is logging into your application.
| |
| If the provided credentials are correct, simply return an object that | If the provided credentials are correct, simply return an object that
| represents the user being authenticated. If the credentials are not | represents the user being authenticated. If the credentials are not
| valid, don't return anything. | valid, don't return anything.
| |
| Note: If a user object is returned, it must have an "id" property. | Note: If a user object is returned, it must have an "id" property.
| |
*/ */
'attempt' => function($username, $password) 'attempt' => function($username, $password)
{ {
if ( ! is_null($user = User::where('email', '=', $username)->first())) if ( ! is_null($user = User::where('email', '=', $username)->first()))
{ {
if (Hasher::check($password, $user->password)) return $user; if (Hasher::check($password, $user->password)) return $user;
} }
}, },
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Logout | Logout
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Here you may do anything that needs to be done when a user logs out of | Here you may do anything that needs to be done when a user logs out of
| your application, such as call the logout method on a third-party API | your application, such as call the logout method on a third-party API
| you are using for authentication, or anything else you desire. | you are using for authentication, or anything else you desire.
| |
*/ */
'logout' => function($user) {} 'logout' => function($user) {}
); );
\ No newline at end of file
<?php <?php
return array( return array(
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Cache Driver | Cache Driver
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| The name of the default cache driver for your application. | The name of the default cache driver for your application.
| |
| Caching can be used to increase the performance of your application | Caching can be used to increase the performance of your application
| by storing commonly accessed data in memory or in a file. | by storing commonly accessed data in memory or in a file.
| |
| Supported Drivers: 'file', 'memcached', 'apc'. | Supported Drivers: 'file', 'memcached', 'apc'.
| |
*/ */
'driver' => 'file', 'driver' => 'file',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Cache Key | Cache Key
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| This key will be prepended to item keys stored using Memcached and APC to | This key will be prepended to item keys stored using Memcached and APC to
| prevent collisions with other applications on the server. | prevent collisions with other applications on the server.
| |
*/ */
'key' => 'laravel', 'key' => 'laravel',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Memcached Servers | Memcached Servers
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| The Memcached servers used by your application. | The Memcached servers used by your application.
| |
| Memcached is a free and open source, high-performance, distributed memory | Memcached is a free and open source, high-performance, distributed memory
| object caching system, generic in nature, but intended for use in speeding | object caching system, generic in nature, but intended for use in speeding
| up dynamic web applications by alleviating database load. | up dynamic web applications by alleviating database load.
| |
| For more information about Memcached, check out: http://memcached.org | For more information about Memcached, check out: http://memcached.org
| |
*/ */
'servers' => array( 'servers' => array(
array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100), array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100),
), ),
); );
\ No newline at end of file
<?php <?php
return array( return array(
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Default Database Connection | Default Database Connection
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| The name of your default database connection. | The name of your default database connection.
| |
| This connection will be the default for all database operations unless a | This connection will be the default for all database operations unless a
| different connection is specified when performing the operation. | different connection is specified when performing the operation.
| |
*/ */
'default' => 'sqlite', 'default' => 'sqlite',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Database Connections | Database Connections
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| All of the database connections used by your application. | All of the database connections used by your application.
| |
| Supported Drivers: 'mysql', 'pgsql', 'sqlite'. | Supported Drivers: 'mysql', 'pgsql', 'sqlite'.
| |
| Note: When using the SQLite driver, the path and "sqlite" extention will | Note: When using the SQLite driver, the path and "sqlite" extention will
| be added automatically. You only need to specify the database name. | be added automatically. You only need to specify the database name.
| |
| Using a driver that isn't supported? You can still establish a PDO | Using a driver that isn't supported? You can still establish a PDO
| connection. Simply specify a driver and DSN option: | connection. Simply specify a driver and DSN option:
| |
| 'odbc' => array( | 'odbc' => array(
| 'driver' => 'odbc', | 'driver' => 'odbc',
| 'dsn' => 'your-dsn', | 'dsn' => 'your-dsn',
| 'username' => 'username', | 'username' => 'username',
| 'password' => 'password', | 'password' => 'password',
| ) | )
| |
| Note: When using an unsupported driver, Eloquent and the fluent query | Note: When using an unsupported driver, Eloquent and the fluent query
| builder may not work as expected. | builder may not work as expected.
| |
*/ */
'connections' => array( 'connections' => array(
'sqlite' => array( 'sqlite' => array(
'driver' => 'sqlite', 'driver' => 'sqlite',
'database' => 'application', 'database' => 'application',
), ),
'mysql' => array( 'mysql' => array(
'driver' => 'mysql', 'driver' => 'mysql',
'host' => 'localhost', 'host' => 'localhost',
'database' => 'database', 'database' => 'database',
'username' => 'root', 'username' => 'root',
'password' => 'password', 'password' => 'password',
'charset' => 'utf8', 'charset' => 'utf8',
), ),
'pgsql' => array( 'pgsql' => array(
'driver' => 'pgsql', 'driver' => 'pgsql',
'host' => 'localhost', 'host' => 'localhost',
'database' => 'database', 'database' => 'database',
'username' => 'root', 'username' => 'root',
'password' => 'password', 'password' => 'password',
'charset' => 'utf8', 'charset' => 'utf8',
), ),
), ),
); );
\ No newline at end of file
<?php <?php
return array( return array(
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Error Detail | Error Detail
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Detailed error messages contain information about the file in which | Detailed error messages contain information about the file in which
| an error occurs, a stack trace, and a snapshot of the source code | an error occurs, a stack trace, and a snapshot of the source code
| in which the error occured. | in which the error occured.
| |
| If your application is in production, consider turning off error details | If your application is in production, consider turning off error details
| for enhanced security and user experience. | for enhanced security and user experience.
| |
*/ */
'detail' => true, 'detail' => true,
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Error Logging | Error Logging
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Error Logging will use the "logger" function defined below to log error | Error Logging will use the "logger" function defined below to log error
| messages, which gives you complete freedom to determine how error | messages, which gives you complete freedom to determine how error
| messages are logged. Enjoy the flexibility. | messages are logged. Enjoy the flexibility.
| |
*/ */
'log' => false, 'log' => false,
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Error Handler | Error Handler
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Because of the various ways of managing error logging, you get complete | Because of the various ways of managing error logging, you get complete
| flexibility in Laravel to manage error logging as you see fit. | flexibility in Laravel to manage error logging as you see fit.
| |
| This function will be called when an error occurs in your application. | This function will be called when an error occurs in your application.
| You are free to handle the exception any way your heart desires. | You are free to handle the exception any way your heart desires.
| |
| The error "severity" passed to the method is a human-readable severity | The error "severity" passed to the method is a human-readable severity
| level such as "Parsing Error" or "Fatal Error". | level such as "Parsing Error" or "Fatal Error".
| |
*/ */
'handler' => function($exception, $severity, $message, $config) 'handler' => function($exception, $severity, $message, $config)
{ {
if ($config['detail']) if ($config['detail'])
{ {
$data = compact('exception', 'severity', 'message'); $data = compact('exception', 'severity', 'message');
$response = Response::view('error.exception', $data)->status(500); $response = Response::view('error.exception', $data)->status(500);
} }
else else
{ {
$response = Response::error('500'); $response = Response::error('500');
} }
$response->send(); $response->send();
}, },
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Error Logger | Error Logger
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Because of the various ways of managing error logging, you get complete | Because of the various ways of managing error logging, you get complete
| flexibility to manage error logging as you see fit. | flexibility to manage error logging as you see fit.
| |
| This function will be called when an error occurs in your application | This function will be called when an error occurs in your application
| and error loggins is enabled. You can log the error however you like. | and error loggins is enabled. You can log the error however you like.
| |
| A simple logging system has been setup for you. By default, all errors | A simple logging system has been setup for you. By default, all errors
| will be logged to the storage/log.txt file. | will be logged to the storage/log.txt file.
| |
*/ */
'logger' => function($exception, $severity, $message, $config) 'logger' => function($exception, $severity, $message, $config)
{ {
File::append(STORAGE_PATH.'log.txt', date('Y-m-d H:i:s').' '.$severity.' - '.$message.PHP_EOL); File::append(STORAGE_PATH.'log.txt', date('Y-m-d H:i:s').' '.$severity.' - '.$message.PHP_EOL);
} }
); );
\ No newline at end of file
<?php <?php
return array( return array(
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Session Driver | Session Driver
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| The name of the session driver for your application. | The name of the session driver for your application.
| |
| Since HTTP is stateless, sessions are used to maintain "state" across | Since HTTP is stateless, sessions are used to maintain "state" across
| multiple requests from the same user of your application. | multiple requests from the same user of your application.
| |
| Supported Drivers: 'cookie', 'file', 'database', 'memcached', 'apc'. | Supported Drivers: 'cookie', 'file', 'database', 'memcached', 'apc'.
| |
*/ */
'driver' => '', 'driver' => '',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Session Database | Session Database
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| The database table on which the session should be stored. | The database table on which the session should be stored.
| |
| This option is only relevant when using the "database" session driver. | This option is only relevant when using the "database" session driver.
| |
*/ */
'table' => 'sessions', 'table' => 'sessions',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Session Garbage Collection Probability | Session Garbage Collection Probability
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Some session drivers require the manual clean-up of expired sessions. | Some session drivers require the manual clean-up of expired sessions.
| This option specifies the probability of session garbage collection | This option specifies the probability of session garbage collection
| occuring for any given request. | occuring for any given request.
| |
| For example, the default value states that garbage collection has about | For example, the default value states that garbage collection has about
| a 2% (2 / 100) chance of occuring for any given request. | a 2% (2 / 100) chance of occuring for any given request.
| |
*/ */
'sweepage' => array(2, 100), 'sweepage' => array(2, 100),
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Session Lifetime | Session Lifetime
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| The number of minutes a session can be idle before expiring. | The number of minutes a session can be idle before expiring.
| |
*/ */
'lifetime' => 60, 'lifetime' => 60,
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Session Expiration On Close | Session Expiration On Close
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Determines if the session should expire when the user's web browser closes. | Determines if the session should expire when the user's web browser closes.
| |
*/ */
'expire_on_close' => false, 'expire_on_close' => false,
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Session Cookie Path | Session Cookie Path
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| The path for which the session cookie is available. | The path for which the session cookie is available.
| |
*/ */
'path' => '/', 'path' => '/',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Session Cookie Domain | Session Cookie Domain
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| The domain for which the session cookie is available. | The domain for which the session cookie is available.
| |
*/ */
'domain' => null, 'domain' => null,
); );
\ No newline at end of file
...@@ -37,7 +37,7 @@ return array( ...@@ -37,7 +37,7 @@ return array(
| |
*/ */
'GET /' => function() 'GET /' => function($application)
{ {
return View::make('home.index'); return View::make('home.index');
}, },
......
...@@ -61,7 +61,9 @@ IoC::$container = $container; ...@@ -61,7 +61,9 @@ IoC::$container = $container;
* for the lazy-loading of all of the Laravel core classes, as well as * for the lazy-loading of all of the Laravel core classes, as well as
* the developer created libraries and models. * the developer created libraries and models.
*/ */
spl_autoload_register(array($container->resolve('laravel.loader'), 'load')); spl_autoload_register(array('Laravel\\Loader', 'load'));
Loader::$aliases = Config::get('aliases');
/** /**
* Define a few convenient global functions. * Define a few convenient global functions.
......
<?php namespace Laravel; use Closure; <?php namespace Laravel; use Closure;
class Config { class Config {
/** /**
* The paths to the configuration files. * The paths to the configuration files.
* *
* @var array * @var array
*/ */
public static $paths = array(SYS_CONFIG_PATH, CONFIG_PATH); public static $paths = array(SYS_CONFIG_PATH, CONFIG_PATH);
/** /**
* All of the loaded configuration items. * All of the loaded configuration items.
* *
* The configuration arrays are keyed by their owning file name. * The configuration arrays are keyed by their owning file name.
* *
* @var array * @var array
*/ */
protected static $items = array(); protected static $items = array();
/** /**
* Determine if a configuration item or file exists. * Determine if a configuration item or file exists.
* *
* <code> * <code>
* // Determine if the "session" configuration file exists * // Determine if the "session" configuration file exists
* $exists = Config::has('session'); * $exists = Config::has('session');
* *
* // Determine if the "timezone" option exists in the "application" configuration array * // Determine if the "timezone" option exists in the "application" configuration array
* $exists = Config::has('application.timezone'); * $exists = Config::has('application.timezone');
* </code> * </code>
* *
* @param string $key * @param string $key
* @return bool * @return bool
*/ */
public static function has($key) public static function has($key)
{ {
return ! is_null(static::get($key)); return ! is_null(static::get($key));
} }
/** /**
* Get a configuration item. * Get a configuration item.
* *
* If no item is requested, the entire configuration array will be returned. * If no item is requested, the entire configuration array will be returned.
* *
* <code> * <code>
* // Get the "session" configuration array * // Get the "session" configuration array
* $session = Config::get('session'); * $session = Config::get('session');
* *
* // Get the "timezone" option from the "application" configuration file * // Get the "timezone" option from the "application" configuration file
* $timezone = Config::get('application.timezone'); * $timezone = Config::get('application.timezone');
* </code> * </code>
* *
* @param string $key * @param string $key
* @param string $default * @param string $default
* @return array * @return array
*/ */
public static function get($key, $default = null) public static function get($key, $default = null)
{ {
list($file, $key) = static::parse($key); list($file, $key) = static::parse($key);
if ( ! static::load($file)) if ( ! static::load($file))
{ {
return ($default instanceof Closure) ? call_user_func($default) : $default; return ($default instanceof Closure) ? call_user_func($default) : $default;
} }
if (is_null($key)) return static::$items[$file]; if (is_null($key)) return static::$items[$file];
return Arr::get(static::$items[$file], $key, $default); return Arr::get(static::$items[$file], $key, $default);
} }
/** /**
* Set a configuration item's value. * Set a configuration item's value.
* *
* <code> * <code>
* // Set the "session" configuration array * // Set the "session" configuration array
* Config::set('session', $array); * Config::set('session', $array);
* *
* // Set the "timezone" option in the "application" configuration file * // Set the "timezone" option in the "application" configuration file
* Config::set('application.timezone', 'UTC'); * Config::set('application.timezone', 'UTC');
* </code> * </code>
* *
* @param string $key * @param string $key
* @param mixed $value * @param mixed $value
* @return void * @return void
*/ */
public static function set($key, $value) public static function set($key, $value)
{ {
list($file, $key) = static::parse($key); list($file, $key) = static::parse($key);
static::load($file); static::load($file);
(is_null($key)) ? Arr::set(static::$items, $file, $value) : Arr::set(static::$items[$file], $key, $value); (is_null($key)) ? Arr::set(static::$items, $file, $value) : Arr::set(static::$items[$file], $key, $value);
} }
/** /**
* Parse a configuration key and return its file and key segments. * Parse a configuration key and return its file and key segments.
* *
* @param string $key * @param string $key
* @return array * @return array
*/ */
protected static function parse($key) protected static function parse($key)
{ {
$segments = explode('.', $key); $segments = explode('.', $key);
// If there is only one segment after exploding on dots, we will return NULL // If there is only one segment after exploding on dots, we will return NULL
// as the key value, causing the entire configuration array to be returned. // as the key value, causing the entire configuration array to be returned.
$key = (count($segments) > 1) ? implode('.', array_slice($segments, 1)) : null; $key = (count($segments) > 1) ? implode('.', array_slice($segments, 1)) : null;
return array($segments[0], $key); return array($segments[0], $key);
} }
/** /**
* Load all of the configuration items from a configuration file. * Load all of the configuration items from a configuration file.
* *
* @param string $file * @param string $file
* @return bool * @return bool
*/ */
protected static function load($file) protected static function load($file)
{ {
if (isset(static::$items[$file])) return true; if (isset(static::$items[$file])) return true;
$config = array(); $config = array();
// Configuration files cascade. Typically, the system configuration array is loaded // Configuration files cascade. Typically, the system configuration array is loaded
// first, followed by the application array, providing the convenient cascading // first, followed by the application array, providing the convenient cascading
// of configuration options from system to application. // of configuration options from system to application.
foreach (static::$paths as $directory) foreach (static::$paths as $directory)
{ {
if (file_exists($path = $directory.$file.EXT)) if (file_exists($path = $directory.$file.EXT))
{ {
$config = array_merge($config, require $path); $config = array_merge($config, require $path);
} }
} }
// If configuration options were actually found, they will be loaded into the // If configuration options were actually found, they will be loaded into the
// array containing all of the options for all files. The array is keyed by the // array containing all of the options for all files. The array is keyed by the
// configuration file name. // configuration file name.
if (count($config) > 0) static::$items[$file] = $config; if (count($config) > 0) static::$items[$file] = $config;
return isset(static::$items[$file]); return isset(static::$items[$file]);
} }
/** /**
* Add a directory to the configuration manager's search paths. * Add a directory to the configuration manager's search paths.
* *
* @param string $path * @param string $path
* @return void * @return void
*/ */
public static function glance($path) public static function glance($path)
{ {
static::$paths[] = $path; static::$paths[] = $path;
} }
} }
\ No newline at end of file
This diff is collapsed.
...@@ -134,19 +134,23 @@ class Container { ...@@ -134,19 +134,23 @@ class Container {
* Resolve a core Laravel class from the container. * Resolve a core Laravel class from the container.
* *
* <code> * <code>
* // Resolve the "laravel.input" class from the container * // Resolve the "laravel.router" class from the container
* $input = IoC::container()->core('input'); * $input = IoC::container()->core('input');
* *
* // Equivalent resolution using the "resolve" method * // Equivalent resolution using the "resolve" method
* $input = IoC::container()->resolve('laravel.input'); * $input = IoC::container()->resolve('laravel.router');
*
* // Pass an array of parameters to the resolver
* $input = IoC::container()->core('input', array('test'));
* </code> * </code>
* *
* @param string $name * @param string $name
* @param array $parameters
* @return mixed * @return mixed
*/ */
public function core($name) public function core($name, $parameters = array())
{ {
return $this->resolve("laravel.{$name}"); return $this->resolve("laravel.{$name}", $parameters);
} }
/** /**
...@@ -155,12 +159,16 @@ class Container { ...@@ -155,12 +159,16 @@ class Container {
* <code> * <code>
* // Get an instance of the "mailer" object registered in the container * // Get an instance of the "mailer" object registered in the container
* $mailer = IoC::container()->resolve('mailer'); * $mailer = IoC::container()->resolve('mailer');
*
* // Pass an array of parameters to the resolver
* $mailer = IoC::container()->resolve('mailer', array('test'));
* </code> * </code>
* *
* @param string $name * @param string $name
* @param array $parameters
* @return mixed * @return mixed
*/ */
public function resolve($name) public function resolve($name, $parameters = array())
{ {
if (array_key_exists($name, $this->singletons)) return $this->singletons[$name]; if (array_key_exists($name, $this->singletons)) return $this->singletons[$name];
...@@ -169,7 +177,7 @@ class Container { ...@@ -169,7 +177,7 @@ class Container {
throw new \Exception("Error resolving [$name]. No resolver has been registered in the container."); throw new \Exception("Error resolving [$name]. No resolver has been registered in the container.");
} }
$object = call_user_func($this->registry[$name]['resolver'], $this); $object = call_user_func($this->registry[$name]['resolver'], $this, $parameters);
return (isset($this->registry[$name]['singleton'])) ? $this->singletons[$name] = $object : $object; return (isset($this->registry[$name]['singleton'])) ? $this->singletons[$name] = $object : $object;
} }
......
...@@ -2,33 +2,15 @@ ...@@ -2,33 +2,15 @@
class Cookie { class Cookie {
/**
* The cookies for the current request.
*
* @var array
*/
protected $cookies;
/**
* Create a new cookie manager instance.
*
* @param array $cookies
* @return void
*/
public function __construct(&$cookies)
{
$this->cookies =& $cookies;
}
/** /**
* Determine if a cookie exists. * Determine if a cookie exists.
* *
* @param string $name * @param string $name
* @return bool * @return bool
*/ */
public function has($name) public static function has($name)
{ {
return ! is_null($this->get($name)); return ! is_null(static::get($name));
} }
/** /**
...@@ -38,9 +20,9 @@ class Cookie { ...@@ -38,9 +20,9 @@ class Cookie {
* @param mixed $default * @param mixed $default
* @return string * @return string
*/ */
public function get($name, $default = null) public static function get($name, $default = null)
{ {
return Arr::get($this->cookies, $name, $default); return Arr::get($_COOKIE, $name, $default);
} }
/** /**
...@@ -54,9 +36,9 @@ class Cookie { ...@@ -54,9 +36,9 @@ class Cookie {
* @param bool $http_only * @param bool $http_only
* @return bool * @return bool
*/ */
public function forever($name, $value, $path = '/', $domain = null, $secure = false, $http_only = false) public static function forever($name, $value, $path = '/', $domain = null, $secure = false, $http_only = false)
{ {
return $this->put($name, $value, 2628000, $path, $domain, $secure, $http_only); return static::put($name, $value, 2628000, $path, $domain, $secure, $http_only);
} }
/** /**
...@@ -77,11 +59,11 @@ class Cookie { ...@@ -77,11 +59,11 @@ class Cookie {
* @param bool $http_only * @param bool $http_only
* @return bool * @return bool
*/ */
public function put($name, $value, $minutes = 0, $path = '/', $domain = null, $secure = false, $http_only = false) public static function put($name, $value, $minutes = 0, $path = '/', $domain = null, $secure = false, $http_only = false)
{ {
if (headers_sent()) return false; if (headers_sent()) return false;
if ($minutes < 0) unset($this->cookies[$name]); if ($minutes < 0) unset($_COOKIE[$name]);
// Since PHP needs the cookie lifetime in seconds, we will calculate it here. // Since PHP needs the cookie lifetime in seconds, we will calculate it here.
// A "0" lifetime means the cookie expires when the browser closes. // A "0" lifetime means the cookie expires when the browser closes.
...@@ -96,9 +78,9 @@ class Cookie { ...@@ -96,9 +78,9 @@ class Cookie {
* @param string $name * @param string $name
* @return bool * @return bool
*/ */
public function forget($name) public static function forget($name)
{ {
return $this->put($name, null, -60); return static::put($name, null, -60);
} }
} }
\ No newline at end of file
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
use Laravel\IoC; use Laravel\IoC;
use Laravel\Str; use Laravel\Str;
use Laravel\Inflector; use Laravel\Inflector;
use Laravel\Paginator;
use Laravel\Database\Manager as DB; use Laravel\Database\Manager as DB;
abstract class Model { abstract class Model {
...@@ -223,6 +224,28 @@ abstract class Model { ...@@ -223,6 +224,28 @@ abstract class Model {
return (count($results = $this->take(1)->_get()) > 0) ? reset($results) : null; return (count($results = $this->take(1)->_get()) > 0) ? reset($results) : null;
} }
/**
* Get paginated model results as a Paginator instance.
*
* @param int $per_page
* @return Paginator
*/
private function _paginate($per_page = null)
{
$total = $this->query->count();
// The number of models to show per page may be specified as a static property
// on the model. The models shown per page may also be overriden for the model
// by passing the number into this method. If the models to show per page is
// not available via either of these avenues, a default number will be shown.
if (is_null($per_page))
{
$per_page = (property_exists(get_class($this), 'per_page')) ? static::$per_page : 20;
}
return Paginator::make($this->for_page(Paginator::page($total, $per_page), $per_page)->get(), $total, $per_page);
}
/** /**
* Retrieve the query for a 1:1 relationship. * Retrieve the query for a 1:1 relationship.
* *
...@@ -484,7 +507,7 @@ abstract class Model { ...@@ -484,7 +507,7 @@ abstract class Model {
// To allow the "with", "get", "first", and "paginate" methods to be called both // To allow the "with", "get", "first", and "paginate" methods to be called both
// staticly and on an instance, we need to have private, underscored versions // staticly and on an instance, we need to have private, underscored versions
// of the methods and handle them dynamically. // of the methods and handle them dynamically.
if (in_array($method, array('with', 'get', 'first'))) if (in_array($method, array('with', 'get', 'first', 'paginate')))
{ {
return call_user_func_array(array($this, '_'.$method), $parameters); return call_user_func_array(array($this, '_'.$method), $parameters);
} }
......
...@@ -525,7 +525,7 @@ class Query { ...@@ -525,7 +525,7 @@ class Query {
* @param array $columns * @param array $columns
* @return Paginator * @return Paginator
*/ */
public function paginate($per_page, $columns = array('*')) public function paginate($per_page = 20, $columns = array('*'))
{ {
// Calculate the current page for the request. The page number will be validated // Calculate the current page for the request. The page number will be validated
// and adjusted by the Paginator class, so we can assume it is valid. // and adjusted by the Paginator class, so we can assume it is valid.
......
...@@ -32,12 +32,6 @@ abstract class Facade { ...@@ -32,12 +32,6 @@ abstract class Facade {
} }
class Auth extends Facade { public static $resolve = 'laravel.auth'; }
class Cookie extends Facade { public static $resolve = 'laravel.cookie'; }
class Crypter extends Facade { public static $resolve = 'laravel.crypter'; } class Crypter extends Facade { public static $resolve = 'laravel.crypter'; }
class Hasher extends Facade { public static $resolve = 'laravel.hasher'; } class Hasher extends Facade { public static $resolve = 'laravel.hasher'; }
class Input extends Facade { public static $resolve = 'laravel.input'; } class Session extends Facade { public static $resolve = 'laravel.session'; }
class Request extends Facade { public static $resolve = 'laravel.request'; } \ No newline at end of file
class Session extends Facade { public static $resolve = 'laravel.session'; }
class URI extends Facade { public static $resolve = 'laravel.uri'; }
class View extends Facade { public static $resolve = 'laravel.view'; }
\ No newline at end of file
...@@ -7,14 +7,7 @@ class Input { ...@@ -7,14 +7,7 @@ class Input {
* *
* @var array * @var array
*/ */
protected $input; protected static $input;
/**
* The $_FILES array for the current request.
*
* @var array
*/
protected $files;
/** /**
* The key used to store old input in the session. * The key used to store old input in the session.
...@@ -24,16 +17,14 @@ class Input { ...@@ -24,16 +17,14 @@ class Input {
const old_input = 'laravel_old_input'; const old_input = 'laravel_old_input';
/** /**
* Create a new input manager instance. * Set the input for the current request.
* *
* @param array $input * @param array $input
* @param array $files
* @return void * @return void
*/ */
public function __construct($input, $files) public static function set($input)
{ {
$this->input = $input; static::$input = $input;
$this->files = $files;
} }
/** /**
...@@ -43,9 +34,9 @@ class Input { ...@@ -43,9 +34,9 @@ class Input {
* *
* @return array * @return array
*/ */
public function all() public static function all()
{ {
return array_merge($this->get(), $this->file()); return array_merge(static::get(), static::file());
} }
/** /**
...@@ -56,9 +47,9 @@ class Input { ...@@ -56,9 +47,9 @@ class Input {
* @param string $key * @param string $key
* @return bool * @return bool
*/ */
public function has($key) public static function has($key)
{ {
return ( ! is_null($this->get($key)) and trim((string) $this->get($key)) !== ''); return ( ! is_null(static::get($key)) and trim((string) static::get($key)) !== '');
} }
/** /**
...@@ -78,9 +69,9 @@ class Input { ...@@ -78,9 +69,9 @@ class Input {
* @param mixed $default * @param mixed $default
* @return mixed * @return mixed
*/ */
public function get($key = null, $default = null) public static function get($key = null, $default = null)
{ {
return Arr::get($this->input, $key, $default); return Arr::get(static::$input, $key, $default);
} }
/** /**
...@@ -89,9 +80,9 @@ class Input { ...@@ -89,9 +80,9 @@ class Input {
* @param string $key * @param string $key
* @return bool * @return bool
*/ */
public function had($key) public static function had($key)
{ {
return ( ! is_null($this->old($key)) and trim((string) $this->old($key)) !== ''); return ( ! is_null(static::old($key)) and trim((string) static::old($key)) !== '');
} }
/** /**
...@@ -109,7 +100,7 @@ class Input { ...@@ -109,7 +100,7 @@ class Input {
* @param mixed $default * @param mixed $default
* @return string * @return string
*/ */
public function old($key = null, $default = null) public static function old($key = null, $default = null)
{ {
if (Config::get('session.driver') == '') if (Config::get('session.driver') == '')
{ {
...@@ -136,9 +127,9 @@ class Input { ...@@ -136,9 +127,9 @@ class Input {
* @param mixed $default * @param mixed $default
* @return array * @return array
*/ */
public function file($key = null, $default = null) public static function file($key = null, $default = null)
{ {
return Arr::get($this->files, $key, $default); return Arr::get($_FILES, $key, $default);
} }
/** /**
...@@ -155,9 +146,9 @@ class Input { ...@@ -155,9 +146,9 @@ class Input {
* @param string $path * @param string $path
* @return bool * @return bool
*/ */
public function upload($key, $path) public static function upload($key, $path)
{ {
return array_key_exists($key, $this->files) ? File::upload($key, $path, $this->files) : false; return array_key_exists($key, $_FILES) ? File::upload($key, $path, $_FILES) : false;
} }
} }
\ No newline at end of file
...@@ -32,23 +32,58 @@ if (Config::get('session.driver') !== '') ...@@ -32,23 +32,58 @@ if (Config::get('session.driver') !== '')
} }
/** /**
* Resolve the incoming request instance from the IoC container * Manually load some core classes that are used on every request
* and route the request to the proper route in the application. * This allows to avoid using the loader for these classes.
* If a route is found, the route will be called with the current
* requst instance. If no route is found, the 404 response will
* be returned to the browser.
*/ */
require SYS_PATH.'uri'.EXT;
require SYS_PATH.'request'.EXT; require SYS_PATH.'request'.EXT;
require SYS_PATH.'routing/route'.EXT; require SYS_PATH.'routing/route'.EXT;
require SYS_PATH.'routing/router'.EXT; require SYS_PATH.'routing/router'.EXT;
require SYS_PATH.'routing/loader'.EXT; require SYS_PATH.'routing/loader'.EXT;
require SYS_PATH.'routing/caller'.EXT; require SYS_PATH.'routing/caller'.EXT;
$request = $container->core('request'); /**
* Gather the input to the application for the current request.
* The input will be gathered based on the current request method
* and will be set on the Input manager.
*/
$input = array();
switch (Request::method())
{
case 'GET':
$input = $_GET;
break;
case 'POST':
$input = $_POST;
break;
list($method, $uri) = array($request->method(), $request->uri()); case 'PUT':
case 'DELETE':
if (Request::spoofed())
{
$input = $_POST;
}
else
{
parse_str(file_get_contents('php://input'), $input);
}
}
unset($input[Request::spoofer]);
Input::set($input);
/**
* Route the request to the proper route in the application. If a
* route is found, the route will be called with the current request
* instance. If no route is found, the 404 response will be returned
* to the browser.
*/
list($method, $uri) = array(Request::method(), URI::get());
$route = $container->core('routing.router')->route($request, $method, $uri); $route = $container->core('routing.router')->route($method, $uri);
if ( ! is_null($route)) if ( ! is_null($route))
{ {
...@@ -75,7 +110,7 @@ $response->content = $response->render(); ...@@ -75,7 +110,7 @@ $response->content = $response->render();
*/ */
if (isset($session)) if (isset($session))
{ {
$flash = array(Input::old_input => $container->core('input')->get()); $flash = array(Input::old_input => Input::get());
$session->close($container->core('session'), Config::get('session'), $flash); $session->close($container->core('session'), Config::get('session'), $flash);
} }
......
...@@ -7,27 +7,14 @@ class Loader { ...@@ -7,27 +7,14 @@ class Loader {
* *
* @var array * @var array
*/ */
protected $paths = array(); public static $paths = array(BASE_PATH, MODEL_PATH, LIBRARY_PATH, APP_PATH);
/** /**
* The class aliases defined for the application. * The class aliases defined for the application.
* *
* @var array * @var array
*/ */
protected $aliases = array(); public static $aliases = array();
/**
* Create a new class loader instance.
*
* @param array $paths
* @param array $aliases
* @return void
*/
public function __construct($paths, $aliases = array())
{
$this->paths = $paths;
$this->aliases = $aliases;
}
/** /**
* Load the file for a given class. * Load the file for a given class.
...@@ -43,7 +30,7 @@ class Loader { ...@@ -43,7 +30,7 @@ class Loader {
* @param string $class * @param string $class
* @return void * @return void
*/ */
public function load($class) public static function load($class)
{ {
// All Laravel core classes follow a namespace to directory convention. // All Laravel core classes follow a namespace to directory convention.
// We will replace all of the namespace slashes with directory slashes. // We will replace all of the namespace slashes with directory slashes.
...@@ -51,12 +38,12 @@ class Loader { ...@@ -51,12 +38,12 @@ class Loader {
// Check to determine if an alias exists. If it does, we will define the // Check to determine if an alias exists. If it does, we will define the
// alias and bail out. Aliases are defined for most used core classes. // alias and bail out. Aliases are defined for most used core classes.
if (array_key_exists($class, $this->aliases)) if (array_key_exists($class, static::$aliases))
{ {
return class_alias($this->aliases[$class], $class); return class_alias(static::$aliases[$class], $class);
} }
foreach ($this->paths as $path) foreach (static::$paths as $path)
{ {
if (file_exists($path = $path.$file.EXT)) if (file_exists($path = $path.$file.EXT))
{ {
...@@ -74,9 +61,9 @@ class Loader { ...@@ -74,9 +61,9 @@ class Loader {
* @param string $class * @param string $class
* @return void * @return void
*/ */
public function alias($alias, $class) public static function alias($alias, $class)
{ {
$this->aliases[$alias] = $class; static::$aliases[$alias] = $class;
} }
/** /**
...@@ -85,9 +72,9 @@ class Loader { ...@@ -85,9 +72,9 @@ class Loader {
* @param string $path * @param string $path
* @return void * @return void
*/ */
public function path($path) public static function path($path)
{ {
$this->paths[] = rtrim($path, '/').'/'; static::$paths[] = rtrim($path, '/').'/';
} }
/** /**
...@@ -96,9 +83,9 @@ class Loader { ...@@ -96,9 +83,9 @@ class Loader {
* @param string $alias * @param string $alias
* @return void * @return void
*/ */
public function forget_alias($alias) public static function forget_alias($alias)
{ {
unset($this->aliases[$alias]); unset(static::$aliases[$alias]);
} }
} }
\ No newline at end of file
...@@ -54,14 +54,7 @@ class Paginator { ...@@ -54,14 +54,7 @@ class Paginator {
protected $appendage; protected $appendage;
/** /**
* The current request instance. * The pagination elements that will be generated.
*
* @var Request
*/
protected $request;
/**
* The paginatino elements that will be generated.
* *
* @var array * @var array
*/ */
...@@ -84,10 +77,6 @@ class Paginator { ...@@ -84,10 +77,6 @@ class Paginator {
$this->total = $total; $this->total = $total;
$this->results = $results; $this->results = $results;
$this->per_page = $per_page; $this->per_page = $per_page;
// Grab the active request instance. This is used to determine the current URI
// and to determine if HTTPS links should be generated.
$this->request = IoC::container()->core('request');
} }
/** /**
...@@ -112,7 +101,7 @@ class Paginator { ...@@ -112,7 +101,7 @@ class Paginator {
*/ */
public static function page($total, $per_page) public static function page($total, $per_page)
{ {
$page = IoC::container()->core('input')->get('page', 1); $page = Input::get('page', 1);
// The page will be validated and adjusted if it is less than one or greater // The page will be validated and adjusted if it is less than one or greater
// than the last page. For example, if the current page is not an integer or // than the last page. For example, if the current page is not an integer or
...@@ -253,7 +242,7 @@ class Paginator { ...@@ -253,7 +242,7 @@ class Paginator {
// We will assume the page links should use HTTPS if the current request // We will assume the page links should use HTTPS if the current request
// is also using HTTPS. Since pagination links automatically point to // is also using HTTPS. Since pagination links automatically point to
// the current URI, this makes pretty good sense. // the current URI, this makes pretty good sense.
list($uri, $secure) = array($this->request->uri(), $this->request->secure()); list($uri, $secure) = array(URI::get(), Request::secure());
return HTML::link($uri.$this->appendage($element, $page), $text, array('class' => $class), $secure); return HTML::link($uri.$this->appendage($element, $page), $text, array('class' => $class), $secure);
} }
......
<?php namespace Laravel;
/**
* The Proxy class, like the File class, is primarily intended to get rid of
* the testability problems introduced by PHP's global functions.
*
* For instance, the APC cache driver calls the APC global functions. Instead of
* calling those functions directory in the driver, we inject a Proxy instance into
* the class, which allows us to stub the global functions.
*/
class Proxy {
/**
* Magic Method for calling any global function.
*/
public function __call($method, $parameters)
{
return call_user_func_array($method, $parameters);
}
}
\ No newline at end of file
...@@ -7,21 +7,7 @@ class Request { ...@@ -7,21 +7,7 @@ class Request {
* *
* @var Routing\Route * @var Routing\Route
*/ */
public $route; public static $route;
/**
* The $_SERVER array for the current request.
*
* @var array
*/
protected $server;
/**
* The $_POST array for the current request.
*
* @var array
*/
protected $post;
/** /**
* The request data key that is used to indicate a spoofed request method. * The request data key that is used to indicate a spoofed request method.
...@@ -30,21 +16,6 @@ class Request { ...@@ -30,21 +16,6 @@ class Request {
*/ */
const spoofer = '__spoofer'; const spoofer = '__spoofer';
/**
* Create a new request instance.
*
* @param URI $uri
* @param array $server
* @param array $post
* @return void
*/
public function __construct(URI $uri, $server, $post)
{
$this->uri = $uri;
$this->post = $post;
$this->server = $server;
}
/** /**
* Get the URI for the current request. * Get the URI for the current request.
* *
...@@ -52,9 +23,9 @@ class Request { ...@@ -52,9 +23,9 @@ class Request {
* *
* @return string * @return string
*/ */
public function uri() public static function uri()
{ {
return $this->uri->get(); return URI::get();
} }
/** /**
...@@ -64,9 +35,9 @@ class Request { ...@@ -64,9 +35,9 @@ class Request {
* *
* @return string * @return string
*/ */
public function format() public static function format()
{ {
return (($extension = pathinfo($this->uri->get(), PATHINFO_EXTENSION)) !== '') ? $extension : 'html'; return (($extension = pathinfo(URI::get(), PATHINFO_EXTENSION)) !== '') ? $extension : 'html';
} }
/** /**
...@@ -78,9 +49,9 @@ class Request { ...@@ -78,9 +49,9 @@ class Request {
* *
* @return string * @return string
*/ */
public function method() public static function method()
{ {
return ($this->spoofed()) ? $this->post[Request::spoofer] : $this->server['REQUEST_METHOD']; return (static::spoofed()) ? $_POST[Request::spoofer] : $_SERVER['REQUEST_METHOD'];
} }
/** /**
...@@ -92,9 +63,9 @@ class Request { ...@@ -92,9 +63,9 @@ class Request {
* @param mixed $default * @param mixed $default
* @return string * @return string
*/ */
public function server($key = null, $default = null) public static function server($key = null, $default = null)
{ {
return Arr::get($this->server, strtoupper($key), $default); return Arr::get($_SERVER, strtoupper($key), $default);
} }
/** /**
...@@ -106,9 +77,9 @@ class Request { ...@@ -106,9 +77,9 @@ class Request {
* *
* @return bool * @return bool
*/ */
public function spoofed() public static function spoofed()
{ {
return is_array($this->post) and array_key_exists(Request::spoofer, $this->post); return is_array($_POST) and array_key_exists(Request::spoofer, $_POST);
} }
/** /**
...@@ -117,19 +88,19 @@ class Request { ...@@ -117,19 +88,19 @@ class Request {
* @param mixed $default * @param mixed $default
* @return string * @return string
*/ */
public function ip($default = '0.0.0.0') public static function ip($default = '0.0.0.0')
{ {
if (isset($this->server['HTTP_X_FORWARDED_FOR'])) if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{ {
return $this->server['HTTP_X_FORWARDED_FOR']; return $_SERVER['HTTP_X_FORWARDED_FOR'];
} }
elseif (isset($this->server['HTTP_CLIENT_IP'])) elseif (isset($_SERVER['HTTP_CLIENT_IP']))
{ {
return $this->server['HTTP_CLIENT_IP']; return $_SERVER['HTTP_CLIENT_IP'];
} }
elseif (isset($this->server['REMOTE_ADDR'])) elseif (isset($_SERVER['REMOTE_ADDR']))
{ {
return $this->server['REMOTE_ADDR']; return $_SERVER['REMOTE_ADDR'];
} }
return ($default instanceof Closure) ? call_user_func($default) : $default; return ($default instanceof Closure) ? call_user_func($default) : $default;
...@@ -143,9 +114,9 @@ class Request { ...@@ -143,9 +114,9 @@ class Request {
* *
* @return string * @return string
*/ */
public function protocol() public static function protocol()
{ {
return (isset($this->server['HTTPS']) and $this->server['HTTPS'] !== 'off') ? 'https' : 'http'; return (isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
} }
/** /**
...@@ -153,9 +124,9 @@ class Request { ...@@ -153,9 +124,9 @@ class Request {
* *
* @return bool * @return bool
*/ */
public function secure() public static function secure()
{ {
return $this->protocol() == 'https'; return static::protocol() == 'https';
} }
/** /**
...@@ -163,11 +134,11 @@ class Request { ...@@ -163,11 +134,11 @@ class Request {
* *
* @return bool * @return bool
*/ */
public function ajax() public static function ajax()
{ {
if ( ! isset($this->server['HTTP_X_REQUESTED_WITH'])) return false; if ( ! isset($_SERVER['HTTP_X_REQUESTED_WITH'])) return false;
return strtolower($this->server['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'; return strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
} }
/** /**
...@@ -175,6 +146,6 @@ class Request { ...@@ -175,6 +146,6 @@ class Request {
* *
* @return Route * @return Route
*/ */
public function route() { return $this->route; } public static function route() { return static::$route; }
} }
\ No newline at end of file
...@@ -133,7 +133,7 @@ class Response { ...@@ -133,7 +133,7 @@ class Response {
*/ */
public static function view($view, $data = array()) public static function view($view, $data = array())
{ {
return new static(IoC::container()->core('view')->make($view, $data)); return new static(View::make($view, $data));
} }
/** /**
...@@ -153,7 +153,7 @@ class Response { ...@@ -153,7 +153,7 @@ class Response {
*/ */
public static function of($name, $data = array()) public static function of($name, $data = array())
{ {
return new static(IoC::container()->core('view')->of($name, $data)); return new static(View::of($name, $data));
} }
/** /**
...@@ -177,7 +177,7 @@ class Response { ...@@ -177,7 +177,7 @@ class Response {
*/ */
public static function error($code, $data = array()) public static function error($code, $data = array())
{ {
return new static(IoC::container()->core('view')->make('error/'.$code, $data), $code); return new static(View::make('error/'.$code, $data), $code);
} }
/** /**
......
...@@ -87,12 +87,11 @@ class Router { ...@@ -87,12 +87,11 @@ class Router {
/** /**
* Search the routes for the route matching a request method and URI. * Search the routes for the route matching a request method and URI.
* *
* @param Request $request
* @param string $method * @param string $method
* @param string $uri * @param string $uri
* @return Route * @return Route
*/ */
public function route(Request $request, $method, $uri) public function route($method, $uri)
{ {
$routes = $this->loader->load($uri); $routes = $this->loader->load($uri);
...@@ -104,7 +103,7 @@ class Router { ...@@ -104,7 +103,7 @@ class Router {
// no need to spin through all of the routes. // no need to spin through all of the routes.
if (isset($routes[$destination])) if (isset($routes[$destination]))
{ {
return $request->route = new Route($destination, $routes[$destination], array()); return Request::$route = new Route($destination, $routes[$destination], array());
} }
foreach ($routes as $keys => $callback) foreach ($routes as $keys => $callback)
...@@ -120,13 +119,13 @@ class Router { ...@@ -120,13 +119,13 @@ class Router {
if (preg_match('#^'.$this->translate_wildcards($key).'$#', $destination)) if (preg_match('#^'.$this->translate_wildcards($key).'$#', $destination))
{ {
return $request->route = new Route($keys, $callback, $this->parameters($destination, $key)); return Request::$route = new Route($keys, $callback, $this->parameters($destination, $key));
} }
} }
} }
} }
return $request->route = $this->route_to_controller($method, $uri, $destination); return Request::$route = $this->route_to_controller($method, $uri, $destination);
} }
/** /**
......
<?php namespace Laravel\Security; <?php namespace Laravel\Security;
use Laravel\IoC;
use Laravel\Config; use Laravel\Config;
use Laravel\Session\Payload; use Laravel\Session\Payload;
...@@ -10,14 +11,7 @@ class Auth { ...@@ -10,14 +11,7 @@ class Auth {
* *
* @var object * @var object
*/ */
protected $user; protected static $user;
/**
* The session payload instance.
*
* @var Session\Payload
*/
protected $session;
/** /**
* The key used when storing the user ID in the session. * The key used when storing the user ID in the session.
...@@ -26,25 +20,14 @@ class Auth { ...@@ -26,25 +20,14 @@ class Auth {
*/ */
const user_key = 'laravel_user_id'; const user_key = 'laravel_user_id';
/**
* Create a new authenticator instance.
*
* @param Session\Payload $session
* @return void
*/
public function __construct(Payload $session)
{
$this->session = $session;
}
/** /**
* Determine if the current user of the application is authenticated. * Determine if the current user of the application is authenticated.
* *
* @return bool * @return bool
*/ */
public function check() public static function check()
{ {
return ! is_null($this->user()); return ! is_null(static::user());
} }
/** /**
...@@ -63,11 +46,13 @@ class Auth { ...@@ -63,11 +46,13 @@ class Auth {
* *
* @return object * @return object
*/ */
public function user() public static function user()
{ {
if ( ! is_null($this->user)) return $this->user; if ( ! is_null(static::$user)) return static::$user;
$id = IoC::container()->core('session')->get(Auth::user_key);
return $this->user = call_user_func(Config::get('auth.user'), $this->session->get(Auth::user_key)); return static::$user = call_user_func(Config::get('auth.user'), $id);
} }
/** /**
...@@ -80,11 +65,11 @@ class Auth { ...@@ -80,11 +65,11 @@ class Auth {
* @param string $password * @param string $password
* @return bool * @return bool
*/ */
public function attempt($username, $password = null) public static function attempt($username, $password = null)
{ {
if ( ! is_null($user = call_user_func(Config::get('auth.attempt'), $username, $password))) if ( ! is_null($user = call_user_func(Config::get('auth.attempt'), $username, $password)))
{ {
$this->remember($user); static::remember($user);
return true; return true;
} }
...@@ -100,11 +85,11 @@ class Auth { ...@@ -100,11 +85,11 @@ class Auth {
* @param object $user * @param object $user
* @return void * @return void
*/ */
public function remember($user) public static function remember($user)
{ {
$this->user = $user; static::$user = $user;
$this->session->put(Auth::user_key, $user->id); IoC::container()->core('session')->put(Auth::user_key, $user->id);
} }
/** /**
...@@ -114,13 +99,13 @@ class Auth { ...@@ -114,13 +99,13 @@ class Auth {
* *
* @return void * @return void
*/ */
public function logout() public static function logout()
{ {
call_user_func(Config::get('auth.logout'), $this->user()); call_user_func(Config::get('auth.logout'), static::user());
$this->user = null; static::$user = null;
$this->session->forget(Auth::user_key); IoC::container()->core('session')->forget(Auth::user_key);
} }
} }
\ No newline at end of file
<?php namespace Laravel\Security; <?php namespace Laravel\Security;
use Laravel\Config;
if (trim(Config::get('application.key')) === '')
{
throw new \Exception('The encryption class may not be used without an encryption key.');
}
class Crypter { class Crypter {
/** /**
...@@ -7,44 +14,14 @@ class Crypter { ...@@ -7,44 +14,14 @@ class Crypter {
* *
* @var string * @var string
*/ */
public $cipher; protected static $cipher = MCRYPT_RIJNDAEL_256;
/** /**
* The encryption mode. * The encryption mode.
* *
* @var string * @var string
*/ */
public $mode; protected static $mode = 'cbc';
/**
* The encryption key.
*
* @var string
*/
public $key;
/**
* Create a new Crypter instance.
*
* A valid cipher and mode supported by the Mcrypt extension must be given to the constructor.
* Also, an encryption key (typically from the application configuration) must be specified.
*
* @param string $cipher
* @param string $mode
* @param string $key
* @return void
*/
public function __construct($cipher, $mode, $key)
{
$this->key = $key;
$this->mode = $mode;
$this->cipher = $cipher;
if (trim((string) $this->key) === '')
{
throw new \Exception('The encryption class may not be used without an encryption key.');
}
}
/** /**
* Encrypt a string using Mcrypt. * Encrypt a string using Mcrypt.
...@@ -60,10 +37,10 @@ class Crypter { ...@@ -60,10 +37,10 @@ class Crypter {
* @param string $value * @param string $value
* @return string * @return string
*/ */
public function encrypt($value) public static function encrypt($value)
{ {
// Determine the most appropriate random number generator for the operating // Determine the most appropriate random number generator for the
// system and environment the application is running on. // OS and system and environment the application is running on.
if (defined('MCRYPT_DEV_URANDOM')) if (defined('MCRYPT_DEV_URANDOM'))
{ {
$randomizer = MCRYPT_DEV_URANDOM; $randomizer = MCRYPT_DEV_URANDOM;
...@@ -77,16 +54,14 @@ class Crypter { ...@@ -77,16 +54,14 @@ class Crypter {
$randomizer = MCRYPT_RAND; $randomizer = MCRYPT_RAND;
} }
$iv = mcrypt_create_iv($this->iv_size(), $randomizer); $iv = mcrypt_create_iv(static::iv_size(), $randomizer);
return base64_encode($iv.mcrypt_encrypt($this->cipher, $this->key, $value, $this->mode, $iv)); return base64_encode($iv.mcrypt_encrypt(static::$cipher, Config::get('application.key'), $value, static::$mode, $iv));
} }
/** /**
* Decrypt a string using Mcrypt. * Decrypt a string using Mcrypt.
* *
* The string will be decrypted using the cipher and mode specified when the crypter was created.
*
* <code> * <code>
* // Decrypt a string using the Mcrypt PHP extension * // Decrypt a string using the Mcrypt PHP extension
* $decrypted = Crypter::decrypt($secret); * $decrypted = Crypter::decrypt($secret);
...@@ -95,7 +70,7 @@ class Crypter { ...@@ -95,7 +70,7 @@ class Crypter {
* @param string $value * @param string $value
* @return string * @return string
*/ */
public function decrypt($value) public static function decrypt($value)
{ {
// Since all encrypted strings generated by this class are base64 encoded, we will // Since all encrypted strings generated by this class are base64 encoded, we will
// first attempt to base64 decode the string. If we can't do it, we'll bail out. // first attempt to base64 decode the string. If we can't do it, we'll bail out.
...@@ -104,10 +79,13 @@ class Crypter { ...@@ -104,10 +79,13 @@ class Crypter {
throw new \Exception('Decryption error. Input value is not valid base64 data.'); throw new \Exception('Decryption error. Input value is not valid base64 data.');
} }
// Extract the input vector and the encrypted string from the value // Extract the input vector and the encrypted string from the value.
list($iv, $value) = array(substr($value, 0, $this->iv_size()), substr($value, $this->iv_size())); // These will be used by Mcrypt to properly decrypt the value.
$iv = substr($value, 0, static::iv_size());
$value = substr($value, static::iv_size());
return rtrim(mcrypt_decrypt($this->cipher, $this->key, $value, $this->mode, $iv), "\0"); return rtrim(mcrypt_decrypt(static::$cipher, Config::get('application.key'), $value, static::$mode, $iv), "\0");
} }
/** /**
...@@ -117,9 +95,9 @@ class Crypter { ...@@ -117,9 +95,9 @@ class Crypter {
* *
* @return int * @return int
*/ */
private function iv_size() protected static function iv_size()
{ {
return mcrypt_get_iv_size($this->cipher, $this->mode); return mcrypt_get_iv_size(static::$cipher, static::$mode);
} }
} }
\ No newline at end of file
...@@ -4,37 +4,6 @@ use Laravel\Security\Crypter; ...@@ -4,37 +4,6 @@ use Laravel\Security\Crypter;
class Cookie implements Driver { class Cookie implements Driver {
/**
* The crypter instance.
*
* All session cookies have an encrypted payload. Since the session contains sensitive
* data that cannot be compromised, it is important that the payload be encrypted using
* the strong encryption provided by the Crypter class.
*
* @var Crypter
*/
private $crypter;
/**
* The cookie manager instance.
*
* @var Cookie
*/
private $cookies;
/**
* Create a new Cookie session driver instance.
*
* @param Crypter $crypter
* @param Cookie $cookies
* @return void
*/
public function __construct(Crypter $crypter, \Laravel\Cookie $cookies)
{
$this->crypter = $crypter;
$this->cookies = $cookies;
}
/** /**
* Load a session from storage by a given ID. * Load a session from storage by a given ID.
* *
...@@ -45,9 +14,9 @@ class Cookie implements Driver { ...@@ -45,9 +14,9 @@ class Cookie implements Driver {
*/ */
public function load($id) public function load($id)
{ {
if ($this->cookies->has('session_payload')) if (\Laravel\Cookie::has('session_payload'))
{ {
return unserialize($this->crypter->decrypt($this->cookies->get('session_payload'))); return unserialize(Crypter::decrypt(\Laravel\Cookie::get('session_payload')));
} }
} }
...@@ -63,9 +32,9 @@ class Cookie implements Driver { ...@@ -63,9 +32,9 @@ class Cookie implements Driver {
{ {
extract($config); extract($config);
$payload = $this->crypter->encrypt(serialize($session)); $payload = Crypter::encrypt(serialize($session));
$this->cookies->put('session_payload', $payload, $lifetime, $path, $domain); \Laravel\Cookie::put('session_payload', $payload, $lifetime, $path, $domain);
} }
/** /**
...@@ -76,7 +45,7 @@ class Cookie implements Driver { ...@@ -76,7 +45,7 @@ class Cookie implements Driver {
*/ */
public function delete($id) public function delete($id)
{ {
$this->cookies->forget('session_payload'); \Laravel\Cookie::forget('session_payload');
} }
} }
\ No newline at end of file
...@@ -2,13 +2,6 @@ ...@@ -2,13 +2,6 @@
class Cookie implements Transporter { class Cookie implements Transporter {
/**
* The cookie manager instance.
*
* @var Cookie
*/
protected $cookies;
/** /**
* The name of the cookie used to store the session ID. * The name of the cookie used to store the session ID.
* *
...@@ -16,17 +9,6 @@ class Cookie implements Transporter { ...@@ -16,17 +9,6 @@ class Cookie implements Transporter {
*/ */
const key = 'laravel_session'; const key = 'laravel_session';
/**
* Create a new cookie session transporter instance.
*
* @param Cookie $cookie
* @return void
*/
public function __construct(\Laravel\Cookie $cookies)
{
$this->cookies = $cookies;
}
/** /**
* Get the session identifier for the request. * Get the session identifier for the request.
* *
...@@ -35,7 +17,7 @@ class Cookie implements Transporter { ...@@ -35,7 +17,7 @@ class Cookie implements Transporter {
*/ */
public function get($config) public function get($config)
{ {
return $this->cookies->get(Cookie::key); return \Laravel\Cookie::get(Cookie::key);
} }
/** /**
...@@ -52,7 +34,7 @@ class Cookie implements Transporter { ...@@ -52,7 +34,7 @@ class Cookie implements Transporter {
// deleted until the user closes their browser. // deleted until the user closes their browser.
$minutes = ( ! $config['expire_on_close']) ? $config['lifetime'] : 0; $minutes = ( ! $config['expire_on_close']) ? $config['lifetime'] : 0;
$this->cookies->put(Cookie::key, $id, $minutes, $config['path'], $config['domain']); \Laravel\Cookie::put(Cookie::key, $id, $minutes, $config['path'], $config['domain']);
} }
} }
\ No newline at end of file
...@@ -9,25 +9,7 @@ class URI { ...@@ -9,25 +9,7 @@ class URI {
* *
* @var string * @var string
*/ */
protected $uri; protected static $uri;
/**
* The $_SERVER array for the current request.
*
* @var array
*/
protected $server;
/**
* Create a new URI parser instance.
*
* @param array $server
* @return void
*/
public function __construct($server)
{
$this->server = $server;
}
/** /**
* Determine the request URI. * Determine the request URI.
...@@ -41,16 +23,16 @@ class URI { ...@@ -41,16 +23,16 @@ class URI {
* *
* @return string * @return string
*/ */
public function get() public static function get()
{ {
if ( ! is_null($this->uri)) return $this->uri; if ( ! is_null(static::$uri)) return static::$uri;
if (($uri = $this->from_server()) === false) if (($uri = static::from_server()) === false)
{ {
throw new \Exception('Malformed request URI. Request terminated.'); throw new \Exception('Malformed request URI. Request terminated.');
} }
return $this->uri = $this->format($this->clean($uri)); return static::$uri = static::format(static::clean($uri));
} }
/** /**
...@@ -68,9 +50,9 @@ class URI { ...@@ -68,9 +50,9 @@ class URI {
* @param mixed $default * @param mixed $default
* @return string * @return string
*/ */
public function segment($segment = null, $default = null) public static function segment($segment = null, $default = null)
{ {
$segments = Arr::without(explode('/', $this->get()), array('')); $segments = Arr::without(explode('/', static::get()), array(''));
if ( ! is_null($segment)) $segment = $segment - 1; if ( ! is_null($segment)) $segment = $segment - 1;
...@@ -82,20 +64,20 @@ class URI { ...@@ -82,20 +64,20 @@ class URI {
* *
* @return string * @return string
*/ */
protected function from_server() protected static function from_server()
{ {
// If the PATH_INFO $_SERVER element is set, we will use since it contains // If the PATH_INFO $_SERVER element is set, we will use since it contains
// the request URI formatted perfectly for Laravel's routing engine. // the request URI formatted perfectly for Laravel's routing engine.
if (isset($this->server['PATH_INFO'])) if (isset($_SERVER['PATH_INFO']))
{ {
return $this->server['PATH_INFO']; return $_SERVER['PATH_INFO'];
} }
// If the REQUEST_URI is set, we need to extract the URL path since this // If the REQUEST_URI is set, we need to extract the URL path since this
// should return the URI formatted in a manner similar to PATH_INFO. // should return the URI formatted in a manner similar to PATH_INFO.
elseif (isset($this->server['REQUEST_URI'])) elseif (isset($_SERVER['REQUEST_URI']))
{ {
return parse_url($this->server['REQUEST_URI'], PHP_URL_PATH); return parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
} }
throw new \Exception('Unable to determine the request URI.'); throw new \Exception('Unable to determine the request URI.');
...@@ -110,7 +92,7 @@ class URI { ...@@ -110,7 +92,7 @@ class URI {
* @param string $uri * @param string $uri
* @return string * @return string
*/ */
protected function clean($uri) protected static function clean($uri)
{ {
foreach (array(parse_url(Config::get('application.url'), PHP_URL_PATH), '/index.php') as $value) foreach (array(parse_url(Config::get('application.url'), PHP_URL_PATH), '/index.php') as $value)
{ {
...@@ -128,7 +110,7 @@ class URI { ...@@ -128,7 +110,7 @@ class URI {
* @param string $uri * @param string $uri
* @return string * @return string
*/ */
protected function format($uri) protected static function format($uri)
{ {
return (($uri = trim($uri, '/')) == '') ? '/' : $uri; return (($uri = trim($uri, '/')) == '') ? '/' : $uri;
} }
......
...@@ -57,7 +57,7 @@ class URL { ...@@ -57,7 +57,7 @@ class URL {
*/ */
public static function to_asset($url, $https = null) public static function to_asset($url, $https = null)
{ {
if (is_null($https)) $https = IoC::container()->core('request')->secure(); if (is_null($https)) $https = Request::secure();
return str_replace('index.php/', '', static::to($url, $https)); return str_replace('index.php/', '', static::to($url, $https));
} }
......
...@@ -4,6 +4,7 @@ use Closure; ...@@ -4,6 +4,7 @@ use Closure;
use Laravel\IoC; use Laravel\IoC;
use Laravel\Str; use Laravel\Str;
use Laravel\Lang; use Laravel\Lang;
use Laravel\Input;
use Laravel\Database\Manager as DB; use Laravel\Database\Manager as DB;
class Validator { class Validator {
...@@ -304,9 +305,7 @@ class Validator { ...@@ -304,9 +305,7 @@ class Validator {
$value = $this->attributes[$attribute]; $value = $this->attributes[$attribute];
$files = IoC::container()->resolve('laravel.input')->file(); return (array_key_exists($attribute, Input::file())) ? $value['size'] / 1024 : Str::length(trim($value));
return (array_key_exists($attribute, $files)) ? $value['size'] / 1024 : Str::length(trim($value));
} }
/** /**
...@@ -478,7 +477,7 @@ class Validator { ...@@ -478,7 +477,7 @@ class Validator {
// the default error message for the appropriate units. // the default error message for the appropriate units.
if (in_array($rule, $this->size_rules) and ! $this->has_rule($attribute, $this->numeric_rules)) if (in_array($rule, $this->size_rules) and ! $this->has_rule($attribute, $this->numeric_rules))
{ {
return (array_key_exists($attribute, IoC::container()->resolve('laravel.input')->file())) return (array_key_exists($attribute, Input::file()))
? rtrim($message, '.').' '.Lang::line('validation.kilobytes')->get($this->language).'.' ? rtrim($message, '.').' '.Lang::line('validation.kilobytes')->get($this->language).'.'
: rtrim($message, '.').' '.Lang::line('validation.characters')->get($this->language).'.'; : rtrim($message, '.').' '.Lang::line('validation.characters')->get($this->language).'.';
} }
......
<?php namespace Laravel; use Closure; <?php namespace Laravel; use Closure;
class View_Factory { class View {
/** /**
* The directory containing the views. * The name of the view.
* *
* @var string * @var string
*/ */
public $path; public $view;
/** /**
* The path to the directory containing compiled views. * The view data.
*
* @var array
*/
public $data;
/**
* The path to the view on disk.
* *
* @var string * @var string
*/ */
public $compiled; protected $path;
/** /**
* The view composer instance. * All of the view composers for the application.
* *
* @var View_Composer * @var array
*/ */
protected $composer; protected static $composers;
/** /**
* Create a new view factory instance. * Create a new view instance.
* *
* @param View_Composer $composer * @param string $view
* @param string $path * @param array $data
* @param string $compiled
* @return void * @return void
*/ */
public function __construct(View_Composer $composer, $path, $compiled) public function __construct($view, $data = array())
{ {
$this->path = $path; $this->view = $view;
$this->composer = $composer; $this->data = $data;
$this->compiled = $compiled; $this->path = $this->path($view);
}
/**
* Get the path to a given view on disk.
*
* The view may be either a "normal" view or a "Blade" view, so we will
* need to check the view directory for either extension.
*
* @param string $view
* @return string
*/
protected function path($view)
{
$view = str_replace('.', '/', $view);
foreach (array(EXT, BLADE_EXT) as $extension)
{
if (file_exists($path = VIEW_PATH.$view.$extension)) return $path;
}
throw new \Exception("View [$view] does not exist.");
} }
/** /**
...@@ -57,9 +84,9 @@ class View_Factory { ...@@ -57,9 +84,9 @@ class View_Factory {
* @param array $data * @param array $data
* @return View * @return View
*/ */
public function make($view, $data = array()) public static function make($view, $data = array())
{ {
return new View($this, $this->composer, $view, $data, $this->path($view)); return new static($view, $data);
} }
/** /**
...@@ -79,73 +106,13 @@ class View_Factory { ...@@ -79,73 +106,13 @@ class View_Factory {
* @param array $data * @param array $data
* @return View * @return View
*/ */
public function of($name, $data = array()) public static function of($name, $data = array())
{ {
if ( ! is_null($view = $this->composer->name($name))) return $this->make($view, $data); if ( ! is_null($view = static::name($name))) return static::make($view, $data);
throw new \Exception("Named view [$name] is not defined."); throw new \Exception("Named view [$name] is not defined.");
} }
/**
* Get the path to a given view on disk.
*
* @param string $view
* @return string
*/
protected function path($view)
{
$view = str_replace('.', '/', $view);
foreach (array(EXT, BLADE_EXT) as $extension)
{
if (file_exists($path = $this->path.$view.$extension)) return $path;
}
throw new \Exception("View [$view] does not exist.");
}
/**
* Magic Method for handling the dynamic creation of named views.
*
* <code>
* // Create an instance of the "layout" named view
* $view = View::of_layout();
*
* // Create an instance of a named view with data
* $view = View::of_layout(array('name' => 'Taylor'));
* </code>
*/
public function __call($method, $parameters)
{
if (strpos($method, 'of_') === 0)
{
return $this->of(substr($method, 3), Arr::get($parameters, 0, array()));
}
}
}
class View_Composer {
/**
* The view composers.
*
* @var array
*/
protected $composers;
/**
* Create a new view composer instance.
*
* @param array $composers
* @return void
*/
public function __construct($composers)
{
$this->composers = $composers;
}
/** /**
* Find the key for a view by name. * Find the key for a view by name.
* *
...@@ -155,12 +122,14 @@ class View_Composer { ...@@ -155,12 +122,14 @@ class View_Composer {
* @param string $name * @param string $name
* @return string * @return string
*/ */
public function name($name) protected static function name($name)
{ {
if (is_null(static::$composers)) static::$composers = require APP_PATH.'composers'.EXT;
// The view's name may specified in several different ways in the composers file. // The view's name may specified in several different ways in the composers file.
// The composer may simple have a string value, which is the name. Or, the composer // The composer may simple have a string value, which is the name. Or, the composer
// could have an array value in which a "name" key exists. // could have an array value in which a "name" key exists.
foreach ($this->composers as $key => $value) foreach (static::$composers as $key => $value)
{ {
if ($name === $value or (isset($value['name']) and $name === $value['name'])) { return $key; } if ($name === $value or (isset($value['name']) and $name === $value['name'])) { return $key; }
} }
...@@ -172,80 +141,23 @@ class View_Composer { ...@@ -172,80 +141,23 @@ class View_Composer {
* @param View $view * @param View $view
* @return void * @return void
*/ */
public function compose(View $view) protected static function compose(View $view)
{ {
if (is_null(static::$composers)) static::$composers = require APP_PATH.'composers'.EXT;
// The shared composer is called for every view instance. This allows the // The shared composer is called for every view instance. This allows the
// convenient binding of global view data or partials within a single method. // convenient binding of global view data or partials within a single method.
if (isset($this->composers['shared'])) call_user_func($this->composers['shared'], $view); if (isset(static::$composers['shared'])) call_user_func(static::$composers['shared'], $view);
if (isset($this->composers[$view->view])) if (isset(static::$composers[$view->view]))
{ {
foreach ((array) $this->composers[$view->view] as $key => $value) foreach ((array) static::$composers[$view->view] as $key => $value)
{ {
if ($value instanceof Closure) return call_user_func($value, $view); if ($value instanceof Closure) return call_user_func($value, $view);
} }
} }
} }
}
class View {
/**
* The name of the view.
*
* @var string
*/
public $view;
/**
* The view data.
*
* @var array
*/
public $data;
/**
* The path to the view on disk.
*
* @var string
*/
protected $path;
/**
* The view composer instance.
*
* @var View_Composer
*/
protected $composer;
/**
* The view factory instance, which is used to create sub-views.
*
* @var View_Factory
*/
protected $factory;
/**
* Create a new view instance.
*
* @param View_Factory $factory
* @param View_Composer $composer
* @param string $view
* @param array $data
* @param string $path
* @return void
*/
public function __construct(View_Factory $factory, View_Composer $composer, $view, $data, $path)
{
$this->view = $view;
$this->data = $data;
$this->path = $path;
$this->factory = $factory;
$this->composer = $composer;
}
/** /**
* Get the evaluated string content of the view. * Get the evaluated string content of the view.
* *
...@@ -253,7 +165,7 @@ class View { ...@@ -253,7 +165,7 @@ class View {
*/ */
public function render() public function render()
{ {
$this->composer->compose($this); static::compose($this);
// All nested views and responses are evaluated before the main view. This allows // All nested views and responses are evaluated before the main view. This allows
// the assets used by these views to be added to the asset container before the // the assets used by these views to be added to the asset container before the
...@@ -288,7 +200,7 @@ class View { ...@@ -288,7 +200,7 @@ class View {
// For simplicity, compiled views are stored in a single directory by the MD5 hash of // For simplicity, compiled views are stored in a single directory by the MD5 hash of
// their name. This allows us to avoid recreating the entire view directory structure // their name. This allows us to avoid recreating the entire view directory structure
// within the compiled views directory. // within the compiled views directory.
$compiled = $this->factory->compiled.md5($this->view); $compiled = STORAGE_PATH.'views/'.md5($this->view);
// The view will only be re-compiled if the view has been modified since the last compiled // The view will only be re-compiled if the view has been modified since the last compiled
// version of the view was created or no compiled view exists. Otherwise, the path will // version of the view was created or no compiled view exists. Otherwise, the path will
...@@ -322,7 +234,7 @@ class View { ...@@ -322,7 +234,7 @@ class View {
*/ */
public function nest($key, $view, $data = array()) public function nest($key, $view, $data = array())
{ {
return $this->with($key, $this->factory->make($view, $data)); return $this->with($key, static::make($view, $data));
} }
/** /**
...@@ -373,4 +285,23 @@ class View { ...@@ -373,4 +285,23 @@ class View {
unset($this->data[$key]); unset($this->data[$key]);
} }
/**
* Magic Method for handling the dynamic creation of named views.
*
* <code>
* // Create an instance of the "layout" named view
* $view = View::of_layout();
*
* // Create an instance of a named view with data
* $view = View::of_layout(array('name' => 'Taylor'));
* </code>
*/
public static function __callStatic($method, $parameters)
{
if (strpos($method, 'of_') === 0)
{
return static::of(substr($method, 3), Arr::get($parameters, 0, array()));
}
}
} }
\ No newline at end of file
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