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 :: Паттерн Model-View-Controller (MVC). В браузере не отображается содержимое одного из файлов!

 PHP.SU

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


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

> Без описания
Pavl
Отправлено: 25 Июля, 2020 - 13:23:34
Post Id


Новичок


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


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




Добрый день!
Есть файл index.php:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.     require_once 'start.php';
  4.     Route::start();
  5.  

который ссылается на файл start.php:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.     set_include_path(get_include_path().PATH_SEPARATOR.'core'.PATH_SEPARATOR.'controllers');
  4.     spl_autoload_extensions('_class.php');
  5.  
  6.     define('DIR_TMPL', 'C:/OSPanel/domains/test/www/rusakov/tmpl/');
  7.     define('MAIN_LAYOUT', 'main');
  8.  

При заходе на index.php отображается содержимое двух файлов.
main.tpl:
PHP:
скопировать код в буфер обмена
  1.  
  2. <!DOCTYPE_html>
  3. <html lang="ru">
  4. <head>
  5.     <title><?=$title?></title>
  6.     <meta http-equiv="Content-Type" content="<?=$meta_desc?>">
  7.     <meta name="description" content="<?=$meta_desc?>">
  8.     <meta name="keywords" content="<?=$meta_keyword?>">
  9. </head>
  10. <body>
  11.     <header>
  12.         <h1>Добро пожаловать!</h1>
  13.     </header>
  14.     <hr />
  15.     <div id="content"><?=$content?></div>
  16.     <hr />
  17.     <footer>С уваженем, команда нашего сайта.</footer>
  18. </body>
  19. </html>
  20.  

и 404.tpl:
PHP:
скопировать код в буфер обмена
  1.  
  2. <h1>Страница не найдена</h1>
  3. <p>Запрошенной страницы не существует!</p>
  4. <p><a href="index">Главная страница</a></p>
  5.  

Вопрос - почему браузер не находит и не выводит на экран содержимое файла index.tpl? Ведь этот файл лежит в одной папке с main.tpl и 404.tpl.
То есть, по идее, когда открываешь index.php, вместо содержимого 404.tpl, должно выводиться содержимое index.tpl, но так почему-то не происходит.
Файл index.tpl:
PHP:
скопировать код в буфер обмена
  1.  
  2. <h1>Главная страница</h1>
  3. <p>Наш сайт только разрабатывается</p>
  4. <p><a href="/page">Внутренняя страница</a></p>
  5.  

Файлов больше, чем я выложил, поэтому, если необходимо, то ещё выложу.
Содержимое папки tmpl:
Прикреплено изображение (Нажмите для увеличения)
Содержимое папки tmpl.JPG

(Отредактировано автором: 25 Июля, 2020 - 13:25:17)

 
 Top
LIME
Отправлено: 25 Июля, 2020 - 21:12:13
Post Id


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


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


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




браузер ничего не ищет по папкам и вообще о них не знает
что ему веб-сервер присылает, то он и отображает(готовый html)
чтобы посмотреть - chrome - ctrl+U
на сервере его собирает php из вот этих вот шаблонов наполненных переменными, а как он это делает это уже тебе смотреть в коде
думаю что в Route::start(); или скорее всего где-то глубже определяется какой шаблон подключать
вот там и смотри логику
(Добавление)
в классе Route в методе(функции) start
 
 Top
Pavl
Отправлено: 26 Июля, 2020 - 15:16:20
Post Id


Новичок


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


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




При заходе на index.php, если нажать ctrl+U, то выводится:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <!DOCTYPE_html>
  3. <html lang="ru">
  4. <head>
  5.     <title>Страница не найдена - 404</title>
  6.     <meta http-equiv="Content-Type" content="Запрошенная страница не существует.">
  7.     <meta name="description" content="Запрошенная страница не существует.">
  8.     <meta name="keywords" content="<b>Notice</b>:  Undefined variable: meta_keyword in <b>C:\OSPanel\domains\test\www\rusakov\tmpl\main.tpl</b> on line <b>7</b>">
  9. </head>
  10. <body>
  11.     <header>
  12.         <h1>Добро пожаловать!</h1>
  13.     </header>
  14.     <hr />
  15.     <div id="content"><h1>Страница не найдена</h1>
  16. <p>Запрошенной страницы не существует!</p>
  17. <p><a href="index">Главная страница</a></p></div>
  18.     <hr />
  19.     <footer>С уваженем, команда нашего сайта.</footer>
  20. </body>
  21. </html>
  22.  

