Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/16: Рейтинг темы: голосов - 16, средняя оценка - 4.69
18 / 13 / 6
Регистрация: 04.04.2019
Сообщений: 827

Настройка MVC роутов

30.12.2020, 11:05. Показов 3580. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Пробую разобраться с ООП и в частности с MVC. Создал такую структуру:
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
conf\
  config.php
  db.php
  route.php
controllers\
  Controller.php
  IndexController.php
models\
  IndexModel.php
  Model.php
views\
  main.tpl.php
  View.php

Содержимое config.php
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
echo 'config.php zagrugen1<br>';
define("ROOT", "localhost");
define("CONTROLLER_PATH", ROOT."/controllers/");
define("MODEL_PATH", ROOT."/models/");
define("VIEW_PATH", ROOT."/views/");
 
require_once("db.php");
require_once("route.php");
require_once (MODEL_PATH.'Model.php');
require_once VIEW_PATH.'View.php';
require_once CONTROLLER_PATH. 'Controller.php';
 
Routing::buildRoute();
echo 'config.php zagrugen2<br>';

Содержимое Model.php
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
echo 'models<br>';
class Model {
    protected $db = null;
 
    public function __construct() {
        $this->db = DB::connToDB();
    }
}

Содержимое route.php
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
** Класс маршрутизации
*/
 
class Routing {
 
    public static function buildRoute() {
 
        /*Контроллер и action по умолчанию*/
        $controllerName = "IndexController";
        $modelName = "IndexModel";
        $action = "index";
 
        $route = explode("/", $_SERVER['REQUEST_URI']);
 
        /*Определяем контроллер*/
        if($route[1] != '') {
            $controllerName = ucfirst($route[1]. "Controller");
            $modelName = ucfirst($route[1]. "Model");
        }
 
 
        require_once CONTROLLER_PATH . $controllerName . ".php"; //IndexController.php
        require_once MODEL_PATH . $modelName . ".php"; //IndexModel.php
 
        if(isset($route[2]) && $route[2] !='') {
            $action = $route[2];
        }
 
        $controller = new $controllerName();
        $controller->$action(); // $controller->index();
 
    }
 
    public function errorPage() {
 
    }
}

При подключении выдает ошибку и предупреждение:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
main page
config.php zagrugen1
Присоединили файл базы
 
Warning: require_once(localhost/models/Model.php): failed to open stream: No such file or directory in ...\conf\config.php on line 10
Fatal error: require_once(): Failed opening required 'localhost/models/Model.php' (include_path='\xampp\php\PEAR') in ...\conf\config.php on line 10

Подскажите, где ошибка?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.12.2020, 11:05
Ответы с готовыми решениями:

организация роутов в системе
интересует Ваше мнение по поводу организации роутов в системе : к примеру есть контроллер AdminController , в нем есть некий екшн...

Структура роутов
Я еще новичок, и что-то намудрил с роутами. Я так понимаю нужно изменять структуру полностью. Посоветуйте что сделать, чтобы я мог получить...

Настройка ASP.NET 5 с MVC 6
Разбираюсь в работе ASP.NET 5 с MVC 6 на основании автогенерируемого template-проекта в Visual Studio. При попытке запуска проекта на...

49
 Аватар для sad67man
2605 / 1509 / 689
Регистрация: 23.08.2015
Сообщений: 3,841
03.01.2021, 00:58
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DyadyaGe Посмотреть сообщение
Два index.php?
В первом случае views/index/index.php - т.е. это такая вьюшка по названию контроллера и action-а
А public/index.php - это уже точка входа.
1
18 / 13 / 6
Регистрация: 04.04.2019
Сообщений: 827
04.01.2021, 16:50  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
Проверьте правильный ли путь и есть ли там файл.
В принципе разобрался со своими путями. Пока только в моем первоначальном варианте как с использованием dirname(__DIR__) так и с $_SERVER['DOCUMENT_ROOT'].
В первом случае в файле route.php поменял $route[2] на $route[0] (забыл учесть папку проекта, помогло отслеживание-вывод на экран рутовой папки). В результате получил красивый вывод типа: F:/xampp/htdocs/папка проекта/controllers/
Во втором случае кроме этого пришлось добавлять в файле config.php папку проекта по типу:
PHP
1
2
3
define("CONTROLLER_PATH", ROOT. "/папка проекта/controllers/");
define("MODEL_PATH", ROOT. "/папка проекта/models/");
define("VIEW_PATH", ROOT. "/папка проекта/views/");
И подобную процедуру во вьюшке сделать.
Цитата Сообщение от sad67man Посмотреть сообщение
Для понимания полная запись будет такая
Этот вариант обязательно буду пробовать позже. Скорее всего для лучшего понимания буду параллельно вести три варианта одного проекта. И как я понимаю, вопросы по этому варианту нужно будет задавать уже в новой теме? Или тут можно будет продолжать?

