JD *_*cks 0 php model-view-controller cakephp
我有一个调用的控制器DesignersController
,该index
方法列出它们,并且该view
方法接受设计器名称作为参数并按名称检索它.
所以/designers
将列出所有设计师,/designers/view/designer-name
并将展示该设计师.
现在,如果设计器名称有空格,则需要在URL中进行转义.我有逃脱空间和取消空间的逻辑:
private $space_escape_char = '-';
function escapeSpaces($str)
{
return str_replace(" ",$this->space_escape_char,$str);
}
function unescapeSpaces($str)
{
return str_replace($this->space_escape_char," ",$str);
}
Run Code Online (Sandbox Code Playgroud)
现在这个view
方法Controller
需要访问它,所以当它传递像"Foo-Bar"这样的名字时,它可以将其转换为"Foo Bar".
index.ctp视图文件也需要访问它,因此当它列出所有设计器时,它可以提供每个设计器的链接,并且能够转义每个名称:
<?php foreach ($designers as $designer): ?>
<div>
<?php
echo $this->Html->link(
$designer['Designer']['name'],
array(
'controller' => 'designers',
'action' => 'view',
escapeSpaces($designer['Designer']['name'])
)
);
?>
</div>
<?php endforeach; ?>
Run Code Online (Sandbox Code Playgroud)
在没有代码重复的情况下处理此问题的最佳方法是什么?
通常的做法是将实体的主要ID放在URL中,并在关键字/可用性的URL中使用名称/标题(在您的案例中为设计者名称).
例如
/designers/view/13/designer-name/
Run Code Online (Sandbox Code Playgroud)
控制器只关心13,在数据库中搜索ID 13的设计者.根本不会使用它designer-name
.
这是在Stackoverflow上完成的方式.
它还可以防止/ designers/view/john-smith12 /