ホームページ  >  記事  >  バックエンド開発  >  Zend Framework アクション アシスタントの使用状況分析

Zend Framework アクション アシスタントの使用状況分析

不言
不言オリジナル
2018-06-15 11:11:061401ブラウズ

この記事では、主に Zend Framework アクション アシスタント (Zend_Controller_Action_Helper) の使用法を紹介し、アクション アシスタント Zend_Controller_Action_Helper の機能、定義、使用法、および関連する実装コードを詳細に分析します。必要な方は、次の

を参照してください。

この記事の例 Zend Framework アクション ヘルパー (Zend_Controller_Action_Helper) の使用法を学習しました。参考のために皆さんと共有してください。詳細は次のとおりです。

アシスタント モードを通じて、頻繁に使用されるいくつかの機能モジュールをカプセル化できるため、主にアクション内で必要に応じて柔軟に使用できます。

Zend Framework には、アクション アシスタント (Zend_Controller_Action_Helper) とビュー アシスタント (Zend_View_Helper) の 2 種類のヘルパーがあります。

アクション アシスタントは、Zend_Controller_Action の派生アクション コントローラーに関数 (ランタイム機能やオンデマンド機能) を即座に追加できるため、パブリック アクション コントローラー関数を追加するときに、派生アクション コントロールの Device クラスを最小化できます。必要です。

アクション ヘルパーは、呼び出す必要があるときにロードされ、要求されたとき (ブートストラップ)、またはアクション コントローラーの作成されたとき (init()) にインスタンス化できます。

関連ファイル

/library/Zend/Controller/Action/

│ Exception.php
│ HelperBroker.php
│ インターフェイス .php

§─Helper
│ │ Abstract.php
│ │ ActionStack.php
│ │ AjaxContext.php
│ │ AutoCompleteDojo.php
│ │ AutoCompleteScriptaculous .php
│ │ Cache.php
│ │ ContextSwitch.php
│ │ FlashMessenger.php
│ │ Json.php
│ │ Redirector.php
│ │ Url.php
│ │ ViewRenderer.php
│ │
│ └ ─ オートコンプリート
│ Abstract.php

─ Heelperbroker
PriorityStack.php


##一般的なアクション アシスタントは次のとおりです。
:

FlashMessenger は、Flash Messenger セッションの処理に使用されます。
Json は、JSON 応答のデコードと送信に使用されます。
Url は URL の作成に使用されます。
Redirector プログラムが内部ページまたは外部ページにリダイレクトするのに役立つ別の実装メソッドを提供します。##ViewRenderer は、コントローラー内でビュー オブジェクトを確立し、ビューをレンダリングするプロセスを自動的に完了します。 ##AutoComplete は、AJAX の自動完了に自動的に応答します。
ContextSwitch と AjaxContext は、アクションの代替応答形式を提供します。

Cache は、アクション スタックの操作に使用されます。

いくつかの実践的なインスタンス化メソッド

1. Zend_Controller_Action

の $_helper メンバーの getHelper() メソッドを使用します。 getHelper() を直接呼び出して、ヘルパーの名前を渡すだけです。

$redirector = $this->_helper->getHelper('Redirector');
//$redirector->getName();
$redirector->gotoSimple('index2');

2. _helper アシスタントの属性に対応するヘルパー オブジェクト

に直接アクセスします。

$redirector = $this->_helper->Redirector;

Zend_Controller_Action_HelperBroker

中国語の名前は「アシスタント ブローカー」と翻訳され、その名前が示すように、アクション アシスタントの仲介者です。 。

アクションをインスタンス化する 2 番目の方法は、Zend_Controller_Action_HelperBroker のマジック メソッド __get() を使用する方法です。

アシスタント ブローカーは、アシスタント オブジェクトとアシスタント パスを登録し、アシスタントやその他の機能を取得するために使用されます。

Zend_Controller_Action_HelperBroker の実装と共通メソッドのリスト

<?php
/**
 * @see Zend_Controller_Action_HelperBroker_PriorityStack
 */
require_once &#39;Zend/Controller/Action/HelperBroker/PriorityStack.php&#39;;
/**
 * @see Zend_Loader
 */
require_once &#39;Zend/Loader.php&#39;;
/**
 * @category  Zend
 * @package  Zend_Controller
 * @subpackage Zend_Controller_Action
 * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 * @license  http://framework.zend.com/license/new-bsd   New BSD License
 */
class Zend_Controller_Action_HelperBroker
{
  /**
   * $_actionController - ActionController reference
   *
   * @var Zend_Controller_Action
   */
  protected $_actionController;
  /**
   * @var Zend_Loader_PluginLoader_Interface
   */
  protected static $_pluginLoader;
  /**
   * $_helpers - Helper array
   *
   * @var Zend_Controller_Action_HelperBroker_PriorityStack
   */
  protected static $_stack = null;
  /**
   * Set PluginLoader for use with broker
   *
   * @param Zend_Loader_PluginLoader_Interface $loader
   * @return void
   */
  public static function setPluginLoader($loader)
  {
    if ((null !== $loader) && (!$loader instanceof Zend_Loader_PluginLoader_Interface)) {
      require_once &#39;Zend/Controller/Action/Exception.php&#39;;
      throw new Zend_Controller_Action_Exception(&#39;Invalid plugin loader provided to HelperBroker&#39;);
    }
    self::$_pluginLoader = $loader;
  }
  /**
   * Retrieve PluginLoader
   *
   * @return Zend_Loader_PluginLoader
   */
  public static function getPluginLoader()
  {
    if (null === self::$_pluginLoader) {
      require_once &#39;Zend/Loader/PluginLoader.php&#39;;
      self::$_pluginLoader = new Zend_Loader_PluginLoader(array(
        &#39;Zend_Controller_Action_Helper&#39; => &#39;Zend/Controller/Action/Helper/&#39;,
      ));
    }
    return self::$_pluginLoader;
  }
  /**
   * addPrefix() - Add repository of helpers by prefix
   *
   * @param string $prefix
   */
  static public function addPrefix($prefix)
  {
    $prefix = rtrim($prefix, &#39;_&#39;);
    $path  = str_replace(&#39;_&#39;, DIRECTORY_SEPARATOR, $prefix);
    self::getPluginLoader()->addPrefixPath($prefix, $path);
  }
  /**
   * addPath() - Add path to repositories where Action_Helpers could be found.
   *
   * @param string $path
   * @param string $prefix Optional; defaults to &#39;Zend_Controller_Action_Helper&#39;
   * @return void
   */
  static public function addPath($path, $prefix = &#39;Zend_Controller_Action_Helper&#39;)
  {
    self::getPluginLoader()->addPrefixPath($prefix, $path);
  }
  /**
   * addHelper() - Add helper objects
   *
   * @param Zend_Controller_Action_Helper_Abstract $helper
   * @return void
   */
  static public function addHelper(Zend_Controller_Action_Helper_Abstract $helper)
  {
    self::getStack()->push($helper);
    return;
  }
  /**
   * resetHelpers()
   *
   * @return void
   */
  static public function resetHelpers()
  {
    self::$_stack = null;
    return;
  }
  /**
   * Retrieve or initialize a helper statically
   *
   * Retrieves a helper object statically, loading on-demand if the helper
   * does not already exist in the stack. Always returns a helper, unless
   * the helper class cannot be found.
   *
   * @param string $name
   * @return Zend_Controller_Action_Helper_Abstract
   */
  public static function getStaticHelper($name)
  {
    $name = self::_normalizeHelperName($name);
    $stack = self::getStack();
    if (!isset($stack->{$name})) {
      self::_loadHelper($name);
    }
    return $stack->{$name};
  }
  /**
   * getExistingHelper() - get helper by name
   *
   * Static method to retrieve helper object. Only retrieves helpers already
   * initialized with the broker (either via addHelper() or on-demand loading
   * via getHelper()).
   *
   * Throws an exception if the referenced helper does not exist in the
   * stack; use {@link hasHelper()} to check if the helper is registered
   * prior to retrieving it.
   *
   * @param string $name
   * @return Zend_Controller_Action_Helper_Abstract
   * @throws Zend_Controller_Action_Exception
   */
  public static function getExistingHelper($name)
  {
    $name = self::_normalizeHelperName($name);
    $stack = self::getStack();
    if (!isset($stack->{$name})) {
      require_once &#39;Zend/Controller/Action/Exception.php&#39;;
      throw new Zend_Controller_Action_Exception(&#39;Action helper "&#39; . $name . &#39;" has not been registered with the helper broker&#39;);
    }
    return $stack->{$name};
  }
  /**
   * Return all registered helpers as helper => object pairs
   *
   * @return array
   */
  public static function getExistingHelpers()
  {
    return self::getStack()->getHelpersByName();
  }
  /**
   * Is a particular helper loaded in the broker?
   *
   * @param string $name
   * @return boolean
   */
  public static function hasHelper($name)
  {
    $name = self::_normalizeHelperName($name);
    return isset(self::getStack()->{$name});
  }
  /**
   * Remove a particular helper from the broker
   *
   * @param string $name
   * @return boolean
   */
  public static function removeHelper($name)
  {
    $name = self::_normalizeHelperName($name);
    $stack = self::getStack();
    if (isset($stack->{$name})) {
      unset($stack->{$name});
    }
    return false;
  }
  /**
   * Lazy load the priority stack and return it
   *
   * @return Zend_Controller_Action_HelperBroker_PriorityStack
   */
  public static function getStack()
  {
    if (self::$_stack == null) {
      self::$_stack = new Zend_Controller_Action_HelperBroker_PriorityStack();
    }
    return self::$_stack;
  }
  /**
   * Constructor
   *
   * @param Zend_Controller_Action $actionController
   * @return void
   */
  public function __construct(Zend_Controller_Action $actionController)
  {
    $this->_actionController = $actionController;
    foreach (self::getStack() as $helper) {
      $helper->setActionController($actionController);
      $helper->init();
    }
  }
  /**
   * notifyPreDispatch() - called by action controller dispatch method
   *
   * @return void
   */
  public function notifyPreDispatch()
  {
    foreach (self::getStack() as $helper) {
      $helper->preDispatch();
    }
  }
  /**
   * notifyPostDispatch() - called by action controller dispatch method
   *
   * @return void
   */
  public function notifyPostDispatch()
  {
    foreach (self::getStack() as $helper) {
      $helper->postDispatch();
    }
  }
  /**
   * getHelper() - get helper by name
   *
   * @param string $name
   * @return Zend_Controller_Action_Helper_Abstract
   */
  public function getHelper($name)
  {
    $name = self::_normalizeHelperName($name);
    $stack = self::getStack();
    if (!isset($stack->{$name})) {
      self::_loadHelper($name);
    }
    $helper = $stack->{$name};
    $initialize = false;
    if (null === ($actionController = $helper->getActionController())) {
      $initialize = true;
    } elseif ($actionController !== $this->_actionController) {
      $initialize = true;
    }
    if ($initialize) {
      $helper->setActionController($this->_actionController)
          ->init();
    }
    return $helper;
  }
  /**
   * Method overloading
   *
   * @param string $method
   * @param array $args
   * @return mixed
   * @throws Zend_Controller_Action_Exception if helper does not have a direct() method
   */
  public function __call($method, $args)
  {
    $helper = $this->getHelper($method);
    if (!method_exists($helper, &#39;direct&#39;)) {
      require_once &#39;Zend/Controller/Action/Exception.php&#39;;
      throw new Zend_Controller_Action_Exception(&#39;Helper "&#39; . $method . &#39;" does not support overloading via direct()&#39;);
    }
    return call_user_func_array(array($helper, &#39;direct&#39;), $args);
  }
  /**
   * Retrieve helper by name as object property
   *
   * @param string $name
   * @return Zend_Controller_Action_Helper_Abstract
   */
  public function __get($name)
  {
    return $this->getHelper($name);
  }
  /**
   * Normalize helper name for lookups
   *
   * @param string $name
   * @return string
   */
  protected static function _normalizeHelperName($name)
  {
    if (strpos($name, &#39;_&#39;) !== false) {
      $name = str_replace(&#39; &#39;, &#39;&#39;, ucwords(str_replace(&#39;_&#39;, &#39; &#39;, $name)));
    }
    return ucfirst($name);
  }
  /**
   * Load a helper
   *
   * @param string $name
   * @return void
   */
  protected static function _loadHelper($name)
  {
    try {
      $class = self::getPluginLoader()->load($name);
    } catch (Zend_Loader_PluginLoader_Exception $e) {
      require_once &#39;Zend/Controller/Action/Exception.php&#39;;
      throw new Zend_Controller_Action_Exception(&#39;Action Helper by name &#39; . $name . &#39; not found&#39;, 0, $e);
    }
    $helper = new $class();
    if (!$helper instanceof Zend_Controller_Action_Helper_Abstract) {
      require_once &#39;Zend/Controller/Action/Exception.php&#39;;
      throw new Zend_Controller_Action_Exception(&#39;Helper name &#39; . $name . &#39; -> class &#39; . $class . &#39; is not of type Zend_Controller_Action_Helper_Abstract&#39;);
    }
    self::getStack()->push($helper);
  }
}

##アシスタント ブローカーの一般的な使用法:

#1. アシスタントを登録します

1.

Zend_Controller_Action_HelperBroker::addHelper($helper);

2. addPrefix() メソッドの Prefix パラメータを使用してクラスを登録します。 、カスタム ヘルパー クラスのパスを追加するために使用されます。

プレフィックスは Zend Framework のクラス命名規則に従う必要があります。

// Add helpers prefixed with My_Action_Helpers in My/Action/Helpers/
Zend_Controller_Action_HelperBroker::addPrefix(&#39;My_Action_Helpers&#39;);

3. addPath() メソッドを使用します。最初のパラメータはディレクトリ、2 番目のパラメータはクラスのプレフィックスです (デフォルトは「Zend_Controller_Action_Helper」)。 。

は、独自のクラス プレフィックスを指定されたディレクトリにマップするために使用されます。

// Add helpers prefixed with Helper in Plugins/Helpers/
Zend_Controller_Action_HelperBroker::addPath(&#39;./Plugins/Helpers&#39;,
                       &#39;Helper&#39;);

2. アシスタントが存在するかどうかを確認する

hasHelper($name) メソッドを使用して、アシスタントが存在するかどうかを確認します。アシスタント ブローカーが存在します アシスタントが存在するかどうか、$name はアシスタントの短縮名 (プレフィックスが削除されたもの):

// Check if &#39;redirector&#39; helper is registered with the broker:
if (Zend_Controller_Action_HelperBroker::hasHelper(&#39;redirector&#39;)) {
  echo &#39;Redirector helper registered&#39;;
}

取得するには 2 つの静的メソッドがありますアシスタント ブローカーからのアシスタント: getExistingHelper() および getStaticHelper()。 getExistingHelper() は、ヘルパーが以前に呼び出されているか、ヘルパー ブローカーに明示的に登録されている場合にのみヘルパーを取得します。そうでない場合は、例外がスローされます。 getStaticHelper() は getExistingHelper() と同じことを行いますが、ヘルパー スタックが登録されていない場合は、設定するヘルパーを取得するために getStaticHelper() を選択することをお勧めします。

両方のメソッドは、アシスタントの短縮名 (プレフィックスを削除したもの) である $name という 1 つのパラメーターを受け取ります。

// Check if &#39;redirector&#39; helper is registered with the broker, and fetch:
if (Zend_Controller_Action_HelperBroker::hasHelper(&#39;redirector&#39;)) {
  $redirector =
    Zend_Controller_Action_HelperBroker::getExistingHelper(&#39;redirector&#39;);
}
// Or, simply retrieve it, not worrying about whether or not it was
// previously registered:
$redirector =
  Zend_Controller_Action_HelperBroker::getStaticHelper(&#39;redirector&#39;);
}

3.removeHelper($name) はアシスタント ブローカー内のアシスタントを削除します。$name はアシスタントの短縮名です。

// Conditionally remove the &#39;redirector&#39; helper from the broker:
if (Zend_Controller_Action_HelperBroker::hasHelper(&#39;redirector&#39;)) {
  Zend_Controller_Action_HelperBroker::removeHelper(&#39;redirector&#39;)
}

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

Zend Framework校验器Zend_Validate的用法解析

Zend Framework中Zend_View组件的用法解析

以上がZend Framework アクション アシスタントの使用状況分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。