preg_replace и неверное определение маршрута
Пробуюсь писать MVC-шку. При работе с preg_replace выбирается не верный маршрут и соответственно метод.
routes.php
<?php
return array(
'news/(.+)' => 'NewsController@view',
'news' => 'NewsController@index',
);
Router.php (метод run())
public function run()
{
$uri = $this->getURI();
foreach ($this->routes as $uriPattern => $path) {
if (preg_match("~$uriPattern~", $uri)) {
echo "<br>Где ищем (запрос, который набрал пользователь): ".$uri;
echo "<br>Что ищем (совпадение из правила): ".$uriPattern;
echo "<br>Кто обрабатывает: ".$path;
$internalRoute = preg_replace("~$uriPattern~", $path, $uri);
echo "<pre>";
print_r($internalRoute);
echo "<pre/>";
echo '<br>Нужно сформулировать: '.$internalRoute.'<br>'; // Ожидание: NewsController@view/z5
$segments = Exploder::multiExplode(['/', '@'], $internalRoute);
echo "<pre>";
print_r($segments);
echo "<pre/>";
$controllerName = array_shift($segments);
$methodName = array_shift($segments);
$controllerFile = ROOT."/Controllers/".$controllerName.".php";
if (file_exists($controllerFile)) {
require_once($controllerFile);
}
$controllerObject = new $controllerName;
$result = $controllerObject->$methodName();
if ($result != null) {
break;
}
}
}
}
Вывод на экране (localhost:8000/news/z5)
Где ищем (запрос, который набрал пользователь): news/z5
Что ищем (совпадение из правила): news/(.+)
Кто обрабатывает: NewsController@view
NewsController@view (( А должно быть NewsController@view/z5 ))
Нужно сформулировать: NewsController@view (( А должно быть NewsController@view/z5 ))
Array
(
[0] => NewsController
[1] => view
)
Ответы (1 шт):
Автор решения: Alexander Chernykh
→ Ссылка
Прошу прощения за невнимательность. Контроллер и метод маршрута нужно заменить на
'news/([a-z]+)' => 'NewsController@view/$1',