Есть конструкция вида:
class EmailSendPassword extends Mailable
{
use Queueable, SerializesModels;
public $user;
public $password;
public function __construct($user, $password)
{
$this->user = $user;
$this->password = $password;
}
public function build()
{
return $this
->subject('Ваш пароль на сайте ' . env('APP_NAME'))
->markdown('emails.sendpass', compact('user', 'password'));
}
}
Так вот, функция compact начиная с php 7.3 начинает выдавать ошибку, связанную с тем, что переменная user не определена.
В документации, касаемо изменений в php 7.3 связанной с функцией compact только это замечание:
compact() now issues an E_NOTICE level error if a given string refers to an unset variable. Formerly, such strings have been silently skipped.
Подскажите, в чем ошибка? Разумеется, если в методе build() прописать $user = $this->user проблема решается, но как обойтись без этих костылей?
Все верно, до php7.3 не выводилось ничего, если переменная не определена, поэтому было исправлено. Т.е. фактически без определенных в данной оболасти видимости переменных, вызывая compact('definedVar','undefinedVar1','undefinedVar2') мы получали ассоциативный массив только тех переменных, которые доступны в текущей области видимости
И мое субъективное мнение, что это несовсем правильно.
Соответсвенно ваш код при вызове compact не передавал переменные во вьюху. Что в принципе (мне кажется) не совсем то, что ожидается.
Поэтому в каждом случае погони за красотой кода не следует забывать о его работоспособности. Вот так будет работать:
public function build()
{
return $this
->subject('Ваш пароль на сайте ' . env('APP_NAME'))
->markdown('emails.sendpass', [
'user' => $this->user,
'password' => $this->password
]);
}
И это уж точно не костыль
Продвижение своими сайтами как стратегия роста и независимости