7

Zend Framework 1には、URLルートを解析し、簡単にアクセスできるように$_GETスーパーグローバルで見つかったパラメーターを設定する非常に簡単な方法がありました。もちろん、コントローラー内で-> getParam($ something)を使用することもできますが、URLでパラメーターが見つかった場合は、$_GETを介してアクセスすることもできます。

URLの例mypage.com/mymodule/mycontroller/myaction/someparam/5:

ZF1

$this->getParam('someparam'); // 5
$_GET['someparam']; // 5

ZF2

$this->getEvent()->getRouteMatch()->getParam('someparam'); // 5
$_GET['someparam'] // undefined index someparam

明らかに、違いは、ZF2がルートパラメータを$_GETスーパーグローバルに配置しないことです。

コントローラーを拡張し、それを実行するコンストラクターを定義するだけなので、解析されたパラメーターを$ _GETスーパーグローバルに配置するにはどうすればよいですか(RouteMatchはまだオブジェクトではなく、コントローラーのコンストラクターから呼び出すことができないため)?

私のコントローラーのすべてを呼び出す$_GET = $this->getEvent()->getRouteMatch()->getParam('someparam');ことは機能しますが、私はそれを望んでいません。

つまり、上記のURLの例に従って、$ _ GET ['someparam']を実行し、アプリケーションの任意のコンポーネントで値「5」を取得できるようにしたいのです。

編集:私は十分に明確ではなかったように見えるので、もう少し明確にしようとします。/ key/valueフォーメーションを介してURLに入力したパラメータを$_GETですぐに利用できるようにしたい。パラメータの取得に実際には問題はありません。取得方法を知っており、Zendのコントローラを拡張したので、ZF1のように$ this-> getParamsを再度呼び出すことができます。これで、すべてのコントローラがそのパラメータを拡張します。 URLからのパラメータも自動的に$_GETに含まれるため、$_GETをネイティブに使用するサードパーティコンポーネントで簡単にアクセスできます。

編集2:Samuel Herzogの回答に対する反応として更新:ライブラリは$ _GETに直接アクセスする必要があるように構築されているため、この場合はSRPを無効にしてもかまいません-独自のフィルタリングを行い、直接依存していますこのスーパーグローバルで。また、処理のために$_FILESと$_POSTを直接フェッチします。これは、コードが機能する方法です。

抽象コントローラーで次のメソッドを作成しました。$this->mergeGet(); これにより、基本的に$ _GETがすべてのルート一致パラメーターを吸収し、すべてが意図したとおりに機能しますが、すべてのコントローラー/アクションでライブラリが必要になるため、毎回そのメソッドを呼び出すのは面倒になる可能性があります。コントローラだけがZF1のようにinit()メソッドを持っていた場合...

4

3 に答える 3

13

ZF2では、これを使用しています

$getparams = $this->getRequest()->getQuery();
于 2013-01-15T03:03:48.630 に答える
8

まず第一に$_GET、オブジェクト指向スタック上に構築している場合は、または他のスーパーグローバルを直接使用しないでください。SRPはこの方法で無効になります。

(サードパーティ?)ライブラリの方法を変更する可能性がない場合は、MvcEventにフックし、-event--をリッスンしてから、を取得すると、単純なループでRouteMatch埋めることができます。$_GET

最もパフォーマンスの高い答えを得るには、名前付きライブラリがすべてのアクションに必要か、1つのモジュールだけに必要か、または特定のコントローラー/アクションにのみ必要かを知っておく必要があります。最新のものがユースケースである場合は、代わりにコントローラープラグインを作成する必要があります。

最初のアプローチのサンプルコード:

namespace YourModule;
use Zend\EventManager\EventInterface as Event;
use Zend\Mvc\MvcEvent;

class Module
{
    ...

    public function onBootstrap(Event $ev)
    {
        $application = $e->getApplication();
        $eventManager = $application->getEventManager();

        $eventManager->attach('route', function(MvcEvent $mvcEvent) {
            $params = $mvcEvent->getRouteMatch()->getParams();

            foreach ( $params as $name => $value )
            {
                if ( ! isset($_GET[$name]) 
                {
                    $_GET[$name] = $value;
                }
            }
        });
    }
}
于 2012-08-06T17:14:15.450 に答える
1

コントローラーで使用できます。

 $paramValue = $this->params()->fromQuery('your_param_here');

よろしく

于 2016-05-27T01:47:03.213 に答える