{ "_id": 1 "name": "Acme", "createdAt" : ISODate("2016-01-30T15:40:59.153Z") "billing" : { "totalCost" : 100, "expire" : ISODate("2016-02-30T08:18:52.000Z"), }, "settings": { "language" : "en", "logo" : '/ptah/to/logo.png', "color" : { "plugin" : "#496492", "button" : "#46A0D8" }, }, "tags" : [ "tag1", "tag2", "tag3" ], }
Zastanawiam się nad uzyciem któregoś z wzorców projektowych,
chciałbym aby wyglądało to mniej wiecej tak:
class Company { protected $company = null; public function getCompany() { $this->company = Company::where('_id', 1)->first(); } } class Billing { protected $company = null; public function setBilling() {/*ustawia dane*/} } class Settings { public function setSettings() {/*ustawia dane*/} } class Tags { public function setTags() {/*ustawia dane*/} } $companyModel = new Company(); $companyModel->getCompany(); $companyModel->setBilling([ 'totalCost' => 500 ]); $companyModel->setSettings([ 'language' => 'pl', 'logo' => '/nowy/path/logo.png' ]); $companyModel->setTags([ 'tags' => ['tag4', 'tag5', 'tag6'] ]); $companyModel->save();
Czyli mamy gówną klasę która pobiera całą kolekcje i teraz w "globalnym" atrybucie przetrzymujemy wszystkie dane,
a odwołując się do metod innych klas mogę zmienić dane poszczególnych subkolekcji i na końcu zapisać wszystkie zmiany
Myślałem nad wzorcem Obserwatora albo Fasady, ale żaden z nich do końca mi nie pasuje
$settingsModel = new Settings(); $settingsModel->setSettings([ 'language' => 'en' ]); $settingsModel->save();
Chciałbym też aby poszczególne klasy mogły działać także osobno.
Jakieś pomysły jaki wzorzec projektowy wykorzystać do takiego zadania?