Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Система управления контентом
Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2012
Помог: 0 раз(а)
Итак, как известно, каждый программист однажды задумывается о написании своей CMS. Кто-то пишет, кто-то нет. Я решил попробовать, ибо на своем велосипеде ездить удобнее, чем на чужом.
Имеем на данный момент
Точка входа index.php
Класс Application с единственным публичным методом run(), вызываемом из индексного файла
В этом методе описан основной жизненный цикл приложения.
1. Инициализация сессий.
2. Инициализация роутера и разбор URL. Урлы могут быть в виде get-параметров или "человеко-понятные". Роутер определяет имя контроллера, действие (которое нужно выполнить) и представление (которое будет задействовано для отображения данных).
3. Запуск контроллера и получение от него представления.
4. Рендеринг и вывод.
Класс Controller. Остальные контроллеры наследуются от этого класса.
В нем имеются базовые методы аутентификации и финальный метод execute().
Пример из контроллера админки
Правильно ли я сделал реализацию модульности системы?
digi
Отправлено: 23 Февраля, 2012 - 22:39:55
Посетитель
Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012
Помог: 4 раз(а)
простой пример ;) допустим есть сайт со следующей структурой:
1) Главная
2) О компании
2.1) История
3) Новости
Предположим юзер запросил страницу, подпадающую под паттерн роутинга:
/news/{year}/{mon}/{name}.html
в результирующей странице требудется отобрадить в меню выделенным пунет "Новости".
также надо отображить хлебные крошки например так Главная > Новости > 2012 > Февраль > Первая новость.
ну а основном блоке конечно надо отобразить сам текст новости
как сделать? ;)))
KorolevSerge
Отправлено: 23 Февраля, 2012 - 22:54:00
Новичок
Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2012
Помог: 0 раз(а)
как отобразить текст понятно роутер разберется что нужно вывести
а с меню и крошками пока не знаю что делать...
digi
Отправлено: 23 Февраля, 2012 - 23:08:04
Посетитель
Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012
Помог: 4 раз(а)
во во ) а это самое интересное ;))
в общем, если есть желание предлагаю присоедениться к разработке фреймворка на базе компонентов Symfony 2
sKaa
Отправлено: 23 Февраля, 2012 - 23:19:21
Частый посетитель
Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011 Откуда: Россия г. Нижний Новгород
Помог: 25 раз(а)
[+]
Я не понял :
Зачем классу Application, который одновременно ещё и singletone публичный метод run если он только, что и делает это вызывает route..
Ты пытался разделить модели виды и контроллеры, а в итоге у тебя всё в куче. Application::getInst()->run(); каким-то чудом должен определять модель. Это вообще как?
Зачем внутрь родительского класса контроллера пихать авторизацию когда это уже модель? Выходит вы контроллером модель наследуете. Я понимаю, что инкапсуляция сложная фигня - но зачем так всё усложнять?
ИМХО удобней на мой взгляд делать HMVC нежели MVC.
Хм, гляди...
В классе Application..
1) Публичный статичный метод Route() // Он будет парстить URL, возвращая его в удобном виде, массив или может ещё что...
2) Публичный метод Delegate() // В качестве аргументов можно ему передать массивом название контроллера, действия и остальных аргументов..
Этот метод должен проверять наличие файла контроллера, действия в нём, создавать класс контроллера и выполнять call_user_func_array(array($controller, $action), $arguments);
Вышеуказанная конструкция поможет запускать из одного контроллера другой контроллера. Что нам теперь мешает внутри контроллера index index() вызвать аналогичный код, только уже с аргументом для функции delegate (array('contrller'=>'help' .. ));
В этом и ключевое отличие MVC от HMVC
Если не найден файл контроллера или действие в нём или ещё что-то пошло не так то сразу-же плевать исключением и будете автоматически переадресованы на Controller_Errror->Index($e->getMessage(), // сюда можно аналогично пихнуть всё остальное, чтобы потом внутри контроллера Error логировать или выводить ошибки.);
Далее уже внутри контроллера нужно создать класс View который и будет отвечать за рендеринг и вывод )) Да и модели все должны быть созданы внутри контроллера.
Короче я не трезв, давай сам думай.. Я чувствую, что не могу мысли сформулировать ))
Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2012
Помог: 0 раз(а)
sKaa пишет:
Зачем внутрь родительского класса контроллера пихать авторизацию когда это уже модель?
не авторизацию а методы-действия (action) login и logout
в этих методах вызывается базовая модель и авторизация происходит там.
sKaa пишет:
Выходит вы контроллером модель наследуете.
ни в коем случае )
sKaa пишет:
Публичный статичный метод Route()
У меня есть класс Router который занимается парсингом URL и обратной операцией - формирование SEF URL. Т.е. у него есть метод ::_, возвращающий примерно следующее
Роутер также проверяет наличие собственных роутеров расширений (компонентов, модулей, как хотите назовите)и при наличии возвращает результат их работы. Это для более гибкого формирования урлов, в зависимости от потребностей конкретного расширения. Например, базовое преобразование выглядит так, как на примере выше, а расширение Users может переопределить его сделать урлы такими:
// Тут проверяется установлен ли редирект контроллером
// Если да то перенаправляем пользователя
$this->redirect();
// Render
// ... некоторый код, я опущу
$html=$view->render();
echo$html;
}
(Добавление)
в принципе то же самое, только роль метода ::Route выполняет отдельный класс, а роль :elegate из вашего примера возложена на $this->getcontroller()
Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011 Откуда: Россия г. Нижний Новгород
Помог: 25 раз(а)
[+]
KorolevSerge, flow найден - это хорошо, но вот утерян разум.
действия пользователя должны быть методами внутри самого контроллера (допустим контроллер Index )
URL: http://hostname/login - должно запустить контроллер login, т.к вторым параметром мы ничего не передаём по умолчанию действием будет index. т.е URL hostname/login тоже самое, что и hostname/login/index
А выполнить delegate должен
call_user_func_array(array($controller, $action), array()); если за пример взять вышеуказанный юрл hostname/login/index
call_user_func_array(array('Controller_Login', 'Index'), array());
У вас нет четкого представления MVC, и что такое Controller-Action в частности!
Зачем вы их наследуете сразу всеми контролерами?
Ещё раз повторяю: User в данном случае модель.
// Хотя лично для меня это кажется говнокодом - (я выше писал, что я не трезв и возможно я и вправду не вижу очевидных плюсов ваших методов), но у вас там жизненный цикл поэтому надо что-то вернуть контроллеру в ваш цикл.
return$User::getError();
}else{
....
}
}
publicfunction Logout(){
$User= User::getInstance();
if(!$User->Auth()){
$User->Logout();
}
}
}
Не ну может я конечно бухой и туплю сижу и не вижу очевидных плюсов. хз ...
На мой взгляд весь ваш код можно охарактеризовать тремя словами : "плодим классы ради класса"...
Внимание! Вот теперь вы мне вряд-ли докажите, что Router::_('...') - не является моделью т.к скорей всего он дергает это данные из базы или ещё откуда..
Ну как минимум можно быть сделать контроллер Users и вот тут нас и выручит инкапсуляция...
Таким образом если отключить ваш модель-роутер, сделать, нормальный метод delegte - о чем я говорил выше. Итак если URL содержит /users/%USERNAME%
То в любом случае отработает Controller_Users->Index(%USERNAME%); Мы просто передадим имя пользователя как аргумент в действие контроллера, а он уже обратившись к модели решит, что там будет дальше!!!
Покинул форум
Сообщений всего: 24
Дата рег-ции: Февр. 2012
Помог: 0 раз(а)
sKaa, спасибо за мысли, нужно переварить информацию.
по поводу роутера не совсем согласен, но пока разберусь с контроллерами, потом еще раз изложу свое видение роутера.
sKaa
Отправлено: 24 Февраля, 2012 - 01:59:44
Частый посетитель
Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011 Откуда: Россия г. Нижний Новгород
Помог: 25 раз(а)
[+]
Не благодари )
digi
Отправлено: 24 Февраля, 2012 - 02:16:43
Посетитель
Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012
Помог: 4 раз(а)
KorolevSerge, вы читали документацию по Symfony 2?
по мне так такие вещи как Symfony\Component\Routing сделан более чем достойно и придумывать свой вариант не имеет смысла, а вот продумать реализацию паттерна MVC используя как можно больше готовых, отлаженных и распространённых решений это хорошая идея ;))
собственно предалагаю обсудить именно этот вопрос ;) в принципе с радостью готов поделиться своими наработками, хотя там мысли больше как "заметки для себя", но готов ответить на все вопросы ;)
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.