Zend-framework-routing
Zend Framework-ルーティング
ルーティングは、*リクエストURI *を特定のコントローラーのメソッドにマップします。 この章では、Zend Frameworkでルートを実装する方法を説明します。
一般的に、任意のURIには3つの部分があります-
- ホスト名セグメント、
- パスセグメント
- クエリセグメント。
たとえば、URI/URL-* http://www.example.com/index?q = data、* www.example.com はホスト名セグメント、 index はパスセグメント、 q = dataです。 はクエリセグメントです。 一般に、ルーティングは一連の制約に対して*ページセグメント*をチェックします。 制約が一致する場合、値のセットを返します。 主な価値の1つはコントローラーです。
ルーティングは、特定の状況でホストセグメント、クエリセグメント、HTTPメソッドの要求、HTTPヘッダーの要求などもチェックします。
Route&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 です。 この一致メソッドは、指定された要求をその中で定義された制約と照合します。 一致するものが見つかった場合、 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の順序で処理され、1つのルートが一致して返されます。 一致する/返されるルートがない場合、アプリケーションは「ページが見つかりません」エラーを返します。 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 インターフェースの2つの実装を提供し、それらは次のとおりです-
- SimpleRouteStack
- TreeRouteStack
ルートの種類
Zendフレームワークは、「Zend \ Mvc \ Router \ Http」名前空間の下で、あらゆる状況に対応する既製のルートオブジェクトを多数提供します。 特定の状況に適したルートオブジェクトを選択して使用すれば十分です。
利用可能なルートは次のとおりです-
- Hostname -URIのホスト部分と一致するために使用されます。
- Literal -正確なURIに一致するために使用されます。
- Method -着信リクエストのHTTPメソッドと一致するために使用されます。
- Part -カスタムロジックを使用してURIパスセグメントの一部を一致させるために使用されます。
- Regex -正規表現パターンによるURIパスセグメントの照合に使用されます。
- Schema -http、httpsなどのURIスキーマと一致するために使用されます。
- セグメント-URIパスを複数のセグメントに分割して一致させるために使用されます。
最も一般的に使用されるリテラルおよびセグメントルートの作成方法を見てみましょう。 通常、ルートは各モジュールの構成ファイル( module.config.php )で指定されます。
リテラルルート
通常、ルートはLIFOの順序で照会されます。 リテラルルートは、URIパスの完全一致を行うためのものです。
以下に示すように定義されます-
$route = Literal::factory(array(
'route' => '/path',
'defaults' => array('controller' => 'Application\Controller\IndexController',
'action' => 'index',),
));
上記のルートは、リクエストURLの /path と一致し、 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',),
));
ここでは、セグメントはコロンで示され、その後に英数字が続きます。 セグメントを保持する場合はオプションで、角括弧で囲まれます。 各セグメントには制約が関連付けられている場合があります。 各制約は正規表現です。
チュートリアルモジュールでのルートの構成
チュートリアルモジュールにセグメントルートを追加しましょう。 チュートリアルモジュール構成ファイルを更新します- myapp/module/Tutorial/config で入手可能な module.config.php 。
<?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* を追加する必要があります。これについては、次の章で学習します。