📜  Zend框架-路由

📅  最后修改于: 2020-10-16 07:39:30             🧑  作者: Mango


路由将请求URI映射到特定控制器的方法。在本章中,我们将看到如何在Zend框架中实现路由。

一般来说,任何URI都包含三个部分-

  • 主机名段,
  • 路径段,以及
  • 查询段。

例如,在URI / URL- http://www.example.com/index? q=data中 www.example.com是主机名段,索引是路径段,而q = data是查询段。通常,路由将对照一组约束检查Page段。如果有任何约束匹配,那么它将返回一组值。主要值之一是控制器。

在某些情况下,路由还会检查主机段,查询段,请求HTTP方法,请求HTTP标头等。

路由和RouteStack

路由是路由中的主要对象。 Zend Framework为路由对象RouteInterface提供了一个特殊的接口。所有路由对象都需要实现RouteInterface。 RouteInterface的完整列表如下-

namespace Zend\Mvc\Router;  
use Zend\Stdlib\RequestInterface as Request;  
interface RouteInterface { 
   public static function factory(array $options = []); 
   public function match(Request $request); 
   public function assemble(array $params = [], array $options = []); 
}

主要方法是match 。这种match方法对照给定的请求在其中定义的约束进行检查。如果找到任何匹配项,则返回RouteMatch对象。此RouteMatch对象提供匹配请求的详细信息作为参数。可以使用getParams方法从RouteObject中提取这些参数。

RouteObject的完整列表如下-

namespace Zend\Mvc\Router;  
class RouteMatch { 
   public function __construct(array $params); 
   public function setMatchedRouteName($name); 
   public function getMatchedRouteName(); 
   public function setParam($name, $value); 
   public function getParams(); 
   public function getParam($name, $default = null); 
} 

通常,典型的MVC应用程序具有许多路由。每条路线将按照LIFO顺序进行处理,并且一条路线将被匹配并返回。如果没有路由匹配/返回,则应用程序返回“找不到页面”错误。 Zend Framework提供了一个用于处理路由的接口RouteStackInterface 。该RouteStackInterface可以选择添加/删除路由。

RouteStackInterface的完整列表如下-

namespace Zend\Mvc\Router;  
interface RouteStackInterface extends RouteInterface { 
   public function addRoute($name, $route, $priority = null); 
   public function addRoutes(array $routes); 
   public function removeRoute($name); 
   public function setRoutes(array $routes); 
}

Zend框架提供了RouteStack接口的两种实现,如下所示-

  • SimpleRouteStack
  • TreeRouteStack

路线类型

Zend框架为“ Zend \ Mvc \ Router \ Http”命名空间下的所有情况提供了许多现成的路由对象。对于给定的情况,选择并使用适当的路由对象就足够了。

可用的路线如下-

  • 主机名-用于匹配URI的主机部分。

  • 字面量-用于匹配确切的URI。

  • 方法-用于匹配传入请求的HTTP方法。

  • 部分-用于使用自定义逻辑来匹配URI路径段的部分。

  • Regex-用于通过Regex Pattern匹配URI路径段。

  • 模式-用于匹配URI模式,例如http,https等。

  • -用于通过将其分成多个段来匹配URI路径。

让我们看看如何编写最常用的字面量和分段Route。通常在每个模块的配置文件– module.config.php中指定路由。

字面量路线

通常,以LIFO顺序查询路线。字面量路由是用于URI路径的精确匹配。

它的定义如下所示-

$route = Literal::factory(array( 
   'route' => '/path', 
   'defaults' => array('controller' => 'Application\Controller\IndexController', 
      'action' => 'index',), 
));

上面的路由与请求url中的/ path匹配,并返回index作为操作,返回IndexController作为控制器。

段路线

每当您的网址包含可变参数时,就会使用分段路由。

它描述如下-

$route = Segment::factory(array( 
   'route' => '/:controller[/:action]', 
   'constraints' => array( 
      'controller' => '[a-zA-Z][a-zA-Z0-9_-]+', 
      'action' => '[a-zA-Z][a-zA-Z0-9_-]+', 
   ), 
   'defaults' => array( 
      'controller' => 'Application\Controller\IndexController', 
      'action' => 'index',), 
));

在此,句段用冒号表示,后跟字母数字字符。如果保留段是可选的,则将其括在方括号中。每个段可能具有与之关联的约束。每个约束都是一个正则表达式。

在教程模块中配置路由

让我们在“教程”模块中添加路段路线。更新教程模块配置文件– module.config.php,该文件位于myapp / module / Tutorial / config

 [ 
      'factories' => [ 
         Controller\TutorialController::class => InvokableFactory::class, 
      ], 
   ], 
   'router' => [ 
      'routes' => [ 
         'tutorial' => [ 
            'type'    => Segment::class, 
               'options' => [ 
                  'route' => '/tutorial[/:action[/:id]]', 
                  'constraints' => [ 
                     'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
                     'id'     => '[0-9]+', 
                  ], 
                  'defaults' => [
                     'controller' => Controller\TutorialController::class, 
                     'action'     => 'index', 
                  ], 
               ], 
            ], 
      ], 
   ], 
   'view_manager' => [ 
      'template_path_stack' => ['tutorial' => __DIR__ . '/../view',], 
   ], 
];

我们已成功为Tutorial模块添加了路由。我们仅是完成Tutorial模块的一步。我们需要为模块添加View ,我们将在下一章中学习。