Недавно я немного подумал о панировочных сухарях и придумал следующее - моя цель состояла в том, чтобы избежать повторения, связав компонент крошки с маршрутом. Так что, если у вас есть URL:
/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);
}
Предупреждение: некоторые могут посчитать это довольно грязным, но это хорошо работает для меня.