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 :: А как бы вы сделали?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: подробности внутри
Eazy-E
Отправлено: 21 Июня, 2012 - 06:38:15
Post Id



Гость


Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2011  
Откуда: Анапа


Помог: 0 раз(а)




Всем доброго времени суток. Имеется вот такая MVC реализация:

PHP:
скопировать код в буфер обмена
  1.  
  2. class Controller{
  3.         function createPage() {
  4.                 $data = Model::loadPage();
  5.                 View::showPage($data);
  6.         }
  7. }
  8.  
  9. class Model{
  10.         function loadPage() {
  11.                 $data = array(
  12.                         'title'         => 'Тестовая страница',
  13.                         'date'          => '18 июня 2012 года',
  14.                         'author'        => 'Админ',
  15.                         'content'       => 'Содержание тестовой страницы',
  16.                         'template'      => 'test'
  17.                 );
  18.                 return $data;
  19.         }
  20. }
  21.  
  22. class View{
  23.         function showPage($data){
  24.                 echo $data['title'] . '<br>';
  25.                 echo $data['date'] . '<br>';
  26.                 echo $data['author'] . '<br>';
  27.                 echo $data['content'] . '<br>';
  28.                 echo $data['template'] . '<br>';
  29.         }
  30. }
  31.  
  32. $c = new Controller();
  33. $c->createPage();
  34.  


Что нужно? а нужно сделать проверку (в контроллере):

if($private == 1){
//...
}

то, подменить содержимое $data['content'] на нечто подобное: 'Только приватный просмотр!'. Естественно, до непосредственного вывода. Кто-то скажет, что нужно расширить класс Контроллера, и будет не прав. Ибо объект класса Controller уже создан, и заменить его на что-то другое нельзя. Вообще, будем отталкиваться от того, что этот код закрыт. Ну, если только не код контроллера. Как бы вы поступили? Я думаю, что так:

PHP:
скопировать код в буфер обмена
  1. class Controller{
  2.         function createPage() {
  3.                 $data = Model::loadPage();
  4.                 $privateContent = new privateContent();
  5.                 $data = $privateContent->make($data);
  6.                 View::showPage($data);
  7.         }
  8. }
  9.  
  10. class privateContent{
  11.         function make($data){
  12.                 $private = 1;
  13.                 if($private == 1){
  14.                         $data['content'] = 'Только приватный просмотр!!';
  15.                         return $data;
  16.                 }
  17.         }
  18. }


В принципе, все окей! Проблему мы решили. Но что, если исходник контроллера так же не доступен для редактирования? Наследование здесь не поможет, потому что экземпляр класса Controller уже создан и работает. Переопределить его нельзя. Итак, моя идея. Создать к контроллеру конфигурационный файл config.ini следующего содержания:

CODE (htmlphp):
скопировать код в буфер обмена
  1. [some_class]
  2. ext.className   = Test1
  3. ext.methodName  = Test1
  4. ext.sendData    = true


В этом конфиге описывать методы и классы, экземпляры которых будут автоматически созданы в контроллере. Вот таким образом их подгружать (извините, писал наспех):

PHP:
скопировать код в буфер обмена
  1. class extensionLoader{
  2.         private $config = array();
  3.  
  4.         function Load($Data=false){
  5.                 $this->config = parse_ini_file(__DIR__ . "\config.ini", true);
  6.                 foreach($this->config as $k => $v){
  7.                         $class = new $v['ext.className']();
  8.                                 $Data = $class->$v['ext.methodName']($Data);
  9.                         }
  10.                 return $Data;
  11.         }
  12. }
  13.  
  14. // а в контроллер добавим следующее:
  15.  
  16. class Controller{
  17.         function createPage() {
  18.                         $Data = Model::loadPage();
  19.                                 $extensionLoader = new extensionLoader();
  20.                                 $Data = $extensionLoader->Load($Data);
  21.                         View::showPage($Data);
  22.         }
  23. }


Как не сложно догадаться, extensionLoader парсит ини файл, создает на основе параметров экзепляры классов, их методам передает массив данных. Читай, это то же самое:

PHP:
скопировать код в буфер обмена
  1. class Controller{
  2.         function createPage() {
  3.                 $data = Model::loadPage();
  4.                 $privateContent = new privateContent();
  5.                 $data = $privateContent->make($data);
  6.                 View::showPage($data);
  7.         }
  8. }


Только теперь это можно реализовать без редактирования класса Controller'а.
Теперь скажите, это говнокод?! Если да, то почему?


-----
Новое всегда пугает — даже того, кто это новое создает.
(RZA)
 
 Top
digi
Отправлено: 21 Июня, 2012 - 15:46:47
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




ммм... всё не читал, но могу дать совет, если юзаете статические методы, то объявляйте их явно статическими т.е.

PHP:
скопировать код в буфер обмена
  1. class View
  2. {
  3.     public static function showPage($data)
  4.     {
  5.         // ваш код.
  6.     }
  7. }


а контроллер у вас разумеется должен быть:

PHP:
скопировать код в буфер обмена
  1. class Controller
  2. {
  3.     public function createPage()
  4.     {
  5.         // ваш код.
  6.     }
  7. }


т.е. явное всегда лучше неявного, и на всякие Strict Standarts не нарветесь...

(Отредактировано автором: 21 Июня, 2012 - 15:48:49)

 
 Top
Eazy-E
Отправлено: 21 Июня, 2012 - 19:15:07
Post Id



Гость


Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2011  
Откуда: Анапа


Помог: 0 раз(а)




Да, со статикой проще конечно. Но все же интересует мнение о самой реализации.


-----
Новое всегда пугает — даже того, кто это новое создает.
(RZA)
 
 Top
digi
Отправлено: 21 Июня, 2012 - 19:22:55
Post Id


Посетитель


Покинул форум
Сообщений всего: 406
Дата рег-ции: Янв. 2012  


Помог: 4 раз(а)




если именно только мнение т.е. после его высказывания никто не нападёт с холиваром ;)) тогда могу сказать, что купаться в собственных умозаключаниях можно долго и бесконечно и все решения, которые у вас будут работать (т.е. на самом деле работать, но не просто казаться, что работают ;) ) то все эти решения они и есть правильные ;)

но если есть цель писать качественный, расширяемый, современный т.д. код, тогда путь дорога к изучению фреймворка Symfony2 ;)

(Отредактировано автором: 21 Июня, 2012 - 19:27:51)

 
 Top
Eazy-E
Отправлено: 24 Августа, 2013 - 19:34:48
Post Id



Гость


Покинул форум
Сообщений всего: 88
Дата рег-ции: Сент. 2011  
Откуда: Анапа


Помог: 0 раз(а)




извините, что апаю старую тему.. но вопрос как бы актуален. можно ли считать такое решение говнокодом? Может кто нить подскажет шаблон проектирования, который мог бы решить проблему загрузки контроллеров-модулей в основной контроллер без редактирования исходников последнего...?


-----
Новое всегда пугает — даже того, кто это новое создает.
(RZA)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB