ZendFramework Динамическое добавление маршрута

VEV

IT-шник
Есть маршрут, некоторые параметры для которого нужно подтянуть из БД. Т.е., формирую array с нужными параметрами, создаю экземпляр роута
PHP:
$route = Segment::factory($route);
а далее, нужно этот роут добавить в приложение. В доках написано, что Zend\MVC использует Zend\Mvc\Router\Http\TreeRouteStack, но при попытке достать экземпляр из ServiceManager-а (в Module.php) вылетает ошибка:
2015/08/19 13:50:17 [error] 24177#0: *2264 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught exception 'Zend\ServiceManager\Exception\ServiceNotFoundException' with message 'ProxyManagerGeneratedProxy\__PM__\Zend\ServiceManager\ServiceManager\Generatede630d8c867daa4f8b62c4d1fb9772be2::get was unable to fetch or create an instance for Zend\Mvc\Router\Http\TreeRouteStack' in /var/www/projects/zf2-03/vendor/zendframework/zend-servicemanager/src/ServiceManager.php:555
Может не в ту сторону вообще иду? Кто делал такую фичу?
 
Последнее редактирование:

VEV

IT-шник
Так, с добавлением разобрался, вроде
PHP:
$router = $e->getApplication()->getServiceManager()->get('Router')->addRoutes(array('routeName' => $route))
 

WMix

герр M:)ller
Партнер клуба
ты скажи чего добиться хочешь для начала? из array или из базы добавлять руты разницы нет, кроме что во втором случае на один шаг больше и требуется наличие соеденения
и да TreeRouteStack тоже можно использовать
 

VEV

IT-шник
У меня в корне есть 2 фильтра (2 менюшки, по-сути): тип статьи (табл1 в БД) и категория статьи (табл2 в БД). УРЛ-ы имеют следующий вид
site.ru/type
или
site.ru/category/type

Значения type и category берутся из соответствующих таблиц. Т.е. когда пользователь заходит на сайт, и тыкает по меню, мне нужно как-то определить, по меню с типами он тыкнул или с категориями.

Я думаю, запрашивать из БД все значения type и делать маршрут типа Regex с перечнем возможных значений type. И если проверка не проходит - использовать маршрут с категориями. Для этого нужно было динамически добавить маршрут в общий стек. Маршрут вроде добавляется, сейчас думаю, как этот маршрут теперь сформировать ))))
 

WMix

герр M:)ller
Партнер клуба
странно что руты лежат в разных таблицах, может это уже не руты?
может быть такое что у тебя всего 2 маршрута? или лучше сказать всего 2 actions?
или некая categoryAction и несколько других
 

VEV

IT-шник
это не роуты лежат в разных таблицах, а роуты составляются по данным из разных таблиц.
 

WMix

герр M:)ller
Партнер клуба
а зачем? что у тебя в разных таблицах?
 

VEV

IT-шник
В одной - 1-ая менюшка (id, title, alias), во второй - 2-ая менюшка (id, title, alias)
вместо type и category в URL подставляется alias из соотвествующей таблицы.

Когда мне нужно узнать, что у меня стоит после первого слеша - type или category - я просто смотрю, есть ли в таблице запись с соответствующим алиасом.
 

WMix

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

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

VEV

IT-шник
Уникальность чего?
Я беру слово после первого слеша, делаю запрос по нему в таблицу с типами, и если ответ пуст - значит после слеша стоит категория. Вполне возможно сделаю еще проверку и для категорий, чтоб редиректить на 404, ежели чего...

Не хочу объединять, т.к. в дальнейшем останется менюшка категорий, а менюшка типов уйдет просто в фильтры. Да и понятно логику лучше, если не лепить все в кучу.

В чем кривость?
 

WMix

герр M:)ller
Партнер клуба
второе не найдется если есть первое, уникальность первого и второго вместе!
фильтры категории руты (уже смешались люди кони)
делай как знаешь!
 

VEV

IT-шник
С чего это не найдется?
PHP:
public function setRoutes($sm)
    {
        $types = $sm->get('TypesTable')->getTypesList()->toArray();
        $typeRegex = "";
        foreach($types as $type) {
            $typeRegex .= $type['alias'];
            if($types[count($types)-1]['alias'] !== $type['alias']) {
                $typeRegex .= '|';
            }
        }
        $type = Regex::factory(array(
            'regex' => '/(?<type>('.$typeRegex.'))?',
            'defaults' => array(
                '__NAMESPACE__'    => 'Main\Controller',
                'controller'    => 'Index',
                'action'        => 'index',
            ),
            'spec' => '/%type%',
        ));
       
        $category = Segment::factory(array(
            'route' => '/:category',
            'constraints' => array(
                '__NAMESPACE__'    => 'Main\Controller',
                'controller'    => 'Index',
                'action'        => 'index',
                'category'        => '[a-zA-Z][a-zA-Z0-9_-]*',
            ),
            'defaults' => array(
                '__NAMESPACE__'    => 'Main\Controller',
                'controller'    => 'Index',
                'action'        => 'index',
            ),
        ));
       
        // Стек маршрутов - LIFO. Более приоритетный маршрут добавляем последним.
        $router = $sm->get('Router')->addRoutes(array(
            'category' => $category,
            'type' => $type,
        ));
    }
Так все находится и определяется. :)

Могу пример показать:
заходишь referat.ru
там менюшка слева (типы) и менюшка в центре (категории)

маршрут нужет типа такого:
PHP:
/[:category/][:type[/:articleName]]
Есть пример реализации лучше? Буду благодарен, если покажешь?
 

VEV

IT-шник
Это то да... Но мне нужно , чтобы в одном случае из роута первый параметр присваивался переменной type, а в другом - переменной category.
К тому же, у роута category будут child_route в соответсвии с маршрутом, который я писал выше. А у роута type - не будет :)
И то, что в defaults прописаны одинаковые action/controller - так это пока поисковая выдача не готова и соответствующие методы под нее. Потом будут ссылаться на разные.
 

WMix

герр M:)ller
Партнер клуба
Назови это query, и все встанет на свои места
 

VEV

IT-шник
А что делать в третьем случае, когда задано и category, и type?
 

WMix

герр M:)ller
Партнер клуба
в твоем случае все одно не понятно тип это или категория, если появится категория с таким же именем как и тип
а вот в третьем при условии что сначала тип а после категория уже понятно
 
Сверху