Пользовательский универсальный класс маршрутизатора CodeIgniter

Я пытаюсь «укоротить» свои URL-адреса, например, из:

http://mydomain.com/controller/method/something-here

в

http://mydomain.com/something-here

добавив к routes.php:

$route['(.*)'] = 'router/resolve/$1';

и создание класса Router, метод resolve() которого определяет, соответствует ли something-here строке в одной из моих таблиц базы данных (сущностей). Если это так, я хочу загрузить запись, вызвав соответствующий метод controller::method.

Например, если something-here является типом book, я бы хотел, чтобы Router::resolve() вызывал Book::view($id).

Однако я понимаю, что контроллер не может вызывать метод другого контроллера. (Это?)

Я также не могу использовать redirect("book/view/$id"), потому что $route['(.*)'] вызовет Router::resolve() на book (первый сегмент).

Любые предложения о том, как достичь моей цели?


person Obay    schedule 30.04.2014    source источник
comment
почему бы просто не использовать контроллер перенаправления, что-то вроде stackoverflow.com/questions /10845440/свертки-с-кодомигнитером/   -  person Rooneyl    schedule 30.04.2014
comment
Он по-прежнему использует некоторые text/ перед something-here. Я бы хотел, чтобы URL-адрес был something-here сразу после домена.   -  person Obay    schedule 30.04.2014
comment
извините, неправильно понял задачу; вызов контроллера из другого. Лучшее решение для вас, которое я могу придумать, это HMVC bitbucket.org/wiredesignz/codeigniter -modular-extensions-hmvc   -  person Rooneyl    schedule 30.04.2014


Ответы (1)


Я могу придумать два решения:
1) использовать архитектуру HMVC. , что позволило бы вызывать один контроллер из другого.

2) Динамически генерируйте маршруты.
Возможно, это не самое эффективное или элегантное решение, но это вариант.

<?php
$route[ 'default_controller' ]  = 'main';
$route[ '404_override' ]        = 'error404';

require_once( BASEPATH .'database/DB'. EXT );
$db =& DB();
$query = $db->get( 'whatever_table' );
$result = $query->result();
foreach( $result as $row )
{
    $route[$row->slug.'/(:any)'] = $row->controller.'/'.$row->method.'/$1';
}

Как мне было указано ранее, маршруты обрабатываются с использованием регулярного выражения (в _parse_routes), поэтому это может быть не самым быстрым по производительности, это зависит от того, сколько маршрутов вы будете генерировать и как вы относитесь к влиянию на производительность.

person Rooneyl    schedule 30.04.2014