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 モジュールについては、次の章で学習します。