Этот урок набрал набрал достаточно большое количество комментариев и дальнейшее его комментирование отключено. Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку, посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали. Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
[email protected] 21.09.2018 в 18:01

Добрый день в первой части урока выдает вместо
'abracadabra'
'train.com/public_html/abracadabra'

ivashkevich 22.09.2018 в 20:36

Привет, напишите мне в вк или телеграм.

SlipKnot 02.10.2018 в 08:12

src\MyProject\Controllers\MainController.php

<?php

namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Main page!';
    }
    public function sayHello(string $name)
    {
        echo 'Hello, ' . $name . '!';
    }
    public function sayBye(string $name)
    {
        echo 'Bye, bye ' . $name;
    }
}

src\routes.php

<?php

return [
    '~^hello/(.*)$~'=> [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~'=> [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~'=>[\MyProject\Controllers\MainController::class, 'main'],
];

www\index.php

<?php

spl_autoload_register(function (string $className) {
    require_once __DIR__ . '/../src/' . $className . '.php';
});

$route = $_GET['route'] ?? '';
$routes = require __DIR__ . '/../src/routes.php';

$isRouteFound = false;
foreach ($routes as $pattern => $controllerAndAction) {
    preg_match($pattern, $route, $matches);
    if (!empty($matches)) {
        $isRouteFound = true;
        break;
    }
}
if (!$isRouteFound) {
    echo '!!!PAGE NOT FOUND!!!';
    return;
}
unset ($matches[0]);

$controllerName = $controllerAndAction[0]; // 0 => string 'MyProject\Controllers\MainController' (length=36)
$actionName = $controllerAndAction[1]; //1 => string 'sayHello' (length=8)
$controller = new $controllerName(); //object(MyProject\Controllers\MainController)[1]
$controller->$actionName(...$matches);
ivashkevich 02.10.2018 в 22:46

Хорошо

SBTesla 12.10.2018 в 11:41

файл 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;
     }
}

файл routes.php

return ['~ ^Hello/(.*)$~'=>[\MyProject\Controllers\MainController::class, 'sayHello'],
      '~^$~'=>[MyProject\Controllers\MainController::class, 'main'],
      '~^bye/(.*)$~'=>[MyProject\Controllers\MainController::class, 'sayBye']
      ];

файл Index.php

spl_autoload_register(function (string $className) {
     require_once __DIR__ . '/../src/' . $className . '.php';
});

$route = $_GET['route'] ?? '';
$routes = require __DIR__ . '/../src/routes.php';

$isRouteFound = false;
foreach ($routes as $pattern => $controllerAndAction) {
     preg_match($pattern, $route,$matches);
     if (!empty($matches)) {
          $isRouteFound = true;
          break;
     }
}
if (!$isRouteFound) {
     echo 'Страница не найдена';
     return ;
}
unset($matches[0]);
$controllerName = $controllerAndAction[0];
$actionName = $controllerAndAction[1];
$controller = new $controllerName();
$controller->$actionName(...$matches);
ivashkevich 13.10.2018 в 21:17

Отлично!

[email protected] 01.05.2020 в 18:22

ахахахах, хорошее прощание ;)

artemjeka 17.10.2018 в 07:20

src/routes.php +

'~^bye/(.*)$~' => [\MVCExample\Controllers\MainController::class, 'sayBye'],

src/MVCExample/Controllers/MainController.php +

public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }

url +

http://php_book/mvc/www/bye/artem

Выхлоп =

Пока, artem

Спасибо.

ivashkevich 19.10.2018 в 00:15

А что у вас за url такой жуткий? Опять экспериментируете не по курсу?

AxLT 31.10.2018 в 22:25

routes.php

<?php
return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    ];

MainController.php

<?php
namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }
    public function sayHello(string $name)
    {
        echo ' Hello ' . $name;
    }
    public function sayBye(string $name)
    {
        echo 'Bye ' . $name;
    }
}
ivashkevich 01.11.2018 в 22:52

Супер!

AntonM99 06.11.2018 в 19:10

Пока что трудно переваривается информация, но вроде справляюсь

routes.php

<?php
return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main']

];

MainController.php

<?php
namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }

    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }
}
ivashkevich 08.11.2018 в 10:34

Отлично!

Todd 07.11.2018 в 01:01

MainController

namespace app\Controllers;

class MainController {

    public function main() {
        return 'main page';
    }

    public function sayHello(string $name) {
        return 'hi, ' . $name;
    }

    public function sayBye(string $name) {
        return 'Bye, ' . $name;
    }

}

routes

return [
    '~^hello/(.*)$~' => [\app\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~'   => [\app\Controllers\MainController::class, 'sayBye'],
    '~^$~'           => [\app\Controllers\MainController::class, 'main'],
];

index

spl_autoload_register(function (string $className) {
    require __DIR__ . '/' . $className . '.php';
});

$route = $_GET['route'] ?? '';
$routes = require __DIR__ . '/routes.php';

$isRouteFound = false;
foreach ($routes as $pattern => $controllerAndAction) {
    preg_match($pattern, $route, $matches);
    if (!empty($matches)) {
        $isRouteFound = true;
        break;
    }
}

if (!$isRouteFound) {
    echo 'not found page';
}

unset($matches[0]);

$controllerName = $controllerAndAction[0];
$controllerAction = $controllerAndAction[1];

$controller = new $controllerName();
echo $controller->$controllerAction(...$matches);
ivashkevich 08.11.2018 в 10:34

Супер!

stokato 07.11.2018 в 11:02

Создайте еще один экшн в контроллере – 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;
    }
}
ivashkevich 08.11.2018 в 10:35

Отлично!

bildep 18.11.2018 в 17:47

src\MyProject\Controllers\MainController.php

<?php
namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }

    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }
}

src\routes.php

