yarkov
@yarkov
Помог ответ? Отметь решением.

Нужна помощь в MVC PHP. Это сложно так или я дибил?

Есть какрас простенькой CMS на основе MVC. С добавлением страниц я разобрался, bootstrap шаблон натянул, БД MySQL прикрутил. Теперь вот напоролся на подводный камень. Сейчас структура такая:
site.com/blog - открывается страница и на ней 5 последних записей
http://site.com/blog/ID_категории/ID_статьи - сейчас, естественно, открывается страница 404, а надо чтоб открывалась статья.

Помогите добавить просмотр статей, ребята!

Я залил архив с исходниками. Посмотрите кому не жалко времени, пожалуйста.

freelancer-blog.ru.zip
  • Вопрос задан
  • 1204 просмотра
Решения вопроса 1
orlov0562
@orlov0562 Куратор тега PHP
I'm cool!
Хоть как и писали выше, нет привычного роутинга, параметры можно легко добавить:

Надо внести такие изменения в класс route.php:

<?php

/*
Класс-маршрутизатор для определения запрашиваемой страницы.
> цепляет классы контроллеров и моделей;
> создает экземпляры контролеров страниц и вызывает действия этих контроллеров.
*/
class Route
{

	static function start()
	{
		// контроллер и действие по умолчанию
		$controller_name = 'Main';
		$action_name = 'index';
// --------------------------------------------------

$action_params = array();
		
$routes = explode('/', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));

// --^^------------------------------------------------
		// получаем имя контроллера
		if ( !empty($routes[1]) )
		{	
			$controller_name = $routes[1];
		}
		
		// получаем имя экшена
		if ( !empty($routes[2]) )
		{
			$action_name = $routes[2];
		}
// --------------------------------------------------		

if (count($routes)>2) {
	$action_params = array_slice($routes, 2);
}

// --^^------------------------------------------------
		// добавляем префиксы
		$model_name = 'model_'.$controller_name;
		$controller_name = 'controller_'.$controller_name;
		$action_name = 'action_'.$action_name;

		/*
		echo "Model: $model_name <br>";
		echo "Controller: $controller_name <br>";
		echo "Action: $action_name <br>";
		*/

		// подцепляем файл с классом модели (файла модели может и не быть)

		$model_file = strtolower($model_name).'.php';
		$model_path = "application/models/".$model_file;
		if(file_exists($model_path))
		{
			include "application/models/".$model_file;
		}

		// подцепляем файл с классом контроллера
		$controller_file = strtolower($controller_name).'.php';
		$controller_path = "application/controllers/".$controller_file;
		if(file_exists($controller_path))
		{
			include "application/controllers/".$controller_file;
		}
		else
		{
			/*
			правильно было бы кинуть здесь исключение,
			но для упрощения сразу сделаем редирект на страницу 404
			*/
			Route::ErrorPage404();
		}
		
		// создаем контроллер
		$controller = new $controller_name;
		$action = $action_name;
		
		if(method_exists($controller, $action))
		{
			// вызываем действие контроллера
// --------------------------------------------------

call_user_func_array(array($controller, $action), $action_params)

// --^^------------------------------------------------
		}
		else
		{
			// здесь также разумнее было бы кинуть исключение
			Route::ErrorPage404();
		}
	
	}

	function ErrorPage404()
	{
        $host = 'http://'.$_SERVER['HTTP_HOST'].'/';
        header('HTTP/1.1 404 Not Found');
		header("Status: 404 Not Found");
		header('Location:'.$host.'404');
    }
    
}


после этого можно строить любые роуты, согласно схемы:
http:// site.com / [controller] / [action] ( / параметр_1 ( / параметр_2 ( / .. ( / параметр_n))))

для того, чтобы использовать указанные параметры, надо в методе action-а, соответствующего контроллера указать их в сигнатуре, т.е. вот так:
class controller {
  public function action($param_1, $param_2,...,$param_n) {
  
  }
}


P.S. Код я не проверял, так что если будут ошибки, пиши их сюда, коллективный разум исправит :)
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Kostik_1993
Web Developer
altorouter.com один файл всего. Тебе его думаю за глаза будет

и кстати почитай про автолоад классов.
Ответ написан
paalomnik
@paalomnik
PHP-Dev
сам игрался с "Ололошей", решил подобную проблему подключением стороннего вендора www.itlessons.info/php/routing-library
Ответ написан
@SergeyZelensky-Rostov
В ваших исходниках нет обработки маршрутов нормальной
/*
Класс-маршрутизатор для определения запрашиваемой страницы.
> цепляет классы контроллеров и моделей;
> создает экземпляры контролеров страниц и вызывает действия этих контроллеров.
*/
class Route
{

	static function start()
	{
		// контроллер и действие по умолчанию
		$controller_name = 'Main';
		$action_name = 'index';
		
		$routes = explode('/', $_SERVER['REQUEST_URI']);

		// получаем имя контроллера
		if ( !empty($routes[1]) )
		{	
			$controller_name = $routes[1];
		}
		
		// получаем имя экшена
		if ( !empty($routes[2]) )
		{
			$action_name = $routes[2];
		}

		// добавляем префиксы
		$model_name = 'model_'.$controller_name;
		$controller_name = 'controller_'.$controller_name;
		$action_name = 'action_'.$action_name;

		/*
		echo "Model: $model_name <br>";
		echo "Controller: $controller_name <br>";
		echo "Action: $action_name <br>";
		*/

		// подцепляем файл с классом модели (файла модели может и не быть)

		$model_file = strtolower($model_name).'.php';
		$model_path = "application/models/".$model_file;
		if(file_exists($model_path))
		{
			include "application/models/".$model_file;
		}

		// подцепляем файл с классом контроллера
		$controller_file = strtolower($controller_name).'.php';
		$controller_path = "application/controllers/".$controller_file;
		if(file_exists($controller_path))
		{
			include "application/controllers/".$controller_file;
		}
		else
		{
			/*
			правильно было бы кинуть здесь исключение,
			но для упрощения сразу сделаем редирект на страницу 404
			*/
			Route::ErrorPage404();
		}
		
		// создаем контроллер
		$controller = new $controller_name;
		$action = $action_name;
		
		if(method_exists($controller, $action))
		{
			// вызываем действие контроллера
			$controller->$action();
		}
		else
		{
			// здесь также разумнее было бы кинуть исключение
			Route::ErrorPage404();
		}
	
	}

	function ErrorPage404()
	{
        $host = 'http://'.$_SERVER['HTTP_HOST'].'/';
        header('HTTP/1.1 404 Not Found');
		header("Status: 404 Not Found");
		header('Location:'.$host.'404');
    }
    
}

вот эта штука будет обрабатывать только запросы вида site.com/controller/action/
то есть ваш url парсится так blog - контроллер, id_категории - action и естественно его не существует
поэтому и выдает 404 ошибку, ищите другой движок, ибо как написать хороший роутинг это целая статья получиться
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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