Я знаю, что представления и контроллеры не должны делиться логикой ... но как еще я могу это сделать? - PullRequest
0 голосов
/ 07 декабря 2010

У меня есть контроллер с именем 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);    
}

Теперь метод 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; ?>

Каков наилучший способ справиться с этим без дублирования кода?

Ответы [ 3 ]

5 голосов
/ 07 декабря 2010

Обычный способ сделать это - поместить основной URL-адрес сущности в URL-адрес и указать имя / заголовок (в имени дизайнера вашего дела) в URL-адресе для ключевых слов / удобства использования.

Например

/designers/view/13/designer-name/

Контроллер будет заботиться только о 13, ища в базе данных конструктор ID 13. Он вообще не будет использовать designer-name.

Вот как это делается здесь, в Stackoverflow.

Это также предотвращает / конструкторы / просмотр / john-smith12 /

3 голосов
/ 07 декабря 2010

То, что вы здесь делаете, это преобразование имен дизайнеров в слагов, но вручную.Вместо этого вы можете использовать Behavior (например, this Sluggable Behavior ) для автоматического хранения фрагмента имени вашего разработчика.После этого вы можете ссылаться на $designer['Designer']['slug'] везде, где вам нужна URL-безопасная версия имени.Этот слаг хранится в базе данных как часть данных модели, поэтому вы даже можете запросить его.

3 голосов
/ 07 декабря 2010

Если это обычное явление, я бы порекомендовал хранить слаг URL в записи базы данных пользователей.Рассчитайте его один раз и используйте его оттуда снова.Зачем пересчитывать что-то, что будет всегда одинаковым?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...