Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В случае если сервисы CMS будут спроектированы по шаблону Facade, можно будет добиться довольно хороших результатов. Все проверки, эскейпы и валидации в таком случае, должны проходить не в контроллере, что я довольно часто наблюдаю, а в сервисе, где данные будут отфильтрованы, а результат будет сообщен, как только задача будет выполнена — контроллеру, где и продолжится программный цикл.
Да я опустил множество мелких деталей, но не упустил важнейшего чего и хочу добиться. Такие вещи как авторизация / регистрация, должны реализовываться в момент (чего?), что и показала нам группа разработчиков Django
Например, в django на view функцию можно повесить @login_required и таким образом она будет доступна только для авторизованных пользователей
В PHP так просто сделать не получится
class LoginViewDecorator{
private $controller;
public function __construct($controller){
$this->controller = $controller;
}
public function view(...){
if(Annotation::fromMethod($this->controller, 'view')->has('login_required')){
if(!$serviceLocator->get('user')->hasLogin()){
throw new RuntimeException('...');
}
}
return $this->controller->view();
}
}
насчет того, что функция начинает, что-то подозревать тоже наверное не понял вас
в нем вы так же ссылаетесь на декорируемый объект
или такой реализацией, чтобы не приходилось оборачивать инстанцируемые классы
interface Controller{
...
}
abstract class Decorator{
protected $controller;
public function wrap(Controller $controller){
$this->controller = $controller;
}
}
class LoginActionDecorator extends Decorator{
public function __call($method, $args){
if(substr($method, -6) == 'Action'){
if(!ServiceLocator::get('user')->isLogin()){
throw new RuntimeException('Нет прав');
}
else{
return call_user_func_array([$this->controller, $method], $args);
}
}
}
}
class ControllerFactory{
private $wrappers = [];
public function get($className){
$controller = new $className;
foreach($this->wrappers as $wrap){
$controller = $wrap->wrap($controller);
}
return $controller;
}
public function addWrap(Decorator $wrap){
array_push($this->wrappers, $wrap);
}
}
$myControllerFactory = new ControllerFactory;
$myControllerFactory->addWrap(new LoginActionDecorator);
$controller = $myControllerFactory->get('app\Controllers\TaskController');
портировании джанго в пхп
классы-декораторы?
A function returning another function, usually applied as a function transformation using the wrapper syntax. Common examples for decorators are classmethod() and staticmethod().
The decorator syntax is merely syntactic sugar, the following two function definitions are semantically equivalent:
def f(...): ... f = staticmethod(f) @staticmethod def f(...): ...
мне вот лично очень не хватает декораторов в PHP
а о библиотеках в духе php annotations я конечно вскурсе
я все же продолжу как и планировал.
К примеру реализация задачи по быстрому и простому способу создания блога для человека, которому довольно сложно объяснить как им пользоваться — чрезвычайно сложна по своей природе
Вы можете себе представить насколько удобно можно реализовать интеграцию социальных сетей, API Аналитики и прочих «сладостей» нынешних возможностей мира информационных технологий для конечного пользователя?
Я могу довольно долго продолжать описывать мои идеи и цели
Иерархия поддиректорий проекта
В свое оправдание могу сказать что паттерны проектирования уместны не во всех ситуациях.
Но если взять тот же Pattern Facade или Observer, общая картина становится не такой уж очевидной, хотя и представить ее можно.
Да я опустил множество мелких деталей, но не упустил важнейшего чего и хочу добиться.
Пишу CMS на PHP. Часть 2