• Как извлечь обьект из Service Container в зависимости от аргумента?

    miraage
    @miraage
    Старый прогер
    Так нельзя делать.
    Вернее, можно, но это полный моветон и архитектурная ошибка.
    Инжектите в контроллер someotherservice и вызывайте его метод getDataById.
    Ответ написан
    2 комментария
  • Как живётся программисту без дискретной видеокарты?

    Pinsky
    @Pinsky
    Кофеиноникотиновая смесь в backend-код
    Абсолютно нормально, два монитора, никаких проблем.
    WebDev. Куда хуже живется программисту без SSD.
    Ответ написан
    1 комментарий
  • Возможно ли врачу стать программистом?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    В чем проблема просто поискать вакансии и походить на интервью?
    Вам имеет смысл поискать компании, которые разрабатывают что-то медицинское - вдруг опыт работы пригодится.

    А так - просто попробуйте пройти несколько интервью (хотя бы 3-5) и вопросы отпадут сами собой.
    Ответ написан
    4 комментария
  • Абстрактные классы и интерфейсы - когда применять одно или другое?

    @yociyavi
    Как по мне так эти ассоциации из реального мира только усложняют понимание ООП.
    Интерфейс - это описание методов доступа к объекту.
    Абстрактный класс - это выделение общих методов и свойств классов.
    Ответ написан
    Комментировать
  • Где найти готовые шаблоны баз данных?

    kimono
    @kimono
    Web developer
    От проекта к проекту количество таблиц отличается, количество полей отличается, типы полей отличаются, длина полей отличается, названия полей отличаются, значения полей отличаются. Может и нет никаких шаблонов?
    Ответ написан
    Комментировать
  • Перехват обращение к свойству объекта?

    by25
    @by25
    Веб-разработчик
    Обращаться к свойству через геттер/сеттер.

    class Foo {
        private $param;
    
        public function getParam() {
            //... тут своя логика
            return $this->param;
        }
    }
    Ответ написан
    Комментировать
  • Как хранить динамическое количество свойств?

    e_svirsky
    @e_svirsky
    Web Developer
    OneToMany - 2 таблицы.
    good
    good_property

    связаны onetomany связью:
    good.id = good_property.good_id
    Ответ написан
    Комментировать
  • Быстрый LIKE по 1 миллиону строк, как быть?

    saintbyte
    @saintbyte
    Django developer
    ElasticSearch уже предлагали?
    Ответ написан
    Комментировать
  • Redis + MySQl или mongoDB?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    MySQL + Sphinx + Memcached

    С подобным объемом данных вы можете и миллион посетителей в месяц на данной связке держать.
    Sphinx нужен для более-менее приличного полнотекстовго поиска, обычно это ключевой момент при поиске музыки.

    MongoDB имеет смысл, если у вас будет ну хотя бы 20 млн композиций, плюс там будет еще куча активности типа прослушиваний, коментов, лайков и прочей ерунды.

    MySQL плохо масштабируется при смешанной нагрузке (когда запись/чтение почти поровну), но если у вас только чтение и данные редко обновляются, то можно иметь и миллионы композиций и при миллионной дневной посещаемости. Есть решения вроде Galera, где проблемы масштабирования решены достаточно неплохо.

    MongoDB нужно использовать там, где критична гибкость схемы и важна значительная масштабируемость. Это хорошее решение например для хранения данных о пациентах и истории болезни. У каждого пациента своя очень сложная и уникальная история. На монге можно построить систему медицинских записей масштаба государства. На MySQL тоже можно, но это окажется гораздо более сложным решением.
    Ответ написан
    1 комментарий
  • Ветки развития. Куда бы вы пошли из helpdesk?

    saboteur_kiev
    @saboteur_kiev Куратор тега Python
    software engineer
    Все ветки развития, где человек много лет сидит и делает тоже самое - тупиковые.
    Нужно развиваться, искать возможность стать хорошим специалистом.

    Хороших админов - поискать надо
    Хороших сетевых админов - поискать надо
    Хороших девопсов - поискать надо.

    Хороший это и хотя бы mid, и толковый, с опытом.

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

    Antonoff
    @Antonoff
    Разработчик
    Посмотрите как работают конкуренты или крупные игроки в вашей нише, сделайте выводы. Профит.
    Ответ написан
    Комментировать
  • Первый проект для изучения PHP фреймворков - что делать?

    nepster-web
    @nepster-web
    " ООП знаю" - поверьте, не знаете.

    С Yii2 не советую начинать обучение. В качестве обучения возьмите Laravel5.2 или symfony3 или zend3, все что угодно но не в коем случае не Yii2. Иначе у вас будет не правильное понимание OOP, SOLID и еще многих бестпрактик.

    Что касается паттернорм, в принцепи невозможно написать хороший код с длительным обслуживанием без: PSR, DI, Repository, Entity/DTO/VO, тестов и тп. Поэтому если вы не знаете хотя-бы одно из этих слов, прежде чем что-то писать и учить, прочитайте книгу по ООП. Иначе ничего хорошего вы не напишите.
    Ответ написан
  • Как не нарушать SOLID?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вы путаете инверсию контроля и инверсию зависимости. Давайте по порядку кратенько.

    Зачем нам нужны контроллеры или различные представления данных

    Зачем нам в принципе контроллер? Что он делает? Для упрощения не будет воспринимать контроллер как "один объект" и вместо этого представим себе его как целый слой. Так же заменим слово "модель" словом "приложение".

    Задача контроллера - принять и обработать запрос и выдать ответ. По сути в контексте WEB наш HTTP запрос и ответ это представление, которое хочет получить клиент (браузер, мобильное приложение, SPA, что угодно). HTTP - это интерфейс пользователя (UI) для нашего web-приложения.

    Например что бы независеть от реализации клиента и что бы было удобно мы передаем даты в формате iso 8601 (пример: 2016-07-14T19:40:12Z). Это удобно что бы быть независимым от реализации клиента или сервера. Но это не удобно для нашего приложения. В приложении скорее всего нам удобнее всего работать с объектом типа DateTime. То есть приложение использует абсолютно другое представление.

    Мы могли бы прямо в приложении конвертить DateTime в iso 8601 но тогда мы делаем наше приложение привязанным к одному конкретному представлению, которое хочет получить клиент. К примеру по каким-нибудь причинам известным только темным богам, вам вдруг понадобится быстро прикрутить интеграцию с другим сервисом и те же данные гонять уже в RFC2822. И стало быть уже приложению нужно париться о еще одном представлении.

    Мы могли бы сделать какие-то адаптеры у приложения, и дергать их в зависимости от потребностей, но тогда опять же наше приложение все еще знает о представлении, которое ему собственно не нужно. То есть у нас есть зависимость приложения от его UI что... похоже на "не лучшую идею". И тут на помощь приходит Inversion of Control.

    Что такое Inversion of Control

    Тут название само говорит за себя. Допустим у нас был объект A который дергал объект B, причем объект A по сути и не должен ничего знать об объекте B потому то это не его дело. Принцип инверсии контроля говорит нам о том, что в таких ситуациях именно B должно вызывать A, таким образом меняя направление потока управления. Это позволяет нам уменьшить связанность и повысить зацепление компонентов нашей системы. Так же сделав это у нас может появиться объект C который так же будет дергать объект A. Если говорить о UI - мы просто можем сделать несколько реализаций UI.

    То есть если еще упростить - фреймворк должен дергать ваш код, а не код дергать код фреймворка. Тем самым мы снижаем связанность одного от другого.

    Роутер и контроллеры как реализация UI

    Что бы отвязать приложение от логики формирования представления, вынесем это все в отдельный "слой" и назовем этот слой - контроллеры. Точнее это будет как цепочка адаптеров. Один адаптер (фронт-контроллер по сути) получает Request и делает какие-нибудь вещи с ним. Например проверяет можем ли мы вообще делать подобный запрос. Другой адаптер вызывает роутер и выясняет какой дальше адаптер вызвать. Если следующий адаптер не вызван - надо вернуть 404-ую ошибку. Если же все пошло хорошо - мы вызываем еще один адаптер, который уже будет конвертировать HTTP запрос в какое-то действие приложения (вызов метода приложения по сути).

    Так а инверсия зависимости это что?

    Инверсия зависимости - очень похожа на инверсию контроля но действует чуть по другому. Проще всего будет вглянуть на картинку:

    Dependency_inversion.png

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

    Если мы не хотим завязываться на SwiftMailer, и дать возможность в будущем изменить способ отправки почты, мы можем в рамках нашего модуля объявить интерфейс а в другом модуле уже его реализовать с применением SwiftMailer. Для упрощение под модулями мы можем понимать неймспейсы например.

    Нужно ли соблюдать принцип инверсии зависимости в случае контроллеров?

    Нет. Контроллеру нужна конкретная реализация какой-то части нашего приложения (ибо приложение главнее UI-ки), иначе в них нет особо смысла. И наше приложение вообще не должно париться о том что есть какие-то там контроллеры.

    будет ли правильным передавать зависимости в роутинге

    Это уже вопрос реализации IoC. Конкретно вы хотите получить что-то вроде Dependency Injection. Вы можете забрать зависимости из аргументов метода экшена. или аргументов конструктора контроллера.... или просто использовать контейнер зависимостей внутри контроллера.... это совершенно не важно. Контроллеры это то место где высокая связанность на компоненты фреймворка более чем допустимы.

    С другой стороны у вас теперь роутинг совмещает обязанность маршрутизации и разруливания зависимостей. Сами понимаете что это как-то нарушает прицип единой ответственности. Этим может заниматься Controller Resolver какой-нибудь.
    Ответ написан
    2 комментария
  • Помощь с началом обучения Yii 2?

    vakorovin
    @vakorovin
    Разработчик
    К словам Максима добавлю вот еще что, берите тестовые задания в компаниях, которые набирают yii-разработчиков. Это конечно же не учебник, но задания могут отражать потребности компании. Для себя самого очень полезно понимать, чего ты еще не можешь, а где преуспел.
    Ответ написан
    Комментировать
  • Куда клиенты валят с Upwork?

    sim3x
    @sim3x
    Тебе пора или присоединяться к фирме, в которой ты будешь востребован менее епизодично
    или повышать свой уровень и переходить на почасовку

    ПС:
    Клиенты никуда не валят.
    Ты просто попал в нишу, где ты конкурируешь с низкооплачивамыми работниками, которых становится больше
    Ответ написан
    21 комментарий
  • Как получить доступ к репозиторию в сущности?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как получить доступ к репозиторию в сущности?

    Вы не должны этого хотеть. Это противоречит самому понятию Repository-Entity.
    Репозиторий - работает только с БД и только с этити.
    Энтити - только хранит в себе данные и более ничего.

    Не пытайтесь превратить Repository в ActiveRecord, добром это не закончится.

    Если вам нужны зависимые энтити - тогда пропишите их в аннотациях.

    Если нужно вызывать именно метод репозитория: это делается через DI в сервисах, либо через $this->getDoctrine()->getManager()->getRepository('AppBundle:MyEntityName') в контроллерах.

    Конкретно в вашем примере: вы должны объявить сервис, в который будет насетапливаться EntityManager.
    Ответ написан
    Комментировать
  • Как организовать древовидные категории в Symfony 3?

    skobkin
    @skobkin
    Гентушник, разработчик на PHP и Symfony.
    вроде это работает только с SF2 Неужели бросать 3 версию?

    Так вроде или не работает?
    Неужели бросать 3 версию?

    Ну тут как бы есть проблема в том, что многие бандлы, которые широко используются ещё не поддерживают версии 2.8 и 3.0+. Например, бандлы Sonata ещё не полностью поддерживают новые версии. Поэтому действительно стоит подумать о том, брать ли прямо сейчас версию 3 или подождать.
    Ответ написан
    5 комментариев
  • Как отрендерить дерево узлов?

    MiragePresent
    @MiragePresent
    программист php
    Для таких случаев есть nested sets. Как по мне так проще так проще. Ну а если переделывать все не вариант, то в интернете полно примеров использования рекурсий для таких случаев
    Ответ написан
    3 комментария
  • Почему не работает KnpPaginatorBundle 2.5.3 в Symfony 3?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    Забыл return в методе queryGetList
    Ответ написан
    1 комментарий