Класс Route находится в файле route_class.php и выглядит следующим образом:
PHP:
скопировать код в буфер обмена
  1.  
  2. class Route
  3. {
  4.  
  5.     public static function start()
  6.     {
  7.         $controller_name = 'Main';
  8.         $action_name = 'index';
  9.  
  10.         $uri = $_SERVER['REQUEST_URI'];
  11.         $uri = substr($uri, 1);
  12.         if ($uri) $action_name = $uri;
  13.         $controller_name = $controller_name . 'Controller';
  14.         $action_name = 'action' . $action_name;
  15.         $controller = new $controller_name();
  16.         if (method_exists($controller, $action_name)) $controller->$action_name();
  17.         else $controller->action404();
  18.     }
  19.  
  20. }
  21.  

В этом файле метод action404() подсвечен в PhpShtorm и при наведении курсора появляется: Method 'action404' not found in

Этот код я пишу точь-в-точь, как у автора в видеоуроке, который нашёл в интернете. Только , у него всё работает, а у меня нет.

(Отредактировано автором: 26 Июля, 2020 - 15:18:07)

 
 Top
LIME
Отправлено: 26 Июля, 2020 - 15:29:18
Post Id


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


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


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




ох уж эти видеоуроки
ох уж эти сказасьники

судя по стилю урок либо мегадревний либо от не особо качественного учителя
но для начала сойдет

http://phpfaq[dot]ru/debug

вот так должно стать понятнее что происходит
попробуй всеже вникнуть в логику вместо тупого переписывания

Спойлер (Отобразить)
 
 Top
Pavl
Отправлено: 26 Июля, 2020 - 18:00:58
Post Id


Новичок


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


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




LIME пишет:
ох уж эти видеоуроки
ох уж эти сказасьники

судя по стилю урок либо мегадревний либо от не особо качественного учителя
но для начала сойдет

По-правде говоря не слышал ни разу положительных отзывов, как о каких-либо видеоуроках, так и об учебниках! Хотя я согласен, что видеоуроки вырабатывают дурную привычку - сначала, что-то делать, потом думать! А не наоборот! Радость
Урок 2017 года (не слишком, наверное, старый?) от Михаила Русакова. Он и сам пишет, что
это самый простой вариант паттерна MVC, чтобы был понятен принцип работы MVC. Не знаю, хороший Михаил Русаков учитель или плохой, но на просторах интернета его видеоуроки популярны. То тут, то там постоянно на них натыкаешься.

LIME пишет:
http://phpfaq[dot]ru/debug
- мне кажется эта статья всё-таки уже для более-менее профессионалов, чем новичков (или ошибаюсь?). Хотя, всё-равно, спасибо, буду изучать.

Попробовал, с помощью функции var_dump посмотреть код, как Вы предложили. Вот, что вывелось:
string(13) "rusakov/index" string(14) "MainController" string(19) "actionrusakov/index" object(MainController)#1 (4) { ["title":protected]=> NULL ["meta_desc":protected]=> NULL ["meta_keywords":protected]=> NULL ["view":protected]=> object(View)#2 (1) { ["dir_tmpl":"View":private]=> string(41) "C:/OSPanel/domains/test/www/rusakov/tmpl/" } }


