Wo soll die Validierung stattfinden?

Ich möchte MVC-Muster in meinem PHP-Projekt verwenden. Ich möchte auch das Dao-Service-Muster für die Modellebene verwenden, da es die Datenbank-Engines leicht austauschbar macht und die Geschäftslogik von der DB-Interaktion fernhält.

Jetzt,Ich habe gehört Diese Validierung sollte in der Modellebene erfolgen, da die Controller nur für den Datentransport verantwortlich sind. Das ist ziemlich vernünftig.

Sollte es jedoch in der Service-Schicht oder in Entitäten selbst implementiert werden?

Ansatz 1: Validierung in Entitäten
class Post extends Entity
{
    protected $title;

    public function getTitle()
    {
        return $this->title;
    }

    public function setTitle($newTitle)
    {
        if (strlen($newTitle) == 0)
            throw new ValidationException('Title cannot be empty.');
        $this->title = $newTitle;
    }
}

class PostService
{
    public static function saveOrUpdate(Post $post)
    {
        PostDao::saveOrUpdate($post);
    }
}

Vorteile:

Ich weiß sofort, ob ich etwas falsch mache,alles ist an einem ort, was wie eine gute sache scheint.

Nachteile:

viel Boilerplate-Code durch ausgefallene Setter und Getter,Fügt der Entität eine Geschäftslogik hinzu, was eine schlechte Sache zu sein scheint (insbesondere, wenn die Validierung sehr komplex ist - z. B. Datenbank / andere Dienste abfragen muss).Das Serialisieren und Deserialisieren kann schwierig werden.Ansatz 2: Validierung im Betrieb
class Post extends Entity
{
    public $title;
}

class PostService
{
    public static function saveOrUpdate(Post $post)
    {
        if (strlen($post->title) == 0)
            throw new ValidationException('Title cannot be empty.');
        PostDao::saveOrUpdate($post);
    }
}

Vorteile:

Hält die Geschäftslogik im Dienst, was eine gute Sache zu sein scheint.Kesselplatte ist auf ein Minimum beschränkt.

Nachteile:

Ich weiß nicht sofort, wann etwas schief geht undWas ging eigentlich schief.Ich kann nicht garantieren, dass die Validierung tatsächlich erfolgt, bevor sie in der Datenbank gespeichert wird. Ein Beispiel: Ich muss Post in zwei Routinen speichern, vergessen zu verwendenPostService::saveOrUpdate Proxy in einem von ihnen und tun es direkt überPostDao::saveOrUpdate. Die Validierung findet in dieser Routine nicht statt, und die einzige Hoffnung des Projekts sind jetzt Unit-Tests oder ich selbst, wie ich sie im Code finde. Daher ist Code in dieser Hinsicht schwieriger zu warten.

Hast du irgendwelche Hinweise, SO? Vermisse ich etwas? Bis jetzt ist das Projekt in Planung, also bin ich zu allem bereit.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage