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 :: Решил поменять структуру MVC

 PHP.SU

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


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

> Описание: Но обламался)
etoYA
Отправлено: 11 Апреля, 2012 - 23:49:41
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


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




Сейчас у меня так: - http://site[dot]com/controller/method/argument
Но это напрягает, да и не удобно, если честно! Мне кажется такой способ более удобен, т.е. не привязывать контроллер и метод к браузерной строке.

Страницы (главная)http://site[dot]com/page2/
Категорииhttp://site[dot]com/category/kategoriya
Страницыhttp://site[dot]com/category/kategoriya/page2/
Постhttp://site[dot]com/kategoriya/nazva[dot][dot][dot]e-materiala[dot]html

Но сразу же вопрос, как? Каким образом тогда вызывать нужный контроллер и метод?

(Отредактировано автором: 12 Апреля, 2012 - 01:20:02)

 
 Top
Panoptik
Отправлено: 12 Апреля, 2012 - 00:24:16
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




роутер.
я использую yii фреймворк. там есть такая штука как роутер. настраиваешь любые пути под свои нужды в виде правил

такой же роутер знаю есть в кодигнайтере

велком ту гугл и ты найдешь ответ (роутер)


-----
Just do it
 
 Top
etoYA
Отправлено: 12 Апреля, 2012 - 00:29:41
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


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




Panoptik, знаю я что такое роутер! И применяю его! Вот мой старый роутер

PHP:
скопировать код в буфер обмена
  1. function route(){
  2.         $request = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
  3.         $controller = !empty($request[0]) ? ucfirst(strtolower($request[0])) . 'Controller' : 'IndexController';
  4.         $method = !empty($request[1]) ? strtolower($request[1]) : 'base';
  5.         if (!file_exists("application/controllers/$controller.php")) throw new ErrorController ('Controller does not exists');
  6.         $controller = new $controller($this);
  7.         if (!method_exists($controller, $method)) throw new ErrorController ('Method does not exists');
  8.         else $controller->$method(@$request[2], @$request[3], @$request[4]);
  9. }


Но как создать такое, я незнаю, просто может кто-то сталкивался, или просто знает...

(Отредактировано автором: 12 Апреля, 2012 - 00:30:52)

 
 Top
XXI
Отправлено: 12 Апреля, 2012 - 00:36:48
Post Id


Новичок


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


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




Закатив глазки Я это делал с туевой кучей ифов хД
 
 Top
etoYA
Отправлено: 12 Апреля, 2012 - 00:39:44
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


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




Не вариант....
 
 Top
OrmaJever Модератор
Отправлено: 12 Апреля, 2012 - 01:00:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




etoYA пишет:
PHP:
скопировать код в буфер обмена
  1. else $controller->$method(@$request[2], @$request[3], @$request[4]);

Изначально по трём '@' в одной строке заметен хороший стиль програмирования Закатив глазки


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
etoYA
Отправлено: 12 Апреля, 2012 - 01:15:52
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


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




OrmaJever, да это.. так, для начала. Потом офк убрал)
 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Апреля, 2012 - 01:15:56
Post Id



Активный участник


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


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




etoYA пишет:
http://site.com/controller/model/argument
Достаточно отсюда выдрать model и все встанет на свои места.
А нахрена она тут нужна?
Это контроллер должен знать с какими модельками он работать будет и почему.
Или приведи пример где это целесообразно в твоем случае.
 
 Top
etoYA
Отправлено: 12 Апреля, 2012 - 01:17:10
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


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




DeepVarvar, сори опечаточка, method)).

(Отредактировано автором: 12 Апреля, 2012 - 01:17:46)

 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Апреля, 2012 - 01:22:51
Post Id



Активный участник


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


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




А помнишь я тебе показывал как args можно отхапать?
http://www.tiho.sru/controller/action?arg1=a&arg2=2&page=12
Вот допиши в роутер разбор аргументов и храни их в отдельном массиве.
Так даже если по умолчанию на главной не объявлено ни контроллера ни экшна,
аргументы ты спокойно видишь.
 
 Top
etoYA
Отправлено: 12 Апреля, 2012 - 01:25:59
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


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




