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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Из области ООП
razorg1991
Отправлено: 23 Мая, 2014 - 21:31:25
Post Id


Частый гость


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


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




Пишу роутер, сейчас выглядит так

PHP:
скопировать код в буфер обмена
  1.  
  2.     class Route {
  3.        
  4.         // контроллер и действие по умолчанию
  5.         public $controller_name = 'Main';
  6.         public $action_name = 'index';
  7.         public $id;
  8.        
  9.         public function run()
  10.     {
  11.        
  12.         // получаем имя контроллера
  13.         if($_GET['view']){     
  14.             $this->controller_name = trim(strip_tags($_GET['view']));
  15.             if(!class_exists($this->controller_name)) {Route::ErrorPage404();}
  16.         }        
  17.         // получаем имя экшена
  18.         if($_GET['option']) {
  19.             $this->action_name = trim(strip_tags($_GET['option']));
  20.             if(!method_exists($this->action_name)) {Route::ErrorPage404();}
  21.         }
  22.        
  23.         // получаем id элемента
  24.         if($_GET['id']) {
  25.             $this->id = (int)trim(strip_tags($_GET['id']));
  26.         }
  27.            
  28.         // создаем объект контроллера
  29.             $controller = new $this->controller_name;
  30.             $action = $this->action_name;
  31.              
  32.             // вызываем действие контроллера
  33.             $controller->$action();
  34.    
  35.     }
  36.    
  37.         static function ErrorPage404() {
  38.            
  39.         $host = $_SERVER['DOCUMENT_ROOT'];
  40.         header('Location:'.$host.'/templates/default/error.php');
  41.     }
  42. }
  43.  


Вроде все маршрутизирует, но не хочет перенаправлять на страницу ошибки! Никак! Вместо этого php просто выдает в браузере ошибку, что такого класса не найдено и у меня в файле router.php ошибка в строке $controller->$action();
Где я напортачил? Не понял
 
 Top
Panoptik
Отправлено: 23 Мая, 2014 - 22:00:00
Post Id



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


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


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




во-первых убедитесь есть ли у вас соответствующие гет-параметры а-ля option
во-вторых попробуйте посмотреть в сторону исключений и обрабатывать ошибки с помощью их
в третьих обратите внимание на функцию method_exists


-----
Just do it
 
 Top
DelphinPRO
Отправлено: 23 Мая, 2014 - 23:51:12
Post Id



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


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


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




а что у вас просиходит в методе ?

(Добавление)
Подсказываю: отправляется 404 заголовок и все!! дальше продолжается выполнение программы.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
razorg1991
Отправлено: 24 Мая, 2014 - 08:43:37
Post Id


Частый гость


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


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




DelphinPRO пишет:
Подсказываю: отправляется 404 заголовок и все!! дальше продолжается выполнение программы.

В начале метода 404 добавил еще exit();

Panoptik пишет:
в третьих обратите внимание на функцию method_exists

Ну да, пардон, это я в ней про объект забыл А?!

Подредактировал немного роутер, выглядит теперь так

PHP:
скопировать код в буфер обмена
  1.  
  2.     class Route {
  3.        
  4.         // контроллер и действие по умолчанию
  5.         public $controller_name = 'Main';
  6.         public $action_name = 'index';
  7.         public $id;
  8.        
  9.         public function run()
  10.     {
  11.        
  12.         // получаем имя контроллера
  13.         if($_GET['view']){     
  14.             $this->controller_name = trim(strip_tags($_GET['view']));
  15.             if(!class_exists($this->controller_name)) {Route::ErrorPage404();}
  16.             else {
  17.                 // создаем объект контроллера
  18.             $controller = new $this->controller_name; }
  19.         }
  20.                    
  21.         // получаем имя экшена
  22.         if($_GET['option']) {
  23.             $this->action_name = trim(strip_tags($_GET['option']));
  24.             if(!method_exists($controller, $this->action_name)) {Route::ErrorPage404();}
  25.             else {
  26.                 // создаем экшн
  27.             $action = $this->action_name; }
  28.         }
  29.        
  30.         // получаем id элемента
  31.         if($_GET['id']) {
  32.             $this->id = (int)trim(strip_tags($_GET['id']));
  33.         }
  34.                        
  35.         // вызываем действие контроллера
  36.             $controller->$action();
  37.    
  38.     }
  39.    
  40.         static function ErrorPage404() {
  41.            
  42.             exit();    
  43.             $host = $_SERVER['DOCUMENT_ROOT'];
  44.             header('Location:'.$host.'/templates/default/error.php');
  45.     }
  46. }
  47.  


Теперь браузер выдает ошибку Fatal error: Method name must be a string in W:\home\localhost\www\avtocms\core\router.php on line 38
Конкретно на строку $controller->$action();
Понятно, что ругается на скобки, ну т.е. что типа метод должен быть строкой.
Только теперь я не пойму как это исправить?
 
 Top
Мелкий Супермодератор
Отправлено: 24 Мая, 2014 - 20:25:31
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




razorg1991 пишет:
Только теперь я не пойму как это исправить?

Используйте call_user_func


-----
PostgreSQL DBA
 
 Top
razorg1991
Отправлено: 25 Мая, 2014 - 12:23:45
Post Id


Частый гость


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


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




Мелкий пишет:
razorg1991 пишет:
Только теперь я не пойму как это исправить?

Используйте call_user_func


Честно сказать не совсем понял как ее использовать Не понял
Типа такого?

PHP:
скопировать код в буфер обмена
  1.  
  2. // вызываем действие контроллера
  3.             // $controller->$action();
  4.             call_user_func(array(&$controller, $action));
  5.  


В таком случае выдает ошибку Warning: call_user_func() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in W:\home\localhost\www\avtocms\core\router.php on line 39
 
 Top
Мелкий Супермодератор
Отправлено: 25 Мая, 2014 - 12:33:11
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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






-----
PostgreSQL DBA
 
 Top
razorg1991
Отправлено: 25 Мая, 2014 - 14:22:01
Post Id


Частый гость


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


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




Мелкий пишет:


Так все-равно та же ошибка Warning: call_user_func() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in W:\home\localhost\www\avtocms\core\router.php on line 39
 
 Top
Мелкий Супермодератор
Отправлено: 25 Мая, 2014 - 14:46:14
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Сделайте var_dump($controller, $action);
Что-то потеряли.


-----
PostgreSQL DBA
 
 Top
razorg1991
Отправлено: 25 Мая, 2014 - 15:22:36
Post Id


Частый гость


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


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




Мелкий пишет:
Сделайте var_dump($controller, $action);
Что-то потеряли.


Сделал - получил
NULL NULL
Warning: call_user_func() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in W:\home\localhost\www\avtocms\core\router.php on line 40


Теперь я вообще в тупике Не понял
 
 Top
Мелкий Супермодератор
Отправлено: 25 Мая, 2014 - 15:31:41
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Собственно. Таких переменных и нет, а у вас отключен E_NOTICE, чтобы PHP мог сам об этом сказать.

Переменная $controller, например, инициализируется только в том случае, если $_GET['view'] не пусто.


-----
PostgreSQL DBA
 
 Top
razorg1991
Отправлено: 25 Мая, 2014 - 15:54:50
Post Id


Частый гость


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


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




Мелкий пишет:
Собственно. Таких переменных и нет, а у вас отключен E_NOTICE, чтобы PHP мог сам об этом сказать.

Переменная $controller, например, инициализируется только в том случае, если $_GET['view'] не пусто.


Да, действительно, когда я в строке написал к примеру еще ?view=main он мне выдал в дампе имя объекта, но отругался на пустой метод, ввел ?view=main&option=index все сработало как надо.
НО по сути же не работает Route::ErrorPage404, он же должен был сработать еще до создания объекта, при проверке существования класса в условии.
И сразу тогда еще один вопрос: что мне тогда делать объектом и классом по умолчанию? Проверять
PHP:
скопировать код в буфер обмена
  1.  
  2. if($_GET['view'] && !empty($_GET['view'])
  3.  

а в elseif проверять если пуста, то return $this->controller_name Так что-ли?
 
 Top
Мелкий Супермодератор
Отправлено: 25 Мая, 2014 - 16:04:24
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




razorg1991 пишет:
НО по сути же не работает Route::ErrorPage404, он же должен был сработать еще до создания объекта, при проверке существования класса в условии.

Смотрим ваш же код:
Проверка существования класса выполняется, если передан $_GET['view']. А его нет. Проверка совершенно резонно и не выполняется.

Вам что надо? Если параметр есть, то сделать такой контроллер. Ну так и разверните логику соответственно.
PHP:
скопировать код в буфер обмена
  1. if (! empty($_GET['view'])) {
  2.     $this->controller_name = trim(strip_tags($_GET['view']));
  3.     }
  4.  
  5. if(! class_exists($this->controller_name)) {
  6.     Route::ErrorPage404();
  7.     }
  8. $controller = new $this->controller_name;


И ещё раз напишу - включите вывод ошибок.


-----
PostgreSQL DBA
 
 Top
razorg1991
Отправлено: 25 Мая, 2014 - 20:53:23
Post Id


Частый гость


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


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




Снова подправил скрипт, теперь выглядит так:

PHP:
скопировать код в буфер обмена
  1.  
  2.     class Route {
  3.        
  4.         // контроллер и действие по умолчанию
  5.         public $controller_name = 'Main';
  6.         public $action_name = 'index';
  7.         public $id;
  8.        
  9.         public function run()
  10.     {
  11.        
  12.         // получаем имя контроллера
  13.         if(!empty($_GET['view'])){     
  14.             $this->controller_name = trim(strip_tags($_GET['view']));}
  15.  
  16.         if(!class_exists($this->controller_name)) {self::ErrorPage404();}
  17.         // создаем объект контроллера
  18.             $controller = new $this->controller_name;
  19.                    
  20.         // получаем имя экшена
  21.         if(!empty($_GET['option'])) {
  22.             $this->action_name = trim(strip_tags($_GET['option']));}
  23.  
  24.         if(!method_exists($controller, $this->action_name)) {self::ErrorPage404();}
  25.             // создаем экшн
  26.             $action = $this->action_name;
  27.        
  28.         // получаем id элемента
  29.         if($_GET['id']) {
  30.             $this->id = (int)trim(strip_tags($_GET['id']));
  31.         }
  32.                        
  33.         // вызываем действие контроллера
  34.             // $controller->$action();
  35.             var_dump($controller, $action);
  36.             call_user_func(array($controller, $action));
  37.            
  38.    
  39.     }
  40.    
  41.         public static function ErrorPage404() {
  42.                
  43.             echo 'Страница не найдена 404!';
  44.             exit();
  45.     }
  46. }
  47.  


Индексный метод контроллера вызывается, переходит по всем методам и контроллерам, и заработал error Радость .Я дурак exit не туда влепил Ха-ха
 
 Top
esterio
Отправлено: 25 Мая, 2014 - 22:37:57
Post Id



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


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


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





где-то я уже видел такой роутер, только непомню где имнно.
https://gist.github.com/dmitrymomot/5668691

(Отредактировано автором: 25 Мая, 2014 - 22:38:28)

 
 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