For this example, I need to send an email via some AuthService
but not the others (FacebookAuthService
, GoogleAuthService
and LoginFormAuthService
should send an email, but ApiAuthService
should not, so I cannot use a AbstractAuth
parent class doing so).
Classes are related here since they are all about Auth but this is just an example. What about unrelated classes (one for Auth, one for Upload and so on)?
Given these classes:
class MailerService() { /* do stuff to send emails */}
class FacebookAuthService {
public function connect() {}
}
class GoogleAuthService {
public function connect() {}
}
class LoginFormAuthService {
public function connect() {}
}
class ApiAuthService {
public function connect() {}
}
Is it more efficient to do so (with a LoginMailService) :
class LoginMailService() {
public function send(User $user, MailerService $mailer) {
$mailer->sendTo($user->email());
$mailer->message('Login email message');
}
}
class FacebookAuthService {
public function connect(User $user, LoginMailService $loginMail) {
$loginMail->send($user->email());
}
}
class GoogleAuthService {
public function connect(User $user, LoginMailService $loginMail) {
$loginMail->send($user->email());
}
}
class LoginFormAuthService {
public function connect(User $user, LoginMailService $loginMail) {
$loginMail->send($user->email());
}
}
class ApiAuthService {
public function connect(User $user) {}
}
Or to do so (with Traits) :
trait SendLoginMailTrait {
private function sendLoginMail(User $user, MailerService $mailer) {
$mailer->sendTo($user->email());
$mailer->message('Login email message');
}
}
class FacebookAuthService {
use SendLoginMailTrait;
public function connect(User $user) {
$this->sendLoginMail($user->email());
}
}
class GoogleAuthService {
use SendLoginMailTrait;
public function connect(User $user) {
$this->sendLoginMail($user->email());
}
}
class LoginFormAuthService {
use SendLoginMailTrait;
public function connect(User $user) {
$this->sendLoginMail($user->email());
}
}
class ApiAuthService {
public function connect(User $user) {}
}