1 Отредактировано Sergic (2012-08-23 00:32:33)

Тема: Динамические роуты symfony2 dynamic routing

Как не крути, а рано или поздно, пришел бы к динамике. Пока эксперементирую.

Че мне надо было?...
Значит есть сущность страница Page, у нее есть алиас.
Все любят, когда в урл нет префиксов domain.com/pages/terms-of-use, а нужно сразу domain.com/terms-of-use
А еще и нужно чтоб категории товаров или новостей тоже были без опознаваемого префикса...
Дабы не делать геморрой и не парсить все подряд...

 /**
   * @Route("/{q}", requirements={"q": ".+"})
   * ........
   */

Решил юзануть такую штуку как dynamic routing.
Есть в инете пост.
Собираю все странички и их алиасы, айдишники - генерирую роуты в методе load.
Все вышло, роуты генерируются.

page_1                      ANY      /terms-of-use
page_2                      ANY      /privacy-policy
page_3                      ANY      /o-nas
page_4                      ANY      /help
page_5                      ANY      /contacts
page_6                      ANY      /site-map

При переходе попадаю на контроллер, страничка показывается.
Но тут опача. Добавляем новую страничку в админке...
1. Ее не будет видно - роуты в кеше. Чистить кеш при каждом изменении данных? как? ))) можно ли отдельно почистить роуты? или мож как-то реализовать добавления в кеш нового роута?
2. ...

Может кто-то делал что-то подобное? Или есть мысли по моей проблемке?
Спасибо.
----

2

Re: Динамические роуты symfony2 dynamic routing

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

3

Re: Динамические роуты symfony2 dynamic routing

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

4

Re: Динамические роуты symfony2 dynamic routing

спасибо. еще подумаю по этому поводу, много мыслей и логики будет в будующем...

5 Отредактировано zhil (2013-03-02 22:49:44)

Re: Динамические роуты symfony2 dynamic routing

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

if(is_file("../app/cache/prod/appprodUrlMatcher.php")) {
    unlink("../app/cache/prod/appprodUrlMatcher.php");
}
if(is_file("../app/cache/prod/appprodUrlGenerator.php")) {
    unlink("../app/cache/prod/appprodUrlGenerator.php");
}

но временами система начинает жестко тупить и роутинг вообще не работает до полного удаления папки кеша. правда пока на тестовом сервере. default/smile

Пришел к выводу, что проще и эффективнее просто направить все динамические роуты на 1 action и в нём динамически все разбирать.

ЗЫ - немного погуглил и нашел http://symfony.com/doc/master/cmf/bundl … extra.html

The RoutingExtraBundle integrates dynamic routing into Symfony using Routing.

Хотя, я уже пробовал мельком несколько раз юзать куски http://cmf.symfony.com/ в "реальной жизни" - сыровато было.

6

Re: Динамические роуты symfony2 dynamic routing

zhil пишет:

Пришел к выводу, что проще и эффективнее просто направить все динамические роуты на 1 action и в нём динамически все разбирать.

А если к этому action прикрутить еще и свой кеш роутов в Redis'е с блекджеком и шлюхами (чтобы не разбирать по миллиону раз одно и тоже, а в случае полного совпадения ключа - сразу получить результат), то будет не только проще, но и быстрее.

7

Re: Динамические роуты symfony2 dynamic routing

Я вот питаюсь сделать bundle статических страниц. добавление редактирование в базу с этим проблем не было. А вот как словить префикс урла и проверить есть ли такой в базе мне тоже помог этот пост и у меня все заработало только в app_dev.php.
В app.php 404 постоянно если перейти по урлу любой статической страницы.

Вот весь код:

# app/config/config.yml
 
...
 
services:
    routing.loader.statik_url:
        class: Acme\HelloBundle\Routing\ExtraLoader
        tags:
            - { name: routing.loader }
# app/config/routing.yml
 
...
 
statik_url:
    resource: .
    type: extra
    prefix: /
# Acme/HelloBundle/Routing/ExtraLoader.php
 
namespace Acme\HelloBundle\Routing;
 
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\Config\Loader\LoaderResolverInterface;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\HttpFoundation\Request;
 
class ExtraLoader implements LoaderInterface
{
  private $loaded = false;
 
