diff --git a/laravel/response.php b/laravel/response.php index 6264d100..0bcaf1d0 100644 --- a/laravel/response.php +++ b/laravel/response.php @@ -14,14 +14,14 @@ class Response { * * @var int */ - protected $status; + public $status; /** * The response headers. * * @var array */ - protected $headers = array(); + public $headers = array(); /** * HTTP status codes. diff --git a/laravel/routing/controller.php b/laravel/routing/controller.php index 67eb7344..dc99c713 100644 --- a/laravel/routing/controller.php +++ b/laravel/routing/controller.php @@ -28,9 +28,9 @@ abstract class Controller { * For example, a destination of "user.profile@show" would call the User_Profile * controller's show method with the given parameters. * - * @param string $destination - * @param array $parameters - * @return mixed + * @param string $destination + * @param array $parameters + * @return Response */ public static function call($destination, $parameters = array()) { @@ -43,30 +43,12 @@ public static function call($destination, $parameters = array()) $controller = static::resolve($controller); - if (is_null($controller) or static::hidden($method)) + if (is_null($controller)) { return Response::error('404'); } - // Again, as was the case with route closures, if the controller - // "before" filters return a response, it will be considered the - // response to the request and the controller method will not be - // used to handle the request to the application. - $response = Filter::run($controller->filters('before'), array(), true); - - if (is_null($response)) - { - $response = call_user_func_array(array($controller, $method), $parameters); - } - - // The after filter and the framework expects all responses to - // be instances of the Response class. If the method did not - // return an instsance of Response, we will make on now. - if ( ! $response instanceof Response) $response = new Response($response); - - Filter::run($controller->filters('after'), array($response)); - - return $response; + return $controller->execute($method, $parameters); } /** @@ -106,7 +88,7 @@ protected static function load($controller) if (file_exists($path = CONTROLLER_PATH.$controller.EXT)) { - require $path; + require_once $path; return true; } @@ -114,6 +96,41 @@ protected static function load($controller) return false; } + /** + * Execute a controller method with the given parameters. + * + * @param string $method + * @param array $parameters + * @return Response + */ + public function execute($method, $parameters = array()) + { + if (static::hidden($method)) + { + return Response::error('404'); + } + + // Again, as was the case with route closures, if the controller + // "before" filters return a response, it will be considered the + // response to the request and the controller method will not be + // used to handle the request to the application. + $response = Filter::run($this->filters('before'), array(), true); + + if (is_null($response)) + { + $response = call_user_func_array(array($this, $method), $parameters); + } + + // The after filter and the framework expects all responses to + // be instances of the Response class. If the method did not + // return an instsance of Response, we will make on now. + if ( ! $response instanceof Response) $response = new Response($response); + + Filter::run($this->filters('after'), array($response)); + + return $response; + } + /** * Determine if a given controller method is callable. * diff --git a/laravel/routing/route.php b/laravel/routing/route.php index d36c9e96..3c14dacc 100644 --- a/laravel/routing/route.php +++ b/laravel/routing/route.php @@ -186,7 +186,9 @@ public function filters($name) { if (is_array($this->callback) and isset($this->callback[$name])) { - return (array) $this->callback[$name]; + $filters = $this->callback[$name]; + + return (is_string($filters)) ? explode('|', $filters) : (array) $filters; } return array(); diff --git a/laravel/routing/router.php b/laravel/routing/router.php index c5faf12b..79c6823e 100644 --- a/laravel/routing/router.php +++ b/laravel/routing/router.php @@ -272,7 +272,7 @@ protected function parameters($uri, $route) for ($i = 0; $i < $count; $i++) { - if (preg_match('/\(.+\)/', $route[$i])) + if (preg_match('/\(.+\)/', $route[$i]) and isset($uri[$i])) { $parameters[] = $uri[$i]; }