首页 文章

在网站上打印面包屑的最优雅方式是什么?

提问于
浏览
1

我已经考虑了很久了 . 创建面包屑的最佳或最优雅的方法是什么?

一种方法是从控制器调用方法 . 像这样的东西:

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(...);
    }
}

这种方法的一个问题是,关于当前路线很难获得"data" . 例如,我可以有一个显示单个用户( admin.users.single )的路由,它在路由中获取用户ID(例如 admin/users/{id} ) . 我没有本机方法为breadcrumb项构造正确的URL,因为路由数据仅在控制器内部使用 .

你能想到其他任何方式吗?关于这些例子的意见?

1 回答

  • 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") 将返回列表"Admin Panel","Users"

    然后构建breadcrumb字符串:

    var currentPage = "admin.users"
    strings.Join(">", GetHierarchy(currentPage)
                       .Select(c => GetLink(c.categoryName, c.categoryDisplayName)))
    

    您可以使用帮助程序将其嵌入到视图中,或者只是从控制器中设置它 .

    GetLink 方法将返回包含类别路径的链接 . 即

    <a href="admin/users">Users</a>

相关问题