2012-04-20 33 views
5

Tôi đang sử dụng Symfony2 và FOSUserBundleGửi Email Bên ngoài điều khiển hành động Symfony2

tôi phải gửi email bằng SwiftMailer trong lớp bưu phẩm của tôi mà không phải là một bộ điều khiển hay hành động của nó tôi đang cho thấy những gì tôi đã được mã hóa

<?php 

namespace Blogger\Util; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class FlockMailer { 


    public function SendEmail(){ 
     $message = \Swift_Message::newInstance() 
     ->setSubject('Hello Email') 
     ->setFrom('[email protected]') 
     ->setTo('[email protected]') 
     ->setBody('testing email'); 

     $this->get('mailer')->send($message); 
    } 
} 

Nhưng tôi nhận được lỗi sau

Fatal error: Call to undefined method Blogger\Util\FlockMailer::get() .... 

bất kỳ cơ thể có thể giúp tôi điều này thực sự là fustrating tôi .....

+0

Tôi không hiểu. Đoạn mã đó có phải là giải pháp hiện tại của bạn nhưng bạn muốn chuyển thư đến một nơi khác? Nếu đó là chính xác, bạn có lẽ nên đọc về tiêm dịch vụ vào các lớp học tùy chỉnh của bạn: http://stackoverflow.com/questions/6124444/how-can-i-access-a-service-outside-of-a-controller-with- symfony2 – geca

+0

Tôi đã sử dụng FOSUserBundle và FOSFacebookbundle những gì tôi muốn khi người dùng đăng nhập thành công với tài khoản facebook tôi muốn gửi email cho người dùng bằng mật khẩu của mình để anh ấy có thể đăng nhập bằng mật khẩu email đó. .... –

Trả lời

1

Chỉ cần quên đi những setter và getter:

$transport = \Swift_MailTransport::newInstance(); 
$mailer = \Swift_Mailer::newInstance($transport); 
$helper = new MailHelper($mailer); 
$helper->sendEmail($from, $to, $body,$subject); 

Đó làm việc cho tôi với MailHelper gọi từ một phương pháp nghe.

8

EDIT: vì tôi không kiểm tra mã, bạn cũng nên chỉ định lớp vận chuyển nếu bạn không sử dụng vùng chứa dịch vụ để nhận được cá thể của bưu phẩm. Nhìn vào: http://swiftmailer.org/docs/sending.html

Bạn đang làm sai. Về cơ bản bạn muốn có một dịch vụ , không phải là một lớp mở rộng Controller. Nó không hoạt động vì vùng chứa dịch vụ không có sẵn trong hàm SendMail().

Bạn phải đưa vùng chứa dịch vụ vào trình trợ giúp tùy chỉnh của riêng bạn để gửi email. Một vài ví dụ:

namespace Blogger\Util; 

class MailHelper 
{ 
    protected $mailer; 

    public function __construct(\Swift_Mailer $mailer) 
    { 
     $this->mailer = $mailer; 
    } 

    public function sendEmail($from, $to, $body, $subject = '') 
    { 
     $message = \Swift_Message::newInstance() 
      ->setSubject($subject) 
      ->setFrom($from) 
      ->setTo($to) 
      ->setBody($body); 

     $this->mailer->send($message); 
    } 
} 

Để sử dụng nó trong một hành động khiển:

services: 
    mail_helper: 
     class:  namespace Blogger\Util\MailHelper 
     arguments: ['@mailer'] 

public function sendAction(/* params here */) 
{ 
    $this->get('mail_helper')->sendEmail($from, $to, $body); 
} 

Hoặc nơi khác mà không cần truy cập vào container dịch vụ:

class WhateverClass 
{ 

    public function whateverFunction() 
    { 
     $helper = new MailerHelper(new \Swift_Mailer); 
     $helper->sendEmail($from, $to, $body); 
    } 

} 

Hoặc trong một dịch vụ tùy chỉnh truy cập vùng chứa:

namespace Acme\HelloBundle\Service; 

class MyService 
{ 
    protected $container; 

    public function setContainer($container) { $this->container = $container; } 

    public function aFunction() 
    { 
     $helper = $this->container->get('mail_helper'); 
     // Send email 
    } 
} 

services: 
    my_service: 
     class: namespace Acme\HelloBundle\Service\MyService 
     calls: 
      - [setContainer, ['@service_container']] 
+0

Tôi đã triển khai mà không truy cập vào vùng chứa dịch vụ sau khi lỗi đến ====== Lỗi nghiêm trọng bắt được: Đối số 1 được chuyển đến Swift_Mailer :: __ construct() phải là một thể hiện của Swift_Transport, không được cho trước, –

+0

@MuhammadUmair yes , bạn phải chỉ định lớp truyền tải. Tôi đã không kiểm tra mã. Bạn nên theo dõi http://symfony.com/doc/current/cookbook/email/email.html – gremo

+0

@MuhammadUmair cũng xem http://swiftmailer.org/docs/sending.html – gremo

Các vấn đề liên quan