  public function load($resource, $type = null)
  {
    if (true === $this->loaded) {
      throw new \RuntimeException('Do not add this loader twice');
    }
 
    $routes = new RouteCollection();
    $pattern = Request::createFromGlobals()->getPathInfo();
    $defaults = array(
      '_controller' => 'AcmeHelloBundle:StaticPage:extraRoute',
      'maxAge'=>'86400',
      'sharedMaxAge'=>'86400',
      'private'=>'false',
    );
 
    $route = new Route($pattern, $defaults);
    $routes->add('extraRoute', $route);
    return $routes;
  }
 
  public function supports($resource, $type = null)
  {
    return 'extra' === $type;
  }
 
  public function getResolver()  {  }
 
  public function setResolver(LoaderResolverInterface $resolver)  {  }
}
public function extraRouteAction()
  {
    $prefix = $this->getRequest()->getPathInfo();
    $result = $this->getDoctrine()->getManager()->getRepository('AcmeHelloBundle:StaticPage');
    $pageObject = $result->findByUrl($prefix);
    if( count($pageObject) > 0) {
      return $this->render('AcmeHelloBundle:Default:index.html.twig', array('content' => $pageObject[0]->getBody() ));
    }
    throw $this->createNotFoundException('Страница не существует');
  }

Почему не работает в app.php ?
Что нужно дописать чтобы чистился кеш только роутов при удалении редактировании и создании страниц?
Может есть другие решения для модуля статических страниц на Symfony2 ?

8

Re: Динамические роуты symfony2 dynamic routing

relo_san пишет:

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

т.е хранить в редисе ключ (путь урл типа /terms-of-use, /some-category/subcategory/page...) - значение (тип урл page|category..., айдишник page category записи)? (с редисом не работал и к сф2 не подключал пока)
а эт на быстродействие не повлияет если мы постоянно при показе ссылок на страницы статьи категории и т.д. помимо подключения к mysql(выбор сущности) будем лезть в редис выбирать этот урл.

9

Re: Динамические роуты symfony2 dynamic routing

Sergic пишет:

т.е хранить в редисе ключ (путь урл типа /terms-of-use, /some-category/subcategory/page...) - значение (тип урл page|category...

Лучше даже ключ (/terms-of-use) и значение (массив параметров, аля контроллер с его параметрами или полную конфигурацию роута). Минимум затрат на разбор и преобразования.

Sergic пишет:

а эт на быстродействие не повлияет если мы постоянно при показе ссылок на страницы статьи категории и т.д. помимо подключения к mysql(выбор сущности) будем лезть в редис выбирать этот урл.

Я думаю что гораздо раньше серверу поплохеет от нагрузки на Мускул, вебсервер и диск, чем от запроса к Редису. У него очень дешевые коннекты и запросы, он способен выдать десятки тысяч rps даже на "калькуляторе".

Я собственно сейчас как раз пишу провайдера для https://github.com/symfony-cmf/RoutingBundle, чтобы хранить урлы в Редисе.

10

Re: Динамические роуты symfony2 dynamic routing

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

11

Re: Динамические роуты symfony2 dynamic routing

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

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

12

Re: Динамические роуты symfony2 dynamic routing

про мд5 интересная идея.
relo_san, спасибо за подсказки!!! default/wink

13

Re: Динамические роуты symfony2 dynamic routing

Зы, а что за бред, что при роутингу:

pattern: /{slug}
requirements: { slug: .+ }

нужно чистить кеш?

Чистить кеш никакой не нужно. Но вот эту строчку нужно поставить полностью в конце всего описание роутинга, так как роутинг проверяеться прямолинейно (согласно описанию). Если такое делать, то сделайте при помощи yml, и не будет у Вас никаких проблем!

14

Re: Динамические роуты symfony2 dynamic routing

relo_san пишет:

Лучше даже ключ (/terms-of-use) и значение (массив параметров, аля контроллер с его параметрами или полную конфигурацию роута).

это одна сторона, а теперь другая... просто точно знать, что на верном пути)
для того чтобы вывести урл /category/subcategory/item через path('some_route', {url: item.url}) необходимо хранить полный путь урл для итема?
я так понял лучше его держать рядом с объектом в той же таблиц (дабы не делать лишний запрос по бд). так будет нормально?