DeepVarvar,
DeepVarvar пишет:
Вот допиши в роутер разбор аргументов и храни их в отдельном массиве.

о, это уже толкает на мысль, но.
DeepVarvar пишет:
Так даже если по умолчанию на главной не объявлено ни контроллера ни экшна,
аргументы ты спокойно видишь.

По умолчанию IndexController, будет выборка анонсов(короткой версии новости).
 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Апреля, 2012 - 01:31:09
Post Id



Активный участник


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


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




Я говорю не за контроллеры и их наличие.
Я говорю за простоту поиска аргументов для всех этих контроллеров:
Где тут что (контроллер, аргументы и их значения, экшн???):
http://www.tiho.sru/action/arg1/a/page/12/controller/arg2/2
А тут (?):
http://www.tiho.sru/controller/action?arg1=a&arg2=2&page=12
 
 Top
etoYA
Отправлено: 12 Апреля, 2012 - 01:33:26
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


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




Хм.. Сейчас что-то попробую, если неверно, натолкнеш на мысль
(Добавление)
В общем у меня получилось вот такое:

Если в базе(таблице 'категории') найдено точное совпадение с $request[0], то это категории, иначе все как и было. request[0] конттроллер, [1], метод, остальное аргументы

PHP:
скопировать код в буфер обмена
  1.  
  2. function route(){
  3.         $request = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
  4.         $route = new Router;
  5.         $r = $route->categories();
  6.         $controller = null;
  7.         $method = null;
  8.         $argument = array();
  9.         while ($row = $r->fetch_assoc()){
  10.                 if ($request[0] == $row['title']){
  11.                         $controller = 'CategoryController';
  12.                         $method = 'getCategory';
  13.                         $argument[] = $request[0];
  14.                         $argument[] = isset($request[1]) ? str_replace('', '.html', $request[1]) : null;
  15.                         $controller = new $controller($this);
  16.                         $controller->$method($argument);
  17.                         break;
  18.                 }
  19.         }
  20.         if ($controller === null){
  21.                 $request = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
  22.                 $controller = !empty($request[0]) ? ucfirst(strtolower($request[0])) . 'Controller' : 'IndexController';
  23.                 $method = !empty($request[1]) ? strtolower($request[1]) : 'base';
  24.                 if (!file_exists("application/controllers/$controller.php")) throw new ErrorController ('Controller does not exists');
  25.                 $controller = new $controller($this);
  26.                 if (!method_exists($controller, $method)) throw new ErrorController ('Method does not exists');
  27.                 unset($request[0], $request[1]);
  28.                 $controller->$method($request);
  29.         }
  30. }
  31.  

модель
PHP:
скопировать код в буфер обмена
  1.  
  2. class Router{
  3.         function categories(){
  4.                 $r = db()->query("SELECT `title` FROM `categories`");
  5.                 if (!is_object($r)) throw new ErrorController(db()->error);
  6.                 return $r;
  7.         }
  8. }
  9.  

А вот класс категорий
PHP:
скопировать код в буфер обмена
  1. class CategoryController{
  2.         function getCategory($argument){
  3.                 if (!isset($argument[1])){
  4.                         echo "Категория: $argument[0]";
  5.                 }
  6.                 else{
  7.                         echo "Категория: $argument[0] <br /> Материал: $argument[1]";
  8.                 }
  9.         }
  10. }

(Отредактировано автором: 12 Апреля, 2012 - 03:22:29)

 
 Top
etoYA
Отправлено: 12 Апреля, 2012 - 14:31:15
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


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




DeepVarvar, покажи свой вариант, что-то мне кажется, что он будет лучше раз в 100500
 
 Top
DeepVarvar Супермодератор
Отправлено: 12 Апреля, 2012 - 14:42:56
Post Id



Активный участник


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


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




Как-то так, на коленке, без проверок, только смысл:
PHP:
скопировать код в буфер обмена
  1. $query = explode("?", $_SERVER['REQUEST_URI']);
  2. $uri = $query[0];
  3. $args = $query[1];
  4. // дальше разбирать каждый отдельно
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB