123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- <?php
- /**
- * Abstract controller class. Controllers should only be created using a [Request].
- *
- * Controllers methods will be automatically called in the following order by
- * the request:
- *
- * $controller = new Controller_Foo($request);
- * $controller->before();
- * $controller->action_bar();
- * $controller->after();
- *
- * The controller action should add the output it creates to
- * `$this->response->body($output)`, typically in the form of a [View], during the
- * "action" part of execution.
- *
- * @package KO7
- * @category Controller
- *
- * @copyright (c) 2007-2016 Kohana Team
- * @copyright (c) since 2016 Koseven Team
- * @license https://koseven.dev/LICENSE
- */
- abstract class KO7_Controller {
- /**
- * @var Request Request that created the controller
- */
- public $request;
- /**
- * @var Response The response that will be returned from controller
- */
- public $response;
- /**
- * Creates a new controller instance. Each controller must be constructed
- * with the request object that created it.
- *
- * @param Request $request Request that created the controller
- * @param Response $response The request's response
- *
- * @return void
- */
- public function __construct(Request $request, Response $response)
- {
- // Assign the request to the controller
- $this->request = $request;
- // Assign a response to the controller
- $this->response = $response;
- }
- /**
- * Executes the given action and calls the [Controller::before] and [Controller::after] methods.
- *
- * Can also be used to catch exceptions from actions in a single place.
- *
- * 1. Before the controller action is called, the [Controller::before] method
- * will be called.
- * 2. Next the controller action will be called.
- * 3. After the controller action is called, the [Controller::after] method
- * will be called.
- *
- * @throws HTTP_Exception_404
- * @return Response
- */
- public function execute()
- {
- // Execute the "before action" method
- $this->before();
- // Determine the action to use
- $action = 'action_'.$this->request->action();
- // If the action doesn't exist, it's a 404
- if ( ! method_exists($this, $action))
- {
- throw HTTP_Exception::factory(404,
- 'The requested URL :uri was not found on this server.',
- [':uri' => $this->request->uri()]
- )->request($this->request);
- }
- // Execute the action itself
- $this->{$action}();
- // Execute the "after action" method
- $this->after();
- // Return the response
- return $this->response;
- }
- /**
- * Automatically executed before the controller action. Can be used to set
- * class properties, do authorization checks, and execute other custom code.
- *
- * @return void
- */
- public function before()
- {
- // Nothing by default
- }
- /**
- * Automatically executed after the controller action. Can be used to apply
- * transformation to the response, add extra output, and execute
- * other custom code.
- *
- * @return void
- */
- public function after()
- {
- // Nothing by default
- }
- /**
- * Issues a HTTP redirect.
- *
- * Proxies to the [HTTP::redirect] method.
- *
- * @param string $uri URI to redirect to
- * @param int $code HTTP Status code to use for the redirect
- * @throws HTTP_Exception
- */
- public static function redirect($uri = '', $code = 302)
- {
- return HTTP::redirect( (string) $uri, $code);
- }
- /**
- * Checks the browser cache to see the response needs to be returned,
- * execution will halt and a 304 Not Modified will be sent if the
- * browser cache is up to date.
- *
- * $this->check_cache(sha1($content));
- *
- * @param string $etag Resource Etag
- * @return Response
- */
- protected function check_cache($etag = NULL)
- {
- return HTTP::check_cache($this->request, $this->response, $etag);
- }
- }
|