ZF Rewrite路由后$this->url的问题_PHP教程
Zend_Controller_Router_Rewrite是标准的框架路由器。路由是个过程,在这个过程中它取出URI的端点(跟着基本URL的URI的那部分)并把它分解成参数来决定哪个模块、哪个控制器和控制器中的哪个动作应该接受请求。模块、控制器、动作和其它参数被打包到Zend_Controller_Request_Http对象,接着这个对象由Zend_Controller_Dispatcher_Standard来处理。路由只发生一次:当请求最初被接收和第一个控制器被派遣之前。
Zend_Controller_Router_Rewrite被设计来考虑使用纯php结构时mod_rewrite-like的功能性。它非常宽松地基于Ruby on Rails并且不要求任何先前的web服务器URL rewriting的知识。它被设计来和单个Apache的 mod_rewrite规则(其中之一)一起工作:
RewriteEngine on RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
或者:
RewriteEngine on RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1
使用路由器
为正确使用rewrite路由器你必须初始化它,添加一些用户定义的路由并注入到控制器。下面的代码示例这个过程:
<?php /* Create a router */ $router = $ctrl->getRouter(); // returns a rewrite router by default $router->addRoute( 'user', new Zend_Controller_Router_Route('user/:username', array('controller' => 'user', 'action' => 'info')) );
RewriteRouter的核心是用户定义路由的定义。路由通过调用RewriteRouter的addRoute方法和传递一个由类实现的Zend_Controller_Router_Route_Interface的新的实例被添加。例如:
<?php $router->addRoute('user', new Zend_Controller_Router_Route('user/:username'));
Rewrite 路由器带有四个基本类型的路由(其中一个是特殊的):
- Zend_Controller_Router_Route
- Zend_Controller_Router_Route_Static
- Zend_Controller_Router_Route_Regex
- 缺省路由
路由可以被使用无数次来创建链或用户定义的应用程序路由计划。你可以在任何配置中使用任何数量的路由,除了模块路由以外,它最好被用一次并作为通用路由(例如,作为缺省的)。每个路由将在稍后详细描述。
addRoute的第一个参数是路由名。它用来作为权柄从路由器中取得路由(例如,for URL generation purposes)。第二个参数是路由自己。路由名最普通的用法是通过Zend_View_url助手的方法:
<a href="<?= $this->url(array('username' => 'martel'), 'user') ?>">Martel</a>
路由是一个简单的过程,这个过程通过所有提供的路由和匹配它的当前请求的URI定义来迭代。当一个正匹配被发现,变量值从路由实例返回并注入到Zend_Controller_Request对象以备将来在派遣器和用户创建的控制器中使用。如果是负匹配,在链中的下个路由被检查。从路由返回的值来自于URL参数或用于定义的缺省值。这些变量以后可通过Zend_Controller_Request::getParam() 或 Zend_Controller_Action::_getParam() 方法来访问。
有三个特殊的变量可用于你的路由-'module'、 'controller' 和 'action'。这些特殊的变量被Zend_Controller_Dispatcher用来找出控制器和动作然后派遣过去。
Zend_Controller_Router_Rewrite 和缺省路由一起预先配置,它将以controller/action的形式匹配URIs。另外,模块名可以被指定作为第一个路径参数,允许这种module/controller/action形式的URIs。最后,它也将缺省地匹配任何另外的追加到URI的参数-controller/action/var1/value1/var2/value2。
一些路由如何匹配的例子:
// Assuming the following: $ctrl->setControllerDirectory( array( 'default' => '/path/to/default/controllers', 'news' => '/path/to/news/controllers', 'blog' => '/path/to/blog/controllers' ) ); Module only: http://example/news module == news Invalid module maps to controller name: http://example/foo controller == foo Module + controller: http://example/blog/archive module == blog controller == archive Module + controller + action: http://example/blog/archive/list module == blog controller == archive action == list Module + controller + action + params: http://example/blog/archive/list/sort/alpha/date/desc module == blog controller == archive action == list sort == alpha date == desc
缺省路由是存储在RewriteRouter名(index)为'default'的简单的Zend_Controller_Router_Route_Module对象。它被创建多多少少象下面这样:
<?php $compat = new Zend_Controller_Router_Route_Module(array(), $dispatcher, $request); $this->addRoute('default', $compat);
如果你不想这个特别的缺省路由在你的路由计划中,你可以重写你自己的'缺省'路由(例如,把它存储在'default'名下)或用removeDefaultRoutes()完全清除它:
<?php // Remove any default routes $router->removeDefaultRoutes();
Zend_Controller_Router_Route
Zend_Controller_Router_Route 是标准的框架路由。它结合了灵活路由定义的易用性。每个路由包含了基本的URL映射(静态的和动态的部分(变量))并且可以被缺省地初始化,也可以根据不同的要求初始化。
让我们想象一下我们假设的应用程序将需要一些广域内容作者的信息页面。我们想能够把浏览器指向http://domain.com/author/martel去看一个叫"martel"的信息。有这样功能的路由看起来是这样的:
<?php $route = new Zend_Controller_Router_Route( 'author/:username', array( 'controller' => 'profile', 'action' => 'userinfo' ) ); $router->addRoute('user', $route);
在Zend_Controller_Router_Route里构造函数的第一个参数是路由的定义,它将匹配一个URL。路由定义包含静态的和动态部分,它们由正斜杠('/')符分开。静态部分只是简单的字符:author。动态部分,被叫做变量,用预设的冒号来标记变量名::username。
当你把浏览器指向http://domain.com/author/martel这个例子的路由应该被匹配,它所有的变量将被注入到Zend_Controller_Request对象并在ProfileController可访问。由这个例子返回的变量可能会被表示为如下键和值配对的数组:
<?php $values = array( 'username' => 'martel', 'controller' => 'profile', 'action' => 'userinfo' );
稍后,基于这些值,Zend_Controller_Dispatcher_Standard应该调用ProfileController类(在缺省模块中)中的userinfoAction()方法。你将依靠Zend_Controller_Action::_getParam()或者Zend_Controller_Request::getParam()方法能够访问所有的变量:
<?php public function userinfoAction() { $request = $this->getRequest(); $username = $request->getParam('username'); $username = $this->_getParam('username'); }
路由定义可以包一个额外的特别字符-通配符-表示为'*'号。它被用来取得参数,和缺省模块路由类似(在URI中定义的var=>value)。下面的路由多多少少地模仿了模块路由的行为:
<?php $route = new Zend_Controller_Router_Route( ':module/:controller/:action/*', array('module' => 'default') ); $router->addRoute('default', $route);
变量请求
当变量请求被设定,第三个参数可以加给Zend_Controller_Router_Route的构造函数。这些被定义为正则表达式的一部分:
<?php $route = new Zend_Controller_Router_Route( 'archive/:year', array( 'year' => 2006, 'controller' => 'archive', 'action' => 'show' ), array('year' => '\d+') ); $router->addRoute('archive', $route);
用上述定义的路由,路由器仅当year变量包含数字数据将匹配它,例如http://domain.com/archive/2345。象http://example.com/archive/test这样的URL将不被匹配并且控制将被传递给在链中的下一个路由。
一个简单的应用例子
<ul id="nav"> <li><a href="<?php echo $this->url(array('controller'=>'index'),null,true);?>" title="Home">首页</a></li> <li><a href="<?php echo $this->url(array('controller'=>'news','action'=>'index'),null,true);?>" title="news">新闻</a></li> </ul>

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在PHP中使用ZendFramework:快速入门指南ZendFramework是一个开源的、基于PHP的Web应用程序框架,它是一个功能强大且易于扩展的框架。ZendFramework包含了许多好用的组件,这些组件可以帮助你构建高效的Web应用程序。本文将介绍如何在PHP中使用ZendFramework,帮助你快速入门。安装ZendFramewo

通过ZendFramework中间件实现高效的数据库查询引言在开发过程中,数据库查询是不可避免的一部分。一个高效的数据库查询可以大大提高系统的性能和用户体验。ZendFramework是一个使用广泛的PHP框架,拥有强大的数据库操作功能。本文将介绍如何通过ZendFramework中间件来实现高效的数据库查询,并提供相应的代码示例。一、了解ZendF

ZendFramework是一个功能强大的开发框架,可以帮助开发人员快速构建高性能、可扩展的PHP应用程序。其中,中间件是ZendFramework中的一个重要概念,它可以帮助我们实现全文搜索和分页功能。本文将介绍如何在ZendFramework中使用中间件来实现这两个功能,并提供代码示例。一、全文搜索功能全文搜索是现代应用程序中常见的功能之一。

ZendFramework中间件:为应用程序添加OAuth和OpenID登录支持在当今的互联网应用程序中,用户认证是一个关键的功能。为了提供更好的用户体验和安全性,许多应用程序选择集成第三方登录服务,如OAuth和OpenID。在ZendFramework中,我们可以通过中间件来轻松地为应用程序添加OAuth和OpenID登录支持。首先,我们需要安装Ze

ZendFramework中间件:提供邮件通知和消息推送的功能引言:随着互联网的发展和智能手机的普及,邮件通知和消息推送已经成为了现代软件开发中常用的功能之一。在ZendFramework中,我们可以使用中间件来实现邮件通知和消息推送的功能。本文将介绍如何利用ZendFramework中间件来实现邮件通知和消息推送,并提供相应的代码示例。一、准备工作在

ZendFramework是一个基于PHP的开源框架,提供了许多功能强大的工具和组件,用于构建可扩展的Web应用程序。本文将介绍如何使用ZendFramework的中间件来为Web应用程序添加社交登录功能。中间件是一种在请求进入应用程序之前或之后执行的代码。它允许开发人员在处理请求的过程中进行定制和扩展。ZendFramework提供了一种灵活的方式来

当你决定开发ERP系统时,选择一个适合的框架是至关重要的。这里我们将比较CodeIgniter和ZendFramework这两个PHP框架,帮助你找到更适合你的ERP系统开发的框架。CodeIgniter和ZendFramework是颇受欢迎的PHP框架。它们都提供了许多功能,并具有扩展性和可维护性。然而,这两个框架在某些方面存在明显不同,更适合于某些应

ZendFramework中间件:为应用程序添加支付宝和微信支付功能引言:随着移动支付的普及,支付宝和微信支付已经成为了许多应用程序中必不可少的支付方式。本文将介绍如何使用ZendFramework中间件来为应用程序添加支付宝和微信支付功能。通过本文的学习,您将了解到如何使用中间件来简化支付流程,并且可以运用到您的实际项目当中。一、准备工作在开始之前,您
