2015-08-02 2 views
2

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

protected function callMessageBuilder($callback, $message) 
{ 
    if ($callback instanceof Closure) 
    { 
     return call_user_func($callback, $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 Вот весь код из freamwork: https://github.com/laravel/framework/blob/5.1/src/Illuminate/Mail/Mailer.php

ответ

1

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

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

$message = $ourMessage; 

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

+0

Я тоже думал об этом. Однако сеттеры в классе сообщений вызывают изменения в переменных. Обращаясь к их функциям геттера, мы получим уже измененные данные. Написание такого заменителя, похоже, требует много работы. Я думаю, что нет никакой другой возможности без переписывания кода freamwork. Так плохо :( –

+0

Хм, я не понимаю ... Что значит, что вы получите уже измененные данные? Я имел в виду sth, как $ message-> from ($ ourMessage-> getSwiftMessage() -> getFrom()) Да, это хлопот, поэтому я сначала подумаю, действительно ли мне нужно использовать свой собственный объект сообщения. То, что вы пытаетесь сделать, не стандартное, а в 99% случаев стандартное использование Mailer должно так что либо у вас есть какой-то крайний случай, либо просто попытка злоупотреблять Mailer :) –

+1

И если логика Illuminate \ Mailer не то, что вам нужно, вы всегда можете напрямую использовать SwiftMailer. Не нужно переписывать логику Mailer, если вы можете просто пропустить ее, когда она не делает то, что вам нужно. В любом случае, пожалуйста, уточните, почему стандартное поведение не подходит для вас, и может быть лучше –

Смежные вопросы