Маршрутизация для страны, провинции, города, продукта в Zend Framework - PullRequest
3 голосов
/ 03 февраля 2012

Эта структура URL предлагается для оптимизации SEO. Поэтому предложение другой структуры не сработает. Предлагаемая структура

example.com/<language>/<country>/<province>/<city>/<product>

example.com/en/spain Я хотел бы указать на CountryController indexAction, поскольку каждый из них отличается от других, и иногда думает, что в макете также есть изменения.

Показать контент на английском языке о стране Испания. И для запроса example.com/en/india должен показать об Индии на английском языке и example.com/es/spain должен показать испанскую страницу для страны Испания.

example.com/en/spain/barcelona Указывает на CountryController provinceAction

Страница содержания для испанской провинции Барселона на английском языке.

example.com/en/spain/barcelona/barcelona Указывает на CountryController cityAction

Страница содержания для города Барселона в провинции Барселона страны Испания на английском языке.

example.com/en/spain/barcelona/barcelona/taxis Очки для CountryController productAction

Страница содержания для продукта в городе Барселона, провинция Барселона, Испания на английском языке.

Да, мы можем добавить маршрут как

$router = $ctrl->getRouter();
$router->addRoute(
    'country_spain',
    new Zend_Controller_Router_Route('spain',
                                     array('controller' => 'country',
                                           'action' => 'index'))
);

Но в этом случае нам нужно добавить весь список стран в маршрут. то есть Индия, Китай, Пакистан, США и т. д.

Тогда будет добавлено country_province

$router = $ctrl->getRouter();
$router->addRoute(
    'country_spain_barcelona',
    new Zend_Controller_Router_Route('spain',
                                     array('controller' => 'country',
                                           'action' => 'province'))
);

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

Вы можете сказать добавить что-то вроде

$router = $ctrl->getRouter();
$router->addRoute(
    'country',
    new Zend_Controller_Router_Route('country/:country/:province/:city/:product',
                                     array('controller' => 'country',
                                           'action' => 'index'))
);

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

Проблема с Zend_Controller_Router_Route_Regex в том, что у нас должно быть что-то вроде example.com/en/country/spain/barcelona/barcelona/taxis а также все движется к одному действию. Поскольку представление совершенно иное, оно становится грязным. Может быть, что-то вроде частичных я могу использовать. Но мне интересно, есть ли другое хорошее решение для этой проблемы? Это устаревший проект, поэтому у меня есть ограничения на него, и версия #ZF - 1.6.

Есть пример чего-то похожего

http://www.travelportal.info/ http://www.travelportal.info/asia http://www.travelportal.info/asia/india http://www.travelportal.info/asia/india/business-currency-economy

Как вы думаете, они сделали это, добавят ли они маршруты, по крайней мере, в Азию, Европу?

Я смог заставить его работать как

example.com/en/spain Указывает на CountryController indexAction

example.com/en/spain/barcelona Указывает на CountryController provinceAction

example.com/en/spain/barcelona/barcelona Указывает на CountryController cityAction

example.com/en/spain/barcelona/barcelona/taxis Указывает на CountryController productAction

Но там мне нужно добавить 4 маршрута, и будет трудно вручную добавить маршрут, подобный этому.

Предложения и критика приветствуются, чтобы сделать это лучше.

1 Ответ

5 голосов
/ 03 февраля 2012

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

$router->addRoute(
    'product',
    new Zend_Controller_Router_Route(':lang/:country/:province/:city/:product', array(
        'controller' => 'country',
        'action' => 'product'
    ))
);

$router->addRoute(
    'city',
    new Zend_Controller_Router_Route(':lang/:country/:province/:city', array(
        'controller' => 'country',
        'action' => 'city'
    ))
);

$router->addRoute(
    'province',
    new Zend_Controller_Router_Route(':lang/:country/:province', array(
        'controller' => 'country',
        'action' => 'province'
    ))
);

$router->addRoute(
    'country',
    new Zend_Controller_Router_Route(':lang/:country', array(
        'controller' => 'country',
        'action' => 'index'
    ))
);
...