Bir ActiveRecord BaseModel
sınıfım var ve onlardan devralan bir çok sınıf modeli var. Ve Bookmark
sınıfına da sahibim, bu da BaseModel
'dan miras alınmış. Ayrıca, ben Decorator
-inherited sınıfları var, onlar tek bir model (getModelView(model)
yöntemi) temsil etmek için özel bir arabirim uygular. i Yerimlerine modeli biraz söz konusu Görünümü değiştirmek istediğiniz kadarActiveRecord sınıfı için uygun desen
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())
Böylece, her şey iyi görünüyor: Bu, bazı sözde koddur. Bu görünüm için özel bir başlık eklemek istiyorum. Ve bunu dekoratörün içinde yapamıyorum çünkü sadece bir yer imleri için değil.
DÜZENLEME: Yani, problem - bir dekoratör paternine ihtiyacım var gibi görünüyor, ama ben TestModel speical yöntemlerini kullanarak beton TestDecorator, çünkü miras almak için bir şey yok. Yani şimdi ben sihirli yöntemler (PHP) kullanarak, bazı gerçekten kötü gerçekleşmesini yaptık: Yani şimdilik çalışacak
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];
}
}
ancak kod yapısı, okunabilirliği ve istikrar açısından gerçekten kötü bir karar.
benim 2cents: getBookmark değiştirmek() özel başlığı ile bir model geri verilmesi gereken depolama değiştirmek gerekiyorsa
Sonra yine sadece depolama mekanizması süsleyin. Görünüm sadece bir işleyicidir, jenerik kalmalıdır. – lucasg
getBookmark, BaseModel'den gelen herhangi bir modeli döndürür. BaseModel 'getName() 'soyut yöntemine sahiptir. Bir çeşit dekoratör deseni yaptım (ama gerçek dekoratör değil, miras alacağım bir dersim yok.) – UnstableFractal
Şimdi 'baseModel' öğesine setName() 'yi eklemeyi düşünüyorum. Ve veritabanından aldıktan sonra 'BookmarkModel'' getBookmark' yönteminde ayarlayarak. Bence daha kolay karar. Başka gerekli işlevsellikle karşılaşacağımı sanmıyorum. – UnstableFractal