我已经考虑了很长时间了。创建面包屑的最佳或最优雅的方法是什么?
一种方法是从控制器调用方法。像这样:
function showUsers()
{
$this->breadcrumbs->add('Users', URL::route('admin.users'));
// ...
}
我个人不喜欢这种方式,因为我想将面包屑逻辑与控制器分开。另外,如果我想要,例如对于控制器内的许多页面都有一个Admin Panel -item,我需要在构造函数或每个控制器方法中定义它。
另一种方法是利用命名路线,将它们分成几段。这显然要求路线以某种方式明智地命名和构造。这是一些伪代码:
if($segment[0] == 'admin') {
$breadcrumbs->add('Admin Panel', URL::route('admin');
if($segment[1] == 'users') {
$breadcrumbs->add('Users', URL::route('admin.users');
} elseif($segment[1] == 'foo') {
$breadcrumbs->add(...);
}
}
这种方法的一个问题是很难获得数据"关于当前的路线。例如,我可以有一个显示单个用户(admin.users.single
)的路由,该路由获取路由中的用户ID(例如admin/users/{id}
)。我没有为nativecrumb项构造正确的URL的本地方法,因为路由数据仅在控制器内使用。
你能想到其他方法吗?关于这些例子的意见?
答案 0 :(得分:0)
使其更通用,而不是在控制器中对用户和用户名等具有条件语句。我认为最好先定义某种类别的层次结构或树。在您的后端存储该信息取决于您(即db,text file,nosql):
+--------------+--------------+---------------------+------------+
| CategoryId | CategoryName | CategoryDisplayName | ParentId |
+--------------+--------------+---------------------+------------+
| 1 | admin | Admin Panel | NULL |
+--------------+--------------+---------------------+------------+
| 2 | admin.users | Users | 1 |
+--------------+--------------+---------------------+------------+
您可以分离遍历类别和构建面包屑字符串的逻辑。这更容易理解,测试等。
即。用c#
您可以根据该数据检索面包屑列表:
IEnumerable<Category> GetHierarchy(string categoryName) {
...
}
即。 GetHierarchy("Users")
将返回列表&#34;管理员面板&#34;,&#34;用户&#34;
然后构建breadcrumb字符串:
var currentPage = "admin.users"
strings.Join(">", GetHierarchy(currentPage)
.Select(c => GetLink(c.categoryName, c.categoryDisplayName)))
您可以使用帮助程序将其嵌入到视图中,或者只是从控制器中设置它。
GetLink
方法将返回包含该类别路由的链接。
即
<a href="admin/users">Users</a>