<?php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];
ivashkevich 19.11.2018 в 21:51

Отлично!

Ilon 21.11.2018 в 03:31

Правильно ли делать отдельный класс route, чтобы делать маршрутизацию или же сделать как Вы указали? Есть много примеров отдельного класса, и актуально ли это?

ivashkevich 22.11.2018 в 09:20

Да, можно делать отдельным классом, в котором будет логика парсинга и всё что только нужно. Здесь специально не стал выносить для простоты.

virtual2018 26.12.2018 в 09:34

MainController.php

    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }

routes.php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye']
ivashkevich 26.12.2018 в 23:37

Хорошо

alepawka 02.01.2019 в 03:13
'~^bue/(.*)$~' => [\MyProject\Controllers\MainController::class,'sayBue'], //Добавил в routes.php
public function sayBue(string $name) // Добавил в MainController.php
        {
            echo "Пока, " . $name;
        }
ivashkevich 02.01.2019 в 21:04

Отлично!

landialog 06.01.2019 в 14:12

Метод sayBye в MainControoler.php

public function sayBye(string $name){echo 'Пока , '. $name;}

Код общий route.php
return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~'=>[\MyProject\Controllers\MainController::class, 'main'],
];
ivashkevich 06.01.2019 в 23:06

Не нужно лепить всё в одной строке. А так - норм.

Bogdan 07.01.2019 в 22:28

Создайте еще один экшн в контроллере – sayBye(string $name), который будет выводить «Пока, $name». Добавьте для него роут /bye/$name и убедитесь, что всё работает.

<?php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];
<?php

namespace MyProject\Controllers;

class MainController
{
    public function main(): void
    {
        echo 'Главная страница';
    }

    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }

    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }
}

МОзг поплыл после этого урока, надеюсь не я один такой...

$controllerName = $controllerAndAction[0];
$actionName = $controllerAndAction[1];

$controller = new $controllerName();
$controller->$actionName(...$matches);

вот тут вообще полностью все взорвалось, без копи-паст тут не написать)

ivashkevich 07.01.2019 в 22:38

Всё норм

Bogdan 10.01.2019 в 14:08

Да, свежая голова дает о себе знать, потратил 3 часа но разобрался и все понял. Но есть 1 вопрос:

  • Почему мы все это написали в конце кода, а не к примеру в if (!empty($matches)), как ни как это вроде оптимизация кода и мы бы убрали в данном случае проверку на $isRouteFound.
    Спасибо

    $controllerName = $controllerAndAction[0];
    $controllerAction = $controllerAndAction[1]; 
    $controller = new $controllerName(); 
    echo $controller->$controllerAction(...$matches); 

    Мы бы даже могли просто убрать проверку и написать "Страница не найдена"

    foreach ($routes as $pattern => $controllerAndAction) {
    preg_match($pattern, $route, $matches); 
    if (!empty($matches)) {
        unset($matches[0]);     
        $controllerName = $controllerAndAction[0]; 
        $actionName = $controllerAndAction[1]; 
        $controller = new $controllerName(); 
        $controller->$actionName(...$matches); 
    
        break;
    }
    }
    echo 'Страница не найдена!';
ivashkevich 11.01.2019 в 11:08

Чтобы не городить потом весь код внутри if'а. Если потом появятся ещё условия, нужно будет их внутри этого if'а добавлять. И так оно будет разростаться и усложняться, как снежный ком. Нашли роут - выполняем код дальше, не нашли - падаем. Прочитайте про цикломатическую сложность.

Bogdan 10.01.2019 в 14:23

Урок хороший, спасибо

Bugaga159 02.02.2019 в 22:28

MainController.php

<?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.php

<?php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
];

Делаем запрос:
http://myproject.loc/bye/andrey
Получаем : Пока, andrey

ivashkevich 03.02.2019 в 23:59

Отлично!

cap 26.02.2019 в 23:50
//MainController.php

<?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.php

<?php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
]
//index.php - не меняется, если я правильно понял
ivashkevich 19.03.2019 в 23:13

Отлично

CarfikDK 18.03.2019 в 19:47

Спасибо за урок!
routes.php

<?php

return [
    '~hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~bye/(.*)$~' =>[\MyProject\Controllers\MainController::class, 'sayBye'],
];

MainController.php

<?php

namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Это главная страница проэкта';
    }

    public function sayHello($name)
    {
        echo 'Привет, ' . $name;
    }

    public function sayBye($name)
    {
        echo 'Пока, ' . $name;
    }
}
ivashkevich 19.03.2019 в 23:13

Отлично

Evgeny 19.03.2019 в 00:53

route.php


<?php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
];

MainController.php


<?php

namespace MyProject\Controllers;

class MainController
{
    public function main(): void
    {
        echo 'Главная страница.';
    }

    public function sayHello(string $name): void
    {
        echo 'Привет, ' . $name;
    }

    public function sayBye(string $name): void
    {
        echo 'Пока, ' . $name;
    }
}

index.php


<?php

spl_autoload_register(function (string $classname) {
    require_once __DIR__ . '/../src/' . $classname . '.php';
});

$route = $_GET['route'] ?? '';
$routes = require __DIR__ . '/../src/routes.php';

$isRouteFound = false;
foreach ($routes as $pattern => $controllerAnsAction) {
    preg_match($pattern, $route, $matches);
    if (!empty($matches)) {
        $isRouteFound = true;
        break;
    }
}

if (!$isRouteFound) {
    echo 'Страница не найдена.';
    return;
}

unset($matches[0]);

$controllerName = $controllerAnsAction[0];
$actionName = $controllerAnsAction[1];

$controller = new $controllerName;
$controller->$actionName(...$matches);
ivashkevich 19.03.2019 в 23:14

Отлично

mitja1211 02.04.2019 в 14:02
return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
];

namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

     public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }

    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }
}
ivashkevich 03.04.2019 в 05:08

Отлично

[email protected] 02.04.2019 в 17:47
public function sayBye(string $name){
    echo 'Пока, '. $name;
}

Роут:

'~^bye/(.*)$~' => [\Controllers\MainController::class, 'sayBye'],
ivashkevich 03.04.2019 в 05:09

Отлично

Boodoo 13.04.2019 в 14:53

MainController.php

<?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.php

<?php
    return [
        '#^hello/(.+)$#' => [\MyProject\Controllers\MainController::class, 'sayHello'],
        '#^bye/(.+)$#' => [\MyProject\Controllers\MainController::class, 'sayBye'],
        '#^$#' => [\MyProject\Controllers\MainController::class, 'main']
    ];
ivashkevich 13.04.2019 в 15:27

Отлично

polvanovv 25.04.2019 в 15:15
return [
    '~^hello/(.*)$~' => [\Myproject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~'   => [\Myproject\Controllers\MainController::class, 'sayBye'],
    '~^$~'           => [\Myproject\Controllers\MainController::class, 'main'],
];

public  function sayBye(string $name)
    {
        echo 'Good bye, ' . $name;
    }
ivashkevich 25.04.2019 в 15:17

Отлично

Dram 12.05.2019 в 15:44
  1. routes.php
    <?php
    return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, ' sayBye'],
    ];
  2. MainController.php
<?php
namespace MyProject\Controllers;
class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }

    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }
}
  1. Вроде бы в индекс пхп не надо ничего добавлять. Но пока я получаю ошибку

    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 отрабатывают как нужно.

ivashkevich 12.05.2019 в 23:04

А точно ли у вас файл с контроллером сохранен?

lMaxl 24.05.2019 в 14:58

Доброго дня!

Создайте в директории 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 / и директории сайта.
???

ivashkevich 26.05.2019 в 12:45

Приветствую. Настройте OpenServer по этому уроку.

ashfedor 13.06.2019 в 11:46

src\MyProject\Controllers\MainController.php

<?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.php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];
ivashkevich 13.06.2019 в 19:47

Отлично!

rpash151 25.06.2019 в 22:49
return [
    '~^hello/(.*)$~' => [\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [\Controllers\MainController::class, 'sayBye'],
];
<?php

function myAutoLoader(string $className)
{
    //require_once __DIR__ . '/Src/' . $className . '.php';
    require_once __DIR__ . '/../src/' . str_replace('\\', '/', $className) . '.php';
}

spl_autoload_register('myAutoLoader');

$route = $_GET['route'] ?? '';
$routes = require __DIR__ . '/../src/routes.php';
$isRouteFound = false;
foreach ($routes as $pattern => $controllerAndAction)
{
    preg_match($pattern,$route,$matches);
    if(!empty($matches))
    {
        $isRouteFound=true;
        break;
    }
}

if (!$isRouteFound) {
    echo 'Страница не найдена!';
    return;
}

unset($matches[0]);

var_dump($controllerAndAction);
var_dump($matches);

$controllerName = $controllerAndAction[0];
$actionName = $controllerAndAction[1];

$controller = new $controllerName();
$controller->$actionName(...$matches);
<?php

namespace Controllers;

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }
    public function sayBye(string $name)
    {
        echo 'До новых встреч, '.$name;
    }
}
ivashkevich 27.06.2019 в 19:09

Отлично!

Invo 07.07.2019 в 14:50

Возможно кто то решил не с апачем, а с nginx работать (как я):

Тогда для подобного нужно следующее:

  • Файл конфига будет таким:

    server {
    index index.php;
    server_name blog.dev;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/blog.dev/www;
    
    location / {
        try_files $uri $uri/ /?route=$route;
    }
    
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    }

Так же нужно в /etc/nginx/nginx.conf, в разделе http добавить мапу:

 map $uri $route {
     default '';
     '~^/(.*)' $1;
    }

Вдруг кому будет полезно )

ivashkevich 07.07.2019 в 18:03

Отлично!

Vilotu 11.02.2021 в 20:46

Большое спасибо за конфиг nginx!

Moskva 09.07.2019 в 14:12

MainController.php

<?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;
    }
}

Routes.php

<?php

