ZF2 路由 - 路由无法匹配请求的 URL
ZF2 Routes - The requested URL could not be matched by routing
我在为一个非常简单的控制器设置路由时遇到问题。我收到 "The requested URL could not be matched by routing." 错误。我在 SO 上查看过类似的已解决问题,但无法确定我做错了什么(例如:ZF2 - Zend Framework 2, understanding routing)
我已经关注了 skeleton tutorial with the albums 主题并且一切正常。我尝试复制相册模块,然后更改控制器的名称、文件夹、模块配置等。我认为这是确认我至少可以复制工作代码的好方法。我只是想 echo "123"
到页面,所以我尝试从新模块中删除表单、模型和一些视图的目录。
有什么方法可以查看我真正要寻找的路线以及我定义的路线吗?我知道 CI 实际上创建了一个我能够检查的日志文件。它有点像 Apache 日志,但特定于框架功能。
我想 post 我的一些代码,以便有人可以指出我犯的错误,并可能解释为什么它是错误的。我尝试密切注意大小写,因为整个教程中使用了单词 album
的不同变体,我不能 100% 确定哪些变体应该与刚才的变体相匹配。我正在努力让它适用于 http://www.example.com/productbriefs
.
文件夹结构
module.config.php:
return array(
'controllers' => array(
'invokables' => array(
'Productbriefs\Controller\Productbriefs' => 'Productbriefs\Controller\ProductbriefsController',
),
),
// The following section is new and should be added to your file
'router' => array(
'routes' => array(
'productbriefs' => array(
'type' => 'Literal',
'options' => array(
'route' => '/productbriefs',
'defaults' => array(
'controller' => 'Productbriefs\Controller\Productbriefs',
'action' => 'index',
),
),
),
),
),
'view_manager' => array(
'template_path_stack' => array(
'productbriefs' => __DIR__ . '/../view',
),
),
);
ProductbriefsController.php
namespace Productbriefs\Controller;
use Zend\Mvc\Controller\AbstractActionController;
class ProductbriefsController extends AbstractActionController
{
public function indexAction()
{
echo "123";
}
}
Module.php
namespace Productbriefs;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements AutoloaderProviderInterface, ConfigProviderInterface
{
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
// Add this method:
public function getServiceConfig()
{
return array(
'factories' => array(),
);
}
}
根据我的评论,您需要将 Productbriefs
添加到 application.config.php
中的模块数组,否则将不会加载模块(包括其配置)。
要回答您的第二个问题,控制器管理器需要知道如何加载您的应用程序使用的控制器 classes。 'invokable' 是一个 class,它可以在不需要传递任何参数的情况下被实例化,所以通过向该数组添加控制器,你告诉控制器管理器它可以简单地实例化 class通过 $controller = new Productbriefs\Controller\ProductbriefsController()
。数组的键是一个别名,是的。这可以是任何东西,尽管 ZF 约定是使用 class 的完全限定名称,但从末尾省略 'Controller' 后缀。当您在路由配置中引用控制器时,您使用这些别名。
我在为一个非常简单的控制器设置路由时遇到问题。我收到 "The requested URL could not be matched by routing." 错误。我在 SO 上查看过类似的已解决问题,但无法确定我做错了什么(例如:ZF2 - Zend Framework 2, understanding routing)
我已经关注了 skeleton tutorial with the albums 主题并且一切正常。我尝试复制相册模块,然后更改控制器的名称、文件夹、模块配置等。我认为这是确认我至少可以复制工作代码的好方法。我只是想 echo "123"
到页面,所以我尝试从新模块中删除表单、模型和一些视图的目录。
有什么方法可以查看我真正要寻找的路线以及我定义的路线吗?我知道 CI 实际上创建了一个我能够检查的日志文件。它有点像 Apache 日志,但特定于框架功能。
我想 post 我的一些代码,以便有人可以指出我犯的错误,并可能解释为什么它是错误的。我尝试密切注意大小写,因为整个教程中使用了单词 album
的不同变体,我不能 100% 确定哪些变体应该与刚才的变体相匹配。我正在努力让它适用于 http://www.example.com/productbriefs
.
文件夹结构
module.config.php:
return array(
'controllers' => array(
'invokables' => array(
'Productbriefs\Controller\Productbriefs' => 'Productbriefs\Controller\ProductbriefsController',
),
),
// The following section is new and should be added to your file
'router' => array(
'routes' => array(
'productbriefs' => array(
'type' => 'Literal',
'options' => array(
'route' => '/productbriefs',
'defaults' => array(
'controller' => 'Productbriefs\Controller\Productbriefs',
'action' => 'index',
),
),
),
),
),
'view_manager' => array(
'template_path_stack' => array(
'productbriefs' => __DIR__ . '/../view',
),
),
);
ProductbriefsController.php
namespace Productbriefs\Controller;
use Zend\Mvc\Controller\AbstractActionController;
class ProductbriefsController extends AbstractActionController
{
public function indexAction()
{
echo "123";
}
}
Module.php
namespace Productbriefs;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements AutoloaderProviderInterface, ConfigProviderInterface
{
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
// Add this method:
public function getServiceConfig()
{
return array(
'factories' => array(),
);
}
}
根据我的评论,您需要将 Productbriefs
添加到 application.config.php
中的模块数组,否则将不会加载模块(包括其配置)。
要回答您的第二个问题,控制器管理器需要知道如何加载您的应用程序使用的控制器 classes。 'invokable' 是一个 class,它可以在不需要传递任何参数的情况下被实例化,所以通过向该数组添加控制器,你告诉控制器管理器它可以简单地实例化 class通过 $controller = new Productbriefs\Controller\ProductbriefsController()
。数组的键是一个别名,是的。这可以是任何东西,尽管 ZF 约定是使用 class 的完全限定名称,但从末尾省略 'Controller' 后缀。当您在路由配置中引用控制器时,您使用这些别名。