ホームページ  >  記事  >  バックエンド開発  >  Zend Frameworkチュートリアルのアクション基本クラスZend_Controller_Action、コントローラ基本クラス_PHPチュートリアルの詳細説明

Zend Frameworkチュートリアルのアクション基本クラスZend_Controller_Action、コントローラ基本クラス_PHPチュートリアルの詳細説明

WBOY
WBOYオリジナル
2016-07-12 08:57:40771ブラウズ

Zend Framework チュートリアルのアクション基本クラス Zend_Controller_Action、コントローラー基本クラスの詳細説明

この記事では、Zend Framework チュートリアルのアクション基本クラス Zend_Controller_Action について例を示して説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

Zend_Controller_Actionの実装

Zend Framework のアクション コントローラーは Zend_Controller_Action を継承する必要があります。 Zend_Controller_Action はアクション コントローラーの基本機能を提供します。 詳細については、次のコードを参照してください。

Zend_Controller_Action_Interface リーリー

Zend_Controller_Action リーリー

Zend_Controller_Action は、アクションとビューのレンダリング機能を提供するだけでなく、リクエストとレスポンスのオブジェクト、共通ヘルパーなどを登録します。

アクションコントローラーの一般的なメソッド

アクション コントローラーで一般的に使用されるメソッドとプロパティは次のとおりです:

$this->_helper は主にアシスタントの関連操作を完了します例:
リーリー

ViewRenderer の noRender フラグを設定することで、独立したビューのレンダリング (レンダリング) を簡単に無効にすることができます。 リーリー

ViewRenderer を無効にする主な理由は、ビュー オブジェクトが必要ない場合、またはビュー スクリプトを通じてビュー オブジェクトを解析しない場合 (たとえば、アクション コントローラーを使用して SOAP、XML-RPC、休む)。ほとんどの場合、ViewRenderer をグローバルに無効にする必要はなく、個々のコントローラーまたはアクションで選択的に無効にするだけです。

リクエストオブジェクトとレスポンスオブジェクトの関連操作

オブジェクトには無数のオブジェクトと変数が登録されており、それぞれにアクセサーメソッドがあります。

Request オブジェクト: getRequest() を使用して、呼び出し元のアクション要求オブジェクトを読み取ることができます。

Response オブジェクト: getResponse() を使用して、最終応答を収集する応答オブジェクトを読み取ることができます。いくつかの典型的な呼び出しは次のようになります:

リーリー

パラメータの呼び出し: フロントエンド コントローラーはルーター、ディスパッチャー、アクション コントローラーにパラメーターを渡すことができます。これらのパラメータを読み取るには、getInvokeArg($key) を使用します。あるいは、getInvokeArgs() を使用してパラメータ リスト全体を読み取ります。

リクエストパラメータ: _GET パラメータや _POST パラメータなどのリクエストオブジェクトのリクエストパラメータ、または URL のパス情報で指定されたユーザーパラメータ。これらのパラメータを読み取るには、_getParam($key) または _getAllParams() を使用します。 _setParam() を使用してリクエスト パラメータを設定することもできます。これは、別のアクションに転送するときに便利です。

_hasParam($key) を使用して、パラメーターが存在するかどうかをテストします (論理分岐に役立ちます)。

注: _getParam() はオプションの 2 番目のパラメーターを取ることができ、空でない場合はデフォルト値が含まれます。これを使用して、値を読み取る前に _hasParam() への呼び出しを排除します:

リーリー

関連する操作を表示

Zend_Controller_Action は、ビュー継承のための予備的な柔軟なメカニズムを提供します。これを実現するには、initView() と render() の 2 つのメソッドがあります。前者は $view パブリック プロパティを緩やかに読み込み、後者は現在要求されているアクションに基づいてビューを解決し、ディレクトリ階層を使用してスクリプト パスを決定します。

ビューの初期化

initView() はビューオブジェクトを初期化します。ビュー オブジェクトを読み取るために、render() は initView() を呼び出しますが、これはいつでも初期化できます。デフォルトでは $view プロパティが Zend_View オブジェクトでアセンブルされますが、Zend_View_Interface を実装する任意のクラスを使用できます。 $view が初期化されている場合は、単にプロパティを返します。

デフォルトの実装では、次の想定されるディレクトリ構造が使用されます:

アプリケーションまたはモジュール/

コントローラー/ IndexController.php
再生回数/
スクリプト/
インデックス/
インデックス.phtml
ヘルパー/
フィルター/

言い換えると、ビュー スクリプトは views/scripts/ サブディレクトリに配置されると想定され、views サブディレクトリには兄弟関数 (ヘルパーとフィルター) も含まれると想定されます。ビュー スクリプトの名前とパスを決定するときは、まず views/scripts/ をベース パスとして使用し、次にビュー スクリプトに対応するコントローラにちなんだ名前のディレクトリを追加します。

レンダリングビュー

render() には次の署名があります:

リーリー

render() はビュー スクリプトを解析します。パラメーターが渡されない場合、要求されたスクリプトは [controller]/[action].phtml (.phtml は $viewSuffix 属性の値) であると想定されます。 $action の値を渡すと、[controller] サブディレクトリ内のテンプレートが解決されます。 [controller] でオーバーライドするには、$noController に true 値を渡します。最後に、テンプレートは応答オブジェクトに解析されます。応答オブジェクトで指定された名前付きセグメントに解析したい場合は、値を $name に渡します。

Note: 因为控制器和动作名字里可能包含分隔符如'_'、 '.' 和 '-',当决定视图名字时,render()把它们规格化成 '-'.在内部,它使用派遣器的字和路径分隔符来做规格化。这样,对/foo.bar/baz-bat的请求将解析脚本foo-bar/baz-bat.phtml。如果动作方法包含camelCasing,记住当决定视图脚本文件名的时候,这将变成由'-'分隔的字。

一些例子:

class MyController extends Zend_Controller_Action
{
  public function fooAction()
  {
    // Renders my/foo.phtml
    $this->render();
    // Renders my/bar.phtml
    $this->render('bar');
    // Renders baz.phtml
    $this->render('baz', null, true);
    // Renders my/login.phtml to the 'form' segment of the
    // response object
    $this->render('login', 'form');
    // Renders site.phtml to the 'page' segment of the response
    // object; does not use the 'my/' subirectory
    $this->render('site', 'page', true);
  }
  public function bazBatAction()
  {
    // Renders my/baz-bat.phtml
    $this->render();
  }
}

其它

_forward($action, $controller = null, $module = null, array $params = null) :执行另外一个动作。如果在preDispatch()里调用,当前请求的动作将被跳过来支持新的动作。否则,在当前动作被处理之后,在_forward()请求的动作将被执行。

_redirect($url, array $options = array()):重定向到另外一个地方。这个方法用URL和一组可选的选项。缺省地,它执行HTTP 302 重定向。

选项可包括一个或多个下面这些:

exit:是否立即退出。如果被请求,它将干净地关闭任何打开的会话和执行重定向。

可以用setRedirectExit()访问器在控制器里全局地设置这个选项。

prependBase:是否预先考虑基础URL和URL提供的请求对象一起注册。

使用setRedirectPrependBase()访问器,在控制器里全局地设置这个选项。

code:在重定向时要用什么HTTP代码。缺省使用302;可以用从301到306之间的任何代码。

使用setRedirectCode()访问器,在控制器里全局地设置这个选项。

扩展自定义Zend_Controller_Action

为了创建动作控制器,设计上,Zend_Controller_Action 必须被继承。至少,需要定义控制器可能调用的动作方法。

除了为web应用程序创建有用的函数外,你可能发现在不同的控制器里重复同样的设置和实用方法;如果这样,创建一个继承(extends)Zend_Controller_Action 的基础类可能会解决问题。

Example #1 如何处理不存在的动作

如果控制器的请求包括一个未定义的动作方法,Zend_Controller_Action::__call()将被调用。__call()当然是PHP中用来重载方法的魔术方法。

缺省地,这个方法抛出一个Zend_Controller_Action_Exception 来表明在控制器里没有发现要求的方法。如果要求的方法以'Action'结尾,就假设一个动作被请求并且不存在;这样的错误导致带有代码为 404 的异常。所有其它方法导致带有代码为 500 的异常。这使你很容易地在错误句柄里区分是页面没有发现还是程序错误。

如果想执行其它操作,你应该重写这个函数。例如,如果你想显示错误信息,可以象下面这样来写:

class MyController extends Zend_Controller_Action
{
  public function __call($method, $args)
  {
    if ('Action' == substr($method, -6)) {
      // If the action method was not found, render the error
      // template
      return $this->render('error');
    }
    // all other methods throw an exception
    throw new Exception('Invalid method "'
              . $method
              . '" called',
              500);
  }
}

另外的可能性就是你可能想转发到缺省控制页面:

class MyController extends Zend_Controller_Action
{
  public function indexAction()
  {
    $this->render();
  }
  public function __call($method, $args)
  {
    if ('Action' == substr($method, -6)) {
      // If the action method was not found, forward to the
      // index action
      return $this->_forward('index');
    }
    // all other methods throw an exception
    throw new Exception('Invalid method "'
              . $method
              . '" called',
              500);
  }
}

为了定制控制器,除了重写__call()以外,本章前面说涉及的初始化、实用程序、访问器、视图和派遣钩子等方法都可以被重写。作为例子,如果把视图对象保存到注册表里,你可能想用象下面的代码来修改initView():

abstract class My_Base_Controller extends Zend_Controller_Action
{
  public function initView()
  {
    if (null === $this->view) {
      if (Zend_Registry::isRegistered('view')) {
        $this->view = Zend_Registry::get('view');
      } else {
        $this->view = new Zend_View();
        $this->view->setBasePath(dirname(__FILE__) . '/../views');
      }
    }
    return $this->view;
  }
}

更多关于zend相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

您可能感兴趣的文章:

  • Zend Framework教程之Autoloading用法详解
  • Zend Framework教程之Resource Autoloading用法实例
  • Zend Framework教程之MVC框架的Controller用法分析
  • Zend Framework教程之路由功能Zend_Controller_Router详解
  • Zend Framework教程之Zend_Controller_Plugin插件用法详解
  • Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
  • Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
  • Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
  • Zend Framework教程之前端控制器Zend_Controller_Front用法详解
  • Zend Framework教程之视图组件Zend_View用法详解
  • Zend Framework教程之Loader以及PluginLoader用法详解

www.bkjia.com本当http://www.bkjia.com/PHPjc/1106893.html技術記事 Zend Framework チュートリアルのアクション基本クラス Zend_Controller_Action、コントローラー基本クラスの詳細説明 この記事では、Zend Framework チュートリアルのアクション基本クラス Zend_Controller_Action について例を示して説明します。みんなとシェアしましょう...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。