0

ZF 1 でモジュール構造を使用せずに開始したプロジェクト ウィッチがあり、ユーザーを管理するためのモジュール構造を配置する必要があります (私にはより理にかなっています)。

私の問題は、「デフォルト」ルートが :controller/:action/:id を使用しようとする必要があり、モジュールルート
が :module/:controller/:action/:id を使用する必要があることです。ZF 1 のデフォルトは、 :id
しかし、私の「ロジック」には :id フィールドが必要です。どうすればこれを機能させることができますか?

私が試したことは次のとおりです。

    protected function _initModuleAutoload()
{
    $modelLoader = new Zend_Application_Module_Autoloader(
                    array('namespace' => 'DM',
                        'basePath' => APPLICATION_PATH . '/modules/default')
                    , array('namespace' => 'UM',
                'basePath' => APPLICATION_PATH . '/modules/users')
    );

    $modelLoader->addResourceType('service', 'services', 'Service');
    $modelLoader->addResourceType('serviceplugin', 'services/plugins', 'Service_Plugin');

    return $modelLoader;
}

public function _initFrontController()
{
    $front = Zend_Controller_Front::getInstance();
    $router = $front->getRouter();

    $route1 = new Zend_Controller_Router_Route(
                    ':module/:controller/:action/:id/',
                    array(
                        'id' => '\d+'
                        , 'module' => 'default'
                        , 'controller' => 'index'
                        , 'action' => 'index'
                    )
    );

    $router->addRoute('default', $route1);

    $front->addModuleDirectory(APPLICATION_PATH . "/modules/");

    $front
            ->registerPlugin(new Far_Access_Plugin_Identity(), 1)
            ->registerPlugin(new Far_Access_Plugin_Access(), 2)
            ->throwExceptions(true)
    ;

    return $front;
}

また、デフォルトの代わりにユーザー用の 2 番目のルートを作成しようとしましたが、機能しませんでした。

何か案は?私は何を間違っていますか?

このリンクを提供したときに、チャンネル #zftalk で freenode の irc からのヘルプが提供されました。

Bittarman: crash82: id に要件を追加して、[\d]+ にする必要があります
Bittarman: または、:id だけで Zend_Controller_Router_Route にチェーンされた Zend_Controller_Router_Route_Module のインスタンスを追加し、id のデフォルトを false に設定します。
Bittarman: また、_initModuleAutoload は無意味です Bittarman: モジュール ディレクトリに「デフォルト」モジュールを配置するのはちょっと間違ってい
ます Bittarman: そして、_initFrontController Bittarman: を使用して frontcontroller リソースの動作を停止します
Bittarman: したがって、resources.frontController は動作しなくなります。

crash82: うーん... 非常に多くの問題 :( 、「デフォルト」モジュールをアプリケーションディレクトリに配置するだけで、他のモジュールはモジュール/パスから引き続きロードできますか?

Bittarman: はい :)

crash82: その Bittarman を試してみます: そして、ブートストラップを持つ各モジュールは、独自のモジュール リソース ローダー
Bittarman を提供します。
Bittarman: 驚くほど多くの人がやっています。
Bittarman: s/tht/that/

4

1 に答える 1

0

スクリプトの URL にパラメーターを渡す必要がある場合、いくつかの方法のいずれかを使用します。ほとんどの単純なことについては、新しいルートを作成する必要はありません。

  1. <a href="/music/index/album/id/<?php echo $variable->id ?>"><?php echo $track->album ?></a>. パラメータを / として渡しますid/album_id
  2. url() ビュー ヘルパーを使用します。<?php echo $this->url(array('controller' => 'index', 'action' => 'index', 'id' => $variable->id)); ?>このヘルパーも、最初のパラメーターとしてモジュールを受け取ります。
  3. 最初の 2 つはビュー スクリプトで動作します。コントローラーで同じことを行うには、reidector アクション ヘルパーを使用できます。$this->getHelper('Redirector')->gotoSimple('action'=> 'someAction', 'controller' => 'someController', 'module' => 'someModule', array('id' => $id );コントローラー、モジュール、およびパラメーターはオプションで、デフォルトはNULL.
  4. または、アクション ユーティリティ メソッド _forward() を使用できます。$this->_forward($action, $controller, $module, array($params))これは gotoSimple() と同じ構文です。

この種のルーティングを実現する方法は他にもあります。残りはあなたに任せますが、アクション ヘルパーユーティリティ メソッドビュー ヘルパーから始めることができます。

于 2012-05-01T06:44:20.110 に答える