J1upuk
11.05.2014 - 09:14
есть запрос site.ru/registration и запрос site.ru/news/all: в первом случае запрос должен разбираться как сайт/контроллер во втором сайт/каталог/контроллер, т.е. нужна многоуровневая структура сайта, как научить роутер правильно работать с запросами, у меня только одна идея, создать массивы, в которые поместить имена контроллеров, категорий и подкатегорий, и если запрошеной категории не существует - то обрабатывать как запрос непосредственно контроллера. А как это все делают?
Игорь_Vasinsky
11.05.2014 - 10:04
не надо заморачиваться с "много..." - достаточно научить контроллер понимать то что нужно + настроить ЧПУ
_____________
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
11.05.2014 - 16:15
Точнее будет сказать, научить роутер верно формироваь путь к контролеру.
Разбивать 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()
{
$this->getController($file, $controller, $action, $args);
if (is_readable($file) === false)
{
error404();
}
include ($file);
$class = $controller;
$controller = new $class();
if (is_callable(array($controller, $action)) == false)
{
error404();
}
$this->registry->args = $args;
$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';
}
$route = trim($route, '/\\');
$parts = explode('/', $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);
if (is_dir($cmd_path . strtolower($part)))
{
$cmd_path .= $part . DIRSEP;
array_shift($parts);
continue;
}
if (is_file($fullpath . '.php'))
{
$controller = 'Controller' . $part;
array_shift($parts);
break;
}
}
if (empty($controller))
{
$controller = 'ControllerIndex';
}
$action = array_shift($parts);
if (!isset($action) || $action == '')
{
$action = 'index';
}
$file = $cmd_path . str_replace('controller', 'controller_', strtolower($controller)) . '.php';
$args = $parts;
}
}
_____________
[продано копирайтерам]