Ich habe eine ActiveRecord BaseModel
Klasse und viele Klassen-Modelle, die davon erben. Und ich habe eine Klasse Bookmark
, die von BaseModel
geerbt wird. Ich habe auch Decorator
-inherited Klassen, sie implementiert spezielle Schnittstelle, um einzelnes Modell (getModelView(model)
Methode) darzustellen. Dies ist einige Pseudo-Code:Geeignetes Muster für ActiveRecord Klasse
TestModel inherits BaseModel
getName:
return this.name
BookmarkModel inherits BaseModel
BaseModel model
getBookmark:
return this.model
TestDecorator inherits BaseDecorator implements SingleModelViewInterface:
getView(model):
return 'view' //html-view of model
BookmarkDecorator inherits BaseDecorator
getBookmarksView(BookmarkModel[] bookmarks):
foreach(bookmarks > bookmark):
decorator = Relation::getDecoratorByModel(bookmark->getEntityType())
decorator->getView(bookmark->getBookmark())
Also, alles sieht gut aus, bis ich für Markiert Modell ein wenig, dass die Ansicht ändern möchten. Ich möchte einen benutzerdefinierten Titel für diese Ansicht hinzufügen. Und ich kann es innen nicht schaffen, weil es es nicht nur für ein Lesezeichen macht.
EDIT: Also, das Problem ist - scheint, dass ich ein Dekorator Muster brauche, aber ich habe nichts zu erben, weil konkrete TestDecorator TestModel speical Methoden verwenden. So, jetzt habe ich einige wirklich schlechte Realisierung getan, magische Methoden (PHP):
class BookmarkedModel {
/** @var BaseEntityModel*/
private $model;
public function __construct(BaseEntityModel $model) {
$this->model = $model;
}
public function getName() {
return 'Bookmark '.$this->model->getName();
}
public function __call($name, $arguments) {
return call_user_func_array(array($this->model, $name), $arguments);
}
public function __get($name) {
return $this->model->$name;
}
public function __set($name, $value) {
return $this->model->$name[$value];
}
}
So wird es für jetzt arbeiten, aber in Bezug auf die Code-Struktur, Lesbarkeit und Stabilität ist es wirklich schlechte Entscheidung.
meine 2cents: modifizieren GetBookmark() das Modell mit dem benutzerdefinierten Titel zurückzukehren. Die Ansicht ist nur ein Renderer und sollte generisch bleiben. – lucasg
getBookmark gibt jedes Modell zurück, das von BaseModel erbt. BaseModel hat die abstrakte Methode 'getName()'. Ich habe irgendeine Art von Decorator-Muster gemacht (aber es ist nicht der eigentliche Dekorator, ich habe keine Klasse, von der ich erben könnte.) – UnstableFractal
Jetzt denke ich darüber nach, 'setName()' zu 'BaseModel' hinzuzufügen. Und setzen Sie es einfach in 'BookmarkModel'' getBookmark' Methode nach dem Abrufen aus der Datenbank. Ich denke, es ist einfacher Entscheidung. Ich glaube nicht, dass ich mit einer anderen erforderlichen Funktionalität konfrontiert werde. – UnstableFractal