Сообщество - Программирование на PHP
26 постов 961 подписчик
4354

Про взлом сайта

Вспомнил историю, хочу поделиться. Может кому то интересно, что значит "взлом сайта" и как это делают.

Был у меня малюсенький сайт в годах примерно 2010-2014. Сайт - интернет магазин, где я продавал свои же php скрипты и давал возможность любому продавать на нём свои скрипты и брал за это 10%. Сайт был не прибыльным, но и содержание его мне ни чего не стоило. И написал я его полностью сам, совершенствуя навык программирования. Был этот сайт полностью автоматизирован.. Т.е. пополнение баланса через webmoney, покупка, продажа, вывод денег, оповещения о продажах по смс... Всё проходило автоматически и без моего участия. К сайту был привязан кошелек, на котором лежало около 3000р.

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

И действительно, парень вывел на свой кошелек все деньги с кошелька сайта. Он их мне вернул и рассказал про уязвимость.

А уязвимость просто наитупейшая... Немного об алгоритме программы: при покупке какого-то товара, программа проверяла, если на счету покупателя денег больше чем цена товара, то из его счета вычиталась эта сумма и отдавался товар. Так вот. В программе при добавлении товара на сайт я не сделал проверку на отрицательную цену. Чувак просто добавил товар с отрицательной ценой, допустим -500р. Потом с другого аккаунта стал покупать свой же товар. Программа проверила, что на его нулевом счету денег больше, чем -500 и вычла из нуля минус пятьсот... Минус на минус дало плюс и его счет увеличился на 500р при покупке товара. Потом он заказал вывод средств и программа в автоматическом режиме перевела деньги на его кошелек.

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

237

Бесплатная книга «Заметки по PHP»

У меня есть сайт, где я публикую свои заметки по программированию. Решил попробовать сделать раздел по PHP в виде книги (формат PDF). В итоге по объёму получилось 72 страницы.


Все статьи уникальны, т.е. написаны мною.


Скачать книгу можно по этой ссылке: https://yadi.sk/i/aSudVcy-3KucBN

13

Агрегатор контента своими руками. Попытка №2.

Агрегатор контента своими руками. Попытка №2. Веб-Разработка, Разработка сайтов, Агрегатор для агрегаторов, Telegram бот, RSS, Smm, Длиннопост

Привет моим верным подписчикам и лиге вэб разработчиков! В данном посте я поведаю о:

- паре забавных случаев, возникших при разработке новой версии моего агрегатора котиков и мемасиков (а так же новостей, видео, пабликов, групп, RSS и Telegram каналов );

- текущем состоянии дел и планах развития.


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


Так как по своей натуре я перфекционист, то идея сделать все "красиво" не давала мне покоя и в 2017 году я наконец сдался и решился переписать все с 0, нанять хорошего дизайнера и выкатить ресурс который заткнет за пояс конкурентов :) Получилось ли у меня или это очередное фиаско, я надеюсь узнать сегодня, в комментариях к этому посту :)


Итак, начнем с пары интересных задач, которые пришлось решить при разработке.


1. Как я добавлял вывод телеграмм каналов.


В последний год появляется все больше популярных телеграм-каналов. Но лично мне не удобно читать их в приложении, хотя я не пробовал :). Я сразу запланировал, что в новой версии агрегатора обязательно должна быть возможность вывести в свою ленту посты из любых публичных телеграм-каналов вместе со всеми другими источниками.


Обилие инструкций по работе с телеграм-ботами воодушевляло и я рассчитывал, что задача не займет много времени. И еще я не понимал, почему никто не сделал аналогичного сервиса :)


Как это всегда бывает в разработке, препятствия возникли на ровном месте: оказалось, что для того, что бы бот мог читать какой-то канал, бота надо туда добавить. Поэтому вариант сразу отпал. И я перешел к чтению мануалов на основной API телеграма.


Через 30 минут изучения документации я был в отчаянии.



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


Несколько дней поиска привели меня к решению: использовать на сервере opensource php телеграм клиент. Дада! Можно использовать телеграм под php, и там даже есть поддержка звонков! Это чудо называется madelineProto и исходники доступны на гитхабе.


В итоге, через 3 дня настройки и две блокировки моего аккаунта из-за чрезмерного количества попыток авторизации я настроил клиент и решил задачу. Теперь у меня есть свой шлюз из telegram в web! А пользователи могут читать любые публичные телеграмм каналы у меня на сайте без регистрации и смс.