В коде задействован класс MainController, который находится в файле maincontroller_class.php:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. class MainController extends AbstractController{
  5.  
  6.     protected $title;
  7.     protected $meta_desc;
  8.     protected $meta_keywords;
  9.  
  10.     public function __construct(){
  11.         parent::__construct(new View(DIR_TMPL));
  12.     }
  13.  
  14.     public function action404() {
  15.         parent::action404();
  16.         $this->title = 'Страница не найдена - 404';
  17.         $this->meta_desc = 'Запрошенная страница не существует.';
  18.         $this->meta_keywords = 'страница не найдена, страница не существует, 404';
  19.  
  20.         $content = $this->view->render('404', [], true);
  21.         $this->render($content);
  22.     }
  23.  
  24.     public function actionIndex(){
  25.         $this->title = 'Главная страница';
  26.         $this->meta_desc = 'Описание главной страницы';
  27.         $this->meta_keywords = 'описание, главная страница';
  28.  
  29.         $content = $this->view->render('index', [], true);
  30.         $this->render($content);
  31.     }
  32.  
  33.     public function actionPage(){
  34.         $this->title = 'Внутренняя страница';
  35.         $this->meta_desc = 'Описание внутренней страницы';
  36.         $this->meta_keywords = 'описание, внутренняя страница';
  37.         $email = 'abc@mail.ru'; //Допустим получено из базы с помощью Model
  38.         $content = $this->view->render('page', ['email' => $email], true);
  39.         $this->render($content);
  40.     }
  41.  
  42.     protected function render($content) {
  43.         $params = [];
  44.         $params['title'] = $this->title;
  45.         $params['meta_desc'] = $this->meta_desc;
  46.         $params['meta_keywords'] = $this->meta_keywords;
  47.         $params['content'] = $content;
  48.         $this->view->render(MAIN_LAYOUT, $params);
  49.     }
  50.  
  51. }
  52.  
  53. ?>
  54.  

При наведении на extends AbstractController появляется Undefined class AbstractController . Класс не найден. Интересный вопрос - почему класс не найден? Этот класс содержится в файле abstractcontroller_class.php:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. abstract class AbstractController {
  5.  
  6.     protected $view;
  7.  
  8.     public function __construct($view) {
  9.         $this->view = $view;
  10.     }
  11.  
  12.     public function action404() {
  13.         header('HTTP/1.1 404 Not Found');
  14.         header('Status: 404 Not Found');
  15.  
  16.     }
  17.  
  18.     abstract protected function render($str);
  19.  
  20. }
  21.  
  22. ?>
  23.  

В файле start.php есть такие строки:
PHP:
скопировать код в буфер обмена
  1.  
  2. set_include_path(get_include_path().PATH_SEPARATOR.'core'.PATH_SEPARATOR.'controllers');
  3.     spl_autoload_extensions('_class.php');
  4.  

И файл abstractcontroller_class.php находится в папке core.
Почему же, тогда появляется сообщение, что этот класс не найден?
 
 Top
LIME
Отправлено: 26 Июля, 2020 - 18:16:06
Post Id


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


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


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




Pavl пишет:
это самый простой вариант паттерна MVC
это какраз понятно
дело в стиле наименования переменных и пренебрежении угловыми скобками
и использование глобальных переменных внутри класса
не серьезный он дядька короче

Pavl пишет:
мне кажется эта статья всё-таки уже для более-менее профессионалов
ты в закладки добавь
если щас не понял потом перечитай, когда будешь головой об монитор биться в поисках бага


Pavl пишет:
Почему же, тогда появляется сообщение, что этот класс не найден?
как не найден? найден
object(MainController) выводит же
значит инстанс объекта создан
поудаляй лишние вардампы ато их много и ты путаешься
и кстати там в статье среди прочего сказано
Цитата:
8. И САМОЕ ВАЖНОЕ: запуская скрипт, смотрите не то, что показывает браузер, а ИСХОДНЫЙ HTML код!.
ты бы не ленился а почитал

actionrusakov/index вот этого метода не найдено в if (method_exists(...

вот это ковыряй
PHP:
скопировать код в буфер обмена
  1. $uri = substr($uri, 1);
  2. if ($uri) {
  3.     $action_name = $uri;//всегда добавляй угловые скобки даже для одной строки
  4. }
 
 Top
Pavl
Отправлено: 26 Июля, 2020 - 19:22:08
Post Id


Новичок


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


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




Вырезал следующие строки из класса Route, но оставив в этом же файле:
PHP:
скопировать код в буфер обмена
  1.  
  2. $uri = $_SERVER['REQUEST_URI'];
  3. $uri = substr($uri, 1);
  4. if ($uri)
  5. {
  6.     $action_name = $uri;
  7. }
  8.  

Стало отображаться содержимое файла index.tpl.
Исходный код:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. string(5) "index"
  3. string(14) "MainController"
  4. string(11) "actionindex"
  5. object(MainController)#1 (4) {
  6.   ["title":protected]=>
  7.   NULL
  8.   ["meta_desc":protected]=>
  9.   NULL
  10.   ["meta_keywords":protected]=>
  11.   NULL
  12.   ["view":protected]=>
  13.   object(View)#2 (1) {
  14.     ["dir_tmpl":"View":private]=>
  15.     string(41) "C:/OSPanel/domains/test/www/rusakov/tmpl/"
  16.   }
  17. }
  18. <!DOCTYPE_html>
  19. <html lang="ru">
  20. <head>
  21.     <title>Главная страница</title>
  22.     <meta http-equiv="Content-Type" content="Описание главной страницы">
  23.     <meta name="description" content="Описание главной страницы">
  24.     <meta name="keywords" content="<b>Notice</b>:  Undefined variable: meta_keyword in <b>C:\OSPanel\domains\test\www\rusakov\tmpl\main.tpl</b> on line <b>7</b>">
  25. </head>
  26. <body>
  27.     <header>
  28.         <h1>Добро пожаловать!</h1>
  29.     </header>
  30.     <hr />
  31.     <div id="content"><h1>Главная страница</h1>
  32. <p>Наш сайт только разрабатывается</p>
  33. <p><a href="/page">Внутренняя страница</a></p></div>
  34.     <hr />
  35.     <footer>С уваженем, команда нашего сайта.</footer>
  36. </body>
  37. </html>
  38.  

