使用ORM时,在laravel中指定非DB函数的位置?

时间:2015-04-16 08:06:46

标签: laravel laravel-5

例如我有一张桌子商店。 所以我有ORM模型Shop。

我需要一个向店主发送电子邮件的功能。:

function sendEmail($body){
}

现在我想要这项工作:

Shop::find(1)->sendEmail('Email body to one shop')
Shop::all()->sendEmail('Send bulk email')

sendEmail函数放在哪里?在ORM模型中?
什么是最好的?

1 个答案:

答案 0 :(得分:1)

这应该是邮件服务。理想地致力于界面。

类似的东西:

$shop = Shop::where('postcode', '=', 44444)->first();
AppMailer::send($shop);
AppMailer::bulk(Shop::where('postcode', '=', 44444));

服务方法,服务类

// Single send
function send(IMailable $mailable) 
{
    // do mail stuff here
    // the mail service doesn't even need to care if its 
    // eloquent or not
    $this->doSomething($mailable->email); 
}

// Bulk send
function bulk(Collection $mailables)
{
    foreach ($mailables as $mailable)
    {
        if($mailable instanceof IMailable) 
        {
            $this->send($mailable);
        }
    }

}

可以在您的IMailer界面类中使用

interface IMailable {
    public function getEmailAddress();
    public function getName();
}

在某处购物

class Shop extends Eloquent implements IMailable {
    // bla bla your normal attributes for a shop

    // add some special attributes to statisfy the mailable contract
    public function getEmailAddress() 
    {
        return $this->email;
    }

    public function getName()
    {
        return $this->streetNumber . ' ' . $this->streetName;
    }
}

关于这一切的好处是,以后如果你想发送电子邮件Cafes以及Shops,你只需要确保你的Cafe类实现IMailable并且你笑了通往商店的路,以及咖啡馆。