[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Комбинируемый класс
Страницы: 1, 2
Shurik_17
Название сам придумал, даже не знаю как назвать иначе ибо множественно наследования по запросам в поисковике не дает нужной информации)) Сильно не пинайте за "креатив", я новичок))

Задача такая

- есть общие категории товаров
- есть торговые центры у которых есть категории
- есть категории витрин

модели (такие как страницы и категории) для всех этих объектов разные но по сути копипаст

У торговых центров есть
- страницы
- категории

далее у витрин есть
- товары
- страницы
- категории

К примеру, класс StoreModel с множеством методов для реализации вышеописанного (нарушение паттернов и все такое) - получилось не красиво. Решил разнести все методы по своему назначению для этого использовал trait - с виду ничего так, простенько но все работает как надо))

class StoresModel extends Core
{
use store\storeBase, // класс с общим назначением
store\storeCategories, // класс категорий
store\storePages; // класс страниц
}

trait storeBase
{
....
}

trait storeCategories
{
....
}

... и прочие

Потом подумал - Категории и страницы у всех объектов имеют схожую функциональность, почему бы не вынести функциональность категорий в отдельный класс и унаследовать его в нужном месте. Но вот тут и возник вопрос КАК?

получается что

trait storeCategories
{
....
}


должен получить методы от общего класса Categories
chee
Это решается любой ORM, я не понимаю зачем тут трейты.

$tradeCenter = $tradeCenterRepository->findById(100);
$tradeCenter->categories->add($newCategory);


$showCases = $tradeCenter->getShowCases();

foreach ($showCases as $showCase) {
echo $showCases->categories->first()->getId() . "\n";
}


Да даже не используя ORM, а только datamapper, все равно тут трейты не нужны. Короче ты сильно завязал объекты и реализацию их хранения.

Просто спроектируй объекты и их отношения без хранения в БД. После того как спроектировал, используй паттерн Data mapper, что бы сохранить или извлечь из БД созданные тобой объекты и отношения между ними.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Shurik_17
Цитата (chee @ 17.08.2017 - 09:56)
Это решается любой ORM, я не понимаю зачем тут трейты.
<pre class="sh_sourceCode" rel="php">
<span class="sh_variable">$tradeCenter</span> <span class="sh_symbol">=</span> <span class="sh_variable">$tradeCenterRepository</span><span class="sh_symbol">-></span><span class="sh_function">findById</span><span class="sh_symbol">(</span><span class="sh_number">100</span><span class="sh_symbol">);</span>
<span class="sh_variable">$tradeCenter</span><span class="sh_symbol">-></span>categories<span class="sh_symbol">-></span><span class="sh_function">add</span><span class="sh_symbol">(</span><span class="sh_variable">$newCategory</span><span class="sh_symbol">);</span>


<span class="sh_variable">$showCases</span> <span class="sh_symbol">=</span> <span class="sh_variable">$tradeCenter</span><span class="sh_symbol">-></span><span class="sh_function">getShowCases</span><span class="sh_symbol">();</span>

<span class="sh_control">foreach</span> <span class="sh_symbol">(</span><span class="sh_variable">$showCases</span> <span class="sh_control">as</span> <span class="sh_variable">$showCase</span><span class="sh_symbol">)</span> <span class="sh_cbracket">{</span>
    <span class="sh_function">echo</span> <span class="sh_variable">$showCases</span><span class="sh_symbol">-></span>categories<span class="sh_symbol">-></span><span class="sh_function">first</span><span class="sh_symbol">()-></span><span class="sh_function">getId</span><span class="sh_symbol">() .</span> <span class="sh_string">"</span><span class="sh_escape">\n</span><span class="sh_string">"</span><span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>
</pre>

Да даже не используя ORM, а только datamapper, все равно тут трейты не нужны. Короче ты сильно завязал объекты и реализацию их хранения. 

Просто спроектируй объекты и их отношения без хранения в БД. После того как спроектировал, используй паттерн Data mapper, что бы сохранить или извлечь из БД созданные тобой объекты и отношения между ними.

Посмотри на данный паттерн либо не понял либо у меня цель немного другая

суть в том что бы обратится к дочерним классам через основной класс, но притом дочерние классы могут унаследовать функциональность от общих классов. При этом ксласс StoreClass сам по себе не имеет ни каких методов, он как бы маршрутизирует обращение в нужный исполняющий класс.

К примеру

отправит нас в класс StoreClass::CategoriesClass
$categoreis = $this->stores->getAllCategories();

отправит нас в класс StoreClass::CategoriesClass
$categoreis = $this->stores->getCategory($id);

а класс CategoriesClass в свою очередь реализует функциональность общего класса
CommonClasses:: CategoriesClass



StoreClass
---- CategoriesClass
---- PagesClass

CommonClasses
---- CategoriesClass

StoreClass::CategoriesClass extends CommonClasses:: CategoriesClass

Трейт с этим справляется частично беда в том что он не может унаследовать функциональность другого класса

не уверен что внятно изложил.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.