如何将 shell 函数调用到另一个控制器 - Cakephp



我在我的外壳中使用这个函数来发送电子邮件

编辑: 用户外壳

<?php
namespace AppShell;
use CakeConsoleShell;
use CakeLogLog;
use CakeControllerComponent;
use CakeControllerComponentRegistry;
use AppControllerComponentEmailComponent;
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;   
}

我想知道如何在我的控制器中调用它?

编辑:事件位于插件文件夹中

事件控制器

<?php
namespace FullCalendarController;
use FullCalendarControllerFullCalendarAppController;
use CakeRoutingRouter;
use CakeEventEvent;
use CakeConsoleShellDispatcher;
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');
}

如您所见,我使用了派遣的外壳,我不确定它是否正确 但是我失败了 谢谢!

编辑:

电子邮件组件

<?php
namespace AppControllerComponent;
use CakeControllerComponent;
use CakeCoreApp;
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerException;
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!");
}
}
}

如果我错了,请纠正我。首先,你的 shell 必须像这样启动。

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;   
}       
}

顺便说一句,如果要检查输出,则必须返回类似truefalse.否则,在执行 shell 后检查输出就没有意义了。

首先检查 shell 命令在 CakePHP-CLI 中运行。喜欢这个

bin/cake users mail

如果外壳命令成功运行。壳类精细。

下一页 在控制器中使用外壳

<?php
namespace AppController;
use AppControllerAppController;
use CakeConsoleShellDispatcher;
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.");
}
}

最新更新