Kingfisher (5.1.0) выдает мне эту ошибку только с Xcode 9. , он отлично работает с Xcode 10. .
Ну, Вы делаете его неправильно путь. Необходимо поместить, электронная почта отправляют стандартную программу в AppController:
function _sendMail($to,$subject,$template) {
$this->Email->to = $to;
// $this->Email->bcc = array('secret@example.com'); // copies
$this->Email->subject = $subject;
$this->Email->replyTo = 'noreply@domain.com';
$this->Email->from = 'MyName <noreply@domain.com>';
$this->Email->template = $template;
$this->Email->sendAs = 'text'; //Send as 'html', 'text' or 'both' (default is 'text')
$this->Email->send();
}
Затем используйте его от ЛЮБОГО контроллера как это:
$this->_sendMail($this->data['User']['email'],'Thanks for registering!','register');
И не забывайте помещать
var $components = array('Email');
в контроллерах, в который Вы 'ре с помощью _sendMail функцию.
даже если это не лучшая практика, на самом деле можно использовать EmailComponent в модели, но Вам нужен к instanciate он (в Моделях нет никакой автоматической загрузки Компонента), и необходимо передать его контроллер. EmailComponent полагается на Контроллер из-за соединения, в котором он нуждается к представлению для рендеринга почтовых шаблонов и разметок.
С методом как это в Вашей модели
function sendEmail(&$controller) {
App::import('Component', 'Email');
$email = new EmailComponent();
$email->startup($controller);
}
Можно использовать его в Контроллере как это:
$this-> Модель-> sendEmail ($this);
(опустите и в сигнатуре метода, если Вы находитесь на PHP5),
Компоненты, как предполагается, используются в контроллерах, не моделях.
В Вашем использовании контроллера
var $components = array('Email');
Нет никакой потребности использовать Приложение:: импорт ();
Не зная Ваше приложение и причины желания использовать его в модели, я мог бы предложить, чтобы Вы заново продумали свою архитектуру системы и переместили эту логику в Ваш контроллер.
При определенной необходимости в нем в режиме код включал что-то как...
$this->Email->delivery = ...
Вы поместили, создал новый экземпляр компонента и установил его на свойство Вашей модели, названной электронной почтой? (Никакая идея, если это будет работать ум.)
Ошибка, которую Вы получаете, состоит в том, потому что Вы называете отправление () метод на объект stdClass т.е. не экземпляр EmailComponent.
Хорошо, верный не хорошо использовать компоненты в моделях. Моя проблема была, я не хотел должным быть писать, что электронная почта блокирует миллион раз в моих контроллерах:
$this-> электронная почта-> доставка = 'smtp';
$this-> электронная почта-> обрабатывают по шаблону = $template;
$this-> электронная почта-> sendAs = 'текст';
$this-> электронная почта-> от = $from;
$this-> электронная почта-> к = $to;
$this-> электронная почта-> подвергают = $subject;
$this-> электронная почта-> отправляют ();
Едва DRY, если я использую это 5 раз в контроллере. Таким образом, я создал компонент под названием Обертка и добавил sendEmail стандартную программу, таким образом, я могу просто записать:
$this-> Обертка-> sendEmail ($from, $to, $subject, $template, $body);
Я - с Вами Justin.
У меня есть ряд Моделей, которые инициировали электронные письма на основе определенных действий, которые могут произойти от Пользователей, Администраторов и сценариев оболочки для автоматизированных процессов.
Это - FAR, легче централизовать почтовый ответ в Модели (как то, когда запись Порядка 'отменяется'), чем переписать электронную почту в нескольких местоположениях.
Кроме того, у меня есть автоматизированные процессы в Моделях, которые обрабатывают некоторую базовую 'логику', которые располагаются каскадом к другому hasOne, belongsTo или hasMany Моделям, которые являются правилами бизнеса.
Например, crontabbed сценарий оболочки звонит, Предложение-> истекают () для 'истекания' Предложения, которое затем звонит, Предложение-> делают (), чтобы сделать другое Предложение, но если это не может затем он звонить, Запрос-> истекают () для 'истекания' исходного запроса. Электронные письма должны быть посланы первому получателю Предложения с истекшим сроком любым новым получателям Предложения и/или просителю, если это истекает. Их может назвать оболочка crontabbed или Пользователями или Администраторами, которые могут управлять Запросами и Предложениями вручную. Все использующие различные Контроллеры или интерфейсы.
Это - то, что я сделал и могу назвать его в Моделях и Контроллерах:
if(empty($this->MailsController)) {
App::import('Controller','Mails');
$this->MailsController = new MailsController();
$this->MailsController->constructClasses();
$this->MailsController->Email->startup($this->MailsController);
}
Теперь я могу назвать это от примерно где угодно и централизовать всю логику для того, какие данные найти (), что электронная почта генерировать, кого отправить его в, и т.д. через следующее, названное в Модели:
$this->MailsController->orderMail($user_id,$this->id,$mode);
Так как всю почтовую логику в основном называют Модели косвенно через MailsController, я собираюсь дать коду rscherer попытку.
Надежда это помогает, oh4real
У меня есть приложение, в котором я добавляю одну строку в модель (model1). Затем эта модель запускает записи в другую модель (model2). модель1 имеет много модель2. Я хотел только отправлять электронные письма, если model2 вставляет успешно. Поэтому я хотел, чтобы модель 1 отправляла электронные письма каждый раз, когда она успешно вставляется в модель 2.
На этом этапе перестройка архитектуры системы занимает слишком много времени.
Мое решение? Когда я делаю Model1-> addRecord, он делает model2-> addRecord (). У меня есть model1 отслеживать каждый сбой или успех от model2-> addRecord. От модели1-> addRecord Затем я возвращаю массив успеха / неудачи вызывающему контроллеру (model1_controller). Оттуда я тогда заставлю model1_controller выдавать электронные письма.
Таким образом, можно сделать это правильно, не переписывая архитектуру полностью. Просто верните больше информации от Model1 к контроллеру, затем попросите контроллер (должным образом) отправить электронные письма.
Извините за несколько неясный пост. Мой мозг сейчас в кодовом режиме.
Посмотрите на плагин под названием Eventful
, который позволит вам транслировать и прослушивать пользовательские события. Для плаката подо мной: вы можете транслировать событие Model1Saved, прослушивать его в model2, затем выполнять второе сохранение, и они транслируют событие успеха обратно в model1 или даже в контроллер. Оттуда вы можете отправить свою электронную почту.