2. Парсинг youtube каналов.


С API youtube'a вообще вышло забавно. Их справка предлагает использовать php плагин от гугла для доступа к API.  От их API мне нужно было не много: список видео на канале с метаданными, название канала и его логотип. У vk или fb такой запрос создается парой строчек кода и разобраться можно за пол часа.


Но у гугла свой путь разработки :)

Я смирился с тем, что плагин для доступа к API весит более 30 мегабайт. Но я еще и не смог настроить его за 3 часа!

В итоге, кликая на все подряд в справке гугла, оказалось, что плагин можно вообще не использовать, а для получения всей информации - воспользоваться стандартным get запросом, как везде. На формирование запроса мне понадобилось ровно 10 строк кода и 15 минут, вместо 30 мегабайтного плагина.

А потом люди удивляются: "а почему андройд притормаживает на 8-миядерных процессорах и требует 4 гигабайта оперативы?" ;)


3. Что сейчас с агрегатором?


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


4. Планы


- Добавить прямые ссылки на отдельные источники

- Расширять список источников: imgur, rutube, reddit, новостные сайты.

- Привлечь ядро активных пользователей, что бы были данные для формирования ленты популярных постов;

- Добавить в ленту вывод видео и гифок, что бы сократить число внешних переходов;

- Е-маил рассылки с лучшими постами за день/неделю (естественно при желании пользователя);

- Сотрудничество с создателями контента для совместного продвижения.



5. Техническая часть.


Для тех кому интересно то под капотом следующий стек технологий:


Backend: самописный, доставшийся мне в наследство на одном из проектов и переписаный мной под свои нужды. Используется шаблонизатор smarty.

БД: Mysql

Fron-end: HTML + Angular JS 1, так же используется Jquery 2 (в 3-й версии scroll события в firefox не работают периодически) для анимаций.


Парсинг осуществляю с помощью библиотеки php-query или через API раз в 5 минут по CRON'у в порядке живой очереди с приоритетом на публичные источники. Т.е. если за 4 минуты сайт не успел пройтись по всем источникам, то скрипт останавливается. А в следующий раз в начале очереди находятся те источники, которые дольше всего не обновлялись. Очереди для публичных и персональных источников разные - по 2 минуты и на те и на другие.


Если вас заинтересовал проект, то буду очень признателен за любые отзывы и комментарии. Ссылка (на пикабу, вроде, разрешено в конце поста давать ссылку): https://i-c-a.su/

Показать полностью
8

День рождения и квесты!

Все события произошли ещё в июне прошлого года, но написать о всём том решил я только сейчас. Почему? Не знаю! Хотел ещё тогда, но как-то руки не доходили, а потом уже подзабылось как-то и стало не очень актуально, но сейчас по некоторым причинам немножко снова взялся за этот проектик, вот и вспомнил, захотелось поделиться теми классными впечатлениями и событиями, что были тогда, в самый первый раз :)

Кому-то покажется это всё ерундой и чем-то не интересным, а кто-то, быть может, с интересом прочитает, каждому своё, но я чувствую, что сейчас я должен это всё написать.


Дело в том, что общался я тогда с одной замечательной девушкой, хорошо общались мы, было круто! Но сейчас история общения и что было дальше не особо интересна, не о ней речь. Единственное, что нужно знать, что девушка та очень любит сов в любом их виде (нет-нет, про их поедание речи не идёт!). И захотелось мне сделать подарок ей на день рождения, да не обычный какой-нибудь, а особый, какого раньше ещё не делал никому! Решил я сделать для неё квест небольшой. Но делать просто квест одноразовый -- это как-то не круто. Поэтому решил написать я небольшой квестовый движок, чтоб потом можно было какие угодно задания туда писать и всё менять на ходу, без необходимости лезть в какие-то исходники и вручную править код, а чтоб всё красивенько и удобненько работало через интерфейс приятный, да и чтоб можно было потом и другие квесты тоже проводить, штука-то полезная и в перспективе тоже, ведь можно применить много где.

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

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

