0

ZF2 アプリケーションのルーティングをセットアップしようとしています。

次のような URL があります。

/foo/bar.json            >>> should call /Controller/Foo/BarController.php
/foo/bar/123.json        >>> should call /Controller/Foo/BarController.php
/foo/baz/bar.json        >>> should call /Controller/FooController.php

および下層のコントローラー構造

/Controller/Foo/BarController.php
/Controller/FooController.php

ディレクトリ構造を調べてルーティングする必要があります。存在する/foo/baz/bar.jsonかどうかを確認する必要/Controller/Foo/Baz/BarController.phpがあります。そうでない場合は、/Controller/Foo/BazController.php存在するかどうかを確認し、そうでない場合は探して、そうでない場合/Controller/FooController.phpは 404 を返します

しかし、私は zend のドキュメントから有用な情報をあまり得ていないようです。既存のルーターを調べましたが、必要な機能に一致するものはないようです。

また、カスタム ルーターの作成に関する zend ドキュメントには情報がないようです。

リテラル ルーターを拡張して、match()関数をオーバーライドし、一致するものが見つかった場合はオブジェクトを返すことで、独自のルーターを作成しようとしRouteMatchましたが、一致するルートがないことを通知する 404 が表示されます。

もちろん、module.config ファイルも編集して、新しいルーターを追加しました。それをinvokablesに追加しました

カスタム ルーターの書き方について初心者に教えてもらえますか、それともこれに関する良い情報を知っている人はいますか?

4

2 に答える 2

1

それが最善の方法かどうかはわかりません。

すべての URL を 1 つのコントローラー (/Controller/RouteController.php など) に向けることができます。そこで、URL をトラバースして、適切なコントローラーをディスパスすることができます。

public function indexAction()
{
    $event = $this->getEvent();
    $routeMatch = $event->getRouteMatch();

    $locator = $this->getServiceLocator();
    if ($locator->has('ControllerLoader')) {
        $locator = $locator->get('ControllerLoader');
    }

    $url = parse_url($this->getRequest()->getUri());
    $path = str_replace('.json', '', $url['path']);
    $path = explode('/', trim($path, '/'));

    while (sizeof($path)){
        $controllerName = 'Controller\\' .implode('\\', $path);
        if ($locator->has($controllerName)) {
            return $this->forward()->dispatch($controllerName, $routeMatch->getParams());
        }

        array_pop($path);
    }

    //not found
}

モジュール構成でコントローラーを必ず定義してください。

array(
  'controllers' => array(
    'invokables' => array(
        'Controller\Foo\Baz' => 'Controller\Foo\BazController',
        ...
    )
  ),
);
于 2013-05-30T09:36:50.360 に答える
0

まず、ディレクトリ構造を直接調べるという意味ではないと思いますよね。あなたは決してそれをしてはいけません。アプリケーションを適切に構成した場合、zf2 が自動ロードを処理するため、アプリケーションは必要ありません。

とにかく、これを達成するにはいくつかの方法があります。

  • 実際にカスタマイズした Route クラスを作成します
  • /foo で始まるすべてのものに一致し、fe FooDispatchController にルーティングしてRouteMatchオブジェクトをさらに分析しforward()、そこから適切なコントローラーにルーティングします。
于 2013-05-30T09:38:06.673 に答える