RouterView
为您的组件编写路由预处理、解析和构建函数可能是一项具有挑战性的任务。如果您的组件大体上遵循 `com_content` 的示例,即具有按类别分组的项目,那么使用 RouterView 配置可以为您节省大量工作。
另一方面,如果您发现它不起作用,那么实际上不可能进行调试以查找问题出在哪里,并且最好只使用预处理、解析和构建函数。
我个人建议您尝试 RouterView 配置方法,看看是否可以使其对您的组件生效。您可能需要进行一些实验!如果几天后您仍然无法使其生效,则恢复使用标准的预处理、构建和解析函数。
RouterView 配置
要构建 RouterView 配置,最简单的方法是遵循示例,例如 `com_content` 中的 components/com_content/src/Service/Router.php。
对于您组件的每个视图(对于 `com_content`,这些是 components/com_content/tmpl 下的文件夹),您都需要指定一个 `RouterViewConfiguration`,例如
$this->registerView(new RouterViewConfiguration('featured'));
如果您的视图没有任何其他关联的查询参数,那么您就只需要执行这些操作。
一个更复杂的示例是 `article` 视图(如 components/com_content/tmpl/article)
$article = new RouterViewConfiguration('article');
$article->setKey('id')->setParent($category, 'catid');
$this->registerView($article);
此 `com_content` 视图可用于不同的文章,关键是 `id` 查询参数。与内部 URL 关联,您还可以拥有一个类别 - 由 'catid' 标识。
如果我们继续跟踪 `setParent()` 树,我们可以看到针对类别的 `setNestable()`,这意味着我们可以获得与类别树中的路径关联的一系列类别段。
此外,在“类别”视图中,还有一个额外的布局 `addLayout('blog')`(用于类别博客类型的菜单项) - 除了默认布局(用于类别列表菜单项)之外。
路由器使用此配置来使其能够理解在查询参数中期望什么以及这些参数的含义。
规则
接下来的几行代码指定要包含哪些路由器函数
$this->attachRule(new MenuRules($this));
$this->attachRule(new StandardRules($this));
$this->attachRule(new NomenuRules($this));
- MenuRules – 这是在构建 SEF URL 期间使用的 `preprocess()` 代码,用于确定要基于哪个菜单项构建 URL。
- StandardRules - 这是在找到菜单项的情况下使用的 `build()` 和 `parse()` 函数。
- NomenuRules - 这是在未找到菜单项的情况下使用的 `build()` 和 `parse()` 函数。因此,这是上一节中描述的情况,您最终会得到类似以下内容的段:
/en/component/contact/contact/me?Itemid=1
这些规则与组件路由器中涉及的 3 个函数 - preprocess()、build() 和 parse() - 的关系如下所示
preprocess | build | parse | |
---|---|---|---|
MenuRules | ✓ | ||
StandardRules | ✓ | ✓ | |
NomenuRules | ✓ | ✓ |
Joomla 以这种方式构建代码的一个很大的优势是,如果您不喜欢 Joomla 处理这些路由方面中的任何一个的方式,则可以编写您自己的代码并使其被使用(例如,由 `com_content` 使用),而不是使用 Joomla 提供的版本,如 系统插件路由器规则 中所示。
段和查询变量
RouterView 配置的第三个方面使路由器能够在 SEF URL 的段与查询参数的关联 ID 之间进行转换。因此,对于每个 RouterView 配置(即对于每个视图),您都需要编写 2 个回调函数
get<Viewname>Segment
- 传递一个 ID 并要求您返回关联的段或段get<Viewname>Id
- 传递一个段并要求您返回关联的 ID
此外,您还传递了一个 `$query` 参数,该参数表示正在构建或解析的请求的当前状态。