Этот урок набрал набрал достаточно большое количество
комментариев и дальнейшее его комментирование отключено.
Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку,
посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали.
Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
namespace MyProject\Controllers;
class MainController {
public function main()
{
echo 'Главная страница';
}
public function sayHello (string $name)
{
echo 'Привет' . $name;
}
public function sayBye(string $name)
{
echo 'Проваливай' . $name;
}
}
Создайте еще один экшн в контроллере – sayBye(string $name), который будет выводить «Пока, $name». Добавьте для него роут /bye/$name и убедитесь, что всё работает.
<?php
//routes.php
return [
'#^hello/(.*)$#' => [MyProject\Controllers\MainController::class, 'sayHello'],
'#^bye/(.*)$#' => [MyProject\Controllers\MainController::class, 'sayBye'],
'#^$#' => [MyProject\Controllers\MainController::class, 'main']
];
//MainController.php
namespace MyProject\Controllers;
class MainController
{
public function main()
{
echo 'Главная страница';
}
public function sayHello(string $name)
{
echo 'Привет, ' . $name;
}
public function sayBye(string $name)
{
echo 'Пока, ' . $name;
}
}
Правильно ли делать отдельный класс route, чтобы делать маршрутизацию или же сделать как Вы указали? Есть много примеров отдельного класса, и актуально ли это?
Создайте еще один экшн в контроллере – sayBye(string $name), который будет выводить «Пока, $name». Добавьте для него роут /bye/$name и убедитесь, что всё работает.
Да, свежая голова дает о себе знать, потратил 3 часа но разобрался и все понял. Но есть 1 вопрос:
Почему мы все это написали в конце кода, а не к примеру в if (!empty($matches)), как ни как это вроде оптимизация кода и мы бы убрали в данном случае проверку на $isRouteFound.
Спасибо
Чтобы не городить потом весь код внутри if'а. Если потом появятся ещё условия, нужно будет их внутри этого if'а добавлять. И так оно будет разростаться и усложняться, как снежный ком. Нашли роут - выполняем код дальше, не нашли - падаем. Прочитайте про цикломатическую сложность.
<?php
namespace MyProject\Controllers;
class MainController
{
public function main()
{
echo 'Это главная страница проэкта';
}
public function sayHello($name)
{
echo 'Привет, ' . $name;
}
public function sayBye($name)
{
echo 'Пока, ' . $name;
}
}
<?php
namespace MyProject\Controllers;
class MainController
{
public function main()
{
echo 'Главная страница';
}
public function sayHello(string $name)
{
echo 'Привет, ' . $name;
}
public function sayBye(string $name)
{
echo 'Пока, ' . $name;
}
}
Вроде бы в индекс пхп не надо ничего добавлять. Но пока я получаю ошибку
Fatal error: Uncaught Error: Call to undefined method MyProject\Controllers\MainController:: sayBye() in C:\OSPanel\domains\localhost\index.php on line 32
( ! ) Error: Call to undefined method MyProject\Controllers\MainController:: sayBye() in C:\OSPanel\domains\localhost\index.php on line 32
ругается на строку - $controller->$actionName(...$matches);
пока комменты не смотрю, пытаюсь понять что не так, ведь главная и адрес http://localhost/hello/username отрабатывают как нужно.
Создайте в директории www файл .htaccess
...
Откроем в браузере адрес http://myproject.loc/abracadabra.
И вижу: Object not found! The requested URL was not found on this server. If you entered the URL manually please check your spelling and try again.
Всё работает только при обращении непосредственно в папку www: http://myproject.loc/www/
Если открыть корень сайта видно: Index of / и директории сайта.
???
<?php
namespace Controllers;
class MainController
{
public function main()
{
echo 'Главная страница';
}
public function sayHello(string $name)
{
echo 'Привет, ' . $name;
}
public function sayBye(string $name)
{
echo 'До новых встреч, '.$name;
}
}
<?php
namespace MyProject\Controllers;
class MainController //Публичные методы контроллера ещё называются action-ами (от англ. action - действие).
{
public function main(){
echo 'Главная страница';
}
public function sayHello(string $name){
echo 'Привет, ' . $name;
}
public function sayBye(string $name){
echo 'Пока, ' . $name;
}
}
"Для начала давайте сделаем по-простому – с помощью регулярки научимся понимать, что текущий адрес: http://myproject.loc/hello/ , ГДЕ - вообще любая строка. "
В строке "ГДЕ - вообще любая строка" - где что , не совсем понятно, может пропустили слово?
Преимущество в том, что можно по имени класса щёлкнуть мышкой и он сразу откроется. Ну и если его переименовывать, то здесь IDE автоматом тоже все поменяет.
По идее можно было написать просто MainController::class и он должен выдать путь к классу с namespace'ом, но так почему-то не работает, а почему не пойму?
<?php
namespace MyProject\Controllers;
class MainController
{
public function main()
{
echo 'Главная страница';
}
public function sayBye(string $name){
echo "Пока,$name";
}
public function sayHello(string $name)
{
echo 'Привет, ' . $name;
}
}
Да принцип работы и сейчас и дальше понятен,я не представляю,как это реализовывать с 0). И ещё,в одном из следующих уроков будет момент с
public function sayHello(string $name)
{
$this->view->renderHtml('main/hello.php',['name'=>$name,'title'=>'Страница приветствия']);
}
Мы получается обращаемся к обьекту,который создали в конструкторе мейн контроллера и вызываем метод этого объекта,я правильно понял? Я в этих хитросплетениях немного запутался,получается мы в одном месте создали класс(представление),создали из этого класса внутри другого класса обьект и вызвали его метод.
Кто-то может подсказать что нужно сделать чтобы браузер коректно отображал код и результат выполнение кода? Раньше было все нормально. Сейчас все идет без разметки.
И это всё? Этого мало. У меня несколько строк про xdebug. Вы точно раскомментировали расширение и перезапустил сервис после этого? Он у вас определенно не включен.
RewriteRule ^(.)$ ./index.php?route=$1 [QSA,L] – если файл или папка не найдены, то для такого запроса выполнится этот пункт. В таком случае веб-сервер перенаправить этот запрос на скрипт index.php. При этом скрипту будет передан GET-параметр route со значением запрошенного адреса. $1 – это значение, выдернутое с помощью регулярки по маске ^(.)$. То есть вся адресная строка будет передана в этот GET-параметр.
Не указаны квантификаторы *
2.
То есть вся адресная строка будет передана в этот GET-параметр.
Давайте теперь это проверим. Откроем в браузере адрес http://myproject.loc/abracadabra.
Так в route же передается не вся адресная строка, а URI?
3.
RewriteRule ^(.)$ ./index.php?route=$1 [QSA,L]
Как и когда в $1 попадают данные???
запись ./index..... актуальна же только для локального сервера?
4.
Теперь если нам понадобится добавить новый адрес на сайте то мы просто пропишем его в routes.php, и укажем имя контроллера и метода.
А если этих адресов десятки/сотни/очень много - прописывать вручную для каждого возможного адреса?
Когда по запрошенному URI не найдено файла, веб-сервер перенаправляет запрос на index.php с параметром route. Нет, актуально будет на любом сервере.
Да. Ну вы учитывайте, что в качестве роута можно писать регулярки и обрабатывать каждый отдельный URI непосредственно в контроллере.
Ну то и значит. Если не было совпадений по регуляркам, то эта переменная будет пустой. Но тогда останется isRouteFound = false и скрипт завершится до этой строчки. Но шторм не настолько умный, чтобы это понимать.
Так, как указано в цитате - в описании кода, в регулярке учитывается только один единственный символ. В скобках не хватает квантификатора * после точки
<?php
namespace MyProject\Controllers;
class MainController
{
public function main(){
echo "Главная страница";
}
public function sayHello(string $name)
{
echo 'Привет, ' . $name;
}
public function sayBye(string $name){
echo 'Пока,'.$name;
}
}
Есть вопрос: Зачем в routes в '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'], писать MainController::class, разве MainController уже не название класса?
class MainController
{
public function main()
{
echo 'Главная страница';
}
public function sayHello(string $name)
{
echo 'Привет, ' . $name;
}
public function sayBye(string $name)
{
echo 'Пока, ' . $name;
}
}
<?php
namespace MyProject\Controllers;
class MainController
{
public function main()
{
echo 'Главная страница';
}
public function sayHello(string $name)
{
echo 'Привет, '.$name;
}
public function sayBye(string $name)
{
echo 'Пока, '.$name;
}
}
в чём ошибка? когда ваш код копирую в .htaccess всё работает, но когда мой, пишет:"Ошибка сервера" Ошибку свою понял, перед "L" не нужно было ставить пробел
<?php
namespace MyProject\Controllers;
class MainController
{
public function main()
{
echo 'Главная страница';
}
public function sayHello(string $name)
{
echo 'Привет, '.$name.'.';
}
public function sayBye(string $name)
{
echo 'Пока, '.$name.'.';
}
}
Личный вопрос. Как сделать вывод функции var_dump() и ошибок, как у вас??? Просто неудобно смотреть ошибки и вывод vurdump()'а в одну однотонную строку ..
Возникла проблема с моим локальным хостом, я сейчас использую xampp и там в путь автоматически добавлялось 'index.php', потому пришлось прописать это и в routes.php. Забыла упомянуть об этом нюансе, когда отправляла домашку)
Привет, спасибо за урок.
Сложно это запомнить, но хорошо, что хотя-бы понятно.
(...$matches);
В уроке используется такая конструкция, не нашел ее в документации, поэтому хочу спросить - выходит такая команда ищет единственный существующий элемент массива?
В нашем случае без проблем можно заменить на ($matches[1])?
Я же написал. Это вернёт имя класса в виде строки. Если непонятно почему бы не написать сразу строку, то так делается по нескольким причинам:
Имя класса в коде далеко не всегда пишется с неймспейсом (когда он подключен через use в шапке файла в коде ниже пишется только имя)
IDE при рефакторинге класса (переименовании, смене неймспейса), автоматически подставит новое значение, так как в коде прописано обращение именно к классу, а не к какой-то непонятной строке
Зачастую мы сами не знаем какой класс у объекта, в таком случае можно использовать конструкцию ::class с переменной, в которой лежит объект: $obj::class
Добрый день, надо же , справился, долго настаивал адреса в этом уроке, у меня вин7 32, а опен сервер только 64. оставлю добавки к файлам. индекс :
$pattern = '~^bye/(.*)$~';
preg_match($pattern, $route, $matches);
if (!empty($matches)) {
$controller = new \MyProject\Controllers\MainController();
$controller->sayBye($matches[1]);
return;
контроллер:
public function sayBye(string $name)
{
echo 'Пока, ' . $name;
}
роут:
<?php
Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого проверю вашу домашнюю работу и отвечу на вопросы.
<?php
namespace MyProject\Controllers;
class MainController
{
public function main()
{
echo 'Главная страница';
}
public function sayHello(string $name)
{
echo 'Привет ' . $name . ' от 2-го контроллера SayHello';
}
public function sayBye(string $name)
{
echo 'Пока ' . $name;
}
}
Артем, добрый день!
Сделала все как написано в уроке, но выходит ошибка. Подскажите, пожалуйста, в чем может быть проблема.
Ошибка сервера!
Произошла внутренняя ошибка сервера, в результате которой серверу не удалось завершить обработку Вашего запроса. Сервер перегружен, или в CGI-скрипте обнаружена ошибка.
Если Вы считаете, что это ошибка сервера, пожалуйста, сообщите об этом веб-мастеру.
class MainController
{
public function main()
{
echo 'Главная страница';
}
public function sayHello(string $name)
{
echo 'Привет, ' . $name;
}
public function sayBye(string $name)
{
echo 'Пока, ' . $name;
}
}
Спасибо, с первой ссылкой разобрался, со 2-ой нет конкретного ответа. Если я правильно понял, :: указывает на конкретный класс? т.е. в массив он записывается как класс?
Добрый вечер!
Спасибо большое за курсы, интересно и доходчиво!
У меня два вопроса:
Почему в автозагрузке мы не меняли слэши в $className, а она все равно работает?
В случае, когда мы переходим на http://myproject.loc/, происходит удаление единственного элемента массива $matches, и потом мы "отсутствующие" элементы этого массива передаем как аргументы методу main, у которого вообще не заданы аргументы. Почему тут нет ошибок?)
Добрый день в первой части урока выдает вместо
'abracadabra'
'train.com/public_html/abracadabra'
Привет, напишите мне в вк или телеграм.
src\MyProject\Controllers\MainController.php
src\routes.php
www\index.php
Хорошо
файл MainController.php
файл routes.php
файл Index.php
Отлично!
ахахахах, хорошее прощание ;)
src/routes.php +
src/MVCExample/Controllers/MainController.php +
url +
Выхлоп =
Спасибо.
А что у вас за url такой жуткий? Опять экспериментируете не по курсу?
routes.php
MainController.php
Супер!
Пока что трудно переваривается информация, но вроде справляюсь
routes.php
MainController.php
Отлично!
MainController
routes
index
Супер!
Создайте еще один экшн в контроллере – sayBye(string $name), который будет выводить «Пока, $name». Добавьте для него роут /bye/$name и убедитесь, что всё работает.
Отлично!
src\MyProject\Controllers\MainController.php
src\routes.php
Отлично!
Правильно ли делать отдельный класс route, чтобы делать маршрутизацию или же сделать как Вы указали? Есть много примеров отдельного класса, и актуально ли это?
Да, можно делать отдельным классом, в котором будет логика парсинга и всё что только нужно. Здесь специально не стал выносить для простоты.
MainController.php
routes.php
Хорошо
Отлично!
Метод sayBye в MainControoler.php
Не нужно лепить всё в одной строке. А так - норм.
Создайте еще один экшн в контроллере – sayBye(string $name), который будет выводить «Пока, $name». Добавьте для него роут /bye/$name и убедитесь, что всё работает.
МОзг поплыл после этого урока, надеюсь не я один такой...
вот тут вообще полностью все взорвалось, без копи-паст тут не написать)
Всё норм
Да, свежая голова дает о себе знать, потратил 3 часа но разобрался и все понял. Но есть 1 вопрос:
Почему мы все это написали в конце кода, а не к примеру в if (!empty($matches)), как ни как это вроде оптимизация кода и мы бы убрали в данном случае проверку на $isRouteFound.
Спасибо
Мы бы даже могли просто убрать проверку и написать "Страница не найдена"
Чтобы не городить потом весь код внутри if'а. Если потом появятся ещё условия, нужно будет их внутри этого if'а добавлять. И так оно будет разростаться и усложняться, как снежный ком. Нашли роут - выполняем код дальше, не нашли - падаем. Прочитайте про цикломатическую сложность.
Урок хороший, спасибо
MainController.php
routes.php
Делаем запрос:
http://myproject.loc/bye/andrey
Получаем : Пока, andrey
Отлично!
Отлично
Спасибо за урок!
routes.php
MainController.php
Отлично
route.php
MainController.php
index.php
Отлично
Отлично
Роут:
Отлично
MainController.php
routes.php
Отлично
Отлично
ругается на строку - $controller->$actionName(...$matches);
пока комменты не смотрю, пытаюсь понять что не так, ведь главная и адрес http://localhost/hello/username отрабатывают как нужно.
А точно ли у вас файл с контроллером сохранен?
Доброго дня!
И вижу: Object not found! The requested URL was not found on this server. If you entered the URL manually please check your spelling and try again.
Всё работает только при обращении непосредственно в папку www: http://myproject.loc/www/
Если открыть корень сайта видно: Index of / и директории сайта.
???
Приветствую. Настройте OpenServer по этому уроку.
src\MyProject\Controllers\MainController.php
код routes.php
Отлично!
Отлично!
Возможно кто то решил не с апачем, а с nginx работать (как я):
Тогда для подобного нужно следующее:
Файл конфига будет таким:
Так же нужно в /etc/nginx/nginx.conf, в разделе http добавить мапу:
Вдруг кому будет полезно )
Отлично!
Большое спасибо за конфиг nginx!
MainController.php
Routes.php
Отлично!
"Для начала давайте сделаем по-простому – с помощью регулярки научимся понимать, что текущий адрес: http://myproject.loc/hello/ , ГДЕ - вообще любая строка. "
В строке "ГДЕ - вообще любая строка" - где что , не совсем понятно, может пропустили слово?
Спасибо, исправил
Отлично!
Отлично
Супер!
Спасибо за урок, вроде разобрался!
routes.php:
MainController.php:
Отлично
Метод
Роут
Отлично
А зачем вот эта приписка ::class в \MyProject\Controllers\MainController::class ?
Непонятна ее целесообразность, ведь можно же и просто в кавычки взять '\MyProject\Controllers\MainController' и ничего не поменяется.
Нашел в документации только это, но ясности все-равно не вносит
Преимущество в том, что можно по имени класса щёлкнуть мышкой и он сразу откроется. Ну и если его переименовывать, то здесь IDE автоматом тоже все поменяет.
А в какой вкладке это настраивается? Потому что у меня в phpstorm по клику мышки класс не открывается и при переименовании автоматически не меняется.
Ctrl+клик мышкой. Переименовывать надо через меню refactor
По идее можно было написать просто MainController::class и он должен выдать путь к классу с namespace'ом, но так почему-то не работает, а почему не пойму?
MainController.php
routes.php
index.php оставляем идентичным уроку, так так сделали все для работы.
При переходе http://myproject.loc/bye/Serega все работает))
Отлично
все. разобрался ))
Супер)
MainController.php
routes.php
Отлично
Контроллер
Индекс
Роут
Отлично
Вроде понятно,а вроде и не очень) Думаю после модели и представления будет общая картина понятнее)
А что именно непонятно? Лучше сейчас спрашивай
Да принцип работы и сейчас и дальше понятен,я не представляю,как это реализовывать с 0). И ещё,в одном из следующих уроков будет момент с
Мы получается обращаемся к обьекту,который создали в конструкторе мейн контроллера и вызываем метод этого объекта,я правильно понял? Я в этих хитросплетениях немного запутался,получается мы в одном месте создали класс(представление),создали из этого класса внутри другого класса обьект и вызвали его метод.
Всё верно. С нуля понятно что не смог бы, для того и учишься, это нормально.
routes.php
MainController.php
Отлично
routes.php
MainController.php
Отлично
array(2) { [0]=> string(36) "MyProject\Controllers\MainController" [1]=> string(4) "main" } array(1) { [0]=> string(0) "" }
Кто-то может подсказать что нужно сделать чтобы браузер коректно отображал код и результат выполнение кода? Раньше было все нормально. Сейчас все идет без разметки.
XDebug включите
xdebug установлен. Результат тот же
В phpinfo() что конкретно про xdebug написано?
Debug Build no
Показывает что нет, хотя дебаг установлен и работает. ПОпробовать переустановить?
И это всё? Этого мало. У меня несколько строк про xdebug. Вы точно раскомментировали расширение и перезапустил сервис после этого? Он у вас определенно не включен.
если еще актуально, то я в файле php.ini в строку xdebug.default_enable прописал значение on (off было по умолчанию)
src/MyProject/Controllers/MainController.php
src/routes.php
www/index.php
Отлично
Спасибо за урок, было сложно, возможно через короткое время повторю.
MainController.php
routes.php
Отлично
1.
Не указаны квантификаторы *
2.
Так в route же передается не вся адресная строка, а URI?
3.
Как и когда в $1 попадают данные???
запись ./index..... актуальна же только для локального сервера?
4.
А если этих адресов десятки/сотни/очень много - прописывать вручную для каждого возможного адреса?
5.
Шторм в этой строке:
подчеркивает $matches и говорит, что переменная вероятно не определена. Что это значит?
Так, как указано в цитате - в описании кода, в регулярке учитывается только один единственный символ. В скобках не хватает квантификатора * после точки
Понял, спасибо, исправил
Контроллер:
Роут
Есть вопрос: Зачем в routes в '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'], писать MainController::class, разве MainController уже не название класса?
Чтобы не хардкодить строку. Если мы переименуем класс контроллера, IDE автоматом и здесь найдет его использование и переименует.
MainController.php
routes.php
Супер!
Я переименовал класс контроллера и в файле routes.php строчка \myProject\Controllers\mainController::class так и осталась не переименованная
MainController.php:
routes.php:
Отлично
MainController.php
routes.php
Спасибо, Артём, это прекрасный урок. Сложный, но до жути интересный
Отлично)
index.php
routes.php
MainController.php
Отлично!
Отлично
MainController.php:
routes.php:
Результат при переходе на http://myproject.loc/bye/username
Отлично
index.php:
MainController.php:
routes.php:
Достаточно только тех файлов, которые были изменены в рамках ДЗ, все файлы проекта скидывать не нужно)
Хорошо, понял)
в чём ошибка? когда ваш код копирую в .htaccess всё работает, но когда мой, пишет:"Ошибка сервера"
Ошибку свою понял, перед "L" не нужно было ставить пробел
routes.php
MainController.php
index.php
Отлично.
В решении не нужно скидывать все файлы проекта, скидывайте только то, что изменили в рамках выполнения ДЗ.
Личный вопрос. Как сделать вывод функции var_dump() и ошибок, как у вас??? Просто неудобно смотреть ошибки и вывод vurdump()'а в одну однотонную строку ..
Погуглите xdebug + var_dump + color
MainController.php
routes.php
Лучше уж ^$, зачем этот путь с индексом
Возникла проблема с моим локальным хостом, я сейчас использую xampp и там в путь автоматически добавлялось 'index.php', потому пришлось прописать это и в routes.php. Забыла упомянуть об этом нюансе, когда отправляла домашку)
Надо от этого как-то избавиться) погуглите
Хорошо.
routes.php
MainController.php
Отлично
Только имена методов нужно с маленькой буквы написать.
Спасибо большое, очень интересный урок!
Отлично. Пожалуйста ;)
В MainController.php добавил:
В routes.php:
Отлично
Отлично
Привет, спасибо за урок.
Сложно это запомнить, но хорошо, что хотя-бы понятно.
В уроке используется такая конструкция, не нашел ее в документации, поэтому хочу спросить - выходит такая команда ищет единственный существующий элемент массива?
В нашем случае без проблем можно заменить на ($matches[1])?
Привет. А как искал? :)
Первая ссылка
Плохо, извиняюсь.)
Не понял как мы положили в переменную подключение файла:
Потом понял, что require - это всего лишь функция, и в ней тоже может быть return
Изучите документацию по require, это было одним из домашних заданий в курсе PHP для начинающих
После этого урока понял, что нужно пропить курс Ноотропила)))))
MainController.php
routes.php
Хах) Лучше высыпайтесь)
Отлично
Подскажите, как этот код работает не пойму никак?
Особенно касаемо части строк где ::class
php
return [
'~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
'~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];
А что именно непонятно? Это просто массив массивов.
::class - возвращает строку с именем класса.
То что это массив массивов я это понимаю.
Просто не ясен момент. ::class
Ну по итогу после выполнения этого кода по ключу '~^hello/(.*)$~' находится массив с содержимым:
['\MyProject\Controllers\MainController', 'sayHello']
Это и так понятно.
Настораживает зачем в конце 1ого элемента массива используется ::class?
Для чего? Что за тема. Акся в пхп, с н аксисе?
Я же написал. Это вернёт имя класса в виде строки. Если непонятно почему бы не написать сразу строку, то так делается по нескольким причинам:
Добрый день, надо же , справился, долго настаивал адреса в этом уроке, у меня вин7 32, а опен сервер только 64. оставлю добавки к файлам. индекс :
$pattern = '~^bye/(.*)$~';
preg_match($pattern, $route, $matches);
if (!empty($matches)) {
$controller = new \MyProject\Controllers\MainController();
$controller->sayBye($matches[1]);
return;
контроллер:
public function sayBye(string $name)
{
echo 'Пока, ' . $name;
}
роут:
<?php
return [
'~^hello/(.)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
'~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
'~^bye/(.)$~' => [\MyProject\Controllers\MainController::class, 'sayBye']
];
Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого проверю вашу домашнюю работу и отвечу на вопросы.
MainController.php
routes.php
Отлично. Только комментарии не нужно скидывать в домашней работе
routes.php
mainControllres.php
index.php
Отлично
Добрый день!
Опечатка в слове bye.
Ключ ~^$~ в роутинге массивов дублируется
Артем, добрый день!
Сделала все как написано в уроке, но выходит ошибка. Подскажите, пожалуйста, в чем может быть проблема.
Ошибка сервера!
Произошла внутренняя ошибка сервера, в результате которой серверу не удалось завершить обработку Вашего запроса. Сервер перегружен, или в CGI-скрипте обнаружена ошибка.
Если Вы считаете, что это ошибка сервера, пожалуйста, сообщите об этом веб-мастеру.
Error 500
study
Apache
А какой у вас веб-сервер?
Добрый день, Артем!
Отлично. В меню опенсервера есть логи, после появления ошибки нужно найти ее в логах. Можете мне в личку написать, так быстрее будет.
в браузере вызываю http://study/abracadabra
Артем, я нашла в чем проблема. Покопалась в журнале логов Appach отладки. Не было пробела в RewriteRule^
RewriteRule ^(.*)$ ./index.php?route=$1 [QSA,L]
Теперь все заработало.
О, супер! Только отвечайте в той же ветке комментариев в следующий раз)
Да, хорошо! Спасибо вам большое!
routes.php
MainController.php
Отлично
Стоит(можно) ли идти дальше если не понятно про Routing?
Нет. Что именно непонятно?
Что происходит в этой строке (что означают два вопроса в строке):
$route = $_GET['route'] ?? '';
И в файле routes.php строчка:
'~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
Что это значит: MainController::class
https://www.php.net/manual/ru/migration70.new-features.php
https://www.php.net/manual/ru/language.oop5.paamayim-nekudotayim.php
Спасибо, с первой ссылкой разобрался, со 2-ой нет конкретного ответа. Если я правильно понял, :: указывает на конкретный класс? т.е. в массив он записывается как класс?
Это обращение к статическим свойствам и методам класса
Добрый вечер!
Спасибо большое за курсы, интересно и доходчиво!
У меня два вопроса:
В routes.php
в MainController.php
Отлично
А что это за конструкция?
Всё, нашёл ответы в комментариях выше.
Почему переменная $controllerAndAction имеет глобальную зону видимости, хотя создали ее внутри foreach?
Это не глобальная область видимости. Иначе было бы ключевое слово global. foreach не имеет собственной области видимости, как и другие циклы в PHP