Архитектурные вопросы в приложении (лог, настройки)

Вурдалак

Продвинутый новичок
Ну я вообще не очень понял, зачем может понадобиться именно корневой реквест параллельно с сабреквестом.
Чтобы этот subrequest создать. Это был пример кейса, когда нужно получить текущий $request в принципе. Просто получить $request. Через конструктор (точнее, сервис, который этот $request предоставит). Не через аргумент метода:
Последний пример RequestObject который содержит входные параметры, его можно передавать по цепочке, а можно получить через DI. Первое правильно, второе убивать. Если не понятно - то извините и смотрите выше.
 

AnrDaemon

Продвинутый новичок
Ребят, мне кажется, или вам нужен другой язык? Python или Lua например? Не PHP.
 

stalxed

Новичок
Нашёл живой пример для логики HraKK:

HraKK написал(а):
Последний пример RequestObject который содержит входные параметры, его можно передавать по цепочке, а можно получить через DI. Первое правильно, второе убивать. Если не понятно - то извините и смотрите выше.
Первый пример(правильный):
PHP:
services:
     acme_customer.customer_manager:
     class: Acme\CustomerBundle\Doctrine\CustomerManager
     arguments:
         - @doctrine

use Doctrine\Common\Persistence\ManagerRegistry;

class CustomerManager
{
     private $managerRegistry;
     public function __construct(ManagerRegistry $managerRegistry)
     {
         $this->managerRegistry = $managerRegistry;
     }
    public function createCustomer(Customer $customer)
    {
       // retrieve the right entity manager for this type of entity
       $entityManager = $this->managerRegistry->getManagerForClass(get_class($customer));
       $entityManager->persist($customer);
       $entityManager->flush();
    }
}
Второй пример(неправильный):
PHP:
services:
     acme_customer.customer_manager:
     class: Acme\CustomerBundle\Doctrine\CustomerManager
     arguments:
         - @doctrine.orm.default_entity_manager

use Doctrine\ORM\EntityManager;
class CustomerManager
{
     private $entityManager;
     public function __construct(EntityManager $entityManager)
     {
         $this->entityManager = $entityManager;
     }
    public function createCustomer(Customer $customer)
    {
        $this->entityManager->persist($customer);
        $this->entityManager->flush();
    }
}
Взято отсюда.

ИМХО! В некоторых случаях нужно тянуть цепочку вызовов, в некоторых нет, лучше передать некий объект "напрямую".
В каждой конкретной ситуации верен свой подход.
 

Redjik

Джедай-мастер
Вурдалак, мне кажется HraKK не умеет готовить DIC, может на си шарпе не популярно...
Сейчас вовсю играюсь с С++ и QT в частности (лень ковырять другие гуи), так там вообще атас с solid во всех туториалах... Барбара Лисков тихо плачет ))) Там редко используется DI, что уж говорить про контейнер... Всюду глобалы.

Php вместе с творением фабиена чуть ли не верх академического ооп...
 

fixxxer

К.О.
Партнер клуба
Redjik, ну DI на C++ без кодогенерации это вообще вещь нетривиальная. На темплейтах как-нибудь можно выкрутиться, конечно. Надо погуглить, как это делают :)

UPD: https://code.google.com/p/wallaroo/
UPD2: ЖЕСТЬ
 

stalxed

Новичок
C++ это вообще другая планета и другое измерение, если бы в качестве примера вы приводили код на C# или Java - понятно.
Но при чём тут C++?
Тогда уж C или ассемблер...
 

Redjik

Джедай-мастер
Ага, и есть еще одна либа , датируемая 2003 годом )))
Уже Гуглил, это не мейнстрим.
 

Вурдалак

Продвинутый новичок
Вурдалак, мне кажется HraKK не умеет готовить DIC, может на си шарпе не популярно...
Я думаю он пример с $request неудачный привел, а изначально я не так его понял, что речь идет о цепочке method call'ов. Хотя в любом случае изначально речь шла про логгер и передавать его через метод — я не могу придумать кейса, это в 99% через конструктор инжектится. Короче, он неплохо набросил.
 

stalxed

Новичок
Redjik, в PHP/Java/C# можно решать задачу в плане бизнес логики, не задумываясь о самом языке.
Не задумываюсь, что такое ОЗУ.

При работе с C++ забыть о существование ОЗУ нельзя.
Поэтому всё богатство паттернов GOF, P of EAA в С++ как-то бледнеет....
 

Вурдалак

Продвинутый новичок
stalxed, примеры в GoF написаны на C++. :) Хотя да, на C++ энтЫрпрайз-приложения видимо не особо пишут, одна из причин, почему я не люблю плюсы, там community другое, не любят Java и т.д.
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
stalxed, паттерны GoF написаны на C++ в примерах в книге. :) Хотя да, на C++ энтЫрпрайз-приложения видимо не пишут, одна из причин, почему я не люблю плюсы, там community другое, не любят Java и т.д.
Не, такое встречается, видел. Один раз, правда. Ынтырпрайз, джаву любят, пишут частично на плюсах.
 

stalxed

Новичок
Честно говоря - давно это было.
Сейчас посмотрел книгу GOF, там C++ в большинстве примеров(или во всех).
Хорошо, но блин, почему весь живой код на C++ выглядит - как геморойная работа с указателями, массивами и прочим.
Читаешь не бизнес логику, а математический код...
Видел немного кода крупного системного приложения(известный продукт) у товарища... Там тоже ужас - такое ощущение, что не решение задачи, а именно работа с переменными, указателями, массивами, уничтожением данных... И это шло в релиз....

Имхо, но не могу я назвать C++ ООП языком...

Но преуменьшить важность C/C++ невозможно. Эти являются важнейшими.

Я хотел сказать лишь одно, вся дискуссия текущий темы не совсем уместна по отношению к C++, к C# или к Java - вполне.
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Потому что это Си! Хоть и с плюсами. Язык изначально создавался, чтобы на нём нельзя было программировать.
 

AmdY

Пью пиво
Команда форума
stalxed, у тебя в обоих примерах жёстко задан класс объекта да ещё глобально для всего сервиса. Первый пример так же легко переписывается на глобалах и не теряет ничего
PHP:
services:acme_customer.customer_manager:
 class: Acme\CustomerBundle\Doctrine\CustomerManager
 arguments:
 - @doctrine

// меняем на config.php
$GLOBALS['services']['acme_customer.customer_manager'] = function($doctrine) {
    return new Acme\CustomerBundle\Doctrine\CustomerManager($doctrine);
}
 

stalxed

Новичок
AmdY, и как тогда правильно по феншую?

По поводу не теряет ничего - не верно, теряет, подробнее:
http://php-and-symfony.matthiasnoback.nl/2014/05/inject-a-repository-instead-of-an-entity-manager/
Раздел:
Something to be aware of: resetting closed entity managers
Лично натыкался...

Вкратце: если транзакция оканчивается не удачно, то соединение закрывается и entityManager становится бесполезным(он указывает на закрытое соединение)! Ничего с ним не сделаешь, т.е. класс CustomerManager тоже становится бесполезным.

Тогда как при получение через ManagerRegistry - создастся новый entityManager.
 
Последнее редактирование:

stalxed

Новичок
А, чёрт, не так понял, я про различие первого и второго подхода...

AmdY, тогда я реально не понимаю, как можно что-то потерять при подходе выше(там где код с $GLOBALS)?

P.S.: эта тема убийство времени, дальше её смотрю только в режиме Read Only.
 
Последнее редактирование:
  • Like
Реакции: AmdY
Сверху