<MyRusakov.ru />

Создание крупного проекта на Java с нуля

Создание крупного проекта на Java с нуля

Данный курс научит Вас создавать крупные проекты на Java грамотно и быстро. В курсе Вы увидите создание большой и сложной программы на Java абсолютно с нуля.

В начале курса у нас будет только идея, а в конце готовый продукт, который можно использовать в практических целях.

В рамках упражнений курса Вы параллельно со мной будете создавать свою большую программу на Java, что даст Вам необходимую практику, после которой для Вас уже не будет разницы, какого размера создавать программы.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Форум сайта MyRusakov.ru

Маршрутизатор
29.12.2014 01:39:44 Маршрутизатор Сообщение #1
(Алекс)

(Алекс)

Эксперт

Эксперт

Дата регистрации:
21.06.2013 14:56:26

Сообщений: 114

Здравствуйте.
Решил создать свой движок для сайта. Вот возникла такая проблема: писал маршрутизатор для перенаправления юзера по страницам и выходит, что чтоб добавить новую ключевую страницу на сайт, надо залазить в файл и править его. Никак не могу придумать, как это исправить. Подскажите, как сделать роутер более динамичным??

Собственно, код:
<?php
class Router extends DataBase {
/*
  $link -> ури страницы, к которой обращается пользователь
  $page -> номер страницы из ГЕТ-запоса
 */
public function __construct($link, $page) {
parent::__construct(Config::HOST, Config::USER, Config::PASSWORD, Config:: DATABASE, Config::PREFIX);
$article_link = parent::selectCell("articles", "link", "link", $link);
switch ($link) {
   // ключевые страницы-разделы (категории)
case "/":
case "/html-css.html":
case "/php-mysql.html":
case "/javascript.html": {
ActionSection::__construct($link, $page);
} break;
   // ключевая страница: об авторе
case "/about-autor.html": {
ActionAutor::__construct($link);
} break;
   // К. С. -> поиск
case "/search.html": {
ActionSearch::__construct($link);
} break;
   // К.С. статья
case $article_link["link"]: {
ActionArticle::__construct($link);
} break;
   // К.С. 404-страница
default: {
ActionNotFound::__construct();
}
}
}

}
?>
Профиль Ответить
16.01.2015 13:12:17 Маршрутизатор Сообщение #2
Dersint

Dersint

Новичок

Новичок

Дата регистрации:
21.12.2014 18:39:47

Сообщений: 5

Архитектура класса не совсем правильна в том смысле, что класс является потомком DataBase. Нужно создать экземпляр класса в Router, но никак не наследовать.
Профиль Ответить
16.01.2015 13:45:25 Маршрутизатор Сообщение #3
Dersint

Dersint

Новичок

Новичок

Дата регистрации:
21.12.2014 18:39:47

Сообщений: 5

Можно сделать такой роутер<?php
include "database_class.php";

class Router{

private $db;
private $config;
public $action;
public $controller;

public function __construct(){
$this->db = DataBase::connect();
//Подключаемся к бд. Класс для работы с БД устроен на подобии данного класса http://myrusakov.ru/php-db-class.html
$uri = $this->getAdress($_SERVER['REQUEST_URI']);
$this->action = htmlspecialchars($uri['action']);
$this->controller = htmlspecialchars($uri['controller']);
if(!file_exists("./controllers/"$this->controller.".php" )) $this->error404();
//Если нет такого контроллера, то 404
require_once "./controllers/"$this->controller.".php";
}

public function getAdress($uri){
$uri = trim("/",$uri); //Убираем слэши. То есть преобразуем /articles/article-1/ в articles/article-1
if($url == "" ) return array("action" => "index","controller" => "index" );
//Если ури пуст, то это индексная страница
$array = explode("/",$uri); //Разбиваем на массив по слэшу
switch(count($array)){
case 2:
return array("action" => $array[1], "controller" => $array[0]);
//Если получили адрес типа: rubric/html, то rubric - это контроллер, а html - это страница
case 1:
return array("action" => $array[0], "controller" => "indexController" );
//Если ури типа: /about, то контроллер тот же, что и у индексной страницы, то есть тип страницы тот же.
default:
$this->error404();
//если ури такой: iindex/about/page/article, то редирект на 404
}
}

public function error404(){
header("HTTP/1.0 404 Not Found" );
header("http://mysite.loc/system/404" );
}
}
?>
Что касается самого контроллера, то можно реализовать например, реализовать выборку записи так: имя контроллера - это название таблицы без префикса, а экшн - это название записи. То есть запрос будет выглядеть так
<?php
$query = "SELECT * FROM `prefix_{?}` WHERE `name` = '{?}'";
$db->selectCell($query, array($this->controller,$this->action));
?>
То есть при ури, равном articles/denwer-php
Вытащится запись из таблицы articles, где поле name равно denwer-php, но если такой таблицы нет, или же нет записи, то 404. Это уже пропишите  контроллере.
Думаю, я помог Вам. Удачи в написании движков.
Профиль Ответить
21.05.2015 21:14:05 Маршрутизатор Сообщение #4
(Алекс)

(Алекс)

Эксперт

Эксперт

Дата регистрации:
21.06.2013 14:56:26

Сообщений: 114

Спасибо, большое. Очень помогли))
Профиль Ответить