Как я могу динамически передать адрес электронной почты получателя во внутреннюю функцию обратного вызова Mail :: send ()?

Я новичок в PHP и еще больше в Laravel, и мне трудно отправить электронное письмо не указанному пользователю.

Поэтому я использую класс Illuminate \ Support \ Facades \ Mail.

Если я сделаю что-то подобное, все будет нормально:

$registrationMail = [
    'title' => 'Registrazione albergatore su portale BeTrivius',
    'url' => URL::to('/').'/activate?email='.$data['email'].'&token='.$token,
    'email' => $data['email'],
    'name' => $data['name'],
    'surname' => $data['surname']
];

Mail::send('emails.registrationMail', $registrationMail, function($message) {
    $message->to('[email protected]', 'recipient-name')->subject('email subject');
});

Поэтому я вызываю метод send () передаваемого ему класса Mail:

  • Представление, представляющее шаблон электронного письма.
  • Массив, содержащий некоторые данные, использованные в предыдущем представлении.
  • Функция обратного вызова, в которой содержится логика для установки адреса электронной почты получателя и темы электронной почты.

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

Это не очень хорошо для меня, потому что я должен отправить это электронное письмо на адрес, указанный в свойстве $ registrationMail ['email'].

Но поступаем так:

Mail::send('emails.registrationMail', $registrationMail, function($message) {

    $message->to($registrationMail['email'], $data['name'].' '.$data['surname'])->subject('titolo');
});

$ registrationMail кажется не видимым в функции обратного вызова (он говорит мне Неопределенная переменная). Почему я не вижу внешнее свойство изнутри функции обратного вызова?

Поэтому я не могу получить эту информацию таким образом.

Поэтому я попытался добавить переменную $ registrationMail в качестве параметра этой функции обратного вызова следующим образом:

Mail::send('emails.registrationMail', $registrationMail, function($message, $registrationMail) {

    $message->to($registrationMail['email'], $registrationMail['name'].' '.$registrationMail['surname'])->subject('titolo');
});

Таким образом, переменная $ registrationMail не является неопределенной, но когда она пытается отправить электронное письмо, я получаю следующее сообщение об ошибке:

ErrorException in RegistrationController.php line 90:
Missing argument 2 for App\Http\Controllers\RegistrationController::App\Http\Controllers\{closure}()
in RegistrationController.php line 90
at HandleExceptions->handleError(2, 'Missing argument 2 for App\\Http\\Controllers\\RegistrationController::App\\Http\\Controllers\\{closure}()', 'C:\\xampp\\htdocs\\HotelRegistration\\app\\Http\\Controllers\\RegistrationController.php', 90, array('message' => object(Message))) in RegistrationController.php line 90
at RegistrationController->App\Http\Controllers\{closure}(object(Message))
at call_user_func(object(Closure), object(Message)) in Mailer.php line 199
at Mailer->send('emails.registrationMail', array('title' => 'Registrazione albergatore su portale BeTrivius', 'url' => 'http://laravel.dev/[email protected]&token=4759d4ec56cf1e63447638e0d7a042e6', 'email' => '[email protected]', 'name' => 'Andrea', 'surname' => 'Nobili'), object(Closure)) in Facade.php line 221
at Facade::__callStatic('send', array('emails.registrationMail', array('title' => 'Registrazione albergatore su portale BeTrivius', 'url' => 'http://laravel.dev/[email protected]&token=4759d4ec56cf1e63447638e0d7a042e6', 'email' => '[email protected]', 'name' => 'Andrea', 'surname' => 'Nobili'), object(Closure))) in RegistrationController.php line 93
at Mail::send('emails.registrationMail', array('title' => 'Registrazione albergatore su portale BeTrivius', 'url' => 'http://laravel.dev/[email protected]&token=4759d4ec56cf1e63447638e0d7a042e6', 'email' => '[email protected]', 'name' => 'Andrea', 'surname' => 'Nobili'), object(Closure)) in RegistrationController.php line 93
at RegistrationController->store(object(Request))
at call_user_func_array(array(object(RegistrationController), 'store'), array(object(Request))) in Controller.php line 55
at Controller->callAction('store', array(object(Request))) in ControllerDispatcher.php line 44

где строка 90:

Mail::send('emails.registrationMail', $registrationMail, function($message, $registrationMail) {

Итак, проблема, похоже, в том, что я не могу передать второй параметр внутренней функции обратного вызова. Почему?

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


person Community    schedule 01.03.2017    source источник
comment
Возможный дубликат Определение адреса электронной почты для метода Mail :: send ()   -  person Chris Forrence    schedule 01.03.2017


Ответы (1)


Вам нужно добавить переменную в use часть вашей функции, чтобы отправить ее в ту же область.

Например:

Mail::send('emails.registrationMail', $registrationMail, function($message) use($registrationMail) {
    $message->to($registrationMail['email'])->subject('titolo');
});
person Jerodev    schedule 01.03.2017
comment
Хорошо, все работает нормально. Что конкретно выполняет функция use ()? Он прикрепляет объект \ переменную к содержимому функции? или что? - person ; 01.03.2017
comment
function создает совершенно новое замыкание без каких-либо переменных. Функция use позволяет вам отправлять существующие переменные в это замыкание. - person Jerodev; 01.03.2017
comment
ммм хорошо ... Я думаю, что понимаю, но ... что именно представляет собой закрытие? - person ; 01.03.2017