1

条件が満たされた場合、サイトへのすべてのリクエストを特定のページに再ルーティングまたはリダイレクトできるようにしたいと考えています。これは、ブートストラップまたはディスパッチャーのどこかで実行する必要があると思いますが、最善/最もクリーンな方法が何であるかは正確にはわかりません。

PHP で条件をテストする必要があるため、.htaccess リダイレクトはありません

これが私が望むものです:

if( $condition ) {
    // Redirect ALL Pages/Requests
}

// else, continue dispatch as normal...

ここでの考え方は、Web サイト全体をセットアップし、指定された日時まですべてをスプラッシュ ページに送信できるということです。その時点で、本質的に「自動起動」します。

4

4 に答える 4

5

なぜルーティングを気にするのですか?単純なリダイレクトだけです。

おそらく Bootstrap.php では次のようになります。

public function initSplash(){
    if($splashtime && $requestIsNotForComingSoonAlready){
        header('Location: /coming-soon',true,302);
        die();
    }
}

または、index.php の先頭に if ステートメントを貼り付けて、フレームワークを完全にロードしないようにすることもできます。

于 2011-05-11T21:19:17.893 に答える
2

確かに、私はプラグインに行きます。

library/My/Plugin/ConditionallyRedirect.php

class My_Plugin_ConditionallyRedirect extends Zend_Controller_Plugin_Abstract
{
    public function routeStartup(Zend_Http_Request_Abstract $request)
    {
        // perform your conditional check
        if ($this->_someCondition()){
             $front = Zend_Controller_Front::getInstance();
             $response = $front->getResponse();
             $response->setRedirect('/where/to/go');
        }
    }

    protected function _someCondition()
    {
        // return the result of your check
        return false; // for example
    }

}

次に、プラグインを次のように登録しますapplication/configs/application.ini

autoloaderNamespaces[]                        = "My_"
resources.frontController.plugins.conditional = "My_Plugin_ConditionallyRedirect"

もちろん、クラス名のプレフィックスとファイルの場所に関するその他の設定/要件は、オートロードと呼び出しのわずかに異なる手順を必要とします。

于 2011-05-12T10:03:09.710 に答える
1

@David Weinraubに感謝します、私はあなたと同じようなプラグインを使いました。ただし、いくつか変更する必要がありました。これが最終結果です(ここでの例では、アプリケーション固有のものをいくつか簡略化しています)

<?php

/**
 * Lanch project within valid dates, otherwise show the splash page
 */

class App_Launcher extends Zend_Controller_Plugin_Abstract
{
// The splash page
private $_splashPage = array(
    'module' => 'default',
    'controller' => 'coming-soon',
    'action' => 'index'
);

// These pages are still accessible
private $_whiteList = array(
    'rules' => array(
        'module' => 'default',
        'controller' => 'sweepstakes',
        'action' => 'rules'
    )
);


/**
 * Check the request and determine if we need to redirect it to the splash page
 * 
 * @param Zend_Controller_Request_Http $request
 * @return void
 */
public function preDispatch(Zend_Controller_Request_Http $request)
{
    // Redirect to Splash Page if needed
    if ( !$this->isSplashPage($request) && !$this->isWhiteListPage($request) && !$this->isSiteActive() ) {

        // Create URL for Redirect
        $urlHelper = new Zend_View_Helper_Url();
        $url = $urlHelper->url( $this->_splashPage );

        // Set Redirect
        $front = Zend_Controller_Front::getInstance();
        $response = $front->getResponse();
        $response->setRedirect( $url );

    }
}


/**
 * Determine if this request is for the splash page
 * 
 * @param Zend_Controller_Request_Http $request
 * @return bool
 */
public function isSplashPage($request) {

    if( $this->isPageMatch($request, $this->_splashPage) )
        return true;

    return false;

}


/**
 * Check for certain pages that are OK to be shown while not 
 * in active mode
 * 
 * @param Zend_Controller_Request_Http $request
 * @return bool
 */
public function isWhiteListPage($request) {

    foreach( $this->_whiteList as $page )
        if( $this->isPageMatch($request, $page) )
            return true;            

    return false;

}


/**
 * Determine if page parameters match the request 
 * 
 * @param Zend_Controller_Request_Http $request
 * @param array $page (with indexes module, controller, index)
 * @return bool
 */
public function isPageMatch($request, $page) {

    if(  $request->getModuleName() == $page['module']
      && $request->getControllerName() == $page['controller']
      && $request->getActionName() == $page['action'] )
        return true;

    return false;
}


/**
 * Check valid dates to determine if the site is active
 * 
 * @return bool
 */
protected function isSiteActive() {

    // We're always active outside of production
    if( !App_Info::isProduction() )
        return true;

    // Test for your conditions here...
    return false; 
            // ... or return true;

}

}

いくつかの改善の余地がありますが、これは今のところ私のニーズに合うでしょう。ちなみに、$ requestにはrouteStartupで使用できるモジュール、コントローラー、アクションの名前がなかったため、関数をpreDispatchに戻す必要がありました。これは、リクエストをスプラッシュページにリダイレクトしないようにするために必要でした(無限のリダイレクトループを引き起こします)

(また、まだアクセス可能であるはずの他のページの「ホワイトリスト」を追加しただけです)

于 2011-05-12T18:26:25.927 に答える
1

正しい方法で実行したい場合は、要求が作成された後にクラスで実行する必要があります。これにより、応答が送信される前に変更できるようになります。通常、ブートストラップには完全には含まれていません。フロントコントローラーにアクセスできるプラグインをどこかに置いてください(ACLの動作と同様)

于 2011-05-11T22:02:39.247 に答える