return [
  '~^bye/(.*)$~' => [\MyProject\controllers\MainController::class, 'sayBye'],
  '~^hello/(.*)$~' => [\MyProject\controllers\MainController::class, 'sayHello'],
  '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];
ivashkevich 09.07.2019 в 19:01

Отлично!

Danya 10.07.2019 в 12:26

"Для начала давайте сделаем по-простому – с помощью регулярки научимся понимать, что текущий адрес: http://myproject.loc/hello/ , ГДЕ - вообще любая строка. "
В строке "ГДЕ - вообще любая строка" - где что , не совсем понятно, может пропустили слово?

ivashkevich 12.07.2019 в 05:29

Спасибо, исправил

Iliusha99 19.07.2019 в 22:58
<?php

return [
    '~^hello/(.*)$~' => [Controllers\MainController::class, 'sayHello'],
    '~^$~' => [Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [Controllers\MainController::class, 'sayBye']
];

===================================

<?php

namespace Controllers;

class MainController
{

    public function main()
    {
        echo '<h1>Главная страница</h1>';
    }

    public function sayHello(string $name)
    {
        echo '<h1>Привет, ' . $name .'</h1>';
    }

    public function sayBye(string $name)
    {
        echo '<h1>Пока,'. $name .'</h1>';
    }

}
ivashkevich 20.07.2019 в 14:41

Отлично!

Metey 20.07.2019 в 17:18
вернулся назад и вспомнил про эту ДЗ

<?php

namespace MyProject\Controllers;

use MyProject\View\View;

class MainController
{
    private $view;

    public function __construct()
    {
        $this->view = new View(__DIR__ . '/../../../templates');
    }

    public function main()
    {
        $articles = [
            ['name' => 'Статья 1', 'text' => 'Текст статьи 1'],
            ['name' => 'Статья 2', 'text' => 'Текст статьи 2'],

        ];

        $this->view->renderHtml('main/main.php', ['articles' => $articles]);
    }

    public function sayHello(string $name)
    {
        $this->view->renderHtml('main/hello.php', ['name' => $name, 'title' => 'Страница приветствия']);
    }

    public function sayBye(string $name)
    {
        $this->view->renderHtml('main/bye.php', ['name' => $name]);
    }
}

bye.php

<?php include __DIR__ . '/../header.php'; ?>
Пока, <?= $name ?>!!!
<?php include __DIR__ . '/../footer.php'; ?>
ivashkevich 21.07.2019 в 05:15

Отлично

Reechniy 31.07.2019 в 07:21
routers.php

<?php

return [
    '~^hello/(.*)$~'=>[\MyProject\Controllers\MainController::class, 'sayHello' ],
    '~^$~'=> [\MyProject\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~'=>[\MyProject\Controllers\MainController::class, 'sayBye'],
];

MainController.php

<?php

namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }

    public function sayBye(string $name)
    {
        echo 'Пока, ' .$name;
    }
}

index.php

Без изменений
ivashkevich 31.07.2019 в 07:26

Супер!

artemship 01.08.2019 в 15:06

Спасибо за урок, вроде разобрался!

routes.php:

<?php

return [
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
];

MainController.php:

<?php

namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }

    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }
}
ivashkevich 01.08.2019 в 20:34

Отлично

Blook 07.08.2019 в 23:04

Метод

    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }

Роут

'#^bye/(.*)$#' => [\MyProject\Controllers\MainController::class, 'sayBye'],
ivashkevich 08.08.2019 в 16:07

Отлично

fosfat 30.08.2019 в 00:34

А зачем вот эта приписка ::class в \MyProject\Controllers\MainController::class ?

Непонятна ее целесообразность, ведь можно же и просто в кавычки взять '\MyProject\Controllers\MainController' и ничего не поменяется.

Нашел в документации только это, но ясности все-равно не вносит

ivashkevich 30.08.2019 в 04:44

Преимущество в том, что можно по имени класса щёлкнуть мышкой и он сразу откроется. Ну и если его переименовывать, то здесь IDE автоматом тоже все поменяет.

fosfat 30.08.2019 в 21:15

А в какой вкладке это настраивается? Потому что у меня в phpstorm по клику мышки класс не открывается и при переименовании автоматически не меняется.

ivashkevich 31.08.2019 в 05:05

Ctrl+клик мышкой. Переименовывать надо через меню refactor

stiv822 23.04.2023 в 18:50

По идее можно было написать просто MainController::class и он должен выдать путь к классу с namespace'ом, но так почему-то не работает, а почему не пойму?

Pro100Bah 05.09.2019 в 16:12

MainController.php

namespace MyProject\Controllers;        //Our Controller

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

    public function sayHello(string $name)
    {
        echo 'Привет ' . $name;
    }

    public function sayBye(string $name)            //Homework 13.2
    {
        echo 'Пакедова, дружище ' . $name;
    }
}

routes.php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye']          // homework13.2
];

index.php оставляем идентичным уроку, так так сделали все для работы.
При переходе http://myproject.loc/bye/Serega все работает))

ivashkevich 05.09.2019 в 19:46

Отлично

vtolstov 20.09.2019 в 11:10

все. разобрался ))

ivashkevich 21.09.2019 в 07:21

Супер)

XXX 29.09.2019 в 14:53

MainController.php

 public function sayBye(string $name)
    {
        echo 'Bye, ' . $name . '!';
    }

routes.php

'~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye']
ivashkevich 30.09.2019 в 00:30

Отлично

[email protected] 05.10.2019 в 18:03

Контроллер

<?php

namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

    public function sayBye(string $name){
        echo "Пока,$name";
    }

    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }
}

Индекс

<?php

spl_autoload_register(function (string $className) {
    require_once __DIR__ . '/../src/' . str_replace('\\', '/', $className) . '.php';
});

$route = $_GET['route'] ?? '';
$routes = require __DIR__ . '/../src/routes.php';

$isRouteFound = false;
foreach ($routes as $pattern => $controllerAndAction) {
    preg_match($pattern, $route, $matches);
    if (!empty($matches)) {
        $isRouteFound = true;
        break;
    }
}

if (!$isRouteFound) {
    echo 'Страница не найдена!';
    return;
}

unset($matches[0]);

var_dump($controllerAndAction);
var_dump($matches);

$controllerName = $controllerAndAction[0];
var_dump($controllerName);
$actionName = $controllerAndAction[1];
var_dump($actionName);
$controller = new $controllerName();
var_dump($controller);
$controller->$actionName(...$matches);

Роут

<?php

return [
    '/hello\/(.*)$/' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^\s*$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '/buy\/(.*)$/' => [\MyProject\Controllers\MainController::class, 'sayBye'],
];
ivashkevich 05.10.2019 в 19:41

Отлично

[email protected] 05.10.2019 в 18:46

Вроде понятно,а вроде и не очень) Думаю после модели и представления будет общая картина понятнее)

ivashkevich 05.10.2019 в 19:41

А что именно непонятно? Лучше сейчас спрашивай

[email protected] 05.10.2019 в 21:05

Да принцип работы и сейчас и дальше понятен,я не представляю,как это реализовывать с 0). И ещё,в одном из следующих уроков будет момент с

public function sayHello(string $name)
    {
       $this->view->renderHtml('main/hello.php',['name'=>$name,'title'=>'Страница приветствия']);
    }

Мы получается обращаемся к обьекту,который создали в конструкторе мейн контроллера и вызываем метод этого объекта,я правильно понял? Я в этих хитросплетениях немного запутался,получается мы в одном месте создали класс(представление),создали из этого класса внутри другого класса обьект и вызвали его метод.

ivashkevich 05.10.2019 в 21:36

Всё верно. С нуля понятно что не смог бы, для того и учишься, это нормально.

dliashchenko 17.10.2019 в 21:40

routes.php

<?php
return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];

MainController.php

<?php
namespace MyProject\Controllers;

class MainController
{

    public function main()
    {
        echo "Главная страница";
    }
    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name . '!';
    }
    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name . '!';
    }
}
ivashkevich 18.10.2019 в 08:59

Отлично

H3licoptero 13.11.2019 в 14:52

routes.php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye']
];

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 . '!';
    }
}
ivashkevich 13.11.2019 в 17:12

Отлично

XXX 02.01.2020 в 14:25

array(2) { [0]=> string(36) "MyProject\Controllers\MainController" [1]=> string(4) "main" } array(1) { [0]=> string(0) "" }

array (size=2)
  0 => string 'MyProject\Controllers\MainController' (length=36)
  1 => string 'sayHello' (length=8)
array (size=1)
  1 => string 'username' (length=8)

Кто-то может подсказать что нужно сделать чтобы браузер коректно отображал код и результат выполнение кода? Раньше было все нормально. Сейчас все идет без разметки.

ivashkevich 03.01.2020 в 03:57

XDebug включите

XXX 05.01.2020 в 19:50

xdebug установлен. Результат тот же

ivashkevich 06.01.2020 в 16:15

В phpinfo() что конкретно про xdebug написано?

XXX 11.01.2020 в 16:31

Debug Build no
Показывает что нет, хотя дебаг установлен и работает. ПОпробовать переустановить?

ivashkevich 12.01.2020 в 15:32

И это всё? Этого мало. У меня несколько строк про xdebug. Вы точно раскомментировали расширение и перезапустил сервис после этого? Он у вас определенно не включен.

andreskrip 23.01.2020 в 20:20

если еще актуально, то я в файле php.ini в строку xdebug.default_enable прописал значение on (off было по умолчанию)

EugeneGrigoryev 20.01.2020 в 12:56

src/MyProject/Controllers/MainController.php

<?php

namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }

    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }
}

src/routes.php

<?php
return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];

www/index.php

<?php
function myAutoLoader(string $className)
{
require_once __DIR__ . '/../src/' . $className . '.php';
}

spl_autoload_register('myAutoLoader');

$route = $_GET['route'] ?? '';
$routes = require __DIR__ . '/../src/routes.php';

$isRouteFound = false;
foreach ($routes as $pattern => $controllerAndAction) {
    preg_match($pattern, $route, $matches);
    if (!empty($matches)) {
        $isRouteFound = true;
        break;
    }
}

if (!$isRouteFound) {
    echo 'Страница не найдена!';
    return;
}

unset($matches[0]);

$controllerName = $controllerAndAction[0];
$actionName = $controllerAndAction[1];

$controller = new $controllerName();
$controller->$actionName(...$matches);
ivashkevich 20.01.2020 в 13:03

Отлично

andreskrip 23.01.2020 в 20:23

Спасибо за урок, было сложно, возможно через короткое время повторю.

MainController.php

    public function sayBye(string $name): void
    {
        echo 'Пока, ' . $name;
    }

routes.php

'~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
ivashkevich 24.01.2020 в 08:30

Отлично

OneMoreTime 21.02.2020 в 11:47

1.

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, и укажем имя контроллера и метода.

А если этих адресов десятки/сотни/очень много - прописывать вручную для каждого возможного адреса?

5.

<?php

spl_autoload_register(function (string $className) {
    require_once __DIR__ . '/../src/' . $className . '.php';
});

$route = $_GET['route'] ?? '';
$routes = require __DIR__ . '/../src/routes.php';

$isRouteFound = false;
foreach ($routes as $pattern => $controllerAndAction) {
    preg_match($pattern, $route, $matches);
    if (!empty($matches)) {
        $isRouteFound = true;
        break;
    }
}

if (!$isRouteFound) {
    echo 'Страница не найдена!';
    return;
}

unset($matches[0]);

$controllerName = $controllerAndAction[0];
$actionName = $controllerAndAction[1];

$controller = new $controllerName();
$controller->$actionName(...$matches);

Шторм в этой строке:

unset($matches[0]);

подчеркивает $matches и говорит, что переменная вероятно не определена. Что это значит?

ivashkevich 25.02.2020 в 07:24
  1. Для чего квантификаторы?
  2. Спасибо, исправил
  3. Когда по запрошенному URI не найдено файла, веб-сервер перенаправляет запрос на index.php с параметром route. Нет, актуально будет на любом сервере.
  4. Да. Ну вы учитывайте, что в качестве роута можно писать регулярки и обрабатывать каждый отдельный URI непосредственно в контроллере.
  5. Ну то и значит. Если не было совпадений по регуляркам, то эта переменная будет пустой. Но тогда останется isRouteFound = false и скрипт завершится до этой строчки. Но шторм не настолько умный, чтобы это понимать.
OneMoreTime 25.02.2020 в 14:53

Для чего квантификаторы?

Так, как указано в цитате - в описании кода, в регулярке учитывается только один единственный символ. В скобках не хватает квантификатора * после точки

RewriteRule ^(.)$ ./index.php?route=$1 [QSA,L] 
ivashkevich 25.02.2020 в 15:57

Понял, спасибо, исправил

Dimitry 02.04.2020 в 15:23

Контроллер:

<?php

namespace MyProject\Controllers;

class MainController
{
    public function main(){
        echo "Главная страница";
    }

    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }

    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'],
];

описание картинки

Есть вопрос: Зачем в routes в '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'], писать MainController::class, разве MainController уже не название класса?

ivashkevich 02.04.2020 в 15:29

Чтобы не хардкодить строку. Если мы переименуем класс контроллера, IDE автоматом и здесь найдет его использование и переименует.

Salexandr 04.04.2020 в 22:00

MainController.php

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }

    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }
}

routes.php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
];
ivashkevich 05.04.2020 в 19:17

Супер!

stiv822 23.04.2023 в 18:14

Я переименовал класс контроллера и в файле routes.php строчка \myProject\Controllers\mainController::class так и осталась не переименованная

Alexann 11.04.2020 в 17:17

MainController.php:

...
public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }

routes.php:

<?php
return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' =>[\MyProject\Controllers\MainController::class,'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];
ivashkevich 11.04.2020 в 21:33

Отлично

Dmitry.Dudin 11.04.2020 в 19:56

MainController.php

<?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.php

<?php
return [
    '~^hello/(.*)$~'=>[\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~'=>[\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~'=>[\MyProject\Controllers\MainController::class, 'main'],
];

Спасибо, Артём, это прекрасный урок. Сложный, но до жути интересный

ivashkevich 11.04.2020 в 21:43

Отлично)

[email protected] 12.04.2020 в 13:27

index.php

  unset($matches[0]);

  $controllerName = $controllerAndAction[0];
  $actionName = $controllerAndAction[1];

  $controller = new $controllerName();
  $controller->$actionName(...$matches);

routes.php

return [
  '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
  '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
  '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye']
];

MainController.php

  public function sayBye(string $name) {
    echo 'Пока, ' . $name . '.';
  }
ivashkevich 13.04.2020 в 12:59

Отлично!

Fill 16.04.2020 в 16:32
<?php

//routes.php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
];

//MainController.php

namespace MyProject\Controllers;

class MainController
{
    //...
    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }
}
ivashkevich 17.04.2020 в 08:46

Отлично

Timurik 25.04.2020 в 15:50

MainController.php:

<?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.php:

<?php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye']
];

Результат при переходе на http://myproject.loc/bye/username

Пока, username
ivashkevich 25.04.2020 в 17:38

Отлично

studentDev 29.04.2020 в 15:24

index.php:

<?php
    spl_autoload_register(function (string $className) {
       require_once  __DIR__ . '/../src/' . $className . '.php';
    });

    $route = $_GET['route'] ?? '';
    $routes = require __DIR__ . '/../src/routes.php';

    $isRouteFound = false;
    foreach($routes as $pattern => $controllerAndAction) {

        preg_match($pattern, $route, $matches);
        if(!empty($matches)) {
            $isRouteFound = true;
            break;
        }
    }

    if(!$isRouteFound) {
        echo 'Sorry page not found! :(';
        return;
    }

    unset($matches[0]);

    $controllerName = $controllerAndAction[0];
    $actionName = $controllerAndAction[1];
    $object = new $controllerName();
    $object->$actionName(...$matches);

MainController.php:

<?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.php:

<?php
    return [
        '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
        '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
        '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    ];
ivashkevich 29.04.2020 в 20:23

Достаточно только тех файлов, которые были изменены в рамках ДЗ, все файлы проекта скидывать не нужно)

studentDev 30.04.2020 в 04:30

Хорошо, понял)

[email protected] 01.05.2020 в 11:43
RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^(.*)$ ./index.php?route=$1 [QSA, L]

в чём ошибка? когда ваш код копирую в .htaccess всё работает, но когда мой, пишет:"Ошибка сервера"
Ошибку свою понял, перед "L" не нужно было ставить пробел

[email protected] 01.05.2020 в 18:21

routes.php

<?php
    return [
        '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
        '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
        '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    ];

MainController.php

<?php

    namespace MyProject\Controllers;

    class MainController
    {
        public function main()
        {
            echo 'Главная страница';
        }
        public function sayHello(string $name)
        {
            echo 'Привет, '.$name.'.';
        }
        public function sayBye(string $name)
        {
            echo 'Пока, '.$name.'.';
        }
    }

index.php

<?php

    spl_autoload_register(function (string $className)
    {
        require __DIR__.'/../src/'.$className.'.php';
    });
    $route = $_GET['route'] ?? '';
    $routes = require __DIR__. '/../src/routes.php';
    $isRouteFound = false;
    foreach ($routes as $pattern => $controllerAndAction){
        preg_match($pattern, $route, $matches);
        if (!empty($matches)){
            $isRouteFound = true;
            break;
        }
    }
    if (!$isRouteFound){
        echo 'Страница не найдена';
        return;
    }
    unset($matches[0]);

    $controllerName = $controllerAndAction[0];
    $actionName = $controllerAndAction[1];

    $controller = new $controllerName();
    $controller->$actionName(...$matches);
ivashkevich 02.05.2020 в 15:47

Отлично.

В решении не нужно скидывать все файлы проекта, скидывайте только то, что изменили в рамках выполнения ДЗ.

[email protected] 01.05.2020 в 18:34

Личный вопрос. Как сделать вывод функции var_dump() и ошибок, как у вас??? Просто неудобно смотреть ошибки и вывод vurdump()'а в одну однотонную строку ..

ivashkevich 02.05.2020 в 15:47

Погуглите xdebug + var_dump + color

[email protected] 27.05.2020 в 23:47

MainController.php

<?php
namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Main page';
    }

    public function sayHello(string $name)
    {
        echo 'Hello, ' . $name;
    }

    public function sayBye(string $name)
    {
        echo 'Bye, ' . $name;
    }
}

routes.php

<?php
return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^index\.php$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
];
ivashkevich 28.05.2020 в 20:34
index\.php

Лучше уж ^$, зачем этот путь с индексом

[email protected] 28.05.2020 в 22:25

Возникла проблема с моим локальным хостом, я сейчас использую xampp и там в путь автоматически добавлялось 'index.php', потому пришлось прописать это и в routes.php. Забыла упомянуть об этом нюансе, когда отправляла домашку)

ivashkevich 29.05.2020 в 05:29

Надо от этого как-то избавиться) погуглите

[email protected] 29.05.2020 в 08:05

Хорошо.

IePyton 02.06.2020 в 13:56

routes.php

<?php
return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBay'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main']
    ];

MainController.php

<?php

namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

    public function SayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }

    public function SayBay(string $name)
    {
        echo 'Пока, ' . $name;
    }
}
ivashkevich 02.06.2020 в 14:12

Отлично

ivashkevich 02.06.2020 в 14:13

Только имена методов нужно с маленькой буквы написать.

NR 03.06.2020 в 02:20
<?php

//MainController.php
public function sayBye(string $name)
{
    echo 'Пока, '  . $name;
}

//routes.php
'~^bye/(.*)$~' =>[\MyProject\Controllers\MainController::class, 'sayBye'],

Спасибо большое, очень интересный урок!

ivashkevich 03.06.2020 в 09:07

Отлично. Пожалуйста ;)

Sviatoslav 07.06.2020 в 21:45

В MainController.php добавил:

public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }

В routes.php:

<?php

return [
    '~^hello/(.*)$~' => [\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\Controllers\MainController::class, 'main'],
];
ivashkevich 08.06.2020 в 07:44

Отлично

ivashkevich 08.06.2020 в 07:44

Отлично

[email protected] 05.07.2020 в 21:45

Привет, спасибо за урок.
Сложно это запомнить, но хорошо, что хотя-бы понятно.

(...$matches);

В уроке используется такая конструкция, не нашел ее в документации, поэтому хочу спросить - выходит такая команда ищет единственный существующий элемент массива?
В нашем случае без проблем можно заменить на ($matches[1])?

ivashkevich 06.07.2020 в 07:09

Привет. А как искал? :)
Первая ссылка

[email protected] 06.07.2020 в 07:29

Плохо, извиняюсь.)

[email protected] 01.08.2020 в 23:03

Не понял как мы положили в переменную подключение файла:

$routes = require __DIR__ . '/../src/routes.php';

Потом понял, что require - это всего лишь функция, и в ней тоже может быть return

ivashkevich 02.08.2020 в 17:43

Изучите документацию по require, это было одним из домашних заданий в курсе PHP для начинающих

VitaliyB 04.08.2020 в 10:10

После этого урока понял, что нужно пропить курс Ноотропила)))))

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;
    }
}

routes.php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main']

];
ivashkevich 05.08.2020 в 08:27

Хах) Лучше высыпайтесь)

Ysup 03.09.2020 в 22:38
<?php 
namespace MyProject\Controllers;

class MainController {
    public function main() {
        echo 'Главная страница'; 
    }

    public function sayHello(string $name) {
        echo 'Привет, ' . $name; 
    }

    public function sayBye(string $name) {
        echo 'Пока, ' . $name;
    }
}

src/routes.php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];
ivashkevich 06.09.2020 в 14:25

Отлично

SkSeMi 05.10.2020 в 01:52

Подскажите, как этот код работает не пойму никак?
Особенно касаемо части строк где ::class

php

return [
'~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
'~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];

ivashkevich 06.10.2020 в 07:56

А что именно непонятно? Это просто массив массивов.
::class - возвращает строку с именем класса.

SkSeMi 06.10.2020 в 12:03

То что это массив массивов я это понимаю.
Просто не ясен момент. ::class

ivashkevich 07.10.2020 в 19:28

Ну по итогу после выполнения этого кода по ключу '~^hello/(.*)$~' находится массив с содержимым:
['\MyProject\Controllers\MainController', 'sayHello']

SkSeMi 08.10.2020 в 00:13

Это и так понятно.
Настораживает зачем в конце 1ого элемента массива используется ::class?
Для чего? Что за тема. Акся в пхп, с н аксисе?

ivashkevich 08.10.2020 в 03:53

Я же написал. Это вернёт имя класса в виде строки. Если непонятно почему бы не написать сразу строку, то так делается по нескольким причинам:

  1. Имя класса в коде далеко не всегда пишется с неймспейсом (когда он подключен через use в шапке файла в коде ниже пишется только имя)
  2. IDE при рефакторинге класса (переименовании, смене неймспейса), автоматически подставит новое значение, так как в коде прописано обращение именно к классу, а не к какой-то непонятной строке
  3. Зачастую мы сами не знаем какой класс у объекта, в таком случае можно использовать конструкцию ::class с переменной, в которой лежит объект: $obj::class
[email protected] 15.11.2020 в 17:54

Добрый день, надо же , справился, долго настаивал адреса в этом уроке, у меня вин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']
];

ivashkevich 17.11.2020 в 17:08

Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого проверю вашу домашнюю работу и отвечу на вопросы.

SkSeMi 19.11.2020 в 01:30

MainController.php

............
    public function sayBye(string $name)
    {
        echo 'Привет, ' . $name;
    }

routes.php

<?php

// return [
//     '~^hello/(.*)$~' => [\Controllers\MainController::class, 'sayHello'],
//     '~^$~' => [\Controllers\MainController::class, 'main'],
//  '~^articles/(\d+)$~' => [\Controllers\ArticlesController::class, 'view'],
//  '~^articles/(\d+)$~' => [\Controllers\ArticlesController::class, 'view'],
//     '~^$~' => [\Controllers\MainController::class, 'main'],
// ];

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];
ivashkevich 19.11.2020 в 20:47

Отлично. Только комментарии не нужно скидывать в домашней работе

pixel 24.11.2020 в 17:54

routes.php

<?php
return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];

mainControllres.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;
    }
}

index.php

<?php
spl_autoload_register(function (string $className) {
    var_dump($className);
    require_once __DIR__ . '/../src/' . $className . '.php';
});

$route = $_GET['route'] ?? '';
$routes = require __DIR__ . '/../src/routes.php';

$isRouteFound = false;
foreach ($routes as $pattern => $controllerAndAction) {
    preg_match($pattern, $route, $matches);
    if (!empty($matches)) {
        $isRouteFound = true;
        break;
    }
}

if ($isRouteFound === false) {
    echo 'Страница не найдена';
    return;
}

unset($matches[0]);

$controllerName = $controllerAndAction[0];
$actionName = $controllerAndAction[1];

$controller = new $controllerName();
$controller->$actionName(...$matches);
ivashkevich 25.11.2020 в 21:17

Отлично

MikeSiebel 24.11.2020 в 19:04

Добрый день!

src/MyProject/Controllers/MainController.php
<?php
namespace MyProject\Controllers;

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }
    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }
    public function sayBy(string $name)
    {
        echo 'Пока, ' . $name;
    }
}

src/routes.php

<?php
return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^by/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBy'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];
ivashkevich 25.11.2020 в 21:19

Опечатка в слове bye.

Ключ ~^$~ в роутинге массивов дублируется

Larisa 28.11.2020 в 17:58

Артем, добрый день!
Сделала все как написано в уроке, но выходит ошибка. Подскажите, пожалуйста, в чем может быть проблема.

Ошибка сервера!
Произошла внутренняя ошибка сервера, в результате которой серверу не удалось завершить обработку Вашего запроса. Сервер перегружен, или в CGI-скрипте обнаружена ошибка.

Если Вы считаете, что это ошибка сервера, пожалуйста, сообщите об этом веб-мастеру.

Error 500
study
Apache

ivashkevich 29.11.2020 в 11:52

А какой у вас веб-сервер?

Larisa 29.11.2020 в 19:14

Добрый день, Артем!

описание картинки
описание картинки
описание картинки

ivashkevich 01.12.2020 в 04:06

Отлично. В меню опенсервера есть логи, после появления ошибки нужно найти ее в логах. Можете мне в личку написать, так быстрее будет.

Larisa 29.11.2020 в 19:34

в браузере вызываю http://study/abracadabra

Larisa 29.11.2020 в 23:09

Артем, я нашла в чем проблема. Покопалась в журнале логов Appach отладки. Не было пробела в RewriteRule^

RewriteRule ^(.*)$ ./index.php?route=$1 [QSA,L]

Теперь все заработало.

ivashkevich 01.12.2020 в 04:08

О, супер! Только отвечайте в той же ветке комментариев в следующий раз)

Larisa 01.12.2020 в 08:14

Да, хорошо! Спасибо вам большое!

kan22 30.12.2020 в 16:47

routes.php

return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
];

MainController.php

class MainController
{
    public function main()
    {
        echo 'Главная страница';
    }

    public function sayHello(string $name)
    {
        echo 'Привет, ' . $name;
    }

    public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }
}
ivashkevich 04.01.2021 в 06:54

Отлично

zick 07.02.2021 в 13:15

Стоит(можно) ли идти дальше если не понятно про Routing?

ivashkevich 08.02.2021 в 05:54

Нет. Что именно непонятно?

zick 12.02.2021 в 17:54

Что происходит в этой строке (что означают два вопроса в строке):
$route = $_GET['route'] ?? '';

И в файле routes.php строчка:
'~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],

Что это значит: MainController::class

ivashkevich 14.02.2021 в 15:19
zick 17.02.2021 в 14:46

Спасибо, с первой ссылкой разобрался, со 2-ой нет конкретного ответа. Если я правильно понял, :: указывает на конкретный класс? т.е. в массив он записывается как класс?

ivashkevich 20.02.2021 в 05:00

Это обращение к статическим свойствам и методам класса

smart88 19.03.2021 в 00:09

Добрый вечер!
Спасибо большое за курсы, интересно и доходчиво!

У меня два вопроса:

  1. Почему в автозагрузке мы не меняли слэши в $className, а она все равно работает?
  2. В случае, когда мы переходим на http://myproject.loc/, происходит удаление единственного элемента массива $matches, и потом мы "отсутствующие" элементы этого массива передаем как аргументы методу main, у которого вообще не заданы аргументы. Почему тут нет ошибок?)
ivashkevich 20.03.2021 в 20:41
  1. Винде все равно на слэши
  2. Ну если массив пустой, то и аргументов не будет. Нет здесь ошибки)
Egor.Ka 21.03.2021 в 18:44

В routes.php

<?php
return [
    '~^hello/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayHello'],
    '~^$~' => [\MyProject\Controllers\MainController::class, 'main'],
    '~^Bye/(.*)$~' => [\MyProject\Controllers\MainController::class, 'sayBye'],
    ];

в MainController.php

 public function sayBye(string $name)
    {
        echo 'Пока, ' . $name;
    }
ivashkevich 26.03.2021 в 17:30

Отлично

Deo 28.03.2021 в 16:38

А что это за конструкция?

\MyProject\Controllers\MainController::class

Всё, нашёл ответы в комментариях выше.

Vladimir96 17.04.2021 в 00:05

Почему переменная $controllerAndAction имеет глобальную зону видимости, хотя создали ее внутри foreach?

ivashkevich 17.04.2021 в 21:01

Это не глобальная область видимости. Иначе было бы ключевое слово global. foreach не имеет собственной области видимости, как и другие циклы в PHP

Логические задачи с собеседований