この記事ではZend Frameworkのチュートリアルルートの使い方をZend_Controller_Router関数で解説しています。参考のために皆さんと共有してください。詳細は次のとおりです:
Zend Framework のルーティングは、ルーティングとルートの作成という 2 つの主な機能を提供します。
Zend_Controller_Router の Route クラスと、対応する Route ディレクトリ内のクラスは、共通のルーティング操作を定義します。
インターフェース Zend_Controller_Router_Interface、クラス Zend_Controller_Router_Abstract および Zend_Controller_Router_Rewrite は、ルートの作成とルートの削除という基本的なルーティングの機能を完了します。
└──ルーター
§── Abstract.php
§── Exception.php
§── Interface.php
§── Rewrite.php
§── ルート
│ §── Abstract.php
│ §── Chain.php
│ §── ホスト名.php
│ §── Interface.php
│ §── Module.php
│ §── Regex.php
│ └── Static.php
━━ Route.php
Zend_Controller_Routerルーティング関数の実装
Zend_Controller_Router_Interface
リーリーZend_Controller_Router_Abstract
リーリーZend_Controller_Router_Rewrite
リーリールーティングを追加する方法
パブリック関数 addRoute($name, Zend_Controller_Router_Route_Interface $route)
パブリック関数 addRoutes($routes)
addRoute の最初のパラメータはルート名です。 2 番目のパラメータはルート自体です。ルート名の最も一般的な使用法は、Zend_View_Url アシスタントを使用することです:
リーリーこれは、href: user/martel になります。
ルーティングは、提供されたすべてのルートと、それに一致する現在のリクエストの URI 定義を反復する単純なプロセスです。肯定的な一致が見つかると、変数値がルート インスタンスから返され、ディスパッチャーやユーザー作成のコントローラーで将来使用できるように Zend_Controller_Request オブジェクトに挿入されます。否定的な一致がある場合は、チェーン内の次のルートがチェックされます。
注: 逆の順序で一致させてください
最も一般的なルートが最初に定義されるように、逆の順序でルートを照合します。
注: 戻り値
ルートから返される値は、URL パラメーターまたはその定義に使用されるデフォルト値から取得されます。これらの変数には、後で Zend_Controller_Request::getParam() メソッドまたは Zend_Controller_Action::_getParam() メソッドを通じてアクセスできます。
ルートに使用できる特別な変数は 3 つあります - 「モジュール」、「コントローラー」、「アクション」です。これらの特別な変数は、コントローラとアクションを検索してディスパッチするために Zend_Controller_Dispatcher によって使用されます。
注: 特殊変数
setControllerKey および setActionKey メソッドを通じてデフォルト値を変更することを選択した場合、これらの特殊変数の名前は異なる場合があります。
デフォルトルート
Zend_Controller_Router_Rewrite はデフォルトのルートで事前設定されており、コントローラー/アクションの形式で URI と一致します。さらに、モジュール名を最初のパス パラメーターとして指定し、モジュール/コントローラー/アクションの形式の URI を許可できます。最後に、URI に追加された追加パラメータ (controller/action/var1/value1/var2/value2) もデフォルトで一致します。
ルートがどのように照合されるかの例:
リーリーデフォルト ルートは、RewriteRouter 名 (インデックス) に「default」として保存される単純な Zend_Controller_Router_Route_Module オブジェクトです。多かれ少なかれ次のように作成されます:
リーリーこの特定のデフォルト ルートをルーティング プランに含めたくない場合は、独自の「デフォルト」ルートをオーバーライドする (たとえば、「デフォルト」という名前で保存する) か、removeDefaultRoutes() を使用して完全にクリアできます。 リーリー
ルーティングの柔軟性を高め、新しいルーティング タイプのカスタマイズを容易にするために、Zend_Controller_Router は Zend_Controller_Router_Route_Interface インターフェイスとクラス Zend_Controller_Router_Route_Abstract を定義します。対応するクラス メソッドを実装すると、開発に便利なルーティング タイプを定義できます。
Zend_Controller_Router ルーティング タイプ
Zend_Controller_Router はデフォルトで次のルーティング タイプを提供します。 Zend_Controller_Router_Route
Zend_Controller_Router_Route_Static
Zend_Controller_Router_Route_Regex Zend_Controller_Router_Route是标准的框架路由。它结合了灵活路由定义的易用性。每个路由包含了基本的URL映射(静态的和动态的部分(变量))并且可以被缺省地初始化,也可以根据不同的要求初始化。 让我们想象一下我们假设的应用程序将需要一些广域内容作者的信息页面。我们想能够把浏览器指向http://domain.com/author/martel去看一个叫"martel"的信息。有这样功能的路由看起来是这样的: 在Zend_Controller_Router_Route里构造函数的第一个参数是路由的定义,它将匹配一个URL。路由定义包含静态的和动态部分,它们由正斜杠('/')符分开。静态部分只是简单的字符:author。动态部分,被叫做变量,用预设的冒号来标记变量名::username。 Note: 字符的的用法 当前的实现允许你使用任何字符(正斜杠除外)作为变量标识符,但强烈建议只使用PHP使用的变量标识符。将来的实现也许会改变这个行为,它可能会导致在你的代码里有隐藏的bugs。 当你把浏览器指向http://domain.com/author/martel这个例子的路由应该被匹配,它所有的变量将被注入到Zend_Controller_Request对象并在ProfileController可访问。由这个例子返回的变量可能会被表示为如下键和值配对的数组: 稍后,基于这些值,Zend_Controller_Dispatcher_Standard应该调用ProfileController类(在缺省模块中)中的userinfoAction()方法。你将依靠Zend_Controller_Action::_getParam()或者Zend_Controller_Request::getParam()方法能够访问所有的变量: 路由定义可以包一个额外的特别字符-通配符-表示为'*'号。它被用来取得参数,和缺省模块路由类似(在URI中定义的var=>value)。下面的路由多多少少地模仿了模块路由的行为: 变量缺省 在路由中每个变量可以有一个缺省值,这就是Zend_Controller_Router_Route中构造函数使用的第二个变量。这个参数是一个数组,在数组中键表示变量名,值就是期望的缺省值: 上述路由将匹配象http://domain.com/archive/2005和http://example.com/archive的URLs。对于后者变量year将有一个初始的缺省值为2006。 这个例子将导致注入一个year变量给请求对象。应为没有路由信息出现(没有控制器和动作参数被定义),应用程序将被派遣给缺省的控制器和动作方法(它们都在Zend_Controller_Dispatcher_Abstract被定义)。为使它更可用,你必须提供一个有效的控制器和动作作为路由的缺省值: 这个路由将导致派遣给ArchiveController类的showAction()方法。 变量请求 当变量请求被设定,第三个参数可以加给Zend_Controller_Router_Route的构造函数。这些被定义为正则表达式的一部分: 用上述定义的路由,路由器仅当year变量包含数字数据将匹配它,例如http://domain.com/archive/2345。象http://example.com/archive/test这样的URL将不被匹配并且控制将被传递给在链中的下一个路由。 主机名路由 你也可以使用主机名做路由匹配。对简单的匹配使用静态主机名选项: 如果你想匹配参数在主机名里,使用 regex 选项。在下面例子中,子域为动作控制器被用作用户名参数。 当组装路由时,你可以给出用户名为参数,就像你用其它路径参数一样: Zend_Controller_Router_Route_Static 设置固定不变的路由: 上面的路由将匹配http://domain.com/login的URL,并分派到 AuthController::loginAction(). Zend_Controller_Router_Route_Regex 除了缺省的和静态的路由类型外,正则表达式路由类型也可用。这个路由比其它路由更强更灵活,只是稍微有点复杂。同时,它应该比标准路由快。 象标准路由一样,这个路由必须用路由定义和一些缺省条件来初始化。让我们创建一个archive路由作为例子,和先前定义的类似,这次只是用了Regex: 每个定义的regex子模式将被注入到请求对象里。同上述的例子,再成功匹配http://domain.com/archive/2006之后,结果值的数组看起来象这样: Note: 在匹配之前,开头和结尾的斜杠从路由器里的URL中去除掉了。结果,匹配http://domain.com/foo/bar/,需要foo/bar这样的regex,而不是/foo/bar。 Note: 行开头和行结尾符号(分别为'^' 和 '$')被自动预先追加到所有表达式。这样,你不需要在你的正则表达式里用它们,你应该匹配整个字符串。 Note: 这个路由类使用#符作为分隔符。这意味着你将需要避免哈希符('#')但不是正斜杠('/')在你的路由定义里。因为'#'符(名称为锚)很少被传给webserver,你将几乎不需要在你的regex里使用它。 你可以用通常的办法获得已定义的子模式的内容: Note: 注意这个键是整数(1) 而不是字符串('1')。 因为'year'的缺省没有设置,这个路由将和它的标准路由副本不是非常精确地相同。即使我们为'year'声明一个缺省并使子模式可选,也不清楚是否会在拖尾斜杠(trailing slash)上还将有问题。方案是使整个'year'部分和斜杠一起可选但只抓取数字部分:(这段比较绕口,请校对者仔细看看,谢谢 Jason Qi) 让我们看看你可能注意到的问题。 给参数使用基于整数的键不是容易管理的办法,今后可能会有问题。这就是为什么有第三个参数。这是个联合数组表示一个regex子模式到参数名键的映射。我们来看看一个简单的例子: 这将导致下面的值被注入到请求: 这个映射被任何目录来定义使它能工作于任何环境。键可以包含变量名或子模式索引: Note: 子模式键必须用整数表示。 注意在请求值中的数字索引不见了,代替的是一个名字变量。当然如果你愿意可以把数字和名字变量混合使用: 这将导致在请求中有混合的值可用。例如:URLhttp://domain.com/archive/2006/page/10将在下列结果中: 因为regex模型不容易颠倒,如果你想用URL助手或这个类中的 assemble方法,你需要准备一个颠倒的URL。这个颠倒的路径用可由sprintf()解析的字符串来表示并定义为第四个构造参数: 所有这些都已经可能由标准路由对象完成,那么使用Regex路由的好处在哪里?首先,它允许你不受限制地描述任何类型的URL。想象一下你有一个博客并希望创建象http://domain.com/blog/archive/01-Using_the_Regex_Router.html这样的URLs,还有把解析它路径元素中的最后部分,01-Using_the_Regex_Router.html,到一个文章的ID和文章的标题/描述;这不可能由标准路由完成。用Regex路由,你可以做象下面的方案: 正如你所看到的,这个在标准路由上添加了巨大的灵活性。 通过配置文件定义路由规则 例如 上述的INI文件可以被读进Zend_Config对象: 在上面的例子中,我们告诉路由器去使用INI文件'routes'一节给它的路由。每个在这个节下的顶级键将用来定义路由名;上述例子定义了路由'archive'和'news'。每个路由接着要求,至少,一个'route'条目和一个或更多'defaults'条目;可选地,一个或更多'reqs'('required'的简写)可能要求提供。总之,这些相对应的三个参数提供给Zend_Controller_Router_Route_Interface对象。一个选项键,'type',可用来指定路由类的类型给特殊的路由;缺省地,它使用Zend_Controller_Router_Route。在上述例子中,'news'路由被定义来使用Zend_Controller_Router_Route_Static。 自定义路由类型 标准的rewrite路由器应当最大限度提供你所需的功能;大多时候,为了通过已知的路由提供新的或修改的功能,你将只需要创建一个新的路由类型 那就是说,你可能想要用不同的路由范例。接口Zend_Controller_Router_Interface提供了需要最少的信息来创建路由器,并包含一个单个的方法。 路由只发生一次:当请求第一次接收到系统。路由器的意图是基于请求的环境决定控制器、动作和可选的参数,并把它们发给请求。请求对象接着传递给派遣器。如果不可能映射一个路由到一个派遣令牌,路由器对请求对象就什么也不做。 更多关于zend相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》 希望本文所述对大家PHP程序设计有所帮助。
Zend_Controller_Router_Route_ホスト名
Zend_Controller_Router_Route_Module
Zend_Controller_Router_Route_Chain
Zend_Controller_Router_Route
$route = new Zend_Controller_Router_Route(
'author/:username',
array(
'controller' => 'profile',
'action' => 'userinfo'
)
);
$router->addRoute('user', $route);
$values = array(
'username' => 'martel',
'controller' => 'profile',
'action' => 'userinfo'
);
public function userinfoAction()
{
$request = $this->getRequest();
$username = $request->getParam('username');
$username = $this->_getParam('username');
}
$route = new Zend_Controller_Router_Route(
':module/:controller/:action/*',
array('module' => 'default')
);
$router->addRoute('default', $route);
$route = new Zend_Controller_Router_Route(
'archive/:year',
array('year' => 2006)
);
$router->addRoute('archive', $route);
$route = new Zend_Controller_Router_Route(
'archive/:year',
array(
'year' => 2006,
'controller' => 'archive',
'action' => 'show'
)
);
$router->addRoute('archive', $route);
$route = new Zend_Controller_Router_Route(
'archive/:year',
array(
'year' => 2006,
'controller' => 'archive',
'action' => 'show'
),
array('year' => '\d+')
);
$router->addRoute('archive', $route);
$route = new Zend_Controller_Router_Route(
array(
'host' => 'blog.mysite.com',
'path' => 'archive'
),
array(
'module' => 'blog',
'controller' => 'archive',
'action' => 'index'
)
);
$router->addRoute('archive', $route);
$route = new Zend_Controller_Router_Route(
array(
'host' => array(
'regex' => '([a-z]+).mysite.com',
'reverse' => '%s.mysite.com'
'params' => array(
1 => 'username'
)
),
'path' => ''
),
array(
'module' => 'users',
'controller' => 'profile',
'action' => 'index'
)
);
$router->addRoute('profile', $route);
$route = new Zend_Controller_Router_Route_Static(
'login',
array('controller' => 'auth', 'action' => 'login')
);
$router->addRoute('login', $route);
$route = new Zend_Controller_Router_Route_Regex(
'archive/(\d+)',
array(
'controller' => 'archive',
'action' => 'show'
)
);
$router->addRoute('archive', $route);
$values = array(
1 => '2006',
'controller' => 'archive',
'action' => 'show'
);
public function showAction()
{
$request = $this->getRequest();
$year = $request->getParam(1); // $year = '2006';
}
$route = new Zend_Controller_Router_Route_Regex(
'archive(?:/(\d+))?',
array(
1 => '2006',
'controller' => 'archive',
'action' => 'show'
)
);
$router->addRoute('archive', $route);
$route = new Zend_Controller_Router_Route_Regex(
'archive/(\d+)',
array(
'controller' => 'archive',
'action' => 'show'
),
array(
1 => 'year'
)
);
$router->addRoute('archive', $route);
$values = array(
'year' => '2006',
'controller' => 'archive',
'action' => 'show'
);
$route = new Zend_Controller_Router_Route_Regex(
'archive/(\d+)',
array( ... ),
array(1 => 'year')
);
// OR
$route = new Zend_Controller_Router_Route_Regex(
'archive/(\d+)',
array( ... ),
array('year' => 1)
);
$route = new Zend_Controller_Router_Route_Regex(
'archive/(\d+)/page/(\d+)',
array( ... ),
array('year' => 1)
);
$values = array(
'year' => '2006',
2 => 10,
'controller' => 'archive',
'action' => 'show'
);
$route = new Zend_Controller_Router_Route_Regex(
'archive/(\d+)',
array( ... ),
array('year' => 1),
'archive/%s'
);
$route = new Zend_Controller_Router_Route_Regex(
'blog/archive/(\d+)-(.+)\.html',
array(
'controller' => 'blog',
'action' => 'view'
),
array(
1 => 'id',
2 => 'description'
),
'blog/archive/%d-%s.html'
);
$router->addRoute('blogArchive', $route);
[production]
routes.archive.route = "archive/:year/*"
routes.archive.defaults.controller = archive
routes.archive.defaults.action = show
routes.archive.defaults.year = 2000
routes.archive.reqs.year = "\d+"
routes.news.type = "Zend_Controller_Router_Route_Static"
routes.news.route = "news"
routes.news.defaults.controller = "news"
routes.news.defaults.action = "list"
routes.archive.type = "Zend_Controller_Router_Route_Regex"
routes.archive.route = "archive/(\d+)"
routes.archive.defaults.controller = "archive"
routes.archive.defaults.action = "show"
routes.archive.map.1 = "year"
; OR: routes.archive.map.year = 1
$config = new Zend_Config_Ini('/path/to/config.ini', 'production');
$router = new Zend_Controller_Router_Rewrite();
$router->addConfig($config, 'routes');
interface Zend_Controller_Router_Interface
{
/**
* @param Zend_Controller_Request_Abstract $request
* @throws Zend_Controller_Router_Exception
* @return Zend_Controller_Request_Abstract
*/
public function route(Zend_Controller_Request_Abstract $request);
}
興味があるかもしれない記事:
http://www.bkjia.com/PHPjc/1106889.html
www.bkjia.com