Как создать собственный маршрутизатор в Zend-Framework? - PullRequest
0 голосов
/ 22 октября 2010

Я использую пользовательский маршрутизатор для включения таких страниц, как:

mytutorialsite.com / category /: categoryname

# added to application.ini
resources.router.routes.categorynameOnCategory.route = /category/:categoryname
resources.router.routes.categorynameOnCategory.defaults.module = default
resources.router.routes.categorynameOnCategory.defaults.controller = category
resources.router.routes.categorynameOnCategory.defaults.action = categoryname

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

- html
- css
- js
- php

Это означает, что существуют следующие страницы:

  • mytutorialsite.com / category /html
  • mytutorialsite.com / category / css
  • mytutorialsite.com / category / js
  • mytutorialsite.com / category / php

Но когда вы посещаете страницу с именем категории, которого нет в базе данных, например:

  • mytutorialsite.com / category / foo

Вы должны получить сообщение 404 Страница не существует .

Как мне этого добиться?

1 Ответ

1 голос
/ 24 октября 2010

Я думаю, что вы подразумеваете под categoryname как действием в вашем маршруте: categoryname должно использоваться как действие?Есть два метода, которые вы можете использовать.Сначала вы добавляете только маршруты к маршрутизатору, где существуют категории.Когда запрашивается категория / foo, маршрутизатор не распознает маршрут и выдает ошибку 404.

Второй вариант - вы перехватываете все маршруты категории / * и внутри своего действия вы проверяете, существует ли категория.

Для первого варианта добавьте плагин frontController с функцией routeStartup.В этом хуке вы можете сделать:

public function routeStartup(Zend_Controller_Request_Abstract $request)
{
    // Get the router
    $router     = Zend_Controller_Front::getInstance()->getRouter();

    // Fetch all your categories
    $category   = new Application_Model_Category;
    $categories = $category->fetchAll();

    // Loop and add all individual categories as routes
    foreach ($categories as $category) {
        $route  = 'category/:' . $category->name;
        $params = array(
            'module'     => 'default',
            'controller' => 'category',
            'action'     => $category->name
        );

        $route = new Zend_Controller_Router_Route($route, $params);
        $router->addRoute($category->name, $route);
    }
}

Другой способ является более простым для маршрута.В вашем application.ini:

resources.router.routes.category.route      = "category/:action"
resources.router.routes.category.module     = "default"
resources.router.routes.category.controller = "category"

Теперь все запросы из категории / SOMETHING будут отправляться в модуль по умолчанию, контроллер категорий.Диспетчер проверяет, существует ли действие ЧТО-ТО.Когда это происходит, он выполняет действие.Если нет, то вызывается исключение Zend_Controller_Action_Exception («действие не существует»).

Короче говоря, оба метода работают.С первым вы получаете больше контроля.Второй способ более прост, но когда, например, существует editAction, addAction или removeAction в categoryController, они также могут запускаться (поэтому будьте осторожны с этим методом).

PS.Конечно, функция routeStartup должна иметь механизм кэширования, чтобы предотвратить запрос к базе данных при каждом запросе.

...