Aplikację tworzę w Laravel'u. Mam formularz kontaktowy. Formularz trzeba wyświetlić. Po submitowaniu formularza trzeba dokonać walidacji danych i wysłać wiadomość. Wiem jak zrobić aby wszystko działało. Zależy mi jednak na tym aby napisać 100% czysty kod i aby zachować SOLID - tak aby nie można było się do niczego przyczepić.
Pierwsza kwestia : kontrollery - zrobić jeden kontroller i stworzyć dwie metody 1 - showContactForm, 2 - sendMessage. Czy może zrobić dwa kontrollery jeden do wyświetlania strony z formularzem a drugi do wysyłania wiadomości, każdy zawierający jedną metodę?
Druga kwestia, jak należałoby zapisać kod wysyłający wiadomość? Naklepanie wszystkiego po kolei w kontrolerze nie jest dobrym pomysłem. Przemyślałem wszystko i postanowiłem zorganizować kod w ten sposób. Npiszcie mi co o tym myślicie.
Kod kontrolera
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Constans\NotificationType;
use App\Factories\NotificationsFactory;
class SendMessageFromUserController extends Controller
{
private $notification;
public function __construct(NotificationsFactory $notificationFactory)
{
$this->notification = $notificationFactory->getInstance(NotificationType::SEND_MAIL_TO_OWNER);
}
public function sendMessageFromUser()
{
return $this->notification->notify();
}
}
Kod fabryki powiadomień
namespace App\Factories;
use App\Constans\NotificationType;
use App\Interfaces\Notifiable;
use App\Notifications\Validators\MailMessageFromUserValidator;
use App\Notifications\Validators\MailMessageFromUser;
class NotificationsFactory
{
public function getInstance(NotificationType $notificationType) : Notifiable
{
switch($notificationType)
{
case NotificationType::SEND_MAIL_TO_OWNER:
return $this->buildOwnerMailNotification();
break;
}
}
private function buildOwnerMailNotification()
{
$validator = new MailMessageFromUserValidator();
return new MailMessageFromUser($validator);
}
}
Kod klasy wysyłającej maila
namespace App\Notifications;
use App\Interfaces\NotificationValidator;
use App\Interfaces\Notifiable;
class MailMessageFromUser implements Notifiable
{
private $validator;
public function __construct(NotificationValidator $validator)
{
$this->validator = $validator;
}
public function validate()
{
}
public function notify()
{
}
}
Kod walidatora
namespace App\Notifications\Validators;
use App\Interfaces\NotificationValidator;
class MailMessageFromUserValidator implements NotificationValidator
{
public function validateNotification($message)
{
}
}
Może tak być?