Используя ColdBox Framework, как я могу использовать BuildLink() внутри моей модели?

У меня есть служба модели инфраструктуры CFML ColdBox, которая должна создавать ссылки. Однако у моделей нет доступа к фреймворку SuperType, поэтому у них нет доступа к event.buildLink().

Как предоставить сервисам в моей модели возможность создавать ссылки? Есть ли способ сделать функциональность buildLink() доступной через какую-то инъекцию зависимостей?

Пример службы модели:

component 
    singleton
{

    function getLinkToUser( required numeric userId ) {

        return event.buildLink( "users.#arguments.usersId#" );

    }

}

--Обновлять--

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

При этом давайте расширим приведенный выше пример кода до более реальной ситуации: допустим, у вас есть модель службы, которая генерирует электронные письма для клиентов, и содержание этих электронных писем во многом определяется сложными бизнес-правилами. В этом случае я мог видеть аргумент в пользу создания контента электронной почты в модели, потому что именно там живут бизнес-правила.

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

Предполагая, что генерация основного текста электронной почты на уровне модели является правильным решением, не имеет ли смысл также создавать HTML-ссылки на основе маршрутов фреймворка в этих электронных письмах?


person Dave L    schedule 11.02.2019    source источник
comment
К сожалению, у меня не было времени поиграться с ColdBox столько, сколько мне бы хотелось, но моя интуиция подсказывает мне, что вы делаете это неправильно. На основании того, что buildLink() нельзя использовать в модели. Он предназначен для слоя представления. Почему вы не можете использовать его вместо этого?   -  person Miguel-F    schedule 12.02.2019
comment
Создание ссылок в статическом классе/модели с использованием конфигурации правил перезаписи - это способ сделать это, но, я думаю, это не способ ColdBox.   -  person Alex    schedule 12.02.2019
comment
Я не могу сказать, что это будет работать, и я сомневаюсь, что это даже хорошая идея, поскольку модель не должна знать или зависеть от конкретных функций фреймворка, которые обычно обрабатываются в контроллере/событии, но объект ColdBox, который определяет buildLink(), кажется быть coldbox.system.web.context.RequestContext. Теоретически, я полагаю, вы могли бы заставить WireBox создать его экземпляр и внедрить его в свой сервис. Я понятия не имею, достаточно ли вызова функции с необходимыми параметрами, чтобы использовать обычную закулисную магию во время процесса события; так что ваш пробег может варьироваться.   -  person Tony Junkes    schedule 12.02.2019
comment
@ Мигель-Ф, я думаю, ты прав. У меня не должно быть buildLink() в моей модели. Тем не менее, я пытаюсь создать несколько модельных сервисов, которые используются для упрощения создания выходных данных для представлений (например, вьюлета) или текста электронной почты. В этом конкретном случае строковые данные, которые я генерирую, нуждаются в некоторых HTML-ссылках. Возможно, решение заключается в том, что этот тип кода относится к уровню представления, а не к уровню бизнеса/модели, хотя я вижу аргументы для обоих случаев.   -  person Dave L    schedule 13.02.2019
comment
@TonyJunkes Я тоже согласен с тобой. Первоначально я думал, что метод buildLink() относится к классу утилиты/помощника, но вы правы, что он существует как часть объекта запроса/события.   -  person Dave L    schedule 13.02.2019


Ответы (1)


Я рекомендую использовать что-то вроде CBMailService, а затем в отправке почты вы будете отображать макет/представление, и внутри них у вас есть доступ к событию, чтобы иметь возможность создавать ссылки.

Вы можете передать bodyTokens для переменных в представления, и он будет обрабатывать рендеринг для вас.

Надеюсь это поможет.

var mail = mailservice.newMail(
        to          = arguments.recipients,
        from        = '"Do not reply" <postmaster@noreply>',
        subject     = arguments.emailSubject,
        bodyTokens  = bodyTokens,
        type        = 'html',
        additionalInfo  = { categories: categories }
    );
    mail.setBody(
        renderer.get()
            .renderLayout(
                view    = "/modules/core/views/email/emailSigninSheet",
                layout  = "/modules/core/layouts/email"

            )
    );
person Gavin Pickin    schedule 22.01.2020
comment
Хороший совет, спасибо. Я рассмотрю CBMailService как возможное решение. Мой текущий подход на сегодняшний день заключается в том, чтобы обработчик передавал любые дополнительные данные на уровень службы, что похоже на то, как bodyTokens работает в CBMailService. - person Dave L; 23.01.2020