?>
нужен только в нативных view файлах. Заголовки (headers) должны содержаться в response объекте контроллера и выводится при его отображении (метод __toString). Начальный слэш в строках аля "\MyApp\Pages\Page1\Controller::index()" не требуется, он добавляется для того чтобы избежать совпадения имен с классами php:namespace MyApp;
class ArrayObject extends \ArrayObject {}
<?php
namespace Author\Package\HTTP;
interface RouteInterface
{
public function __construct($name, $regExpUri, array $regExpParams = [], array $defaultParams = []);
/**
* Проверка ссылки на соответствие роуту.
* @param string $uri
* @return this
*/
public function checkUri($uri);
/**
* @param string $name
* @param mixed $default
* @return mixed
*/
public function getParam($name, $default = null);
/**
* @param string $name
* @return bool
*/
public function existsParam($name);
/**
* @return array
*/
public function getParams();
}
interface ResponseInterface
{
const STATUS_100 = 'Continue';
// ...
const STATUS_200 = 'OK';
// ...
const STATUS_300 = 'Multiple choices';
// ...
const STATUS_400 = 'Bad request';
// ...
const STATUS_500 = 'Internal server error';
/**
* @param array $options
* @return void
*/
public function __construct(array $options = array());
/**
* @param string $name
* @param string $value
* @return this
*/
public function setHeader($name, $value);
/**
* @param string $name
* @return array|false Array of values or false if not set
*/
public function getHeader($name);
/**
* @param bool $rewrite
* @return this
*/
public function sendHeaders($rewrite = false);
/**
* @return int
*/
public function getStatus();
/**
* @param int $code
* @return this
*/
public function setStatus($code);
/**
* @param string $body
* @return this
*/
public function setBody($body);
/**
* @return string
*/
public function getBody();
/**
* @return string
*/
public function __toString();
}
interface RequestInterface
{
const GET = 'GET';
const POST = 'POST';
const PUT = 'PUT';
const DELETE = 'DELETE';
const HEAD = 'HEAD';
const OPTIONS = 'OPTIONS';
const TRACE = 'TRACE';
const CONNECT = 'CONNECT';
/**
* @param string|true $uri If true when it's initial request
* @param array $options
* @return void
*/
public function __construct($uri, array $options = array());
/**
* @return ResponseInterface
*/
public function execute();
/**
* @return string
*/
public function getMethod();
/**
* @param string $method
* @return this
*/
public function setMethod($method);
/**
* return $this->execute();
* @return string
*/
public function __toString();
}
interface ControllerInterface
{
/**
* @param RequestInterface $request
* @param ResponseInterface $response
* @return void
*/
public function __construct(RequestInterface $request, ResponseInterface $response);
/**
* @return ResponseInterface
*/
public function execute();
/**
* @return void
*/
public function beforeAction();
/**
* @return void
*/
public function afterAction();
}
interface ExceptionInterface
{
/**
* @param RequestInterface $request
* @return this
*/
public function setRequest(RequestInterface $request);
}
class Exception extends \Exception implements ExceptionInterface
{
/**
* @var null|RequestInterface
*/
protected $request;
/**
* @var array Error code => name
*/
protected $errors = [
E_ERROR => 'Fatal error',
E_WARNING => 'Warning',
E_PARSE => 'Parse error',
E_NOTICE => 'Notice',
E_USER_ERROR => 'User error',
E_USER_WARNING => 'User warning',
E_USER_NOTICE => 'User notice',
E_STRICT => 'Strict',
E_RECOVERABLE_ERROR => 'Recoverable error',
E_DEPRECATED => 'Deprecated',
E_USER_DEPRECATED => 'User deprecated'
];
/**
* @return array
*/
final public function getErrors()
{
return $this->errors;
}
/**
* @param RequestInterface $request
* @return this
*/
final public function setRequest(RequestInterface $request)
{
$this->request = $request;
return $this;
}
}
Router::getInstance()->setRoute(new Route(
'default', // Имя роута
'(<directory>/(<controller>/(<action>/(<id>/))))', // RegExp для пути
[ // RegExp для проверки параметров
'directory' => '[0-9a-zA-Z]+',
'controller' => '[0-9a-zA-Z]+',
'action' => '[0-9a-zA-Z]+',
'id' => '[0-9]+'
],
[ // Значения по умолчанию
'directory' => 'Frontend',
'controller' => 'Page',
'action' => 'Index'
]
));
// Первичный запрос
$request = new Request(true, $_SERVER);
// Получение ответа
$response = $request->execute();
// ... и его вывод на экран
echo $response->sendHeaders(true)->getBody();