Добавлено через 50 минут
Ах да, и во втором случае вывод путей слегка другой: F:\xampp\htdocs\папка проекта/controllers/
0
 Аватар для sad67man
2605 / 1509 / 689
Регистрация: 23.08.2015
Сообщений: 3,841
04.01.2021, 23:29
DyadyaGe, У вас константа ROOT должна вести на папку с проектом. Для того она и нужна, чтоб остальные пути отталкивались именно от нее, и не приходилось ничего дописывать.
$_SERVER['DOCUMENT_ROOT'] должен вести на папку public, с точкой входа. Если она ведет на что-то другое - это значит, что неправильно настроили nginx или apache (смотря что используете). Соответственно в адресной строке и в $_SERVER['REQUEST_URI'] не должно быть никаких папок проекта. И в route.php контроллер должен быть под $route[0], а action - $route[1]
1
18 / 13 / 6
Регистрация: 04.04.2019
Сообщений: 827
04.01.2021, 23:56  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
У вас константа ROOT должна вести на папку с проектом
Я тоже так думал, но как видите простая проверка показала, что ведет на уровень выше.
Цитата Сообщение от sad67man Посмотреть сообщение
Если она ведет на что-то другое - это значит, что неправильно настроили nginx или apache (смотря что используете)
В xampp поднимается апач. И я ведь правильно понимаю, что при правильной настройке ROOT должен указывать именно на папку проекта и путь иметь вид "F:\xampp\htdocs\папка проекта", а не заканчиваться F:\xampp\htdocs\ ?
0
 Аватар для sad67man
2605 / 1509 / 689
Регистрация: 23.08.2015
Сообщений: 3,841
05.01.2021, 00:32
DyadyaGe, У вас константа ROOT служит, чтоб отталкиваясь от нее можно было получить доступ к любой папке в вашем проекте, сама константа ROOT должна вести на папку проекта. Это не должно зависеть от настроек хостинга. Используйте путь от той папке, где эта константа определяется через __DIR__ или dirname(__DIR__)

В настройках хостинга указывается корень сайта - это немного разные вещи. Так как как весь код приложения (контроллеры, вьюшки и т.д. ) находится вне этой папке. А корень сайта указывается на папку public, где будет располагаться точка входа и статические файлы (js, css, images, robots.txt и т.д.). Которые будут доступны по прямой ссылке.

Добавлено через 18 минут
DyadyaGe, По умолчанию в apache указана корневая папка htdocs. Нужно изменить настройки apache параметр
DocumentRoot = "F:\xampp\htdocs\папка проекта\public"
в файле httpd.conf

Если вы хотите держать несколько сайтов на одном apache, то нужно настраивать виртуальные хосты
1
18 / 13 / 6
Регистрация: 04.04.2019
Сообщений: 827
05.01.2021, 01:14  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
У вас константа ROOT служит, чтоб отталкиваясь от нее можно было получить доступ к любой папке в вашем проекте, сама константа ROOT должна вести на папку проекта. Это не должно зависеть от настроек хостинга. Используйте путь от той папке, где эта константа определяется через __DIR__ или dirname(__DIR__)
Не совсем понял. ROOT можно переопределить? У меня сейчас он указывает на всю папку htdocs
0
 Аватар для sad67man
2605 / 1509 / 689
Регистрация: 23.08.2015
Сообщений: 3,841
05.01.2021, 01:20
Цитата Сообщение от DyadyaGe Посмотреть сообщение
Не совсем понял. ROOT можно переопределить?
Корень сайта и корень проекта - это разные вещи. Мы же говорим про константу ROOT - вы ee сами определяете.
PHP
1
define("ROOT", dirname(__DIR__));
А на хостинге указывается корень сайта. На разных проектах он может быть разный - это можно и нужно настраивать.
1
1460 / 1013 / 232
Регистрация: 01.10.2018
Сообщений: 3,936
05.01.2021, 12:10
Цитата Сообщение от DyadyaGe Посмотреть сообщение
И я ведь правильно понимаю, что при правильной настройке ROOT должен указывать именно на папку проекта и путь иметь вид "F:\xampp\htdocs\папка проекта", а не заканчиваться F:\xampp\htdocs\ ?
Да, можно оставить htdocs надкаталогом для каталогов проектов. Хотя htdocs - это из конфигурации по умолчанию, в которой не используется "основанный на именах виртуальный хостинг", а сейчас виртуальный хостинг практически всегда основывается на именах. При этом корневым каталогом для запросов с не определенными на сервере именами хостов является корневой каталог первого по счету виртуального хоста, называемого виртуальным хостом по умолчанию. Т.е. нужно создать минимум два виртуальных хоста: первый для перехвата "недействительных" запросов, второй для проекта. Надкаталог для каталогов проектов чаще всего имеет имя www, web и т.п. (htdocs, как я написал, можно оставить, но это имя плохо подходит по смыслу). В конфигурации Apache for Windows определение корневого каталога htdocs у меня полностью закомментировано - не знаю, это дело моих рук или так было изначально (можно посмотреть сборки Apache Haus, которыми я пользуюсь):
Code
1
2
3
#DocumentRoot "${SRVROOT}/htdocs"
#<Directory "${SRVROOT}/htdocs">
...
Примеры определения виртуального хоста можно посмотреть здесь:
Несколько сайтов на одной виртуальной машине
Обработка разных URL на одной странице

