Ответы пользователя по тегу Yii
  • UML-модель Yii2-приложения, реализация интерфейса группой классов. Как? Есть ли под это паттерн?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Нужен спец по ООП и UML, который работал в своё время с MVC!


    Наблюдаю тут несостыковку. Обычно когда говорят о UML - вот все эти вещи вроде контроллеров и т.д. расписываются на уровне компонентов. В UML обычно описывают только доменную логику, то есть то что важно.

    В любом случае в Yii такие подходы работают очень плохо. Там вы не ООП делаете а базу данных проектируете (это чуть разные вещи), и все остальное уже от этого отталкивается.

    Если вы хотите по UML фигачить (не понятно зачем правда, но это уже ваше дело), то имеет смысл брать какую ORM заточенную под ОО-first (по сути Doctrine2 из ныне существующих) и там уже развлекаться. Там профит будет.

    p.s. забудьте об этой бесполезной для бэкэнда аббревиатуре MVC. Пока вы "проектируете контроллеры" - толку от него нет (ну то есть пока у вас логика работы с данными в контроллере).

    Читаю GOF, Зандстру и т.п.


    Почитайте Applying UML and Patterns - Craig Larman - замечательная книга. Еще дядю боба можете почитать (про SOLID). Если вас интересуют темы проектирования то это будет полезно. Еще раз уж заговорили о проектировании логики предметной области - Эрик Эванса - Предметно ориентированное проектирование.

    Задача 1


    1) композиция всегда лучше наследования
    2) наследование нужно для того что бы организовать подтипы. Если у вас есть сущности которые по своей природе требуют наследование - то можно. А так - лучше его избегать. ООП как бы не про наследование вообще.
    3) интерфейсы нужны для того что бы организовать инверсию зависимости и/или полиморфизм подтипов. У Лармана можете почитать про protected variations для того что бы понять зачем их юзать.

    Задача 2


    В UML отношения между типами очень легко и просто отображаются:

    bell_fig10.gif
    - Base[classname] - wrappers для обеспечения ровного обновления самого Yii в дальнейшем, не обращайте внимания.


    Как это не обращать внимания если вы делаете UML ради UML? Пока я не увидел ничего от ООП на вашей диаграмке. Есть структуры данных с публичными пропертями, есть... контроллеры (внезапно) которые мутируют состояние этих структур.... Это не ООП - это процедурное программирование с классами.

    для такой простой задачи я пилю UML исключительно в целях тренинга


    Пока это выглядит как впустую потраченное время, поскольку вы выбрали не лучший инструмент (yii) что бы тренироваться проектировать ОО решения.

    Я рекомендовал бы вам:

    - Разобраться что такое ООП на самом деле (это не про инкапсуляцию. полиморфизм и уже тем более не про наследование ибо все это было еще до ООП и все это кроме наследования является важными принципами структурного программирования). Это про сокрытие состояния и управление зависимостями (связанность, coupling & coheasion у Лармана)
    - Взять более подходящие для проектирования ОО решений инструменты (какой-нибудь модный нынче Laravel + Doctrine2)
    - если хотите продолжать баловатся с Yii сделайте так, что бы логика предметной области ничегошеньки не знала о Yii, тогда вообще не нужно будет заниматься этими Base* классами. Почитайте про Row Data Gateway (это по сути предшевственник ActiveRecord) а именно как оно использовалось в контексте модели предметной области.

    Есть ли под это паттерн?


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

    Оригинальная книга по GoF в этом плане так себе, сейчас лучше смотреть в сторону Head First Design Patterns Ну и помимо паттернов нужно разобраться с общими принципами такими как закон деметры, SOLID, GRASP и т.д. Тогда понимание всего будет более системным.
    Ответ написан
  • Как организовать фабрику?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Может ну его? Реально? Попробуйте прочитать этот код кому-нибудь, он же не читается. Понятия не имею почему вы решили назвать репозиторий для продукта CatalogProductRepository. Или зачем вам фабрика. Ну и еще - зачем вы инстанцируете все руками. И что это за true.

    Оба варианта как по мне изобилуют излишней сложностью, неочевидны и т.д. и т.п.

    Я предлагаю вам вооружиться DependencyInjection. Реализация оного есть в любом уважающем себя фреймворке. И избавьтесь от непонятных и неявных констант.

    Моя "идея" заключалась лишь в использовании декоратора для реализации логики кеширования. Суть идеи простая - что бы добавить кеширование не нужно ничего править ни в логике использующую репозиторий, ни в самом репозитории.
    Ответ написан
  • Как реализовать очередь выполнения операций?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    www.yiiframework.com/extension/yii2-beanstalk - если не хотите тянуть с собой java для gearman или erlang для rabbitmq.

    Все операции ставим в очередь, обрабатываем в воркерах в фоне.
    Ответ написан
  • Почему современный фрамеворки отказываются от recoverable error?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    что создание ошибок вида E_USER_NOTICE/E_USER_WARNING уже вызовет завершение работы приложения.


    error reporting level вы все еще контролируете. Вообще в продакшен коде у нас не должно быть нотисов или варнингов, но иногда проще просто отключить.

    В целом все идет к более явной обработке ошибок. Осталось только оператор подавления ошибок убрать.

    Есть сервис в вакууме рассылки смс к которому подключено два шлюза (основной и запасной).


    Ваша ситуация прекрасно разруливается исключениями.

    я уже не могу так просто бросить себе recoverable error и приходиться городить огород


    Научитесь пользоваться исключениями. В php7 в принципе даже ошибки парсинга теперь вызывают исключения.
    Ответ написан
  • Что было не так с ArrayHelper::index до Yii2 2.0.8?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Это Yii.

    Ancient-Aliens.jpg

    В целом просто посмотрите историю коммитов. Вот с этого коммита появился третий параметр:

    https://github.com/yiisoft/yii2/commit/ef8b0a2be0f...
    Ответ написан
  • Так что же выбрать для REST API -> ORACLE, (NODE vs PHP)?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вам дела делать или играться? Если играться - попишите на ноде, заодно и опыта наберетесь. А если дела делать - php, раз опыт есть.

    Под вашу задачу что угодно сойдет, а ангуляру плевать на чем реализована серверная часть, лишь бы вы правильно апишку сделали.
    Ответ написан
  • Немного про замыкания в PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    А каковы границы тут ?


    А тут никто никуда не ходит вообще. У вас есть скоуп функции и наружу вы ходить не можете. Вы можете снаружи прокидывать нужные переменные в скоуп вашего замыкания (use ($tax, &$total)). То есть вы просто даете вашему замыканию попользоваться этими переменными.

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

    p.s.
    Но в вашем случае в этом нет ровным счетом никакого смысла. Если вам надо просто сумму посчитать - вам стоит использовать функцию array_reduce, правда тогда придется изменить еще и способ, как вы храните ваши "продукты". А еще вот эта штука:

    $pricePerItem = constant(__CLASS__ . "::PRICE_" .
                        strtoupper($product));


    Попахивает "дурными решениями". Пощадите тех, кто будет работать с вашим кодом через пол года (даже себя самого). Код должен быть не "коротким" а "понятным". Код чаще читают чем пишут. Все должно быть не двусмысленно, выражать что вы хотели сделать и не требовать комментариев (а все что требует комментариев выносится в приватные методы с адекватным названием).
    Ответ написан
  • Есть ли смысл ри изучении YII 2 заглядывать в книги по первой версии фреймворка?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    в книгах по фреймворкам особо смысла нет изначально. Читаем документацию и читаем больше книг (классика, вроде Фаулера, Кента Бэка и т.д.)
    Ответ написан
  • Есть ли смысл изучать, писать на ActiveRecord?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    им реально кто-нибудь пользуется?


    Больше чем нужно, скажем так. Как и любую модную технологию ее часто используют там где не надо и как не надо.

    Просто стоит уяснить что вы не ограничены конкретными инструментами. Даже если у вас половина проекта использует AR, для сложных выборок можно обойтись и без него упростив себе жизнь.
    Ответ написан
  • Как лучше организовать рассылку html писем в php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    mailchimp, sendgrid

    Сделать нормально почту, что бы не попасть в спам базу, что бы все было ок - это очень дорогое удовольствие. стандартый mail не катит. Ну либо вам придется потратить много времени что бы нормально настроить postfix.

    А верстка писем - это уже отдельное развлечение.
    Ответ написан
  • Что обозначает такая ошибка в codeception?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    там все написано же. Идем по ссылке:

    curl.haxx.se/libcurl/c/libcurl-errors.html

    и смотрим что значит ошибка со статусом 7
    Ответ написан
  • Как настроить REST авторизацию для AngulagJS и Yii2?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    и у каждого свой подход

    Пожалуй это ключевая фраза. У каждого на самом деле свой подход. Кто-то делает авторизацию исключительно через Yii и потом аунтентификация проходит тупо по кукам, кто-то использует токены, кто-то JWT. Подходов масса.

    Основное не понимание как на фронте управлять видимостью различных областей.

    У пользователя есть права. Это либо роль, либо список действий которые он может совершать. Словом все примерно как и на бэкэнде. Далее вы можете условия в шаблонах ставить или еще как. Для ангуляра есть несколько подходов организации ACL. В том числе готовых тоже много.

    В какую сторону тут копать?

    Фронтэнд не сильно отличается от бэкэнда. Вспомните как вы делали приложеньки с обычными формачками и т.д. Вот тоже самое, только теперь у вас нет "перезагрузки", то есть приложение живет пока открыта вкладка. Ну и в качестве базы данных у нас HTTP API какое-то. Вот и вся разница.

    Архитектура же приложения примерно такая же. Разве что есть нюансы. UI нужно дробить на независимые маленькие компоненты, желательно не имеющие своего состояния и пробрасывать им оное сверху. Ну и все такое.
    Ответ написан
  • Yii2: как создать структуру HMVC?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Организовать это дело вы можете используя видеты. Через них можно реализовать разделения UI на компоненты и продолжать вложенность оных строя иерархии компонентов/виджетов.
    Ответ написан
  • Yii & Yii2. Как вы управляете связанными данными?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Как поступаете Вы в такой ситуации?

    использую Doctrine2 которая хэндлит подобные штуки.
    Ответ написан
  • Как "закоммитить" папку vendor в composer?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Дополню ответ sunrails

    Тут либо коммит в оригинальный репозиторий, либо клон от оригинала и изменять в нем.

    Либо обернуть зависимость в свой объект/класс что обычно намного проще (если конечно речь идет не о баге) и там уже вносить изменения в поведение. Папка vendors должна оставаться неприкосновенной.
    Ответ написан
  • В Yii2 для написания тестов использовать codeception или phpunit?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    codeception для интеграционных тестов, phpunit для любых функциональных тестов.

    Используйте то что вам удобно.
    Ответ написан
  • Socket.io, nodejs и mysql как организовать соединение для чата?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    конечно же первый вариант. А еще лучше - не одно постоянное соединение а целый пул соединений.
    Ответ написан
  • А как Вы избавляетесь от дублирования при решении типичных задач?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Решение: написать базовый модуль Catalog и на его основе сделать модули Films, Games, Stars...


    ну без описания деталей решение мягко скажем... не полное. И ежу понятно что что бы устранить дублирование надо общие вещи вынести куда-то (базовый класс, общая зависимость). Другой вопрос - зачем в отдельные модули, но это может я не вкурсе специфики Yii2. В Symfony2 скажем многие при решении таких задач пихают все в отдельные бандлы и это не правильно, так как бандлы должны быть самодостаточными.

    Как вы решаете такие проблемы?

    Устраняем дублирование. Как - зависит от того где это дублирование проявляет себя. Если у нас много однотипных проверок (например в Yii1 был убогий ACL и я не думаю что что-то поменялось для Yii2) с проверкой ролей, можно вынести эти однотипные проверки в какой-то отдельный объект. Symfony и Spring предлагают подход с voter-ми (шаблон chain of responsibility)

    Если речь идет о шаблонах - Twig предоставляет механизм наследования шаблонов, миксины и прочие чудные вещи которые позволяют устранить дублирование вообще полностью.

    Если речь идет о банальном дублировании логики - эта логика выносится в отдельный объект. Это может быть как отдельня общая зависимость, либо базовый абстрактный класс (если принцип единой ответственности при этом мы не нарушаем).

    Ну и да - логика может так же дублироваться для разных интерфейсов (http, cli, mq). В этом случае опять же "все общее выносится в общую зависимость". То есть логика переносится в сервисный слой.

    Вариантов как устранить дублирование масса, но суть у всех вариантов одна - берем общее и выносим в общую зависимость.
    Ответ написан