3

Googleで検索したところ、このコードを取得して、コントローラーが存在するかどうかを確認しました。

$front = Zend_Controller_Front::getInstance();
if ($front->getDispatcher()->isDispatchable($request)) {
    // Controller exists
}

しかし、このコードをどこに置くべきかわかりません。何$requestですか?
私はBoostrap.phpにいます。コントローラーが存在しないかどうか_initRouteを確認する必要があります。存在しない場合は、新しいルートを追加します。


最初の回答後に更新されました。Boostrap.phpにいくつかのルートがあります

public function _initRoute() {


    $front = Zend_Controller_Front::getInstance();
    $router = $front->getRouter();
    $router->addRoute(
        'username',
        new Zend_Controller_Router_Route(':username',
            array('controller'=>'profile',
                  'action'=>'index')
        )
    );

    $router->addRoute(
        'username/sets',
        new Zend_Controller_Router_Route(':username/sets',
            array('controller'=>'profile',
                  'action'=>'sets')
        )
    );


}

このルートにより、mydomain.com/{username}のコンテンツはmydomain.com/profile/index/username/{username}と同じになります。

しかし、問題は、mydomain.com / {anything or any controller}と入力すると、Boostrapで定義したとおりにルーティングされることです。ですから、コントローラーが存在するかどうかを確認する必要があると思います。存在しない場合は、ルートを実行します。

私が間違っている?最初の回答の後、プラグインを追加し、それを_initPluginの下に置いて登録しました。しかし、それは機能しないように見えます。

これは私のブーストラップファイルです:

<?php


//Zend_View_Helper_PaginationControl::setDefaultViewPartial('paginator.phtml');

class Plugin_MyX extends Zend_Controller_Plugin_Abstract {
    public function routeStartup(Zend_Controller_Request_Abstract $request) {
        $front = Zend_Controller_Front::getInstance();
        $dispatcher = $front->getDispatcher();

        if (!$dispatcher->isDispatchable($request)) {

            $front = Zend_Controller_Front::getInstance();
            $router = $front->getRouter();
            $router->addRoute(
                'username',
                new Zend_Controller_Router_Route(':username',
                    array('controller'=>'profile',
                          'action'=>'index')
                )
            );

            $router->addRoute(
                'username/sets',
                new Zend_Controller_Router_Route(':username/sets',
                    array('controller'=>'profile',
                          'action'=>'sets')
                )
            );


        } else {
            // exist
        }



    }


}




class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{


    protected function _initPlugin() {
        $front = Zend_Controller_Front::getInstance();
        $front->registerPlugin(new Plugin_MyX());
    }

    public function _initRoute() {


    }


}
4

2 に答える 2

3

リクエストオブジェクトはブートストラップ時にまだ存在しないため、そのコードをコントローラープラグインに配置する必要があります。

問題の$request変数はのオブジェクトですZend_Controller_Request_Http。このオブジェクトは、フロントコントローラーがリクエストをディスパッチするときに最初に作成されます。

プラグインを登録して、routeStartupそこにコードを配置することができます。これは、Requestオブジェクトを使用できる最も早いポイントになります。を除くすべてのコントローラープラグインチェーンは、リクエストオブジェクトをプラグインに渡しますdispatchLoopShutdown()

プラグインコードのサンプルは次のとおりです。

class Application_Plugin_Example
{
    public function routeStartup(Zend_Controller_Request_Abstract $request)
    {
        $front = Zend_Controller_Front::getInstance();
        if ($front->getDispatcher()->isDispatchable($request)) {
            // Controller exists
        }
    }
}

404エラーだけを処理しようとしている場合、これがErrorHandlerプラグインをこの目的に使用できるものです。

于 2012-05-17T00:13:33.093 に答える
0

最も具体的なものからあまり具体的でないものへのルートが必要です。また、URLに他のオプション(/ u / :usernameや/ user /:usernameなど)を含めることができないかどうかも検討してください。これにより、問題が解決します;)

また、すべてのコントローラーが各端のルートを定義すると、それが解決されます-作成:

/controller-name/
/profile-controller-name/
... with
/:username
at the end of the list

そうすれば、どのコントローラーも以前に一致し、機能します。また、リストされていないコントローラーのみが:usernameルートに「フォールスルー」します。

于 2012-05-18T21:30:27.093 に答える