Пока писал движок, в это же время готовил разные части подарков, которые должны были тоже участвовать в квесте, хоть я пока точно не представлял, как именно это будет. Среди них было два набора стикеров с совами (заказывал где-то), кружка с собственным дизайном, тоже с совами и ещё другими животными; и ещё вручную на маленьком прямоугольном кусочке фанеры выжег тоже сову, получилась прикольная такая фанерная карточка с совой, пусть и немного криво выжженой, потому что большим жалом маленький рисунок не очень удобно выжигать, особенно, когда опыта в этом особо нет.. )

Ещё подготовил аудиозапись специальную, FM-передатчик, роутер с OpenWRT на борту и настроенным веб-сервером и Wi-Fi с определённым паролем, были некоторые задумки по этому поводу тоже.

Две недели в свободное время я пилил движок (больше по ночам, днём другие дела были), наверное, даже жил этим, представлял, что и как можно сделать, какие задания и т.д. Но точного сценария так и не было.

В движке есть поддержка заданий, карта, инвентарь. Меня очень пёрло от мыслей о том, что можно связать реальность и виртуальность, потому что предметы, что были в реальности, я загнал и в движок тоже, они могли выдаваться за задания и находиться в инвентаре игрока. Карта нужна для того, чтоб знать, куда идти, если это необходимо по заданию (заодно и я мог наблюдать, где находится сейчас она). А в самих заданиях можно писать текст, по разному оформленный, картинки вставлять, там удобный редактор, позволяющий делать всё это. В заданиях можно указывать координаты, куда нужно идти; запрашивать определённый ответ, присваивать определённый текст кнопки для выполнения задания, чтоб можно было не просто на "Дальше" нажимать, а именно в зависимости от тематики задания указывать определённый текст на кнопке. Также можно указать предмет из инвентаря, необходимый для выполнения задания, а при завершении задания можно выдать какой-то предмет, а также есть возможность указать следующее задание, таким образом строится цепочка заданий в нужном порядке. Хотел сделать возможность разветвления: разные кнопки -- разные следующие задания, но подумал, что это не особо нужно было, на тот момент достаточно было и одной сюжетной ветки, к тому же, времени было мало. Ещё были мысли тогда про такой тип заданий, где нужно придти в определённую точку на карте, и лишь после этого можно будет продолжить, но тоже пока реализовывать не стал.


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


Но вот настал тот самый день!
Помню, это была пятница, шёл дождик. Я назначил время старта на 3 часа дня. А сам только в два часа закончил делать движок. И то, не всё до конца закончил, со стороны "админки" там вообще почти ничего нет, кроме самого необходимого минимума. И вот за час до начала игры пошёл готовить локации. Опять же, не было ни сценария, ни плана, были просто разные части подарков и некоторые идеи. И лил дождь. Ввиду того, что по работе есть много знакомых в городе, потому что мы обслуживаем разные организации, то пошёл я в первую очередь именно к тем людям, которых знал уже, в фирмы какие-то, в магазины. Пришёл, объяснил, что придёт девушка, отдаст шишку лесную (они у неё заранее были, в день рождения отдал вместе с коробочкой-инвентарём, а шишки -- это как валюта), а ей в обмен на шишку должны будут отдать очередной предмет.

На каждом предмете был указан код, который необходимо было ввести в движке для выполнения задания.

Ходил также и к незнакомым людям, в пиццерию, в цветочный магазин, помню, зашёл, объяснил всё это той девушке, что там работала, она так заинтересовалась и так серьёзно к этому отнеслась, что даже на бумажке инструкции для себя записала и тоже ждала с нетерпением нужного времени!

В офисе на работе на окошко поставил плеер с зацикленной аудиозаписью, в которой бот Максим говорил своим голосом нужный циферный код, и всё это транслировалось по обычному радио, на частоте 108.0 FM. Для передачи использовал недорогой FM-трансмиттер, купленный на алике и собранный вручную (это был DIY-комплект).

Недалеко от рабочего офиса находится другая обслуживаемая нами фирма, туда поставил небольшой роутер на окошко, а в роутере... А об этом позже :)

За пол часа до начала игры сел писать сценарий. Было известно, где какие части подарков находятся, в каких локациях, и какие коды на них написаны. Задания, состоящие просто из текста были не так интересны, поэтому решил привлечь кота Пушина, будто бы он обращается к нашей главной героине и просит помощи в поиске пропавших сов! Сначала было пару заданий для обучения, где показано было, как вводить ответы, как по карте ориентироваться, а потом уже началась сама история сюжетом, который был буквально на ходу придуман.

