Куда поместить сущность «вспомогательные функции»?

У меня проблемы с пониманием ключевой концепции Symfony 2.

Я работаю над веб-сайтом, на котором пользователи могут создавать контент, который затем можно отправлять другим людям, используя секретный URL-адрес. Что-то вроде www.yoursite.com/{secret-identifier-string}.

Я планирую сделать это следующим образом:

  • Сохраняйте содержимое пользователя.
  • Создайте строку идентификатора, содержащую идентификатор контента и отметку времени создания (или любой другой контент, который никогда больше не изменится, в качестве дополнительной функции безопасности) с методом двустороннего шифрования (например, mcrypt_encrypt).
  • Создайте ссылку и покажите ее пользователю, чтобы отдать
  • Всякий раз, когда вызывается URL-адрес, строка идентификатора будет расшифрована. Если предоставленная метка времени соответствует соответствующему значению строки идентификатора контента, страница будет отображаться.

Мои вопросы:

  • Считаете ли вы это хорошей процедурой в целом?
  • Вне Symfony2 я бы создал вспомогательные методы, такие как getIdentifierString() и getContentPageLink(). Где разместить соответствующий код в Symfony2? Принадлежит ли он к классу сущностей? Если это так, у меня проблемы, потому что я использую класс обслуживания для шифрования. Услуга доступна только в контроллере.

Большое спасибо!


person sprain    schedule 24.06.2012    source источник
comment
Должен ли идентификатор быть строкой с двусторонним шифрованием? Почему бы просто не сгенерировать длинную случайную строку (даже односторонний хэш содержимого) и сохранить ее как индекс? В чем причина/преимущество шифрования и расшифровки идентификатора и метки времени?   -  person MDrollette    schedule 24.06.2012
comment
Я вижу преимущество в том, чтобы не генерировать ненужные данные, которые должны храниться в базе данных.   -  person sprain    schedule 25.06.2012


Ответы (2)


Общая идея заключается в том, что вы создаете «вспомогательные классы», а не «вспомогательные функции». Эти классы могут иметь зависимости от других классов, и в этом случае вы определите их как службу.

Похоже, ваши методы имеют зависимости (от шифрования), поэтому вы можете создать новую службу, отвечающую за генерацию ссылок. В его конструкторе будет использоваться шифратор, а методы будут переданы объекту для создания ссылки/строки.

например, ваш сервис:

<service id="app_core.linkifier" class="App\CoreBundle\Linkifier">
    <argument type="service" id="the.id.for.encryptor"/>
</service>

и класс:

class Linkifier
{
    private $encryptor;

    public function __construct(Encryptor $encryptor)
    {
        $this->encryptor = $encryptor;
    }

    public function generateContentPageLink(Entity $the_entity)
    {
        return $this->encryptor->encrypt($the_entity);
    }
}
person MDrollette    schedule 24.06.2012

При всем уважении к DI и сервисно-ориентированному дизайну, пространству имен и всем полезным вещам, от которых мы получаем пользу,

Я по-прежнему отказываюсь печатать или читать:

$this->mysyperfancyservice->dowhatevertheseviceissupposedtodowith($the_entity);

где простой

do($the_entity);

это все, что мне нужно для 150 экземпляров в моем проекте, где do — это то, о чем будет знать каждый, кто работает над проектом.

Именно для этого и предназначен хелпер - читабельность и простота. При условии, что это не зависит от других сервисов.

Мое решение для этого находится в базовой функции Composer: "autoload": { ... "files": [ "src/helper/functions.php" ] }

Я помещаю очень ограниченное количество чрезвычайно полезных функций в файл src/helper/functions.php и добавляю его в проект таким образом.

Чтобы функция стала доступной для всего проекта, необходимо запустить: composer dump-autoload

person tishma    schedule 24.08.2018