Я думаю, что вы подразумеваете под 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 должна иметь механизм кэширования, чтобы предотвратить запрос к базе данных при каждом запросе.