ZendFramework-ルーティング

ルーティングマップ Request URI特定のコントローラーのメソッドに。この章では、ZendFrameworkでルートを実装する方法を説明します。

一般に、URIには3つの部分があります-

  • ホスト名セグメント、
  • パスセグメント、および
  • クエリセグメント。

たとえば、URI / URL − http://www.example.com/index?q=data, www.example.com ホスト名セグメントです。 index パスセグメントであり、 q=dataクエリセグメントです。一般的に、ルーティングはPage segment一連の制約に対して。いずれかの制約が一致する場合、値のセットを返します。主な値の1つはコントローラーです。

ルーティングは、特定の状況で、ホストセグメント、クエリセグメント、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オブジェクトは、一致したリクエストの詳細をパラメーターとして提供します。これらのパラメータはから抽出できますRouteObject を使用して getParams 方法。

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フレームワークは、の2つの実装を提供します。 RouteStack インターフェイスとそれらは次のとおりです-

  • SimpleRouteStack
  • TreeRouteStack

ルートの種類

Zendフレームワークは、「Zend \ Mvc \ Router \ Http」名前空間の下にあるすべての状況に対応する多くの既製のルートオブジェクトを提供します。特定の状況に適したルートオブジェクトを選択して使用するだけで十分です。

利用可能なルートは次のとおりです-

  • Hostname −URIのホスト部分を照合するために使用されます。

  • Literal −正確なURIを照合するために使用されます。

  • Method −着信要求のHTTPメソッドを照合するために使用されます。

  • Part −カスタムロジックを使用してURIパスセグメントの一部を照合するために使用されます。

  • Regex −正規表現パターンによってURIパスセグメントを照合するために使用されます。

  • Schema − http、httpsなどのURIスキーマを照合するために使用されます。

  • Segment − URIパスを複数のセグメントに分割することにより、URIパスを照合するために使用されます。

最も一般的に使用されるリテラルおよびセグメントルートの記述方法を見てみましょう。ルートは通常、各モジュールの構成ファイルで指定されます–module.config.php

リテラルルート

通常、ルートはLIFOの順序で照会されます。リテラルルートは、URIパスの完全一致を行うためのものです。

以下のように定義されます-

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

上記のルートは /path リクエストURLで返されます index として action そして IndexController コントローラーとして。

セグメントルート

セグメント化されたルートは、URLに可変パラメータが含まれていると想定される場合に使用されます。

以下のように説明されています-

$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

<?php  
namespace Tutorial;  
use Zend\ServiceManager\Factory\InvokableFactory; 
use Zend\Router\Http\Segment;  
return [ 
   'controllers' => [ 
      '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モジュール。チュートリアルモジュールを完了するのは、ほんの一歩遅れています。追加する必要がありますView モジュールについては、次の章で学習します。