[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Многоуровневость приложения
J1upuk
есть запрос site.ru/registration и запрос site.ru/news/all: в первом случае запрос должен разбираться как сайт/контроллер во втором сайт/каталог/контроллер, т.е. нужна многоуровневая структура сайта, как научить роутер правильно работать с запросами, у меня только одна идея, создать массивы, в которые поместить имена контроллеров, категорий и подкатегорий, и если запрошеной категории не существует - то обрабатывать как запрос непосредственно контроллера. А как это все делают?
Игорь_Vasinsky
не надо заморачиваться с "много..." - достаточно научить контроллер понимать то что нужно + настроить ЧПУ

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
AllesKlar
Точнее будет сказать, научить роутер верно формироваь путь к контролеру.
Разбивать url в массив по разделителю "/" и смотреть, если текущий элемент массива (пути) - каталог, то добавляем его в путь к контроллеру и смотрим следующий элемент массива (пути) .

У меня это выглядит примерно так:
Свернутый текст


$router = new Router();

try
{
$router->setPath(SEITEPATH . 'controllers');
}
catch(Exception $ex)
{
die("Error: " . $ex->getMessage());
}

$router->delegate();


<?php
class
Router
{
private $registry;

private $path;

private $args = array();


function __construct()
{

$this->registry = Registry::getInstance();

}


public function setPath($path)
{
$path = trim($path, '/\\');

$path .= DIRSEP;

$this->path = $path;

}

public function delegate()
{

// Path parsen

$this->getController($file, $controller, $action, $args);
if (is_readable($file) === false)
{
error404();

}


// Datei verbinden
include ($file);


// Controller Instanz erzeugen

$class = $controller;

$controller = new $class();


// Ist Action verfГƒВјgbar?

if (is_callable(array($controller, $action)) == false)
{

error404();

}


$this->registry->args = $args;
// Action aufrufen

$controller->$action();
}


private function getController(&$file, &$controller, &$action, &$args)
{

$route = (empty($_GET['route'])) ? '' : $_GET['route'];

if (empty($route))
{
$route = 'index';
}

if (trim(strtolower($route), '/\\') == 'mobile')
{
$route = 'mobile/index';
}

// Parsen auf Teile

$route = trim($route, '/\\');

$parts = explode('/', $route);

// Suchen Controller

//die($route);



$cmd_path = $this->path;
$os = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? 'win' : 'linux';
if($os == 'linux')
{
$cmd_path = DIRSEP . $cmd_path;
}


foreach ($parts as $part)
{

$fullpath = $cmd_path . 'controller_' . strtolower($part);
// Ist das Verzeichnis?
if (is_dir($cmd_path . strtolower($part)))
{
$cmd_path .= $part . DIRSEP;

array_shift($parts);

continue;

}


// Datei suchen


if (is_file($fullpath . '.php'))
{
$controller = 'Controller' . $part;
array_shift($parts);

break;

}

}



if (empty($controller))
{
$controller = 'ControllerIndex';
}

// Action erzeugen

$action = array_shift($parts);
if (!isset($action) || $action == '')
{
$action = 'index';
}

$file = $cmd_path . str_replace('controller', 'controller_', strtolower($controller)) . '.php';

$args = $parts;

}


}
// Class Router


_____________
[продано копирайтерам]
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.