Чат Telegram
Группа ВКонтакте
Новый комментарий


sashatkachenko1993@gmail.com

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

ivashkevich

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

SlipKnot

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

Хорошо

SBTesla

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

Отлично!

ArtemijeKA

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

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

AxLT

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

Супер!

AntonM99

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

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

Отлично!

Todd

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

Супер!

demyanovpaul@yandex.ru

Создайте еще один экшн в контроллере – 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

Отлично!

bildep

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

Отлично!

Ilon

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

ivashkevich

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

virtual2018

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

Хорошо

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

Отлично!

landialog

Метод 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

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

Bogdan

Создайте еще один экшн в контроллере – 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

Всё норм

Bogdan

Да, свежая голова дает о себе знать, потратил 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

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

Bogdan

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

Bugaga159

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

Отлично!

arturshopengauer@mail.ru
//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

Отлично

lordbear53@gmail.com

Спасибо за урок!
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

Отлично

Evgeny

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

Отлично

arhipow@mail.ru
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

Отлично

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

Роут:

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

Отлично

Boodoo

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

Отлично

polvanovv
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

Отлично

Dram
  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

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

lMaxl

Доброго дня!

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

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

ashfedor

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

Отлично!

rpash151
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

Отлично!

Invo

Возможно кто то решил не с апачем, а с 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

Отлично!

Moskva

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

Отлично!

Danya

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

ivashkevich

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

Iliusha99
<?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

Отлично!

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

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

Отлично

Reechniy
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

Супер!

artemship

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

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

Отлично

Blook

Метод

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

Роут

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

Отлично

fosfat

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

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

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

ivashkevich

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

fosfat

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

ivashkevich

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

Pro100Bah

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

Отлично

vtolstov

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

ivashkevich

Супер)

XXX

MainController.php

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

routes.php

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

Отлично

prinzplanloser0514@gmail.com

Контроллер

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

Отлично

prinzplanloser0514@gmail.com

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

ivashkevich

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

prinzplanloser0514@gmail.com

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

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

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

ivashkevich

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

Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Логические задачи с собеседований