Skip to content

Instantly share code, notes, and snippets.

@adamwathan
Created January 27, 2016 13:03
Show Gist options
  • Save adamwathan/2ccbc0f6fe3f3b31ed3d to your computer and use it in GitHub Desktop.
Save adamwathan/2ccbc0f6fe3f3b31ed3d to your computer and use it in GitHub Desktop.
Dealing with Dependencies in Active Record Models — Option #3: Composing a new domain object
<?php
// The Domain Object
class Invitation
{
private $invitationRecord;
private $mailer;
public function __construct(InvitationRecord $invitationRecord, Mailer $mailer)
{
$this->invitationRecord = $invitationRecord;
$this->mailer = $mailer;
}
public function send()
{
$this->mailer->send('emails.invitation', ['invited_by' => $this->invitationRecord->user], function ($m) {
$m->to($this->invitationRecord->recipient)->subject("You've been invited to my app!");
});
}
}
<?php
class InvitationBuilder
{
private $mailer;
public function __construct(Mailer $mailer)
{
$this->mailer = $mailer;
}
public function create($recipient, $invitedBy)
{
$invitationRecord = InvitationRecord::create([
'recipient' => $recipient,
'invited_by' => $invitedBy->id,
]);
return new Invitation($invitationRecord, $this->mailer);
}
}
<?php
// The Active Record model
class InvitationRecord extends Model
{
protected $table = 'invitations';
public function user()
{
return $this->belongsTo(User::class, 'invited_by');
}
}
<?php
class InvitationsController extends Controller
{
private $invitationBuilder;
public function __construct(InvitationBuilder $invitationBuilder)
{
$this->invitationBuilder = $invitationBuilder;
}
public function store()
{
$recipient = request('recipient');
$invitedBy = auth()->user();
$invitation = $this->invitationBuilder->create($recipient, $invitedBy);
$invitation->send();
return response('', 204);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment