Задать вопрос
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 Оценить 2 комментария
Решения вопроса 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 ошибку, ищите другой движок, ибо как написать хороший роутинг это целая статья получиться
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы