• Нужно ли делать фильтр для коллекции в Angular?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    но тогда у полозователя не будет возможности сделать что-то самому


    Я уже вам написал в комментариях к другому вопросу но продублирую. Когда пользователь выбирает какой-то другой вариант сортировки или фильтрации, мы просто уведомляем контроллер об этом. Тот уже будет просить сервисы что бы тот предоставил данные согласно нашим новым условиям. Сервис все это сделает и вернет нам данные в контроллер. Мы чуть чуть может еще подготовим данные под наше представление и выплюнем во view (по сути данные попадают в $scope). Далее за счет дата биндинга view реагирует на изменение состояния данных и подстраивается под них согласно вашему описанию (все эти ng-repeat и т.д. Не спроста шаблоны в ангуляре называют декларативными).

    Это собвенно и есть MVC, при таком подходе нашему view будет глубоко плевать на реализацию фильтрации, а нашей модели (логике по работе с данными) плевать на то как эти данные выводятся. А контроллер будет лишь посредником который будет знать как эти два слоя связываются друг с дружкой.

    updated

    Решил сделать пример, на который буду ссылаться дальше:

    Пример

    А теперь немного поясню зачем вообще так загоняться и когда допустимо фильтровать все в контроллере или вообще во вью, что бы небыло недопонимания.

    Давайте представим что мы мысленно раздели наше приложение на два слоя: слой который работает с данными (M), и слой который занимается отображением этих данных пользователю (V), ну и посовместительству хэндлит взаимодействие пользователя с этим view (формы например).

    Что бы упростить поддержку системы, нам надо снизить связанность этих двух слоев, сделав их максимально независимыми. Что бы изменения в одном слое не вызывали особой необходимости менять что-то в другом. Для этого мы вводим промежуточный слой - контроллеры (С). Это по сути и есть основная идея MVC. Разделяй и властвуй.

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

    Если у вас работа с данными уже была разделена сделать это не составит проблем. Мы просто поменяем наш ProductCatalog и заменим там методы на нужные нам. View от этого не поменяется ни сколички. Более того мы можем спокойно покрыть этот функционал быстрыми юнит тестами.

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

    Словом, нужно соблюдать баланс. Иногда такие решения более чем оправданы.

    Но вернемся к реалиям anuglar-а. Дело в том что когда вы используете фильтры в шаблонах, они будут дергаться на КАЖДЫЙ $digest цикл, так работает дата биндинг. То есть при относительно небольшом объеме данных у нас приложение уже будет жутко педалить. Потому использовать фильтры с коллекциями в шаблонах простительно только если вы на 100% уверены что данных пока будет мало, а потом можно будет переделать.

    Как-то так. Поскольку у вас есть возможность использовать ангуляровские фильтры внутри сервисов или контроллеров, "экономный" вариант будет занимать не больше времени разработки и поддерживать такой код будет проще.
    Ответ написан
    8 комментариев
  • Как лучше избежать ошибки redeclare?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Внутри функции объявлен класс,

    Что что?

    Если я класс вынесу из функции она ведь перестанет его видеть?

    Что-то? В PHP все, функции, классы и прочее регистрируются в глобальной области видимости.

    Функция же видит переменные либо только принятые, либо объявленные внутри неё?

    классы и функции это не переменные.

    Как правильно спроектировать такой случай? Переделать класс в функцию тоже?

    имеете в виду объект? Если так то да.
    Ответ написан
  • Как отправлять защищенный/шифрованный POST запрос между двумя серверами?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вы всегда можете использовать свой сертификат для организации шифрованного соединения. Это есть и в PHP и в Node.js. Гуглить - TLS в контексте того что вы используете.

    Хороший пример - организация работы с серверами APNS (Apple push notifications). Можете посмотреть как реализован клиент для оного, они есть и для ноды и для пыха.

    Но поскольку речь идет о POST запросах, то все сводится к старому доброму HTTPS со своими сертификатами.
    Ответ написан
    Комментировать
  • Что надо знать хорошему php разработчику?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    но не могли бы вы дать список

    если вы в состоянии написать сортировку вставками - этого достаточно. Ближе к мидлу уже было бы неплохо знать как работают основные структуры данных (хэш-мэпы, списки, деревья и т.д.) и какова сложность вставки/поиска в этих структурах (что бы понимать зачем каждая нужна).

    В целом же знание алгоритмов на начальном этапе вам не понадобится, вы просто должны понимать как строить алгоритмы. Я вот Кормена так и не дочитал... Тут суть в том что на PHP редко пишут что-то, где важна скорость вставки или поиска, обычно все сложное делается на уровне базы данных. Потому PHP разработчику остается только сформировать запрос в базу и получить ответ. Больше работы именно по архитектуре самого приложения.

    затем начну изучать базы данных и буду понимать что такое CGI,

    CGI не трогайте, это весьма старая штука. Просто разберитесь с SAPI (Server API) и примерным флоу что происходит между приходом HTTP запроса на сервер и вызовом PHP с уже заполненными суперглобальными массивами. Ну и да, с самим HTTP тоже разберитесь сначала, что бы понимать что такое куки и как они передаются с клиента на сервер и обратно, что такое сессии, как получить тело запроса и т.д.

    Так же, так как речь идет о PHP, вам так или иначе придется изучать ООП. На процедурном пыхе далеко не уедешь.

    p.s. Еще рекомендую почитать чего по управлению проектами, по методологиям разработки. Ознакомьтесь с XP (причем лучше читать на английском), почитайте про технический долг и т.д.
    Ответ написан
    9 комментариев
  • Стоит ли высылать заказчику подписанный договор NDA?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Отпралять свой паспорт

    С вас просят только ксерокопию. И коль уж человек требует NDA подписанный, то вы должны ему предоставить какой-то документ, с которым он, в случае нарушения NDA пойдет в суд.

    habrahabr.ru/post/88058 - хороший материал на тему, в комментариях так же много полезного.
    Ответ написан
    Комментировать
  • Каким еще способом можно внести изменения в сторонний бандл?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    относительно правильным будет отнаследоваться от модели предоставляемой FosUserBundle и просто в конструкторе вызывать этот метод.
    Ответ написан
  • Как вести логирование запросов, действий в отдельную таблицу?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    CQRS + Event Sourcing
    Ответ написан
    Комментировать
  • Как использовать наследование Bundle для перезаписи частей bundle?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    касающиеся наследование бандлов.

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

    Само наследование достигается строчкой "return 'FOSUserBundle';"

    Да, таким образом вы говорите с каким еще экстеншеном ядра связан ваш экстеншен, тогда кернел будет обрабатывать все в нужном порядке.
    Ответ написан
  • Как сделать .deb пакет?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Комментировать
  • Почему github, а не gitlab?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ведь есть gitlab?

    gitlab в основном используется для реализации своих приватных репозиториев и только. Для всего остального есть github.
    Ответ написан
    5 комментариев
  • Какой выбрать монитор для повседневной работы, 27"?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    LG 27mp67 - 1080p
    Samsung s27d590pl - 1080p
    samsung s27e390h - 1080p

    для 27" нужно минимум 1440p (разрешение 2,560 x 1,440)
    Ответ написан
  • Как работают простые фильтры в Ангуляре?

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

    Сделайте нужную вам коллекцию в контроллере, а лучше в сервисе. Прекратите использовать фильтры для коллекций. Да можно, но только для очень простых случаев и только для того что бы быстро сделать на коленке.
    Ответ написан
    3 комментария
  • Как грамотно выбрать фреймворк PHP для дальнейшего развития?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    в дополнение к ответу Sayber ⏰, есть только два разумных выбора: ActiveRecord vs Data Mapper. Все остальное - без разницы, Laravel 5 (ниже не смотрите), Symfony... с архитектурной точки зрения все едино, различия только в стандартной комплектации. У симфони это доктрина, которая исповедует несколько другие подходы.

    Но поскольку оба эти фреймворка модульны, все можно заменить, можно сделать симфони с AR и Laravel с Doctrine.
    Ответ написан
    1 комментарий
  • Как вы пишите тестируемый код?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    соответственно при тестировании необходимо обернуть его в Mock

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

    Писать в каждой модели конструктор?

    Что вы понимаете под "модель"? Ваши бизнес-объекты? У них в конструкторе должно быть только то, что им нужно.

    а если источников будет много

    То это повод пересмотреть архитектуру, почитать про цепочки обязанностей, стратегии, про сегрегацию интерфейсов в конце концов.

    User::model()->prepareBuy(new Order, New Profile, $userId)


    Прочитайте эту строчку кода, и скажите что тут происходит, ибо я не могу этого понять.

    Ну и да, помимо внедрения зависимостей в конструктор, есть еще такая неплохая штука как double dispatch, когда нужные сервисы передаются как аргументы методов, которым они нужны. Так наш класс не зависит от непонятных вещей и таким образом мы все можем спокойно тестить.
    Ответ написан
    2 комментария
  • Как отправлять логи ошибок PHP на почту?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ответ написан
    Комментировать
  • Есть ли autoprefixer для css на php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    аналогов нет и не нужно, это уже устоявшаяся практика использовать тулчейн для ноды для сборки фронтэнда, нечего плодить реализации, одну реализацию такой довольно критичной вещи как autoprefixer поддерживать сильно проще.
    Ответ написан
    3 комментария
  • Что такое рецепты и провайдеры в angular.js?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    что за рецепты создания обьектов?

    Подозреваю что речь идет о фабриках. Сожгите эту книгу (или что вы там читали).

    Если да, то что посоветуете вкурить?

    Википедию и учите JS.

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Flexbox-ы, просто, эффективно, на css, без разницы знаете ли вы размеры блока или нет...
    Ответ написан
    2 комментария
  • Как вывести результаты из связанной таблицы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    У меня есть таблица:

    Не таблица, а сущность. Doctrine исповедует принцип persistence ignorance.

    Зачем так сложно то? Настраиваем каскадный персист для связи и наш код упрощается до:

    $notification = new FcsNotificationEA();
    // добавляем 3 аттачмента
    $notification->add(new Attachment());
    $notification->add(new Attachment());
    $notification->add(new Attachment());
    
    $this->notificationsRepository->add($notification); // внутри add происходит persist
    
    $this->get('doctrine.orm.entity_manager')->flush(); // коммитим изменения в базу
    
    return $this->render('some_template.twig', compact('notification'));


    p.s. все же подумайте о том что бы нормально именовать объекты... ибо не понятно что это такое.
    Ответ написан
  • Как правильно реализовать авторизацию symfony 2?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    что сие надо делать с помощью FOSUserBundle.

    Нет, FosUserBundle предоставляет базовые вещи вроде активации аккаунта и т.д. Это удобно, но есть куча вариантов при котором этот бандл делает больше плохого чем хорошего. В большинстве случаев использовать его норм.

    Поля имя фамилия появились, а поле группы нет. почему?

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

    При регистрации пользователя ему по умолчанию не присваивается никакой роли, группы и нельзя указать имя и фамилию

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

    как заменить стандартные шаблоны своими заранее сделанными.

    Читаем документацию к fos user bundle, там все это есть. Это одна из самых базовых нужд разработчика, так что, как понимаете, это можно сделать прописав в конфиге пути к шаблонам, которые вы хотите юзать.
    Ответ написан
    4 комментария