@eltor

Контроллер срабатывает после знака вопрос, как исправить?

Привет. изучаю mvc, по туториалу сделал каркас но возникла проблема. При вызове контроллера Например: localhost/mvcless/news пишет что Not Found

The requested URL /mvcless/news was not found on this server.

А если вызвать вот так localhost/mvcless/?news то все нормально работает

Кто нибудь знает как заставить работать без знака вопроса.
файл index.php в корневом каталоге
<?php

// FRONT COTROLLER

// Общие настройки

ini_set('display_errors', 1);
error_reporting(E_ALL);

// Подключение файлов системы

define('ROOT', dirname(__FILE__));
require_once(ROOT.'/components/Router.php');

// Установка соединения с БД


// Вызов Router

$router = new Router();
$router->run();


<?php

class NewsController {
	public function actionIndex()
		{

		    echo 'hi';
			return true;
		}

		
}

?>

маршруты из конфига
<?php
return array(
	'news' => 'news/index', // actionIndex in NewsController
);


<?php

class Router
{

	private $routes;

	public function __construct()
	{
		$routesPath = ROOT.'/config/routes.php';
		$this->routes = include($routesPath);
	}

// Return type

	private function getURI()
	{
		if (!empty($_SERVER['REQUEST_URI'])) {
		return trim($_SERVER['REQUEST_URI'], '/');
		}
	}

	public function run()
	{
		$uri = $this->getURI();

		foreach ($this->routes as $uriPattern => $path) {

			if(preg_match("~$uriPattern~", $uri)) {

				$segments = explode('/', $path);

				$controllerName = array_shift($segments).'Controller';
				$controllerName = ucfirst($controllerName);


				$actionName = 'action'.ucfirst((array_shift($segments)));

				$controllerFile = ROOT . '/controllers/' .$controllerName. '.php';
				if (file_exists($controllerFile)) {
					include_once($controllerFile);
				}

				$controllerObject = new $controllerName;
				$result = $controllerObject->$actionName();
				if ($result != null) {
					break;
				}
			}

		}
	}
}


7caf630a5de441cab0d944ed0e273655.png

пробывал прописывать в виртуальных хостах рутом саму папку mvcless все равно приходилось писать знак вопроса. в windows, в xampp все работает нормально. как это исправить в lamp?
  • Вопрос задан
  • 388 просмотров
Решения вопроса 1
Negezor
@Negezor
Senior Shaurma Developer
Используй NameSpace тебе однозначно будет проще, а ещё в добавок ужасный код роутера.
Как вариант у тебя может не всё правильно устроено в .htaccess
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php/$1 [L,QSA]
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Знакомый роутинг, чувствую туториал с пхп-старта :) Роутинг корявый и недоделанный, если с сервака будешь заходить на сайт с адресом вида 255.255.255.255/test/site, то будут ошибки, поэтому не пугайся :) Допиливать мне его было лень, поэтому с денвера сразу на хостинг залил его.
Вот кстати весь htacces оттуда
AddDefaultCharset utf-8

RewriteEngine on
RewriteBase /

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

RewriteRule ^(.*)$ index.php

# Попробуйте эту настройку .htaccess, если у Вас возникли проблемы с отображением
# стилей css
#AddDefaultCharset cp-1251
#ErrorDocument 404 /
#RewriteEngine On
#RewriteCond %{REQUEST_FILENAME} -s [OR]
#RewriteCond %{REQUEST_FILENAME} -l [OR]
#RewriteCond %{REQUEST_FILENAME} -d
#RewriteRule ^.*$ - [L]
#RewriteRule ^.*$ index.php [L]
Ответ написан
profesor08
@profesor08 Куратор тега PHP
The requested URL /mvcless/news was not found on this server.

Вот это должно сразу навести на нужные мысли, и нужные мысли не связаны с php. Вэб-сервер понятия не имеет о вашем php роутинге. Он ищет указанный путь из url. Вы ему укзали папку news, он не нашел эту папку и выдал ошибку. Следовательно, вам надо преобразовать данный путь в тот, который пойдем php скрипт. Как это сделать вам показали выше.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы