我最近一直在对面包屑进行一些思考,并提出了以下建议 - 我的目标是通过将面包屑组件与路线相关联来避免重复。因此,如果您有网址:
/blog/my-article
然后它将首先找到该 URL 的面包屑标题,然后:
/blog
我已经像这样设置了我的路线:
Route::set('blog', 'blog')
->defaults(array(
'controller' => 'blog',
'action' => 'index',
'breadcrumb' => 'Blog'
)
);
Route::set('module_view', 'blog/<slug>')
->defaults(array(
'controller' => 'module',
'action' => 'view',
'breadcrumb' => function($params=null) {
return ORM::factory('article')->where('slug', '=', $params['slug'])->find()->name;
}
)
);
请注意,面包屑可以是固定的文本/值,也可以是允许动态生成的回调。
然后在我的基本控制器中,我有这个:
protected function breadcrumb() {
$breadcrumb = array();
$uri = substr(Request::detect_uri(), 1);
$routes = Route::all();
while ($uri) {
foreach($routes as $name => $route) {
if ($params = $route->matches($uri)) {
/* @var $route Route */
if (isset($params['breadcrumb'])) {
if (is_callable($params['breadcrumb'])) {
$name = $params['breadcrumb']($params);
} else {
$name = $params['breadcrumb'];
}
$breadcrumb[$name] = URL::site($route->uri($params));
};
break;
}
}
$uri = preg_replace('#(^|/)[^/]*/*?$#', '', $uri);
}
return array_reverse($breadcrumb);
}
警告:有些人可能认为这很混乱,但对我来说效果很好。