Выглядело это всё вот так:

В списке заданий изначально отображались только активные задания, а уже позже, через пару месяцев после всех этих событий, добавил возможность просматривать уже выполненные задания, чтобы ещё раз пройтись по той истории :)

И, кстати, активных заданий может быть несколько, поэтому, всё же, можно делать разные сюжетные линии и связывать их. Например, в одной ветке в каком-то задании будет выдан предмет, который нужен будет в задании другой ветки. Так-то!

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Началось всё с обучения, ведь нужно показать, что как.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Нажали на кнопку и попали в следующее задание.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

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

Некоторые предметы, хоть они и не участвовали непосредственно в игре, но были подарены на ДР, решил тоже добавить в инвентарь. Они ведь есть у неё уже, так что пусть будут и в инвентаре!

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

А вот так инвентарь выглядит со стороны игрока. Не стоит удивляться, что там такое количество предметов. Дело в том, что сейчас скриншоты делаю я из под своего аккаунта, а пока тестировал разные задания, их проходилось по несколько раз проходить, поэтому некоторые предметы выдавались несколько раз.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Итак, продолжим проходить по заданиям! Тут я сначала нарочно ввёл неправильный ответ, чтобы показать, что происходит при этом.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Ввели правильный ответ, следующее задание.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Если нажать на ссылку "показать локацию на карте", то откроется, как ни странно, карта, где будет указано, куда идти. А также можно быстро вернуться обратно к заданию.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

А ещё на карте можно посмотреть свою текущую позицию, которая, кстати, отображается тоже в виде совы. Ну, почему бы и нет? Жмёшь на кнопку "Где я?", а тебе в ответ вот это:

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

И снова возвращаемся к заданиям. Вот, всё началось!

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост
День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост
День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост
День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост
День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

А вот в следующем задании уже нужно было "перехватывать радиоэфир" для того, чтобы узнать код. Как я уже писал выше, с плеера через FM-трансмиттер транслировался записанный аудио-код, который и нужно было ввести в качестве ответа на задание. Помню, сидел я тогда в офисе, смотрел из окошка (второй этаж), и вот она подошла к окну, но тут я уже вышел помочь, потому что до этого там ещё парень с девушкой были в качестве помощников, но они потом ушли по делам, поэтому дальше решил я сам сопроводить, к тому же, приближалась сложная часть. Технически сложная. Может, и не сложная, но человеку, который этим не занимается, всё же, не совсем понятная. Уже тогда у главной героини торжества впечатления были очень хорошие, эмоций тоже много! Всё же, не каждый раз так интересно день рождения проводится :)

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Настало время рассказать про ту штуку с роутером, хотя, думаю, из следующего задания всё и так понятно будет :)

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

К сожалению, не могу показать сейчас, как выглядела страничка из роутера, потому что за этот год уже много раз там всё переделывалось, а сам роутер тот трудится сейчас совершенно в другом месте.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

И вот всё уже подходит к завершающей стадии.

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Самое последнее задание -- чаепитие :)

День рождения и квесты! Сова, Движок, Квесты в реальности, Квест, Сайт, Разработка, Длиннопост

Даже сейчас, делясь с вами этими заданиями, сам снова испытал хотя бы немножко те клёвые эмоции, что были тогда! Для меня это было чем-то необычным, ведь не часто такое происходит, да и реакция девушки, для которой всё это делалось, тоже порадовала весьма! А учитывая то, что планировать я не умею, а тут удалось так хорошо всё провернуть, то это вдвойне приятней, хотя, учитывая то, что сам квест был написать за пол часа до его начала... :)

И в начале я писал, что не знаю, зачем захотелось поделиться этим всем, но сейчас понимаю, что оно точно того стоило! А движок до сих пор используется порой на каких-нибудь праздниках или других событиях, и пусть проводятся не такие сложные и масштабные квесты, но приятно помнить о том, с чего всё началось, и что сейчас это тоже приносит пользу.


Всем спасибо за внимание и за возможность поделиться :)

Надеюсь, мне удалось хоть немножко передать ту необычную атмосферу, заинтересовать вас и поколебать стрелку мимиметра )

Показать полностью 18
4

Пост помощи

Привет всем!

Сообщество хоть и небольшое, но есть. Так что в целях его развития с радостью отвечу на интересующие работы как php разработки, так и программирования в целом.

