0

basePath特定のリクエストに対して、Mvc のすべてのコンポーネントでa を同じに設定したいと考えています。つまり、これらのメソッドを呼び出すときに同じ結果を得たいということです'/spam/ham/'

echo $this->headLink()->prependStylesheet($this->basePath() . '/styles.css')  // $this->basePath() has to be '/spam/ham/'

$this->getServiceLocator()
     ->get('viewhelpermanager')
     ->get('headLink')
     ->rependStylesheet($this->getRequest()->getBasePath() . '/styles.css')   // $this->setRequest()->getBasePath() has to be /spam/ham/

basePath私がすでに見つけた最初のケ​​ースの設定方法、これが私の質問です。ちなみに、元のマニュアルには、回答から得た情報はありません。

そして今、2番目のもの -basePathに設定する必要がありますRequest:

$this->getRequest()->getBasePath()

ここで、実際にはhttp://zend-framework-community.634137.n4.nabble.com/Setting-the-base-url-in-ZF2-MVC-td3946284.htmlでまったく機能しないいくつかの答えを見つけました。ここ で述べたStaticEventManagerように非推奨なので、次のように変更しましたSharedEventManager

// In my Application\Module.php

namespace Application;
use Zend\EventManager\SharedEventManager

    class Module {
        public function init() {             

                $events = new SharedEventManager(); 
                $events->attach('bootstrap', 'bootstrap', array($this, 'registerBasePath')); 
            } 

            public function registerBasePath($e) { 

                $modules = $e->getParam('modules'); 
                $config  = $modules->getMergedConfig(); 
                $app     = $e->getParam('application'); 
                $request = $app->getRequest(); 
                $request->setBasePath($config->base_path); 
            } 
        } 
    }

そして、私modules/Application/configs/module.config.phpは追加します:

'base_path' => '/spam/ham/' 

しかし、それはうまくいきません。問題は次のとおりです。

1) ランが関数に来ることはありませんregisterBasePath。しかし、そうしなければなりません。init関数内のリスナーにイベントを添付しました。

2)私が変更SharedEventManagerするとEventManager、たまたまregisterBasePath関数に到達しますが、例外がスローされます:

Fatal error: Call to undefined method Zend\EventManager\EventManager::getParam()

私は何を間違っていますか?registerBasePathプログラムの実行が関数に来ないのはなぜですか? これがbasePathグローバルに設定する唯一の方法である場合、それを正しく行う方法は?

4

1 に答える 1

4

ドキュメントにこれらの種類のものが欠けていることは知っています。しかし、あなたはこれにアプローチする方法で正しいです:

  1. 早めに(ブートストラップで)
  2. アプリからリクエストを取得する
  3. リクエストにベースパスを設定する

ドキュメントにはこの情報が欠けており、参照している投稿はかなり古いものです。これを行う最も速くて簡単な方法は、次のonBootstrap()方法を使用することです。

namespace MyModule;

class Module
{
    public function onBootstrap($e)
    {
        $app = $e->getApplication();
        $app->getRequest()->setBasePath('/foo/bar');
    }
}

構成からベース パスを取得する場合は、そこにサービス マネージャーをロードできます。

namespace MyModule;

class Module
{
    public function onBootstrap($e)
    {
        $app = $e->getApplication();
        $sm  = $app->getServiceManager();

        $config = $sm->get('config');
        $path   = $config->base_path;

        $app->getRequest()->setBasePath($path);
    }
}
于 2012-12-20T19:59:34.283 に答える