Задать вопрос
  • Что такое public?

    @Arik
    сразу практикуюсь без теории)

    лучше задолбить кого вопросами?

    php.net/manual/ru/language.oop5.visibility.php
    Ответ написан
    3 комментария
  • Symfony 4. Fos user bundle. Как достучаться до 'fos_user.user_manager'?

    Сервисы в четверке по умолчанию приватные и к ним нет доступа через контейнер. Инъекция FOS\UserBundle\Model\UserManagerInterface в конструктор или метод нужного класса решит проблему

    private $manager;
    
        public function __construct(UserManagerInterface $manager)
        {
            $this->manager = $manager;
        }
    
         public function fooMethod(User $user): void
         {
             $this->manager->updateUser($user);
         }
    Ответ написан
    5 комментариев
  • Насколько тяжело попасть в 3A студию на роль программиста(gameplay,core или другие) и что для этого нужно(знания и тд)?

    inoise
    @inoise Куратор тега Карьера в IT
    Solution Architect, AWS Certified, Serverless
    Смотрите на вакансии определенных организаций. В крупных холдингах не редкость найти стажировку за еду и последующее трудоустройство джуном
    Ответ написан
  • Как держать одновременно две ветки в рабочей копии?

    Lobotomist
    @Lobotomist
    Software Developer
    Я вижу два варианта:

    1. Использовать два репозитория.

    Вы просто клонируете репозиторий еще в одно место и работаете с ним отдельно.
    - Весь репозиторий дублируется, но если он не очень большой по размеру - в этом нет ничего страшного
    - Переносить изменения между репозиториями надо будет через pull/push, просто commit-ов будет недостаточно. Например, в репозитории (а) делается коммит в ветку (1), в репозитории (б) делается fetch из репозитория (а) ветки (1) и дальше ее коммиты могут уже черри-пикаться или как-то еще переносится в ветку (2).

    2. Использовать дополнительную рабочую директорию (git 2.5+)

    В новой версии git 2.5 появилась команда для создания дополнительной рабочей директории: git worktree. Если есть возможность обновить git, это наиболее удобный вариант. Нужно иметь ввиду, что фича пока эксперементальная.
    Ответ написан
    Комментировать
  • Как реализовать отзывы для нескольких сущностей?

    padlyuck
    @padlyuck
    https://www.doctrine-project.org/projects/doctrine... или https://www.doctrine-project.org/projects/doctrine... для организации всех комментариев в одной таблице. Судя по документации вам придется сделать класс родительского комментария и 3 класса конкретных сущностей комментариев относительно того к чему они привязаны. Да и разный функционал будет проще потом разносить, а не мешать в кучу коней с людЯми
    Ответ написан
    1 комментарий
  • Какой php-фреймворк сейчас стоит изучать в качестве первого?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря какие у вас цели)). Пилить небольшие говносайтики - laravel. Что-то среднее - yii. Что-то серьезное - symfony. Что-то серьезное, но для крепких нервов - zend. "не хочу ничего учить" - code igniter. "тупой и жадный" (с) - bitrix.

    Рекомендую взглянуть: Попросили проверить код, на что смотреть нужно?
    Ответ написан
  • Many-to-many как избежать Race conditions?

    @yayashitoya
    Как можно избежать этого ?


    Все уже придумано до нас. Лет эдак за 50.
    Делать в одной транзакции. И проверку и добавление подписки.
    Ответ написан
    Комментировать
  • Что нужно учить, чтобы стать php разработчиком и работать на upwork?

    @Stalinko
    PHP'шник и фрилансер до мозга костей
    php5, php7, Laravel/Yii/Slim/Symfony/Zend, jQuery, MySQL, Highload, Computer Science, Redis, ElasticSearch, NodeJS, nginx, apache, AWS, memcache, unix, RESTful APIs, Payment intergration....
    Также не помешает AngularJS, VueJS, ReactJS, MSSQL, PostgreSQL, Oracle SQL, ES6...

    Ну это для начала.
    Сверху ещё нужно добавить опыта работы, глубоко понимания, как работает язык и как писать оптимальные программы, умение продавать себя, умение качественно выполнять свою работу...

    В общем, смотри, что умеют те, кто зарабатывает больше тебя, и делай так же.
    Ответ написан
    4 комментария
  • Как сделать правильный выбор между C# и Java?

    Sputterspark
    @Sputterspark
    В далеком прошлом, я занимался пустой тратой времени. А именно - выбором языков программирования.

    И продолжаешь этим заниматься.
    Ответ написан
    Комментировать
  • Как реализовать API запросы в PHP?

    @l4m3r
    Мне же не надо создавать для каждого поста отдельную папку?(а если поста нет?)

    А может ну его, это программирование?
    Ответ написан
    7 комментариев
  • На кого поступать, чтобы в будущем разрабатывать искусственный интеллект?

    1. На самом деле в наших ВУЗах нет программ близких к ИИ, так что просто поступайте на любую IT специальность вроде Прикладной информатики или Программной инженерии, а дальше изучайте это направление самостоятельно. Необходимую базу знаний для поступления на младшего разработчика получите. Выше уже скинули то что нужно изучать, но никто не мешает погуглить и дополнить или поправить этот список.
    2. Выбирайте те которые на слуху, там обычно часто приглашают разных специалистов, спикеров.
    3. Опыта нет, сам студент.
    Ответ написан
    Комментировать
  • Как побороть NIH-синдром?

    petermzg
    @petermzg
    Самый лучший программист
    Когда вы были маленьким ребенком, то для вас буквы представлялись неведомыми закорючками, а уж написать каждую букву требовало огромного труда, но они все равно были мало похожими.
    А сейчас вы умеете читать и писать. Вы научились этому. Так и с программированием.
    Ответ написан
    Комментировать
  • Чем опытнее разработчик, тем меньше соблюдается принцип KISS?

    @asd111
    То что ты назвал - repository, service layer, provider это не так сложно как кажется.

    Repository - это прослойка над моделью, обычно один класс для каждой модели в котором собраны все функции для работы с моделью, т.е. все нужные запросы к БД через модель, чтобы не писать их в самой модели.

    Service layer - прослойка между контроллером и репозиторием, обычно один класс для каждой модели(репозитория). Здесь обычно пишут обработку данных полученных из репозитория чтобы потом можно было сразу вставить во view. Как правило в service layer есть методы create read update delete - как в контроллере и в них пишут ту логику, которую обычно писали в контроллере только без привязки ко view.

    Sevice Provider - некий код который кочует из проекта в проект и делает например авторизацию пользователя или кеширование. В Laravel есть свой механизм service provider.

    Как правило service layer и repository добавляют чтобы всю логику класть туда и сохранить модели и контроллеры очень простыми. Например в методах контроллера может быть банальный вызов методов service layer с привязкой ко view и больше никакой логики.

    Посмотри вот этот пример https://blog.eduonix.com/web-programming-tutorials... и сразу станет понятно.
    В этом подходе нет ничего сложного иначе никто бы не пользовался.
    Можешь сам попробовать написать тот же блог но только с service layer и repository - это проще чем кажется.
    Ответ написан
    Комментировать
  • Чем опытнее разработчик, тем меньше соблюдается принцип KISS?

    Adamos
    @Adamos
    Чем опытнее разработчик, тем чаще, выполняя конкретную задачу, он понимает, что примерно такую уже решал. Поэтому опытный разработчик видит уровни абстракции, общие для многих решений. И описывает их так, чтобы потом, при решении очередной конкретной задачи, использовать написанное ранее с минимумом дополнительных усилий.
    Вы, не имея такого опыта, просто не понимаете, что все эти лееры, провайдеры и трейты - прекрасная возможность написать две строчки и быть уверенным в их работе там, где вы угробите два дня на написание "простого" решения, а потом еще неделю будете отлавливать его глюки.
    Ответ написан
    6 комментариев
  • Чем опытнее разработчик, тем меньше соблюдается принцип KISS?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Принцип KISS не означает что надо использовать самые примитивные инструменты.
    Он означает, что не надо переусложнять систему без нужды.
    Если так рассуждать, так и высшее образование не нужно: "Дед отличные бани строил, хотя вовсе был неграмотный. Я и без сопромата небоскреб построю!"
    Если вы пока ещё не понимаете назначение всех этих "лееров, провайдеров и репозиториев", это не значит, что они вообще никому не нужны.

    Для того, чтобы упростить управление системой, её надо усложнить.
    Этот принцип относится к любой области человеческой деятельности, от постройки ракет до управления государствами.
    Чем сложнее система, тем больше накладные расходы на ее управление. Хоумпейдж с котиками можно и нужно делать примитивными средствами. В большом проекте надо сразу закладываться на будущую расширяемость. То есть, заранее делить ответственность между "леерами".

    И кстати. Код, в котором "всё друг на друге завязано" - это очень плохой код. Собственно, предназначение всех этих "лееров, провайдеров и репозиториев" как раз в том, чтобы компоненты были как можно более независимы друг от друга.
    Ответ написан
    1 комментарий
  • Как построить инфраструктуру большого проекта?

    opium
    @opium
    Просто люблю качественно работать
    Если все достаточно оптимально и нет каких то глупостей можно воткнуть на один сервер и все будет ок
    Ответ написан
    Комментировать
  • Почему phpStorm перечёркивает синтаксис "className" в yii2?

    @sidni
    Php Developer
    Потому как разработчики посчитали ее деприкейтед и приняли решение правильным будет использовать появившееся в 5.5.0 версии пхп нативное выражение
    Widget::class
    Ответ написан
    Комментировать
  • Как работает подход Unit of Work?

    voronkovich
    @voronkovich
    Попробую привести очень примитивный пример. Допустим, мы делаем простое приложение для микроблоггинга. Каждая сущность будет иметь вид:

    class Tweet
    {
        private $id;
        private $content;
    
        public function __construct(int $id, string $content)
        {
            $this->id = $id;
            $this->content = $content;
        }
    
        public function getId(): int
        {
            return $this->id;
        }
    
        public function getContent(): string
        {
            return $this->content;
        }
    
        public function setContent(string $content): void
        {
            $this->content = $content;
        }
    }


    Схема данных:

    CREATE TABLE tweets (
        id INTEGER PRIMARY KEY,
        content VARCHAR(255) NOT NULL
    )


    Следующая реализация UnitOfWork будет иметь несколько ограничений:
    1. Она умеет работать только с Tweet;
    2. Она умеет только загружать сущности и сохранять произведённые в них изменения.
    class UnitOfWork
    {
        private $connection;
        private $identityMap;
        private $data;
    
        public function __construct(\PDO $connection)
        {
            $this->connection = $connection;
            $this->identityMap = [];
            $this->data = [];
        }
    
        public function find(int $id): Tweet
        {
            if (isset($this->identityMap[$id])) {
                return $this->identityMap[$id];
            }
    
            $query = $this->connection->prepare('SELECT * FROM tweets WHERE id = ?');
            $query->execute([ $id ]);
    
            if (false === $data = $query->fetch()) {
                throw new \Exception(\sprintf('Tweet with id "%d" not found.', $id));
            }
    
            $id = (int) $data['id'];
    
            // Исходные данные сохраняются для того, чтобы в дальнейшем вычислить изменения.
            $this->data[$id] = $data;
    
            $tweet = new Tweet($id, $data['content']);
    
            $this->identityMap[$id] = $tweet;
    
            return $tweet;
        }
    
        public function commit(): void
        {
            // Вообще говоря, лучше вычислить все изиенения, создать один "большой" запрос
            // и выполнить его внутри транзакции, но для простоты мы сделаем для каждого
            // изменения отдельный запрос
            $query = $this->connection->prepare('UPDATE tweets SET content = ? WHERE id = ?');
            foreach ($this->identityMap as $tweet) {
                if ($tweet->getContent() !== $this->data[$tweet->getId()]['content']) {
                    $query->execute([ $tweet->getContent(), $tweet->getId() ]);
                }
            }
        }
    }


    Полный пример можете скачить и посмотреть тут: https://gist.github.com/voronkovich/d35cdcdf6eb09e...
    Ответ написан
    1 комментарий
  • Как работает подход Unit of Work?

    @Flying
    Unit of Work - это паттерн определяющий логическую транзакцию т.е. атомарную синхронизацию изменений в объектах, помещённых в объект UoW с хранилищем (базой данных).

    Если обратиться к исходному описанию этого паттерна у Мартина Фаулера - то видно что объект, реализующий этот паттерн отвечает за накопление информации о том какие объекты входят в транзакцию и каковы их изменния относительно исходных значений в хранилище. Основная работа производится в методе commit() который отвечает за вычисление изменений в сохранённых в UoW объектах и синхронизацию этих изменений с хранилищем (базой данных).

    Паттерн Unit of Work как правило не является полностью самостоятельным, он обычно тесно связан с паттерном Identity Map, задача которого - сохранение карты созданных объектов, взятых из хранилища с тем чтобы гарантировать что одна единица информации из хранилища представлена ровно одним экземпляром объекта данных в приложении. Это позволяет избежать конфликтов изменений т.к. не допускает ситуации когда два объекта, представляющих один и тот же элемент данных в хранилище, изменены по-разному. Информация из Identity Map используется в методе commit() паттерна Unit of Work для вычисления разницы между исходными данными и накопленными изменениями.

    Поскольку для вычисления разницы (и, соответственно, определения того что и каким образом должно быть изменено в хранилище) необходимо знать какие данные и как именно хранятся в объектах - как правило необходима также реализация паттерна Metadata Mapping, описывающего связь между содержимым хранилища (к примеру таблицами и столбцами базы данных) и классами / свойствами объектов.

    Также, если данные в хранилище не являются независимыми (к примеру связи между таблицами в базе данных) - может потребоваться реализации ряда паттернов, отвечающих за сохранение информации о связях между данными (это паттерны раздела Object-Relational Structural Patterns в каталоге паттернов).

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

    Если говорить о PHP - то лучшей реализацией этих паттернов на PHP безусловно является Doctrine ORM. В частности в разделе Working with Objects документации Doctrine можно найти хорошее описание и множество примеров использования паттернов, описанных выше.
    Ответ написан
    6 комментариев
  • Правильно ли использование статичных методов в таком контексте?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Не используйте статику. Вот в вашем примере где будет браться подключение к бд? Вероятно в тоже из чего-то статического. Ваш код будет сильно связан, тяжело тестируем и на лонг ране будет увеличиваться сложность поддержки.
    Попросили проверить код, на что смотреть нужно?
    Ответ написан
    Комментировать