Задать вопрос
  • Принцип DIP из SOLID и Autowiring из DI-контейнеров?

    syamskoy
    @syamskoy
    Dependency injection - это когда в класс A мы передаем класс B через конструктор или сеттер, что бы он с ним работал, а не создавал его в своих нутрях.
    Dependency Inversion - это когда мы в классе A работаем не с конкретной реализацией, а с интерфейсами: указываем интерфейсы в конструкторе, в методах, в возвращаемых типах и т.д.
    Это два разных понятия, которые иногда объединяют в одно, и иногда их путают.
    Так вот, autowiring - это про Dependency injection, а D в solid - это про Dependency Inversion. Одно другому не мешает и не нарушает.
    Ответ написан
    1 комментарий
  • Какие есть хорошие программы для проектирования структуры программ?

    dmitry_pavlov
    @dmitry_pavlov
    World-class .NET freelance contractor (remotely)
    Для разработки структуры программы, нужно разобраться в архитектуре ПО, по UI/UX сначала ознакомьтесь с имеющимися best practices в интересующей области, потом подберите инструментарий для прототипирования.

    Как вы освоили шаблоны проектирования?
    Какие есть хорошие книги по архитектуре приложений?
    15+ Most Valuable & Powerful Wireframing Tools For...
    Ответ написан
    Комментировать
  • Laravel - как типизировать Illuminate\Support\Collection?

    serginhold
    @serginhold
    наследовался, переопределил offsetSet(), сделал в нем проверку, в чем вопрос то?
    Ответ написан
    Комментировать
  • Чем паттерн Repository отличается от DataMapper?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это два абсолютно разных паттерна.

    DataMapper - это то, что традиционно неправильно называют моделью. Тупо мостик между БД и объектом: считать данные из БД и записать в объект, сохранить объект в БД. Фактически CRUD. Способ автоматизировать рутинные операции. Моделью являться не может в силу изначальной ограниченности.
    Другими словами, это универсальный код, подходящий для работы с любыми объектами. Инструмент для работы с БД. Все его методы одинаковы для любых объектов.

    Репозиторий - это то, что на самом деле является моделью - набор методов, реализующих бизнес-логику приложения. Метод в репозитории может включать в себя десяток разных запросов к БД для получения набора данных, необходимого в приложении, плюс их обработку.
    В отличие от DM, репозиторий содержит также уникальные методы, которые отражают конкртеные нужды конкретного модуля приложения.
    Ответ написан
    1 комментарий
  • Кеширование данных "правильнее" описывать в модели или контроллере?

    В репозитории. Модель простой POPO, о БД вообще ничего не знает, её единственная область ответственности — моделировать предметную область. Ответственность репозитория — хранить сущности модели, где и как только он знает. Как вариант, да, прокси, реализующий тот же интерфейс, что и «чистый» репозиторий. Другой вариант — кэшировать результаты запросов ещё ниже, где-то на уровне DBAL/DAL. Но на практике только прямо в репозитории реализовывал, что-то вроде

    class UserRepository {
      public function getById($id) {
        if ($this->cache->hasKey('user' . $id)) {
          $user = $this->cache->getByKey('user' . $id);
        } else {
          $user = $this->db->getUserById($id);
          $this->cache->set('user' . $id, $user);
        }
    }
    
    Ответ написан
    Комментировать
  • Как инициализировать symfony routing без использования symfony?

    padlyuck
    @padlyuck
    https://www.sitepoint.com/build-php-framework-symf... когда не гуглится - задавайте вопрос на английском. Не знаю как по качество, но мануал разжёвывает процесс использования роутинга эволюционируя его от простого switch-case'а до использования симфонийского компонента
    Ответ написан
    3 комментария
  • Как запустить composer с определенной версией php?

    NeLexa
    @NeLexa
    А php7 стоит?

    Можно попробовать в композере конфиг добавить, но не уверен, что поможет конкретно в этой ситуации, но нужно пробовать. Ещё, даже если вы установите пакет, то на старой версии php, он может просто не запуститься из-за нового синтаксиса.
    "config": {
        "platform": {
          "php": "5.5"
        }
    }
    Ответ написан
    Комментировать
  • Обьсните пользу многочисленных абстракций на примере zfcUser?

    1. ZF2 - это "чистый" PHP на основе php-patteens. В нём нет готовых решений для реализации того или иного функционала, всё надо делать вручную. Чтобы понять его низкоуровневый слой абстракции, нужно на очень высоком уровне знать сам PHP, его тонкости и нюансы, встроенные особенности, и понимать php-patteens, ибо их там немереное количество. Я очень люблю сравнивать PHP-framework с музыкой, и ZF2 у меня асоциюеться с Rammstein, то есть ну ОООчень жесткий (hardcore), к чему я это всё виду - к тому, что у этого framework-а очень большой порог вхождения, и в изучении затруднительный даже для продвинутых разработчиков. Это не значит что он плох, да - он сложный, но web-приложение на нём будет будет радовать вас своей производительности, с которой не сравнится ни один PHP-framework. (при условии, что вы не используете готовые сторонние решения, такие как объектно-реляционное отображение, шаблонизаторы, и т.д.)
    2. Насчёт слоёв абстракции, в большинстве случаев вы будете иметь дело с ServiceManager - это всего лишь контейнер других экземпляров классов. То есть если вы создали форму, то вы можете поместить её в этот контейнер, а позже, когда она вам понадобится, просто извлечь её оттуда. (по умолчанию возвращается один и тот же объект, но вы можете это изменить, возвратить конкретно для какого то случая новый объект). Так же вы можете определить какой то класс бизнес-логики как службу, и использовать её на уровне всего приложения (так же можете её настроить как хотите). Можете ещё к всему этому подключить в дело компонент EventManager - и делать какие то действия, когда произойдёт любое событие в web-приложении.
    3. Гидратор - это процесс заполнение объекта данными, или наоборот - извлечение этих данных из объекта. Данные - это в большинстве случаев обычные свойства класса, и на выходите вы получите объект в виде массива, то есть объект без методов, лишь с одними свойствами. Вот как это работает в ZF2: пользователь вводит данные в форму и отправляет их на сервер, система их получает, преобразует обычные строковые данные с помощью гидратора в объект-прототип (то, что я выше писал, в объект в виде массива). Что же этот объект-прототип из себя представляет?! Как выше писалось, это обычный класс с одними свойствами. Свойства должны быть либо защищёнными, или приватными, а также в этом классе допускается использовать методы доступа к этим свойствам (get и set). После того, как наш объект-прототип наполнился данными, мы можем с ними манипулировать, например поместить в базу данных (разумеется мы должны данные фильтровать и проверять на валидность как при получение с формы, так и помещении в БД). Процессом заполнения данных в БД тоже занимается гидратор.
    4. Если вы работали с ORM, то наверняка заметили большое сходство. По большому счёту, то что я выше описал, реализовано в самой DoctrineORM. Получается что ZF2 реализовал свой "собственный велосипед", какой пока ещё не доведён до совершенства. Хотя если сравнять производительность, то ZF2 вне конкуренции. Но если надо будет реализовать крупную систему, то альтернатива ZF2 ещё пока не подходит, она не сможет проявить весь ваш потенциал системы. Можно попытаться дописать этот "велосипед", или на его основе создать собственную систему объектно-реляционного отображения, но для этого надо иметь очень большие знания в этой области. К стати, чтобы добиться производительности, надо использовать расширение mysqli, а не PDO.
    5. На основе выше мною сказанного, вы должны понимать, что возможно для ваших задач вполне подойдёт Symfony, ибо вам придётся очень много потратить ресурсов, чтобы хоть как то сделать что-то стоящее на ZF2. Ведь если добавить в ZF2 DoctrineORM и шаблонизатор-Twig, то сам framework станет не лучше SF2, я бы сказал что ещё хуже, ибо упадёт производительность и будет очень сложно поддерживать. Поэтому я лично для себя решил, если мне надо что-то сделать действительное стоящее, с большой производительностью, и чтобы это был сугубо только чистый PHP, то я выберу Zend Framework; а если мне нужно web-приложение с умеренной производительностью, и сделать его приложив при этом минимальные усилия, то я выберу Symfony. В любом случае, выбирайте то, что подходит лучше для вашей задачи, выбор за вами.
    Ответ написан
    Комментировать
  • Подключение компонентов VUE в HTML?

    0xD34F
    @0xD34F Куратор тега Vue.js
    в обычном html файле

    В смысле - без использования систем сборки?

    Ну, подключаете код и стили:

    <script src="vue-date-pick-master/dist/vueDatePick.js"></script>
    <link href="vue-date-pick-master/dist/vueDatePick.css" rel="stylesheet">

    Всё, компонент будет доступен через переменную VueDatePick.

    Дальше можете указывать его в components:

    components: {
      VueDatePick,
    },

    Или зарегистрировать глобально:

    Vue.component('date-pick', VueDatePick);
    Ответ написан
    2 комментария
  • Какой фрэймворк выбрать Yii 2 или Symfony 2?

    IvanCher
    @IvanCher
    Мысли шире
    Симфонисты не работают с yii2 и не до конца понимают о чем пишут :)
    Я скажу так: оба фреймворка на высоте, по возможностям одинаковы, но подходы очень разные.
    Объективно скажу так: на yii2 не получится запускать отдельные модули без запуска всего приложения, тут у симфони2 огромный плюс. Так же у симфони более классные консольные команды для генерирования каркасов, мне больше нравится, чем gii(но дело вкуса). Но по факту большинство сильных сторон симфони не оправдывается в связи с высоким порогом вхождения. Найти хорошего симфони программиста намного сложнее, чем найти его на yii2. Поэтому взависимости от бюджета и масштаба проекта можете выбирать. Симфони2 - это больше уровень корпораций, yii2 более простой при практчески том же функционале.
    Если знаете симфони2, то лучше подтяните его. Yii2 изучить намного проще, намного всё прозрачнее внутри работает, там Вам хватит пару вечеров, чтобы пройтись по исходникам и всё для себя понять как изнутри как работает.
    Ответ написан
    7 комментариев
  • PHP vs. all. Имеет ли смысл учить (параллельно) что-то еще?

    mr_T
    @mr_T
    Web-разработчик
    Прочитал весь вопрос, но на ответы меня не хватило, так что могу что-то повторить)

    Момент 1. Языки. Если ты реально знаешь C++ (указатели, управление памятью, стек, куча, ООП и т.д.), то ты автоматически уже почти знаешь PHP, Python и Ruby. У тебя есть преимущество при изучении этих языков, так как ты уже имеешь представление о том, что реально происходит в твоей программе и, что тоже важно, под капотом интерпретатора. Сами эти языки (с точки зрения подходов и принципов) не так уж сильно отличаются друг от друга. Каждый из них имеет ряд своих особенностей, но их не так много и освоить их не составит труда. При этом изучив любой из языков ты совершенно без проблем перескачишь на любой другой.

    Момент 2. Фреймворки. Вряд ли в реальных проектах получится взять язык N, и ручками с нуля что-то на нем делать. Скорее всего будут использованы какие-то фреймворки. Но тут, опять же, достаточно взять любой доступный на языке N фреймворк, чтобы понять подавляющее большинство остальных. Yii, Django, Rails, Laravel - все они схожи гораздо сильнее, чем может показаться. Итог - изучив один из них можно легко перескачить на другой. Каждый перескок будет даваться все легче (актуально и для предыдущего пункта).

    Момент 3. Сервер. Если ты хочешь заниматься именно вебом, то сервер, очевидно, его неотъемлемая часть. Тут у языков немного больше отличий, чем в первых двух моментах. Но суть одна - если брать самую распространенную конфигурацию, то должен быть т.н. front-end сервер (не путать с front-end частью приложения), который отдает обычные файлы, не беспокоя само приложение, и back-end сервер (или сервер приложения). Back-end сервер как раз и занимается выполнением кода приложения и тут в зависимости от языка свои особенности по его установке, настройке и связке с front-end сервером. Но все в пределах разумного и вполне реально изучить. Менее распространенные конфигурации можно будет изучить по ходу, да и суть будет похожа.

    Момент 4. Node.js. Да, для него отдельный пункт. В JavaScript все построено на асинхронном программировании, поэтому он сильно отличается от "классических" языков. В подробности вдаваться не буду, но рекомендую как минимум с ним ознакомиться, чтобы иметь общее представление об асинхронном программировании, в частности на сервере. Можно взять не Node.js, а какие-то похожие варианты на других языках, но JavaScript основан на этой идее, поэтому я считаю., что оптимально взять именно его.

    Момент 5. Лирика. Любая технология решает опеределенный круг задач, поэтому говорить, что она "плоха" просто некорректно. Можно сказать, что она не решает данную конкретную задачу или же есть какая-то другая технология, которая решает ее лучше. Теперь конкретно про PHP, Python и Ruby. Как ты успел заметить в этом вопросе, существует очень много споров о том, что же лучше. Сам факт неугасания этих споров в течении многих лет говорит о том, что нельзя однозначно их разрешить.
    Так же есть тренд говорить, что PHP язык для лохов. Но говоря так человек лишний раз доказывает свою некомпетентность и невежество. Исторически так сложилось, что PHP самый распространенный язык, поэтому на нем написано огромное количество вещей разных назначений и качества. Людей, которые могут на нем писать (я намеренно не стал использовать слово "программист"), очень много и логично, что качество кода многих из них оставляет желать лучшего. Многие говорят про порог вхождения, но я бы не сказал, что у того же Python этот порог выше. Плюс PHP за последние годы приобрел много хорошего и как язык, и как его инфраструктура. Короче, можно смело брать PHP :)

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

    @NeoSimvolist
    Правильный способ не городить логику в модель, а выносить ее в менеджер (он же сервис). Саму модель держать предельно простой, максимум вычисляемые поля. У каждой модели свой менеджер. И когда понадобятся связи между моделями будешь инжектить менеджеры в менеджеры. Поверь, такой подход окупится при развитии проекта.
    Ответ написан
    Комментировать
  • За что отвечает require-dev в Composer?

    @harmoxyne
    Отвечает за те зависимости, которые необходимы только для dev-окружения.
    К примеру, Вы точно знаете, что библиотека phpunit нужна для разработки, а на проде будет лишней, тогда phpunit попадает в require-dev.
    Когда выполняется простой
    composer install
    устанавливаются и dev-зависимости.
    Когда выполняется
    composer install --no-dev
    устанавливаются только те зависимости, что в основном блоке require.

    Источник
    Ответ написан
    Комментировать
  • Как правильно работать на oDesk?

    Ubran_Hera
    @Ubran_Hera
    Начинал ~2 года назад (август/сентябрь) на oDesk (это была не первая моя попытка), выставил 14..15 баксов, без портфолио и истории. Первый заказ был получасовой, на 7 баксов, практически случайный (от новичка) — немного напортачил, но всё исправил, потратил времени в разы больше, но добился положительного отзыва.
    Общение сразу пошло через Skype и электронную почту, оплата — через PayPal. Это против правил, но так предложил заказчик.

    Затем оказалось, что работы у него непочатый край. До Нового Года переделывал маленькие сайтики (бизнес-проекты одного и того же человека). Взял меньшую плату, но повысил себе статистическую «среднюю ставку».

    Самое сложное было в графике и работе из дома — жена (девушка) не подходила ко мне когда я говорил по Skype/SIP, но в остальные моменты очень мешала и сбивала с толку. Ещё обижалась, что я ничего не делаю по дому и ложусь спать/встаю с разницей 3..4 часа по отношению к ней — одна комната, горящий монитор, гудящий вентилятор и т.д. Очень сложно было когда мы оба заболели (простуда).

    В итоге я понял, что никак не могу в таком режиме работать дольше 2 недель (у меня ещё есть постоянная работа в телекоме по сменному и практически ненормированному графику), а потом требуется месяц (!) отдыха. С девушкой пришлось расстаться, меня постигло разочарование во фрилансе на следующий год, когда я за месяц заработал сумму порядка $2000, но ни разу не покатался на велике (это был июль) и не побывал на природе/на пляже.

    Шашлык и вино действительно хоть каждый день и стойкое желание переехать куда-нибудь в англоязычную Канаду (тем более, что часто звали). Ставка на почасовые заказы сейчас 20..35.
    Иногда чувствую себя зомби (3 часа сна два дня подряд, потом 12 часов и всё равно не выспался, 6 часов, опять 2 дня по 3 часа, потом 14..15 на выходных).

    Жизнь повернулась так, что сейчас вынужден буду выплачивать пару кредитов, включая ипотечный.
    Выбор очевиден — уволюсь рано или поздно с основной работы (уже была попытка, в целом удачная) и стану совожаворонком (рано вставать и поздно ложиться).

    Success story неполная — не даю ссылки на профиль (у меня их несколько, в т.ч. приходилось заказывать самому у себя, но это оказалось ненужной глупостью). Так что не просите — за треть проектов, особенно первых ужасно стыдно, при том, что посмотрев на некоторые из них клиенты просят «и мне так же сделай», причём никогда не угадаешь заранее что может понравиться.

    Единственное, что радует — UK, CA, NZ, US AU — WeekEnd для них — это святое. На душе легко и спокойно с 3 утра субботы до 15:00 понедельника.
    Но бывает, что заказчик шлёт мне в полседьмого утра письмо с вопросом «Как продвигается наш проект» в 6:30 утра по его часовому поясу.

    С точки зрения разработки хорошо, что разделение testing/development/working environment очень чёткое и всегда есть время откатиться — начинаю обычно в час ночи и заканчиваю полпятого утра по их TimeZone, на живом, боевом сервере никогда не экспериментирую.

    Ну и по поводу каналов в Интернет — у меня 2 FTTx и 3 «свистка» — иногда так медленно заливается на хостинг, что приходится вспоминать командную строку и перепробовать их все.

    Зато индусы иногда вымораживают своим менталитетом, даже при хороших ставках.

    Ну и естественно, я стал замечать за собой НЕНАВИСТЬ к нашим местным наебизнесменам-работадателям, которые предлагают оклады 15..22 тыс. руб./мес. работникам с образованием и опытом, особенно после того, как устроившись в одну из местных фирм-конкурентов «тайным покупателем», вернее разработчиком (чтобы посмотреть workflow, т.к. это довольно успешный бизнес-проект с большой клиентской базой) увидел тот же Job Offer с oDesk, но очень плохо, безграмотно переведённый топ-менеджером компании в редких перерывах между поездками на дайвинги.

    В «малый бизнес» я тоже пытался уйти — очень сильная конкуренция, ценовая со школотой. Потом оказалось, что это ещё не главная проблема — рынок заказчиков всё равно растёт быстрее рынка исполнителей. Главная проблема — это чудовищная пропасть между опытом заказчика — НЕ ЗНАЮТ ЗАЧЕМ ИМ ИНТЕРНЕТ И НЕ ЗНАЮТ ЧЕГО ХОТЯТ и… ПОЛНЫМ ОТСУТСТВИЕМ ЖЕЛАНИЯ ПЛАТИТЬ профессионалам.

    Ещё поразило соотношение между уровнем разработчиков и наглостью в сочетаниями с понтами у менеджеров компаний-конкурентов. Не знаю кого винить — Фурсенко, или сразу Вашингтонский кагал, но пока встречался с потенциальными заказчиками (сейчас только телефон, а лучше -электронная почта) по три раза на дню бывал в ситуации, когда выплеснув на меня ушат откровенной технической ахинеи дядя-Вася-на-джипе на вопрос «Где вы нашли эту чушь?» начинал быковать в духе «Это мне сказали девушки в конторе ИП XYZ, А У НИХ ВСЁ ЧЁТКО, ВЕДЬ У НИХ САМ ИВАН МОИСЕИЧ ЗАКАЗЫВАЕТ САЙТЫ!»

    Короче oDesk — единственный шанс для заМКАДья, кроме восстания конечно.
    Ответ написан
    8 комментариев
  • Windows Port Forwarding

    umcherrel
    @umcherrel
    можно воспользоваться стандартными средствами, без дополнительных программ.
    Запускаем коммандную строку из-под администратора и выполняем следующее:
    C:\Windows\system32>netsh
    netsh>interface
    netsh interface>portproxy
    netsh interface portproxy>add v4tov4 listenport=12345 connectaddress=192.168.0.2  connectport=22 listenaddress=0.0.0.0
    
    netsh interface portproxy>dump
    
    #===========================
    # Конфигурация портов прокси
    #===========================
    pushd interface portproxy
    
    reset
    add v4tov4 listenport=12345 connectaddress=192.168.0.2 connectport=22
    
    
    popd
    
    # Конец конфигурации портов прокси
    
    


    Тем самым получаем проброс порта 12345 на 192.168.0.2:22
    Ответ написан
    5 комментариев