Добавлено через 2 минуты
В упомянутой сборке эти определения записываются во включаемом файле conf/extra/httpd-vhosts.conf

Добавлено через 5 минут
Есть проекты, которые используют именно виртуальный хост по умолчанию

Добавлено через 8 минут
Цитата Сообщение от DyadyaGe Посмотреть сообщение
И я ведь правильно понимаю, что при правильной настройке ROOT должен указывать именно на папку проекта
Вы сами определяете назначение используемых констант. Но ROOT, как я уже писал, - не самое удачное имя для "корня проекта" - больше подходит для "корня сайта".

Также часто определяют константы сразу для основных каталогов проекта без определения константы для "корня проекта", например:
PHP
1
2
3
define('APP', __DIR__.'/app');
define('LOGS', __DIR__.'/logs');
define('ROOT', __DIR__.'/public');
(Это могут быть и пути с завершающим слэшем в конце каждого значения. В этом случае в конце имен констант обычно добавляют _PATH.)

Добавлено через 6 минут
Или просто используют слово PATH в качестве имени одной из констант. Например, я часто использую константу PATH для каталога с php-файлами (программными файлами на других языках), а уже к именам других констант добавляю _PATH, например ROOT_PATH.
1
18 / 13 / 6
Регистрация: 04.04.2019
Сообщений: 827
05.01.2021, 12:32  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
Мы же говорим про константу ROOT - вы ee сами определяете.
Ну да, протупил. Сам же написал в config.php.
Цитата Сообщение от estic Посмотреть сообщение
с завершающим слэшем в конце каждого значения
Кстати, вроде ж была какая-то переменная, которая делает слэши в соответствии с ОС. Только что-то сходу не смог её найти. Будет же правильно её использовать в этом случае, да и вообще при объявлении описанных вами констант? Ато у меня при распечатке путей при использовании $_SERVER['DOCUMENT_ROOT'] часть слэшей развернулась.
0
1460 / 1013 / 232
Регистрация: 01.10.2018
Сообщений: 3,936
05.01.2021, 13:07
Цитата Сообщение от DyadyaGe Посмотреть сообщение
Кстати, вроде ж была какая-то переменная, которая делает слэши в соответствии с ОС.
Да, есть константа. Но PHP понимает и чуждые для данной ОС слэши, поэтому можно оставить nix-слэши, как "более близкие" для Web-а. Выстраивать пути по канонам используемой ОС нужно только в том случае, когда это реально необходимо.

Добавлено через 3 минуты
Цитата Сообщение от DyadyaGe Посмотреть сообщение
часть слэшей развернулась.
И это будет работать

Можете воспользоваться функцией realpath, если хотите получить канонический для ОС путь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.01.2021, 13:07

Настройка загрузки контекста в Spring MVC JavaConfig
Привет, я работаю со Spring MVC проектом, для описание конфигураций использую java классы, JavaConfig, проект без .xml файлов. Как мне...

Настройка connetctionString для asp.net mvc 3 на windows хостинге reg.ru
Доброго времени суток. У меня проблема с сайтом asp.net mvc 3. Сайт стоит на reg.ru хостинге под windows.... Сам сайт работает, просто не...

Как широко применяется MVC в программировании на Java? Стоит ли изучать MVC?
Здравствуйте. Начинающий java-программист. Буквально недавно только закончил изучать Core. Теперь готовлюсь к собеседованиям и своей первой...

связь MVC и MVVM. Трудно ли освоить mvc параллельно с изучением ASP.NET
Здравствуйте, начал изучать ASP.NET для курсовой работы. Начал читать &quot;Мак-Дональд М., Фримен А., Шпушта М. Microsoft ASP.NET 4 с примерами...

ASP.net MVC против MVC обычного
Здраствуйте, читая книгу &quot;Сандерсон С - ASP.NET MVC3 Framework с примерами на C# для профессионалов&quot; я заметил что описание...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru