PHP.SU

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

Страниц (9): « 1 2 3 4 5 6 7 [8] 9 »

> Найдено сообщений: 131
razorg1991 Отправлено: 26 Мая, 2014 - 13:08:47 • Тема: Помогите допилить роутер • Форум: Вопросы новичков

Ответов: 15
Просмотров: 985
esterio пишет:

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


Так я и не скрываю, оригинал я нашел на хабре, только вот решил подправить под свои нужды. Получилось немногго другое Радость
razorg1991 Отправлено: 25 Мая, 2014 - 20:53:23 • Тема: Помогите допилить роутер • Форум: Вопросы новичков

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

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 не туда влепил Ха-ха
razorg1991 Отправлено: 25 Мая, 2014 - 15:54:50 • Тема: Помогите допилить роутер • Форум: Вопросы новичков

Ответов: 15
Просмотров: 985
Мелкий пишет:
Собственно. Таких переменных и нет, а у вас отключен 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 Так что-ли?
razorg1991 Отправлено: 25 Мая, 2014 - 15:22:36 • Тема: Помогите допилить роутер • Форум: Вопросы новичков

Ответов: 15
Просмотров: 985
Мелкий пишет:
Сделайте 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


Теперь я вообще в тупике Не понял
razorg1991 Отправлено: 25 Мая, 2014 - 14:22:01 • Тема: Помогите допилить роутер • Форум: Вопросы новичков

Ответов: 15
Просмотров: 985
Мелкий пишет:


Так все-равно та же ошибка 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
razorg1991 Отправлено: 25 Мая, 2014 - 12:23:45 • Тема: Помогите допилить роутер • Форум: Вопросы новичков

Ответов: 15
Просмотров: 985
Мелкий пишет:
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
razorg1991 Отправлено: 24 Мая, 2014 - 08:43:37 • Тема: Помогите допилить роутер • Форум: Вопросы новичков

Ответов: 15
Просмотров: 985
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();
Понятно, что ругается на скобки, ну т.е. что типа метод должен быть строкой.
Только теперь я не пойму как это исправить?
razorg1991 Отправлено: 23 Мая, 2014 - 21:31:25 • Тема: Помогите допилить роутер • Форум: Вопросы новичков

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

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();
Где я напортачил? Не понял
razorg1991 Отправлено: 21 Мая, 2014 - 22:11:57 • Тема: Не могу понять в чем ошибка? • Форум: Объектно-ориентированное программирование

Ответов: 3
Просмотров: 2216
Блин понял в чем ошибка! У меня адрес в строке браузера идет localhost/avtocms/
Вот он и думает что после первого слеша avtocms - это контроллер!
Не годится, надо наверное через какое-то слово определять контроллер, типа view=controller в адресной строке!
Думаю так будет лучше!

Пока что исправил, на второй слэш, чтобы запустить приложение и посмотреть как оно работает - возникла следующая проблема: Теперь перекидывает на страницу 404, т.е. срабатывает Route::ErrorPage404(); при поиске метода index
Хотя он есть в классе Main

PHP:
скопировать код в буфер обмена
  1.  
  2. class Main {
  3.            public function index() {
  4.                echo 'Индексный метод контроллера Main';
  5.            }
  6.         }
  7.  
razorg1991 Отправлено: 21 Мая, 2014 - 13:23:30 • Тема: Не могу понять в чем ошибка? • Форум: Объектно-ориентированное программирование

Ответов: 3
Просмотров: 2216
Использую phpDesigner 7. Или посоветовали бы что то другое?
razorg1991 Отправлено: 21 Мая, 2014 - 09:09:51 • Тема: Не могу понять в чем ошибка? • Форум: Объектно-ориентированное программирование

Ответов: 3
Просмотров: 2216
Немного переписал класс Route найденный на хабре. Выглядит так

