Как вызвать функцию оболочки для другого контроллера - Cakephp - PullRequest
0 голосов
/ 02 июля 2018

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

Редактировать: UsersShell

<?php
namespace App\Shell;

use Cake\Console\Shell;
use Cake\Log\Log;
use Cake\Controller\Component;
use Cake\Controller\ComponentRegistry;
use App\Controller\Component\EmailComponent;

class UsersShell extends Shell
{
public function initialize()
{
    parent::initialize();
    $this->loadModel('Users');
    //Load Component 
    $this->Email = new EmailComponent(new ComponentRegistry());
}
public function mail()
{
    $to = 'exemple@gmail.com';
    $subject = 'Hi buddy, i got a message for you.';
    $message = 'User created new event';

    try {
        $mail = $this->Email->send_mail($to, $subject, $message);
        print_r($mail);
    } catch (Exception $e) {
        echo 'Message could not be sent. Mailer Error: ', $mail- 
 >ErrorInfo;
    }
    exit;   

}

Я хотел бы знать, как я могу вызвать его в моем контроллере? здесь

Редактировать: События находятся в папке плагинов

EventsController

<?php

namespace FullCalendar\Controller;

use FullCalendar\Controller\FullCalendarAppController;
use Cake\Routing\Router;
use Cake\Event\Event;
use Cake\Console\ShellDispatcher;

class EventsController extends FullCalendarAppController
{
public $name = 'Events';

public function add()
{
    $event = $this->Events->newEntity();
    if ($this->request->is('post')) {
        $event = $this->Events->patchEntity($event, $this->request->data);
        if ($this->Events->save($event)) {

           /* $shell = new ShellDispatcher();
            $output = $shell->run(['cake', 'users'], ['plugin' => 
           'Events']);

            if (0 === $output) {
            $this->Flash->success('Success from shell command.');
            } else {
            $this->Flash->error('Failure from shell command.'); */

            $this->Flash->success(__('The event has been saved.'));
            return $this->redirect(['action' => 'index']);
        } else {
            $this->Flash->error(__('The event could not be saved. Please, 
    try again.'));
        }
    }
    $this->set('eventTypes', $this->Events->EventTypes->find('list'));
    $this->set(compact('event'));
    $this->set('_serialize', ['event']);
    $this->set('user_session', $this->request->session()- 
 >read('Auth.User'));
    $this->viewBuilder()->setLayout('user');
}

Как видите, я использовал отправленную оболочку, я не уверен, что это правильно но я получаю провал Спасибо!

Редактировать:

EmailComponent

<?php
namespace App\Controller\Component;

use Cake\Controller\Component;
use Cake\Core\App;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require ROOT. '/vendor/phpmailer/phpmailer/src/Exception.php';
require ROOT. '/vendor/phpmailer/phpmailer/src/PHPMailer.php';
require ROOT. '/vendor/phpmailer/phpmailer/src/SMTP.php';

class EmailComponent extends Component {

public function send_mail($to, $subject, $message)
{
    // date_default_timezone_set('Asia/Calcutta');

    $sender = "exemple@gmail.com"; // this will be overwritten by GMail

    $header = "X-Mailer: PHP/".phpversion() . "Return-Path: $sender";

    $mail = new PHPMailer();

    $mail->SMTPDebug  = 2; // turn it off in production
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com'; 
    $mail->SMTPAuth = true;
    $mail->Username   = "exemple@gmail.com";  
    $mail->Password   = "xxxx";
    $mail->SMTPSecure = "tls"; // ssl and tls
    $mail->Port = 587; // 465 and 587

    $mail->SMTPOptions = array (
        'tls' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true
        ),
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true
        )
    );

    $mail->From = $sender;
    $mail->FromName = "From Me";

    $mail->AddAddress($to);

    $mail->isHTML(true);
    $mail->CreateHeader($header);

    $mail->Subject = $subject;
    $mail->Body    = nl2br($message);
    $mail->AltBody = nl2br($message);

    // return an array with two keys: error & message
    if(!$mail->Send()) {
        return array('error' => true, 'message' => 'Mailer Error: ' . $mail->ErrorInfo);
    } else {
        return array('error' => false, 'message' =>  "Message sent!");
    }
}

}

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Первая проверка запуска команды оболочки в CakePHP-CLI. Как это

bin/cake users mail

если команда оболочки успешно запущена. Shell Class Fine.

Следующее использование оболочки в контроллере

<?php
namespace App\Controller;

use App\Controller\AppController;
use Cake\Console\ShellDispatcher;

class PagesController extends AppController
{
    /**
     * Run shell command
     */
    public function run()
    {
        $shell = new ShellDispatcher();
        $output = $shell->run(['cake', 'users', 'mail']);
        // $output = $shell->run(['cake', 'users', 'mail', 'email']); // [pass arguments]
        // debug($output);

        if ($output === 0) {
            echo "Shell Command execute";
        } else {
            echo "Failure form shell command";
        }

        exit;
    }
}

Изменить функцию оболочки: если почта не отправлена, запустите $this->abort() функцию и верните (int) 1, а письмо отправлено успешно, запустите $this->out() функцию и верните (int) 0

/**
 * Send Mail with shell command
 */
public function mail()
{
    $to = 'mail@gmail.com';
    $subject = 'Hi buddy, i got a message for you.';
    $message = 'Nothing much. Just test out my Email Component using PHPMailer.';

    $mail = $this->Email->send_mail($to, $subject, $message);
    // debug($mail);
    if ($mail['error'] === false) {
        $this->out("Mail Successfully Sent For :: ". $to);
    } else {
        $this->abort("Mail Error.");
    }
}
0 голосов
/ 02 июля 2018

Поправь меня, если я ошибаюсь. Сначала ваша оболочка должна быть запущена примерно так.

class UsersShell extends AppShell { 

      public function main(){ //change name here to main
         $to = 'exemple@gmail.com';
         $subject = 'Hi buddy, i got a message for you.';
         $message = 'User created new event';

         try {
             $mail = $this->Email->send_mail($to, $subject, $message);
             print_r($mail);
         } catch (Exception $e) {
             echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
         }
         exit;   
     }       

}

Кстати, если вы хотите проверить вывод, вы должны вернуть что-то вроде true или false. В противном случае нет смысла проверять вывод после выполнения оболочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...