Переопределить аргумент анонимной функции в php

У меня небольшая проблема с анонимной функцией в php. Эту функцию выполняет фреймворк, который передает туда переменную. Я хотел бы переопределить эту переменную, не меняя фреймворк кода, возможно ли это в php? Вот код, объясняющий, что происходит. Код Freamwork:

protected function callMessageBuilder($callback, $message)
{
    if ($callback instanceof Closure)
    {
        return call_user_func($callback, $message);
    }
}

Вот мой код с анонимной функцией с переменной $ message, переданной freamwork. Я хочу заменить его заранее подготовленной переменной.

public function sendEmail(){
    $ourMessage = $this->getMessage();
    \Mail::send($this->getTemplate(), $this->getData(), function ($message) use ($ourMessage) {
        $message = $ourMessage;
        //This change is not visible in freamwork code callback
    });
}

Я знал, как это сделать, переписав код произвольной работы так, чтобы он использовал ссылки, но я хочу избежать этого. Есть какое-нибудь решение? Вот весь код этого класса из freamwork Вот весь код из freamwork: https://github.com/laravel/framework/blob/5.1/src/Illuminate/Mail/Mailer.php


person Piotr Suchanek    schedule 02.08.2015    source источник


Ответы (1)


Я понимаю, что у вас уже есть объект $ message, который вы хотите использовать в методе Mailer :: send () вместо объекта, который создается в Mailer :: send () с $ this-> createMessage ()

Невозможно сделать внешнюю ссылку $ message на какой-либо другой объект, поскольку то, что получает ваш обратный вызов, является копией ссылки. Однако вы можете изменить объект, на который ссылается $ message, чтобы он был идентичен $ ourMessage. Передайте свое сообщение закрытию, как вы это уже сделали, а затем вместо того, чтобы делать

$message = $ourMessage;

скопируйте все, что вы установили для $ ourMessage, в объект $ message. Даже если вы не замените $ message на $ ourMessage, вы сделаете объекты идентичными.

person jedrzej.kurylo    schedule 02.08.2015
comment
Я тоже думал об этом. Однако сеттеры в классе Message вызывают изменения в переменных. Ссылаясь на их функции получения, мы получим уже измененные данные. Написание такого заменителя требует много работы. Я думаю, что нет другой возможности без переписывания кода произвольной работы. Очень плохо :( - person Piotr Suchanek; 02.08.2015
comment
Хм, не понимаю ... Что значит получать уже измененные данные? Я имел в виду что-то вроде $ message- ›from ($ ourMessage-› getSwiftMessage () - ›getFrom ()) ;. Да, это хлопотно, поэтому я сначала подумаю, действительно ли мне вообще нужно использовать свой собственный объект сообщения. То, что вы пытаетесь сделать, не является стандартным, и в 99% случаев стандартного использования Mailer должно быть достаточно. Так что либо у вас есть крайний случай, либо вы просто пытаетесь неправильно использовать Mailer :) - person jedrzej.kurylo; 02.08.2015
comment
И если логика Illuminate \ Mailer вам не подходит, вы всегда можете напрямую использовать SwiftMailer. Нет необходимости переписывать логику Mailer, если вы можете просто пропустить ее, когда она не выполняет то, что вам нужно. В любом случае, поясните, почему стандартное поведение вам не подходит, и может быть способ получше - person jedrzej.kurylo; 02.08.2015