24.10.2017 / 14:05 | |
GreeNLine Пользователь Сейчас: Offline
Имя: Саша Регистрация: 02.02.2012
| Цитата Koenig: GreeNLine, Кстати пых потихоньку тянется к строгой типизацииэто я знаю, но пока до этого дойдет, я успею детей завести.
|
25.10.2017 / 23:25 | |
GreeNLine Пользователь Сейчас: Offline
Имя: Саша Регистрация: 02.02.2012
| Есть ли смысл в данной конструкции? Открыть спойлер Закрыть спойлер ```php <?php
namespace framework;
use framework\http\Request; use framework\http\Response; use framework\Collection; use framework\http\Cookie; use Exception; use framework\exceptions\HttpException; use ReflectionMethod; use ReflectionException; use framework\template\TemplateLoader; use framework\exceptions\TemplateNotFoundException; use framework\http\providers\ResponseTemplateProvider; use framework\http\providers\ResponseFileProvider; use framework\io\File;
/**
- @author 3kZO */ class Controller {
/* @var \framework\http\Response / protected $response;
/* @var \framework\http\Request / protected $request;
/* @var string / protected $actionMethod;
/* @var \framework\Collection / protected $routeArgs;
/* @var \framework\Container / protected $container;
/* @var \framework\Collection / protected $renderArgs;
public function __construct(Request $request, array $routeArgs = [], $actionMethod) { $this->request = $request; $this->routeArgs = new Collection($routeArgs); $this->actionMethod = $actionMethod; $this->container = Project::app()->getContainer(); $this->renderArgs = new Collection(); $this->response = new Response(); }
public function before() {
$auth = $this->container['auth']; if (null !== ($token = $this->request->cookies->get('user')))
if ($auth->is()) {
$this->container['db']->executeUpdate('UPDATE FROM users SET last_updated_at=UNIX_TIMESTAMP() WHERE id=?;', [$auth->id]);
// do stuff..
}
}
public function after() {}
public function invoke($method) { try {
$method = new ReflectionMethod(static::class, $method);
$method->invoke($this);
} catch (ReflectionException $e) {
throw new HttpException(404, $e->getMessage());
} }
public function put($key, $value) { $this->renderArgs->set($key, $value); return $this; }
public function putArgs(array $args) { /* @var [] / $args = array_merge($this->renderArgs->toArray(), $args); $this
->renderArgs
->fill($args);
return $this; }
public function template($template) { $this->putArgs([
'csrf_token' => $this->container['security']->getToken(),
'flash_messages'=> $this->container['flash']->toArray()
]); $auth = $this->container['auth']; if ($auth->is())
$this->putArgs([
'user' => $auth->toArray()
]);
try {
/** @var \framework\template\Template */
$template = TemplateLoader::load($template);
/** @var [] */
$args = $this->renderArgs->toArray();
$template->putArgs($args);
return $template;
} catch(TemplateNotFoundException $e) {
throw new HttpException(404, sprintf('Шаблон "%s" не найден', $e->getTemplate()));
} }
public function render($template) { $this
->response
->setEntity(new ResponseTemplateProvider($template));
$this->send(); }
public function renderFile(File $file) { $this
->response
->setEntity(new ResponseFileProvider($file));
$this->send(); }
public function redirect($url) { $this->response->headers->set('Location', $url); $this->send(); }
public function send() { throw new Result($this->response); }
}
Открыть спойлер Закрыть спойлер php <?php
namespace framework\http;
/**
- @author 3kZO */ interface ResponseProviderInterface { public function register(Response $response); //public function before(); public function render(); }
Открыть спойлер Закрыть спойлер php <?php
namespace framework\http; use framework\Collection; use framework\http\ResponseProviderInterface;
/**
- @author 3kZO */ class Response {
/ @var string */ private $entity; / @var int / private $statusCode; private $statusText; /** @var string / private $contentType; / @var [] */ public $headers; /
- @var Cookie[] */ private $cookies;
public function __construct( $statusCode = 200, $statusText = null, array $headers = [] ) { $this->setStatusCode($statusCode); $this->setStatusText($statusText); $this->setContentType('text/html'); $this->headers = new Collection($headers); $this->cookies = []; }
public function setEntity(ResponseProviderInterface $provider) { $this->entity = $provider; return $this; }
public function getEntity() { return $this->entity; }
public function setStatusCode($code) { $this->statusCode = (int)$code; return $this; }
public function getStatusCode() { return $this->statusCode; }
public function setStatusText($text) { $this->statusText = (string)$text; return $this; }
public function getStatusText() { return $this->statusText; }
public function setContentType($contentType) { $this->contentType = $contentType; return $this; }
public function getContentType() { return $this->contentType; }
public function setAcceptableContentTypes(array $contentTypes) { $this->headers->set('Accept', implode(',', $contentTypes)); return $this; }
public function setCookie(Cookie $cookie) { $this->cookies[] = $cookie; return $this; }
public function getContent() { $this->entity->register($this); return $this->entity->render(); }
public function sendHeaders() { //if (!headers_sent()) {
header('HTTP/1.1 ' . $this->statusCode, true);
header('Content-Type: ' . $this->contentType, true);
foreach($this->headers->toArray() as $header => $value)
header($header . ':' . $value, true);
foreach($this->cookies as $cookie) {
$expires = gmdate('D, d-M-Y H:i:s T',
$cookie->expire);
$max_age = $cookie->expire - time();
header('Set-Cookie: ' . $cookie->name . '=' . $cookie->value
. '; expires=' . $expires
. '; max-age=' . $max_age
. (null !== $cookie->path
? '; path=' . $cookie->path
: '')
. (null !== $cookie->domain
? '; domain=' . $cookie->domain
: '')
. (false !== (bool)$cookie->httpOnly
? '; httponly'
: '')
. (false !== (bool)$cookie->secure
? '; secure'
: ''));
}
//} return $this; }
public function send($headers = true) {
ob_start();
http_response_code($this->statusCode);
$content = $this->getContent(); if ($headers)
echo $content;
return $this;
}
public function isOk() { return in_array($this->getStatusCode(), [
]); }
public function isBadRequest() { return 400 === $this->getStatusCode(); }
public function isUnathorized() { return 401 === $this->getStatusCode(); }
public function isForbidden() { return 403 === $this->getStatusCode(); }
public function isNotFound() { return 404 == $this->getStatusCode(); }
public function isUnsupportedMediaType() { return 415 == $this->getStatusCode(); }
public function isServerError() { return in_array($this->getStatusCode(), [
]); }
}
Открыть спойлер Закрыть спойлер php <?php
namespace framework\http\providers; use framework\http\ResponseProviderInterface; use framework\io\File; use framework\http\Response;
/**
- @author 3kZO */ class ResponseFileProvider implements ResponseProviderInterface {
private $file;
public function __construct(File $file) { $this->file = $file; }
public function register(Response $response) { $response->setContentType('application/octet-stream'); $response
->headers
//->set('Content-Length', $this->file->size())
->set('Content-Disposition', 'filename=' . $this->file->getName());
}
public function render() { return readfile($this->file->getAbsolutePath()); }
} ```Суть заключается в подготовке контента перед отправкой. Возможно завелосипедил.. |
25.10.2017 / 23:32 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| GreeNLine, дружище, а иди-ка ты в эту тему, а заодно большие исходники файлом прикрепляй или на gist.github.com __________________
let live |
26.10.2017 / 00:25 | |
GreeNLine Пользователь Сейчас: Offline
Имя: Саша Регистрация: 02.02.2012
| Цитата aNNiMON: GreeNLine, дружище, а иди-ка ты в эту тему, а заодно большие исходники файлом прикрепляй или на gist.github.comя извиняюсь. |
26.10.2017 / 09:32 | |
Koenig Модератор форума Сейчас: Offline
Имя: Дмитрий Откуда: Калининград(Koenigsberg) Регистрация: 23.01.2011
| GreeNLine, Теги все по переломали код У тебя в конструкторе обязательный аргумент идёт после не обязательного, роуты с пустым значением нужно указать третим аргументом
__________________
Магистр Мёда |
26.10.2017 / 09:33 | |
Koenig Модератор форума Сейчас: Offline
Имя: Дмитрий Откуда: Калининград(Koenigsberg) Регистрация: 23.01.2011
| GreeNLine, Ну и нэймспэйсы можно группировать, красивее получается, чем use на каждой строке use Exception Можно в коде обращаться в корневой (глобальный) нэймспейс \Exception Тут можно красивее и производительнее написать $args = array_merge($this->renderArgs->toArray(), $args);
$args += $this->renderArgs->toArray();
И ещё я думаю можно без рефлексии обойтись __________________
Магистр Мёда Изменено Koenig (26.10 / 10:39) (всего 3 раза) |
26.01.2018 / 06:43 | |
Koenig Модератор форума Сейчас: Offline
Имя: Дмитрий Откуда: Калининград(Koenigsberg) Регистрация: 23.01.2011
| Добавил функционал
__________________
Магистр Мёда |