PHP:
скопировать код в буфер обмена
  1.  
  2. class Route {
  3.        
  4.         public function run()
  5.     {
  6.         // контроллер и действие по умолчанию
  7.         $controller_name = 'Main';
  8.         $action_name = 'index';
  9.        
  10.         $routes = explode('/', $_SERVER['REQUEST_URI']);
  11.  
  12.         // получаем имя контроллера
  13.         if ( !empty($routes[1]) )
  14.         {      
  15.             $controller_name = $routes[1];
  16.         }
  17.        
  18.         // получаем имя экшена
  19.         if ( !empty($routes[2]) )
  20.         {
  21.             $action_name = $routes[2];
  22.         }
  23.        
  24.         // Создаем префикс для объекта контроллера
  25.         $controller_obj = $controller_name.'_obj';
  26.        
  27.         // создаем контроллер
  28.         $controller_obj = new $controller_name;
  29.        
  30.         // проверяем существование метода
  31.         if(method_exists($controller, $action))
  32.         {
  33.             // вызываем действие контроллера
  34.             $controller->$action();
  35.         }
  36.         else
  37.         {
  38.             Route::ErrorPage404();
  39.         }
  40.    
  41.     }
  42.    
  43.         static function ErrorPage404() {
  44.            
  45.         $host = 'http://'.$_SERVER['HTTP_HOST'].'/';
  46.         header('HTTP/1.1 404 Not Found');
  47.         header("Status: 404 Not Found");
  48.         header('Location:'.$host.'404');
  49.     }
  50.  


В браузере выдает ошибку "Fatal error: Class 'avtocms' not found in W:\home\localhost\www\avtocms\core\router.php on line 30", а конкретно на $controller_obj = new $controller_name;

Есть автолоадер
PHP:
скопировать код в буфер обмена
  1.  
  2. class Autoloader {
  3.         public static function loadControllers ($classname) {
  4.                 if (is_readable(Config::$controller.$classname.'Controller.php')) {
  5.                         require_once Config::$controller.$classname.'Controller.php';
  6.                 }
  7.         }
  8.         public static function loadModels ($classname) {
  9.                 if (is_readable(Config::$model.$classname.'Model.php')) {
  10.                         require_once Config::$model.$classname.'Model.php';
  11.                 }
  12.         }
  13.     }
  14.    
  15.     //регистрация функций автозагрузки
  16.     spl_autoload_register(array('Autoloader', 'loadControllers'));
  17.     spl_autoload_register(array('Autoloader', 'loadModels'));
  18.  


Роутер и автолоадер подключаются в index.php
PHP:
скопировать код в буфер обмена
  1.  
  2. //подключение конфигурации
  3.         require_once 'config.php';
  4.    
  5.     //подключение автозагрузчика контроллеров, моделей и библиотек
  6.     require_once 'core/autoloader.php';
  7.    
  8.     //подключение роутера
  9.     require_once 'core/router.php';
  10.    
  11.     $app = new Route;
  12.     $app->run();
  13.  


Пока, что не могу понять на что ругается Не понял
razorg1991 Отправлено: 16 Мая, 2014 - 20:57:41 • Тема: Куда запихнуть автолоадер моделей? • Форум: Объектно-ориентированное программирование

Ответов: 8
Просмотров: 2837
DelphinPRO Спасибо огромное за подсказки Улыбка
Хотел отправить "Спасибо" в карму, но не дает, говорит "у вас недостаточно сообщений для данной операции"

Поэтому выражаю свою благодарность здесь Улыбка
razorg1991 Отправлено: 13 Мая, 2014 - 19:34:28 • Тема: Куда запихнуть автолоадер моделей? • Форум: Объектно-ориентированное программирование

Ответов: 8
Просмотров: 2837
DelphinPRO, а вот Ваш вариант мне очень понравился Улыбка
Видимо так и поступлю. Достаточно тогда еще в index подключить файл автолоада и все.
(Добавление)
razorg1991 пишет:
DelphinPRO, а вот Ваш вариант мне очень понравился Улыбка
Видимо так и поступлю. Достаточно тогда еще в index подключить файл автолоада и все.


Получилось в индексе вот что:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4.     //проверка версии php
  5.     if (version_compare(PHP_VERSION, '5.3.1', '<'))
  6.     {
  7.         die('Ваш хостинг должен поддерживать версию php 5.3.1 и выше для запуска AVTOCMS!');
  8.     }
  9.  
  10.     //запрет прямого доступа
  11.     define('AVTO', TRUE);
  12.    
  13.     //подключение автозагрузчика контроллеров и моделей
  14.     require_once 'includes/autoloader.php';
  15.    
  16.     //регистрация функций автозагрузки
  17.     spl_autoload_register(array('Autoloader', 'loadControllers'));
  18.     spl_autoload_register(array('Autoloader', 'loadModels'));
  19.    
  20.      
  21.    
  22.     //подключение конфигурации
  23.         require_once 'config.php';
  24.  
  25. ?>
  26.  


Только я вот теперь не пойму, что написать еще в index.php, ведь браузер же ничего не выведет, он же не знает какой контроллер мне нужен в данный момент?! Не понял
Нужен же типа "запуск приложения". Я снова в тупике
(Добавление)
razorg1991 пишет:
DelphinPRO, а вот Ваш вариант мне очень понравился Улыбка
Видимо так и поступлю. Достаточно тогда еще в index подключить файл автолоада и все.


Получилось в индексе вот что:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4.     //проверка версии php
  5.     if (version_compare(PHP_VERSION, '5.3.1', '<'))
  6.     {
  7.         die('Ваш хостинг должен поддерживать версию php 5.3.1 и выше для запуска AVTOCMS!');
  8.     }
  9.  
  10.     //запрет прямого доступа
  11.     define('AVTO', TRUE);
  12.    
  13.     //подключение автозагрузчика контроллеров и моделей
  14.     require_once 'includes/autoloader.php';
  15.    
  16.     //регистрация функций автозагрузки
  17.     spl_autoload_register(array('Autoloader', 'loadControllers'));
  18.     spl_autoload_register(array('Autoloader', 'loadModels'));
  19.    
  20.      
  21.    
  22.     //подключение конфигурации
  23.         require_once 'config.php';
  24.  
  25. ?>
  26.  


Только я вот теперь не пойму, что написать еще в index.php, ведь браузер же ничего не выведет, он же не знает какой контроллер мне нужен в данный момент?! Не понял
Нужен же типа "запуск приложения". Я снова в тупике
(Добавление)
razorg1991 пишет:
DelphinPRO, а вот Ваш вариант мне очень понравился Улыбка
Видимо так и поступлю. Достаточно тогда еще в index подключить файл автолоада и все.


Получилось в индексе вот что:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4.     //проверка версии php
  5.     if (version_compare(PHP_VERSION, '5.3.1', '<'))
  6.     {
  7.         die('Ваш хостинг должен поддерживать версию php 5.3.1 и выше для запуска AVTOCMS!');
  8.     }
  9.  
  10.     //запрет прямого доступа
  11.     define('AVTO', TRUE);
  12.    
  13.     //подключение автозагрузчика контроллеров и моделей
  14.     require_once 'includes/autoloader.php';
  15.    
  16.     //регистрация функций автозагрузки
  17.     spl_autoload_register(array('Autoloader', 'loadControllers'));
  18.     spl_autoload_register(array('Autoloader', 'loadModels'));
  19.    
  20.      
  21.    
  22.     //подключение конфигурации
  23.         require_once 'config.php';
  24.  
  25. ?>
  26.  


Только я вот теперь не пойму, что написать еще в index.php, ведь браузер же ничего не выведет, он же не знает какой контроллер мне нужен в данный момент?! Не понял
Нужен же типа "запуск приложения". Я снова в тупике
(Добавление)
razorg1991 пишет:
DelphinPRO, а вот Ваш вариант мне очень понравился Улыбка
Видимо так и поступлю. Достаточно тогда еще в index подключить файл автолоада и все.


Получилось в индексе вот что:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4.     //проверка версии php
  5.     if (version_compare(PHP_VERSION, '5.3.1', '<'))
  6.     {
  7.         die('Ваш хостинг должен поддерживать версию php 5.3.1 и выше для запуска AVTOCMS!');
  8.     }
  9.  
  10.     //запрет прямого доступа
  11.     define('AVTO', TRUE);
  12.    
  13.     //подключение автозагрузчика контроллеров и моделей
  14.     require_once 'includes/autoloader.php';
  15.    
  16.     //регистрация функций автозагрузки
  17.     spl_autoload_register(array('Autoloader', 'loadControllers'));
  18.     spl_autoload_register(array('Autoloader', 'loadModels'));
  19.    
  20.      
  21.    
  22.     //подключение конфигурации
  23.         require_once 'config.php';
  24.  
  25. ?>
  26.  


Только я вот теперь не пойму, что написать еще в index.php, ведь браузер же ничего не выведет, он же не знает какой контроллер мне нужен в данный момент?! Не понял
Нужен же типа "запуск приложения". Я снова в тупике
(Добавление)
Чето сайт тупит, извиняюсь повторные сообщения
(Добавление)
Чето сайт тупит, извиняюсь повторные сообщения
(Добавление)
Чето сайт тупит, извиняюсь повторные сообщения
razorg1991 Отправлено: 12 Мая, 2014 - 22:04:52 • Тема: Куда запихнуть автолоадер моделей? • Форум: Объектно-ориентированное программирование

Ответов: 8
Просмотров: 2837
В общем начинаю осваивать ООП, пытаюсь написать что-то вроде учебной CMS (по канонам MVC Радость ).
Сделал следующее:
1. Создал структуру папок (models/, controllers/, templates/default/veiws/)
2. Создал файл конфига в корне (подключение к БД, пути к папкам шаблона и т.д.)
3. index.php - точку входа (в корне) Сейчас index выглядит так:

PHP:
скопировать код в буфер обмена
  1.  
  2. //запрет прямого доступа
  3.     define('AVTO', TRUE);
  4.    
  5.     //автозагрузчик контроллеров
  6.      function autoloadController($className) {
  7.      $filename = "controllers/" . $className . "Controller.php";
  8.      if (is_readable($filename)) { require $filename; }
  9.      }
  10.      spl_autoload_register("autoloadController");
  11.    
  12.     //подключение конфигурации
  13.         require_once 'config.php';
  14.          
  15.     $obj = new One;
  16.     echo $obj->properity;
  17.  


Для теста в конце вывел одно свойство контроллера - автозагрузчик работает.
Вот теперь пока ума не приложу куда впихнуть автолоадер моделей? Не понял Из индекса по MVC должен вызываться только контроллер же?

Есть идея создать отдельный контроллер-автолоадер моделей (что-то вроде родительского класса), а потом от него наследовать все остальные классы-контроллеры. Напрягает только одно - что при таком варианте постоянно придется писать extends, что по-моему не совсем красиво Хм

Подскажите пожалуйста, я немного в растерянности.
razorg1991 Отправлено: 16 Января, 2014 - 08:55:28 • Тема: Покажите на примере MVC • Форум: Вопросы новичков

Ответов: 3
Просмотров: 144
Если кому не лень, можете пожалуйста привести пример кода-сравнения: обычный php + html (т.е. когда все вместе в куче) и этот же код, только переписанный под MVC (т.е. что отнесем в контроллер, что в - модель, что в -представление)
Давать ссылки на литературу не имеет смысла, потому как теории уже начитался много, а в примерах только сразу MVC и показывают.
А мне хотелось бы увидеть и сравнить самому. Просто нужен хороший пример-сравнение.

Страниц (9): « 1 2 3 4 5 6 7 [8] 9 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB