# Разработка роутера в своем MVC фреймворке

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

Пусть своим результатом наш роутер возвращает объект класса `Track`, содержащего имя контроллера, который должен быть вызван на данный запрос, имя действия и параметры из URL.

Пусть наш класс `Track` имеет свойства `controller`, `action` и `params`, доступные только для чтения:

`<?php namespace Core; class Track { private $controller; private $action; private $params; public function __construct($controller, $action, $params) { $this->controller = $controller; $this->action = $action; $this->params = $params; } public function __get($property) { return $this->$property; } } ?>`

## Пример

Для примера, пусть в адресной строке вбито `/test/1/2/`. Пусть у нас есть роут, соответствующий этому адресу:

`<?php new Route('/test/:var1/:var2/', 'test', 'index'); ?>`

Это значит, что имя контроллера будет `test`, имя действия - `index`, а массив параметров будет следующий:.

`<?php ['var1' => 1, 'var2' => 2] ?>`

Цель данного урока - написать класс `Router`, возвращающий объект класса `Track`. Остальное нас пока не касается. Давайте приступим к написанию этого класса.

## Использование роутера

Вспомним текущее содержимое файла `index.php`:

`<?php namespace Core; error_reporting(E_ALL); ini_set('display_errors', 'on'); spl_autoload_register(function($class) { // ваша реализация автозагрузки }); $routes = require $_SERVER['DOCUMENT_ROOT'] . '/project/config/routes.php'; ?>`

Пусть теперь далее в `index.php` мы хотим использовать наш роутер следующим образом:

`<?php $router = new Router(); $track = $router->getTrack($routes, $_SERVER['REQUEST_URI']); ?>`

Можно переписать более компактно:

`<?php $track = ( new Router ) -> getTrack($routes, $_SERVER['REQUEST_URI']); ?>`

## Реализация роутера

Давайте теперь напишем заготовку класса `Router` в соответствии с нашими вызовами:

`<?php namespace Core; class Router { private $routes; public function getTrack($routes, $uri) { // тут будет код } } ?>`

В методе `getTrack` мы должны определить, какой из роутов соответствует данному `$uri`. Для этого нужно перебрать наш массив с роутами циклом:

`<?php namespace Core; class Router { public function getTrack($routes, $uri) { foreach ($routes as $route) { // проверка $uri и $route } } } ?>`

Если какой-то роут соответствует URI, мы должны получить из этого URI значения параметров роута и вернуть объект класса `Track`:

`<?php namespace Core; class Router { public function getTrack($routes, $uri) { foreach ($routes as $route) { if (проверка соответствия роута и URI) { $params = ; // нужно получить параметры из uri return new Track($route->controller, $route->action, $params); } } return new Track('error', 'notFound'); // если ни один роут не подойдет } } ?>`

Скопируйте код моего класса `Track` и разместите его в файле `/core/Track.php`.

Скопируйте мою заготовку класса `Router` и разместите его в файле `/core/Router.php`.

Реализуйте описанный класс `Router`, своим результатом возвращающий объект класса `Track`. Если будете испытывать затруднения (что весьма вероятно), подсмотрите в исходный код фреймворка, по которому вы изучали использование MVC. Там в классе `Router` вы найдете недостающую часть реализации и мои комментарии к ней.

←→
↑