我知道视图和控制器不应该共享逻辑..但我怎么能这样做?

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)

在没有代码重复的情况下处理此问题的最佳方法是什么?

Gal*_*len 5

通常的做法是将实体的主要ID放在URL中,并在关键字/可用性的URL中使用名称/标题(在您的案例中为设计者名称).

例如

/designers/view/13/designer-name/
Run Code Online (Sandbox Code Playgroud)

控制器只关心13,在数据库中搜索ID 13的设计者.根本不会使用它designer-name.

这是在Stackoverflow上完成的方式.

它还可以防止/ designers/view/john-smith12 /