php-MVC应用程序中的面包屑逻辑
作者:互联网
应该在哪里声明面包屑路径(换句话说,用MVC的哪个字母)?到目前为止,我一直在Controllers中声明它,但是最近我开始使用CakePHP,它全部由Views制作,这让我感到惊讶.
解决方法:
我将在这里给出答案,因为对于面包屑应该做和不应该做的事情有很多困惑.
该模型
模型是一个包含业务逻辑的层,该业务逻辑由域对象,数据映射器和服务组成.您可以阅读有关型号here的更多信息.
控制器
记住:胖模型,瘦控制器.您的控制器/方法是通过路由机制访问的.进入控制器后,您想要获取模型对象,执行模型中需要的任何逻辑,将其结果返回到控制器中的变量,然后使用它在视图中显示数据.
面包屑
话虽如此,面包屑需要不同的零件才能工作.让我们考虑一下:
>他们需要当前页面
>他们需要页面列表
>他们(可能)需要添加自定义“ class = current”
分解:
>在我的框架中,当前控制器也是页面名称(登录控制器映射到/ login).因此,我们已经有了当前页面.
>页面列表.
>如果页面的父/子关系直接绑定到数据模型,则在控制器中,从模型中拉出页面列表.因此,如果可以自动生成面包屑,请使用该模型.
>如果您使用的框架允许完全由用户选择创建面包屑,那么您只是在选择手动放入面包屑的内容.无论哪种方式,都可以在控制器中声明面包屑,如果需要从某个地方获取面包屑,请使用模型.
>最后,是“ class = current”.尽管您实际上不应该在视图中包含重要的“逻辑”,但是诸如循环之类的小东西或语句是否很标准.在这里,您将检查面包屑中与当前控制器名称相同的标题(作为变量传递给视图),如果找到,则添加class = current.
代码示例
注意:未经测试
/**
* So we're in the home controller, and index action
*
* @route localhost/home or localhost/home/index
* (depending on .htaccess, routing mechanism etc)
*/
class Home extends Controller
{
public function index()
{
// Get current class name, so we have the current page
$class = __CLASS__;
// Let's say the page heirachy is tied to the model, so get pages for current method, or however you want to implement it
$pages = $model->getPages($class);
// So the TEMPLATE handles the breadcrumbs creation, and the controller passes it the data that it needs, retrieved from the model
// (new Template) is PHP 5.4's constructor dereferencing, also included is some lovely method chaining
// setBreadcrumbs() would assign variables to the view
// Render would do just that
(new Template)->setBreadcrumbs($currentPage, $pages)->render();
}
}
现在,视图…注意,我使用PHP 5.4,因此可以使用短回声…
<body>
<?php foreach($breadcrumbs as $b) { ?>
<li <?=($b['current'])?'class="current"':''?>>
<a href="<?=$b['page']['url']?>">
<?=$b['page']['title']?>
</a>
</li>
<?php } ?>
</body>
这就是我要做的.其中一些取决于个人喜好,但是我希望这显示了一种实现方法,并且至少有用.
实际上,我碰到了这个搜索“ php mvc Breadcrumbs”的答案,写出我的大脑确实也帮助我弄清楚了这一点.那谢谢啦!
标签:breadcrumbs,model-view-controller,php 来源: https://codeday.me/bug/20191024/1917328.html