Laravel nl2br() с отправкой писем

Я использую Laravel 5.3 и пытаюсь отправить электронное письмо с помощью nl2br(). Поэтому я использую email blade file по умолчанию, новое в Laravel 5.3 (vendor/notifications/email.blade.php)

Но он не показывает разрывы строк. Только это:

sttesttesttesttesttesttesttesttesttesttesttesttest<br /> <br /> <br /> <br /> testtesttesttesttesttesttesttesttesttesttesttesttesttesttest

Я сделал это так:

<!-- Outro -->
@foreach ($outroLines as $line)
    <p style="{{ $style['``'] }}">
        {{ nl2br($line) }}
    </p>
@endforeach

Что я делаю не так?

Этот:

{!! nl2br(htmlspecialchars($line)) !!}

не работает.


person Jamie    schedule 03.11.2016    source источник
comment
Возможный дубликат Laravel 5.3 nl2br в электронной почте   -  person S.I.    schedule 03.11.2016


Ответы (3)


Для пользователей Laravel 4:

{{ nl2br(e($message)) }}

e($x) эквивалентно {{{ $x }}}.

Пользователи Laravel 5:

{!! nl2br(e($message)) !!}

e($x) эквивалентно {{ $x }}.

person S.I.    schedule 03.11.2016
comment
Laravel фактически удаляет все символы новой строки до того, как строка войдет в nl2br(). Это потому, что он использует почтовый канал уведомлений. - person Casper Spruit; 14.03.2017
comment
Это должен быть лучший ответ, у меня сработало отлично! - person Emmanuel-Ab; 10.06.2020

Laravel автоматически экранирует вашу строку, используя {{ }}

Для laravel 4+ используйте {{{ nl2br($line) }}}

Для laravel 5+ используйте {!! nl2br($line) !!}

Поправьте меня, если я ошибаюсь в версии.

person Niek van der Maaden    schedule 03.11.2016
comment
Это не сработает, потому что @Jamie использует почтовый канал уведомлений. - person Casper Spruit; 14.03.2017

Я знаю, что это немного поздно, но для всех с той же проблемой. Если вы используете почту уведомлений, новые строки не будут работать ("\n", "\r", "\r\n").

Это потому, что Laravel (для 5.3 и 5.4 я могу подтвердить) удаляет их из строк

поставщик\laravel\framework\src\Illuminate\Notifications\Messages\SimpleMessage.php

protected function formatLine($line)
{
    if (is_array($line)) {
        return implode(' ', array_map('trim', $line));
    }

    return trim(implode(' ', array_map('trim', preg_split('/\\r\\n|\\r|\\n/', $line))));
}

Как я решил это, заменив новые строки фактическими новыми строками html <br>.

Есть гораздо лучшие способы сделать это Я уверен, но важно не упускать из виду функцию formatLine.

public function toMail($notifiable) {

    //Get your mail data
    $mail = new Email(2);
    $emailLine = $mail->getArray();

    return (new MailMessage)
        ->line(str_replace(array("\\r\\n", "\\n", "\\r","\r\n", "\n", "\r"), "<br>", $emailLine))

}

person Casper Spruit    schedule 14.03.2017