Ich habe vor einiger Zeit ein kleines Framework geschrieben und mich dafür entschieden, die erste Lösung zu verwenden, die du vorschlägst.
Behalte Aggregate Roots an der Wurzel des Domain-Modells:
Warum?
Eigentlich habe ich mir die gleiche Frage gestellt, die du heute stellst, und nach etwas Diskussion mit meinen Teamkollegen waren wir uns einig, dass es logischer erschien, den Klassennamen nicht im Namespace zu wiederholen.
Lass uns sehen, wie du deine Klassen mit Lösung Nr. 2 instanzierst
Customer\Customer
Customer\Address
Du musst schreiben:
$customer = new Customer\Customer();
$address = new Customer\Address();
Siehst du die Wiederholung? Es fühlt sich irgendwie nicht richtig an für mich. Meiner Meinung nach ist es wie
$customer->getCustomerId();
Warum den Kunden im Methodennamen wiederholen? Wir wissen, dass es die Kunden-ID ist, da wir ein Customer-Objekt verwenden.
Ein weiteres "schlechtes Ding" bei diesem Modell ist die Unmöglichkeit, reservierte Schlüsselwörter als Klassenname zu verwenden.
Zum Beispiel könntest du mit der Pear-Konvention die Klasse haben
Customer_Abstract
In Customer/Abstract.php, was für mich in Ordnung ist, aber wenn du versuchst, es mit einem Namespace zu übersetzen, erhältst du
namespace Customer;
class Abstract {}
was zu einem schwerwiegenden Fehler führt. Also müsstest du erneut das Domain im Klassennamen wiederholen:
namespace Customer;
class AbstractCustomer {}
$customer = new Customer\AbstractCustomer();
Jetzt sehen wir, wie du deine Klassen mit Lösung Nr. 1 instanzierst
Customer
Customer\Address
Du wirst schreiben:
$customer = new Customer();
$address = new Customer\Address();
Wir müssen den Kunden nicht mehr zweimal wiederholen, um die Customer-Klasse instanziiert. Es ist jedoch immer noch klar, dass Address mit Customer verbunden ist.
Das ist der Grund, warum ich mich für dieses Modell entschieden habe.
EDIT : Zend Framework 2 verwendet auch diese Konvention