Routing zf2奇怪的路由问题

Routing zf2奇怪的路由问题,routing,zend-framework2,Routing,Zend Framework2,我正在开发一个zf2应用程序,在路由方面遇到了一些问题 我有一个控制器和15个视图。他们中的大多数工作正常,而另一半,我得到以下例外: 执行过程中发生错误;请稍后再试 其他信息: Zend\Mvc\Router\Exception\RuntimeException 文件: /用户//Sites/zend/vendor/zendframework/zendframework/library/zend/Mvc/Router/Http/TreeRouteStack.php:313 信息: 未找到名为“

我正在开发一个zf2应用程序,在路由方面遇到了一些问题

我有一个控制器和15个视图。他们中的大多数工作正常,而另一半,我得到以下例外:

执行过程中发生错误;请稍后再试

其他信息: Zend\Mvc\Router\Exception\RuntimeException

文件: /用户//Sites/zend/vendor/zendframework/zendframework/library/zend/Mvc/Router/Http/TreeRouteStack.php:313 信息: 未找到名为“categories”的路由

以下是控制器类:

namespace Stock\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Json\Json;
use Application\Model\Application;

class StockController extends AbstractActionController
{
    private $apiRoutes = array(
            'categories'    => 'catalog/category',
            'certificates'  => 'catalog/certificate',
            'constructions' => 'catalog/construction',
            'colours'       => 'catalog/color',
            'departments'   => 'catalog/department',
            'designers'     => 'catalog/designer',
            'designs'       => 'catalog/design',
            'discounts'     => 'sales/discount',
            'locations'     => 'catalog/location',
            'materials'     => 'catalog/material',
            'patterns'      => 'catalog/pattern',
            'products'      => 'catalog/product',
            'ranges'        => 'catalog/range',
            'shapes'        => 'catalog/shape',
            'suppliers'     => 'catalog/supplier' 
        );

    public function indexAction()
    {
        $model = $this->params()->fromRoute('view') ? $this->params()->fromRoute('view') : 'index';

        $form = null;
        $dataObj = null;
        $itemId = null;

        $modelForm = 'Stock\Form\\' . ucfirst($model) . 'Form';

        if(class_exists($modelForm)){
            $form = new $modelForm();
            $API = new Application();

            $itemId = $this->params()->fromRoute('id') ? $this->params()->fromRoute('id') : null;

            $dataObj = $API->get($this->apiRoutes[$model]);

            if($dataObj){
                foreach($dataObj as $data){

                    $vars = get_object_vars($data);

                    if($data->{key($vars)} == $itemId){
                        $form->setData($vars);
                    }
                }
            }

            $formControllerResponse = $this->validate($form);

            //if response is an object, it contains form errors, so pass client-side for JS to handle.
            if($formControllerResponse->valid){
                //update magento...
                $data = $form->getData();

                $API->put($this->apiRoutes[$model], $data);
            }

            if(isset($formControllerResponse->response)) return $formControllerResponse->response;
        }

        $view = new ViewModel(array('form' => $form, 'dataObj' => $dataObj, 'itemId' => $itemId));
        $view->setTemplate("stock/stock/$model");
        return $view; 
    }

    public function validate($form)
    {
        $filterClass = get_class($form) . 'Filter';
        $request = $this->getRequest();
        $response = $this->getResponse();

        $return = new \stdClass();
        $return->valid = false;

        $message = array('errors' => false);

        if($request->isXmlHttpRequest() && $request->isPost()){

            $form->setInputFilter(new $filterClass());
            $form->setData($request->getPost());

            if(!$form->isValid()){
                $errors = $form->getMessages();
                foreach($errors as $key => $error){
                    $message['errors'][$key] = implode($error, '; ');
                }
            }

            else {
                $return->valid = true;
            }

            $response->setContent(Json::encode($message));

            $return->response = $response;
        }

        if($request->isPost()){
            $form->setInputFilter(new $filterClass());
            $form->setData($request->getPost());

            if($form->isValid()){
                $return->valid = true;
            }
        }

        return $return;
    }
}
下面是
module.config.php
文件:

return array(
    'controllers' => array(
        'invokables' => array(
            'Stock\Controller\Stock' => 'Stock\Controller\StockController',
            'Stock\Controller\Media' => 'Stock\Controller\MediaController',
        ),
    ),
    'router' => array(
        'routes' => array(
            'stock' => array(
                'type'    => 'segment',
                'options' => array(
                    'route'    => '/stock[/][/:view][/:id]',
                    'constraints' => array(
                        'view'    => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id'      => '[0-9]+',
                    ),
                    'defaults' => array(
                        'controller' => 'Stock\Controller\Stock',
                        'action'     => 'index',
                    ),
                ),
            ),
            'media' => array(
                'type'    => 'segment',
                'options' => array(
                    'route'    => '/stock/media[/]',
                    'constraints' => array(
                        'id'            => '[0-9]+',
                    ),
                    'defaults' => array(
                        'controller' => 'Stock\Controller\Media',
                        'action'     => 'index',
                    ),
                ),
            ),
        ),
    ),
    'view_manager' => array(
        'template_path_stack' => array(
            'stock' => __DIR__ . '/../view',
        ),
    ),
);
因此,我对以下观点有异议:

  • 类别
  • 证书
  • 颜色
  • 设计
  • 折扣
  • 地点
最奇怪的是,在locations视图的错误中,异常显示未找到名为“location”(单数)的路由。我不知道位置这个词是从哪里来的。如果我输出
$model
变量,它将打印
位置

有人能解释一下吗


非常感谢。

您需要为出错的页面定义路由,例如,我将为类别创建1作为示例(您可以根据自己的情况修改它)

      'categories' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/stock/categories[/]',
                'constraints' => array(
                    'id'            => '[0-9]+',
                ),
                'defaults' => array(
                    'controller' => 'Stock\Controller\Categories',\\ assuming you need a controller for categories else you have to change below line for its action
                    'action'     => 'index',
                ),
            ),
        ),