Возникла следующая проблема. Когда нажимаешь на ссылку "Внутренняя страница", то не подгружается содержимое файла page.tpl. Происходит переход по адресу http://test/page и в браузере выводится "Объект не найден!". Не понимаю, почему?
 
 Top
miketomlin
Отправлено: 26 Июля, 2020 - 19:42:13
Post Id


Частый гость


Покинул форум
Сообщений всего: 129
Дата рег-ции: Июль 2016  


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




Pavl, это не роутинг, а полная хрень. Или вы что-то попутали, или автор – идиот.

Получается практически то, о чем я вам писал на др. форуме:
Цитата:
P.S. Конечно, может быть и примитив вроде определения имени файла непосредственно из адреса, например из /page получается имя page.php или page.tpl, потом проверяется существование этого файла и т.д. Но такие вещи даже рассматривать не надо.

(Добавление)
Контроллер походу вообще один на все, поэтому вот это подтверждает мои слова про хрень:
PHP:
скопировать код в буфер обмена
  1.         $controller_name = 'Main';
  2. ...
  3.         $controller_name = $controller_name . 'Controller';
  4. ...
  5.         $controller = new $controller_name();

(Добавление)
Про помесь данных с кодом уже молчу. Даже для учебки это отстой. Точнее древность несусветная.
(Добавление)
Кстати, самые идиотские уроки больше всего популярны ;) Уроки Попова – это уже давно мем. Русаков (если там именно его авторство) походу не далеко ушел. Возможно, это тот же Попов в новой обертке Улыбка
 
 Top
LIME
Отправлено: 26 Июля, 2020 - 20:02:46
Post Id


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


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


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




Pavl пишет:
Вырезал следующие строки из класса Route, но оставив в этом же файле:

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

Pavl глянь главу MVC Котерова "PHP5 подлиннике"
книга старая, но глава актуально принципы пояснит
я другого стоящего источника просто не знаю
(Добавление)
отмена...отмена
появился "PHP 7 в подлиннике"
(Добавление)
лучше просто прочитай ее
уроки это - ничего не знаю и не умею зато за 2 дня
если доставляет именно видео формат, то лучшее что видел это - курсы "Специалист" по php от мгту Баумана
 
 Top
miketomlin
Отправлено: 26 Июля, 2020 - 20:27:52
Post Id


Частый гость


Покинул форум
Сообщений всего: 129
Дата рег-ции: Июль 2016  


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




P.S. Проверка существования метода немного лучше, чем проверка существования файла, но в общем та же фигня. Я вам на др. форуме перечислил осн. виды роутинга.
(Добавление)
Суть в том, что нужно опираться на адреса или адресные маски, а не на имена контроллеров/методов. При роутинге могут всплывать внутренние технические «адреса» с именами контроллера/метода, но это уже результат перевода внешних адресов.
 
 Top
LIME
Отправлено: 27 Июля, 2020 - 01:28:52
Post Id


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


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


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




miketomlin пишет:
Про помесь данных с кодом уже молчу.
ты о чем?
(Добавление)
miketomlin пишет:
Суть в том, что нужно опираться на адреса или адресные маски, а не на имена контроллеров/методов.
почему? то есть я знаю почему, но это играет роль для промышленного использования роутинга и MVC тут нипричем.
для учебного примера почему бы и не да
 
 Top
miketomlin
Отправлено: 27 Июля, 2020 - 10:19:39
Post Id


Частый гость


Покинул форум
Сообщений всего: 129
Дата рег-ции: Июль 2016  


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




1. Я про содержимое показанных actionIndex и actionPage (прежде всего).

2. Так я про роутинг и писал, а не MVC в целом Подмигивание Доступность экшина не должна определяться его физ. присутствием. Кроме того, должна быть возможность привязки к разным адресам одного и того же экшина.
(Добавление)
LIME
 
 Top
Pavl
Отправлено: 27 Июля, 2020 - 15:10:53
Post Id


Новичок


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


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




Вы убедили меня в том, что эти видеоуроки не очень хорошие, хотя сам автор пишет, что у него есть курс, конкретно по паттерну MVC по времени на несколько десятков часов. И я хотел, через некоторое время поизучать его. А теперь не знаю, стоит ли?
Текущий вопрос всё-таки, хотелось бы закончить. Ещё раз подчеркну, что писал код точь-в-точь, как у автора. И у него он работает. Только с одним отличием - в жёстком диске размещал файлы не совсем так, как у него. Может я с путями, что-то напутал? Посмотрите, пожалуйста, в прикреплённом файле скриншот жёсткого диска. Может, быть там, что-то не так? Я сам не вижу ошибки (если она там есть).
Прикреплено изображение (Нажмите для увеличения)
Проблема с MVC.JPG
 
 Top
LIME
Отправлено: 27 Июля, 2020 - 23:14:33
Post Id


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


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


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




miketomlin
1. не вижу тут ничего страшного для учебного кода
единственный минус в том что при изменении контента придется деплоить код
но опять же это проблемы уже промышленного использования
короче пойдет

miketomlin пишет:
Так я про роутинг и писал, а не MVC в целом
так а роутинг тут какбэ коротко и сбоку, только чтобы понять принцип MVC
можно вообще без него а тупо передавать имя контроллера и экшена в гет-параметрах, почему бы и нет, а значит не надо так уж в дебри лезть


miketomlin пишет:
Кроме того, должна быть возможность привязки к разным адресам одного и того же экшина.
и это касается промышленного использования
(Добавление)
Pavl пишет:
А теперь не знаю, стоит ли?
эту тему всю целиком вообще не стоит изучать дольше двух часов если уж по хорошему) ну для совсем новичка может подольше
ну если рассматривать все возможные виды, то ладно - 4 часа может можно
один из паттернов и не более
несколько десятков часов Не понял застрелите меня

Pavl пишет:
Только с одним отличием - в жёстком диске размещал файлы не совсем так, как у него

да это уже все поняли на самом деле
либо из папки rusakov все вынь и положи в www
либо в конфиге вебсервера добавь ее к пути до www
если не справишься показывай конфиг...что там у тебя? апач?
(Добавление)
miketomlin а хотя в чем-то ты прав
моделью то и не пахнет))
в таком исполнении контроллер должен брать данные из модели и передавать вьюхе
короче кругом провал)))
 
 Top
Pavl
Отправлено: 28 Июля, 2020 - 15:10:03
Post Id


Новичок


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


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




Добрый день!
Прислушиваясь к вашим советам, сначала переместил все файлы относящиеся к данному уроку из папки rusakov в папку www. В результате чего, вообще ничего не изменилось.
Я вспомнил, что есть скаченные исходники автора этого видеоурока. Их разместил в папке www. Теперь, в браузере, кроме ошибок ничего не выводится:

Warning: include(C:\OSPanel\domains\test\www\tmplmain.tpl): failed to open stream: No such file or directory in C:\OSPanel\domains\test\www\core\view_class.php on line 15

Warning: include(): Failed opening 'C:\OSPanel\domains\test\www\tmplmain.tpl' for inclusion (include_path='.;c:/ospanel/modules/php/PHP_7.2-x64;c:/ospanel/modules/php/PHP_7.2-x64/PEAR/pear;core;controllers') in C:\OSPanel\domains\test\www\core\view_class.php on line 15


Файлы исходники:
Прикреплено изображение (Нажмите для увеличения)
Проблема с MVC(2).JPG

(Отредактировано автором: 28 Июля, 2020 - 15:22:38)

 
 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