О себе: 22 года (по опыту - mid). Поработал в пару интересных проектах. Во всех местах основной язык был php.

3

Потерял сайт с библиотеками php

Приветствую!

Был у меня в закладках сайт годный со всякими php-библиотеками, теперь не могу найти.

Зелёная шапка, лого в левом верхнем углу с ослом(?), вроде иностранный, хотя не уверен.


Если вы узнали этот сайт из описания, сообщите ссылочку, огромное спасибо заранее.

И просто так спасибо всем прочитавшим тоже :)


КДПВ:

Потерял сайт с библиотеками php Php, Потеря потерь, Кот
0

[Doctrine] BEST PRACTICES - 1

Замечательный человек Marco Pivetta, который больше известен под ником Ocramius и который участвует в развитии Doctrine ORM, составил презентацию, в которой описал лучшие практики, которых следует придерживаться при работе с Doctrine.

вот ссыль

На официальном сайте Doctrine так же присутствует раздел, под названием Best practices , но он очень мал.

1. Общие правила.

Как правильно при первом знакомстве с Doctrine все сущности, которые мы создаем являются по сути обычными POCO объектами , которые на каждое свойство имеют по get\set методу и не имеют конкретного поведения.

"Сущности должны работать без ORM", означает то, что вы должны абстрагировать ваши сущности от логики ORM, т.е. если вы вдруг захотите сменить Doctrine на Propel, вам не пришлось бы менять код в бизнес-логике. Однако тут возникают ограничения, накладываемые ORM, например коллекции в Doctrine - "ArrayCollection" которые используются внутри сущностей, для работы со связями.

"Сущности должны работать без БД" - пункт, который в принципе и так исполняем, так как вся логика работы с БД у нас инкапсулируется в самой ORM. Исключение составляет разве, что Active Record сущности с sql внутри.

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

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

2. Придайте Entity осмысленности.

Типичная сущность:

[Doctrine] BEST PRACTICES - 1 Php, Doctrine, ORM, Длиннопост

При таком подходе наша Entity напоминает больше ассоциативный массив, нежели полноценный объект. Чтобы решить эту проблему, данному классу нужно придать немного больше информативности:

[Doctrine] BEST PRACTICES - 1 Php, Doctrine, ORM, Длиннопост

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

3. Инкапсулируйте взаимодействие с коллекцией внутри Entity.

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

[Doctrine] BEST PRACTICES - 1 Php, Doctrine, ORM, Длиннопост

Такой подход является следствием создания сущностей-болванок, по этому оптимальным вариантом будет некоторые операции размещать внутри методов самой сущности. В данном случае - CRUD операции с коллекциями.

[Doctrine] BEST PRACTICES - 1 Php, Doctrine, ORM, Длиннопост

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

4.Ваши сущности всегда должны находится в валидном состоянии.

Как касательно самих типов данных, чтобы в поле для целого значения не прилетела строка, например, так и касательно самих бизнес-правил, чтобы email был валидным, а пароль не меньше 3 и т.д. Вы должны всегда доверять сущности и быть в ней уверены. Однако не следует помещать в методы сущности комплексные валидационные правила, которые работают с данными пользователя. У вас всегда должны быть слои взаимодействия. Валидацию самой пользовательской формы отдавайте валидаторам - это может быть сервис, или input-фильтры, как в ZF2, или формы, как в SF2, или любые другие инструменты.

5.Используйте конструктор.

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

6. Не рекомендуется использовать классы из уровня выше, в классах, уровня ниже.

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

Показать полностью 3
2

Проект для создания коротких ссылок с аналитикой (Yii2)

Проект для создания коротких ссылок с аналитикой (Yii2) Php, Yii2, Shortener, Гифка

Пример моего проекта написанного на Yii2 фреймворке.


Основные функции: создание коротких урлов, а также сохранение аналитической информации по переходам:

- geo позиционирование (страна)

- браузер

- платформа (ОС)

- реферальная ссылка (если есть)


В проекте используется: Google-chart, DB Rbac, Geoip


GitHub - https://github.com/gaalferov/yii2-minify-url

Работающий пример - https://burl.pro


Обоснованная критика приветствуется. Если кому-то будет интересен мой личный путь развития, от начала и до текущего положения, милости прошу ознакомиться с моей историей https://burl.pro/QTkNRW

Показать полностью
Отличная работа, все прочитано!