Nerede kod hiçbir çoğaltılması olduğunu, böylece bir MVC çerçevede postaları göndermek için mi?

3 Cevap php

It's a MVC question. Here is the situation:

  1. Ben "gruplar" var bir uygulama yazıyorum.
  2. Sen kendi e-posta yazarak ve "davet" tıklayarak gruplara başka kişileri davet edebilir.
  3. A) web arayüzü ve b) API: Bu işlevsellik denebilecek iki yolu vardır
  4. Gönderen posta ben postalar (SMTP gönderme başarılı olursa, yani. Şu anda, ben posta sıçrar raporlama not ilgileniyorum) başarıyla gönderildiği kullanıcıya rapor etmek istediğinizden bittikten sonra.

Yani, hiçbir kod çoğaltılması olduğunu bu yüzden nasıl tasarım gerektiğini düşünüyorum. Yani, API ve web arayüzü kod kısmını paylaşmak gerekir.

To do this, I can create the method "invite" inside the model "group". So, the API and and the Web-interface can just call: group->invite($emailList); This method can send the emails. But the, problem is, then I have to access the mail templates, create the views for the mails, and then send the mails. Which should actually be in the "View" part or at least in the "Controller" part.

Bu durumda en zarif tasarım nedir?

Not: Ben gerçekten Modelinde bu yazmak düşünüyorum. Benim tek şüphe: daha önce ben "sunum" olarak da postaları gönderme düşündüm. Bu çıktı üreten bir farklı bir biçimi olarak kabul edilebilir olduğu için.

Added after edit

Ben Görünüm mutlaka tarayıcıya çıktı olmak zorunda olmadığını anlıyorum. Benim şüphe nerede ve olmasıdır. Şimdi sorun, benim app bir "görev listesi" var demek. Biz bazı millet için bir görev atayabilirsiniz. Şimdi "assignTo" yöntemi iki durumda çağrılabilir: 1) görevi oluştururken 2) Başkasına bir görev atayabilirsiniz.

Her iki durumda da, yeni devralan e-posta bildirimi almak gerekir. "Görev denetleyicisi oluşturmak" ve "görevi denetleyicisi yeniden atamak:" yöntemi "assignTo" posta gönderme değilse Yani, biz iki yerde posta kısmını çoğaltmak zorunda.

Ben bu tekrarından kaçınmak istedim.

3 Cevap

Ben bu gibi yapmak için en iyi yol anladım sonunda Kohana postalama sistemle birlikte aynı şüpheleri kendimi vardı;

Her birine ayrı ayrı kullanılan mailler sınıfları (fabrikalar) için uzatmak, posta göndermek için yöntemler içerir bir ana 'mailler' sınıfı (sarıcı) var;

application / classes / mailer.php:

abstract class Mailer {

        protected $from;
        protected $to;
        protected $cc;
        protected $bcc;
        protected $subject;
        protected $body;
        protected $reply_to;
        protected $sent_on;
        protected $content_type = 'text/html';
        protected $headers;

        protected $template;

        public static function factory($name)
        {       
            $class = 'Mailer_'.$name;

            return new $class();
        }

        public function __construct()
        {
            return $this;
        }

        public function send($save = FALSE)
        {
            // send the email using swift mailer, zend_mail, phpmailer, whatever..
        }

        protected function save($to, $subject, $body, $headers)
        {

        }
    }

application / classes / mailler / User.php

class Mailer_User extends Mailer {

        // Who is sending the mail
        protected $from         = "users@domain.com";

    // Content type of the email
    protected $content_type = 'text/html';

    public function email_activated($name, $email)
    {
        $this->to      = $email;
        $this->subject = 'Your email has been verified';
        $this->body    = View::factory('mailer/user/email_verified')
                           ->set('name', $name)
                           ->render();

        return $this;
    }
}

ve daha sonra kod fabrika gibi kullanın;

Mailer::factory('user')
    ->email_activated( $user->username, $user->email)
    ->send();

siz istediğiniz yerden e-posta gönderme.

Görünüm mutlaka görmek için kullanıcı alır tarayıcıya bir çıkış olmak zorunda değildir. Ayrıca e-postayla ediliyor şablon olabilir. Kontrolör, ne yapmak giriş alır Modelden gerekli bilgileri ister ve çıkış kullanıcılar Görünüm bu bilgileri. Bu durumda, Görünüm e-posta şablon olacak ve Denetleyici bu çıkışı e-posta görevi vardır.

View: click "invite" (or for the API: send an invite command);
Controller: user clicked "invite", get data from model;
Model: Controller requests data (emails for specific folks or whatnot), return;
Controller: receives data from Model, setup data for the View (template) and email the "View".

Bundan sonra, API şey dönmek, ya da çıkış için davet işlenmiş olduğunu söyler kullanıcı web arayüzü için bir görünüm denetleyicisi söyle.

Modeli tüm sarma kendisi yapar (ve halka açık olmayan diğer yöntemler tutar) için hiçbir ek sarıcı, gerekli - API kendisi modelinde tüm kamu yöntemleri grubudur. Resmi bir daha Uygulamanın kendisi başka bir API kullanmak gerekir (böylece tekrarını önlemek).

Ben böyle bir şey yapmak istiyorum:

sendMail(array $recipients);
sendGroupMail($group_id) not{
    sendMail(/*get recipients by group_id*/);
};