«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Клуб изучающих PHP #108 Аноним 2019/02/24 03:08:49  №1353705 1
php-noob-1.png (33, 500x500)
500x500
cat-cafe-osaka.jpg (157, 1024x683)
683x1024
l0-sensei.jpg (34, 650x384)
384x650
mori-1.jpg (359, 900x600)
600x900
Ну что же, зима заканчивается, и это хорошо. А мы по-прежнему изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки, печем печенье и даже делаем простые сайты! Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.

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

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

Предыдущий тред был тут: >>1331378 (OP) . Остальные треды есть в архиве: https://phpclub.tech/ (там есть поиск, так что можно легко найти обсуждение какой-то задачи или ответы на свой старый пост) или ищутся в гугле по словам "клуб изучающих php" и в архиваче.

Мейлач лежит? Есть запасной тред на доброчане: /s/res/23225.xhtml#i46467

Форматируй свой код, если хочешь, чтобы его читали (как, написано во втором посте).

Правила: ведем себя воспитанно, помогаем новичкам, читаем учебники, решаем задачки, постим ссылки на решения, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 2-3 дня, у него мало времени, не жди его, решай задачки дальше. ОП отвечает на все вопросы по его задачкам и учебнику, а вот насчет каких-то других вещей - только если останется время. Но в треде немало анонимных экспертов разного уровня, так что вряд ли вопрос останется без ответа.

С чего начать

У нас есть свои уроки по основам PHP, они собраны и выложены по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не читайте, не сохраняйте, не запоминайте его, он временный). Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то можно начать с него. Он простой и понятный. Там есть задачи, их нужно решать (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению. С другой стороны, если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.

Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Visual Studio Code, Netbeans PHP или PhpStorm (с ним будет удобнее).

Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.

Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.

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

- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony 3/Doctrine 2
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.

Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:

https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md

Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md

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

Параллельно стоит подучивать английский, на первых порах можно без него, но по мере развития придется все чаще сталкиваться с англоязычными статьями, так что лучше не откладывать. Читать можно news.ycombinator.com - это что-то вроде их хабра. Также можно начинать смотреть фильмы и видео на английском.

Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.

- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://github.com/codedokode/pasta/blob/master/db/databases.md

Что почитать

- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
- Новости IT на англ. https://news.ycombinator.com/
- какой-то древний, устаревший, но большой и на русском справочник по веб-разработке, посоветованный аноном: https://starcat.dp.ua/doc/wdh/

Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492

У ОПа нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.

Платиновые вопросы

- Почему PHP? Потому что вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу.
- Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Оформляйте код Аноним 2019/02/24 03:10:34  №1353706 2
grammar.png (56, 500x644)
644x500
Не знаю, читает ли кто-то этот пост, но все равно напишу. Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть. Если каждый будет оформлять код как хочет, будет бардак.

Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.

Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492

Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:

- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт или slovari.yandex.ru и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)

Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:

PSR-1: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-2-coding-style-guide.md
Ответы: >>1379335
Аноним 2019/02/24 03:11:13  №1353707 3
Если я кому-то не ответил в прошлом треде, то постараюсь ответить сегодня-завтра. Но вы можете напомнить о себе в этом треде.
ХАЦКЕР Аноним 2019/02/24 08:02:19  №1353742 4
Screenshot1блоо.png (175, 1913x938)
938x1913
Анон помоги. Можно ли как-то заполучить доступ к полному номеру телефона на сайте, если он зашифрован звездочками? Я неумею немножко читать код, но не разобралсс(.
Ответы: >>1353743 >>1353749
Аноним 2019/02/24 08:07:41  №1353743 5
>>1353742
Нет, сори. Я умею ток взламывать вк.
Аноним 2019/02/24 08:10:23  №1353745 6
Пхп вообще параша. Кто будет этим всем заниматься? Язык постоянно пытается стать жабой, когда сама жаба уже существует и просто плюет в сторону этого треда. Я уже не говорю про бек на питоне или голанге, где это дело более успешней, чем перебирать говнокод 10летней давности здесь.

Подумайте об этом.
Аноним 2019/02/24 08:11:59  №1353749 7
>>1353742
Смотри через Network, что сервер тебе присылал. Если присылал уже со звездочками, то ничего.
Ответы: >>1353786
Аноним 2019/02/24 08:17:46  №1353756 8
Аноним 2019/02/24 08:39:25  №1353777 9
>>1353745
Количество вакансий и фирм глянь, где используется. Пхп очень популярен, прост в осовении и гибок, инструменты все современные есть, по скорости щас тоже отдалили. С жабой имеет смысл начинать, если есть огромный энтерпрайз, где кучи сервисов друг с другом коммуницируют. Жаба в крайне малом количестве стартапов сейчас используется, проще и быстрее все на пхп бывает написать и инвесторам результаты показать, чтобы получить дальнейшее финансирование.
Ответы: >>1353803
Аноним 2019/02/24 08:49:45  №1353786 10
>>1353749
Облом. Приходит со звездюльками( Спасиб всеж.

Аноним 2019/02/24 09:18:05  №1353803 11
>>1353777
Проще и быстрее писать на рельсах, если ты очередной манястартапер. Если же хочешь в норм контору - то тут уже юзается питчон, а если прям охуеваешь от своей тормознутости - присыпается голанг для убер маня хайлода.

>чтобы получить дальнейший говнокод.
Подправил.
Ответы: >>1353810 >>1353827 >>1353831
Аноним 2019/02/24 09:33:31  №1353810 12
>>1353803
Как ни грустно это осозновать, но двачую.
Аноним 2019/02/24 10:08:30  №1353827 13
>>1353803

Какие плюсы у Питона? Это же по сути и по синтаксису почти тот же Яваскрипт, нет даже тайп-хинтов. В Руби та же ерунда. В PHP больше возможностей статической типизации, есть фреймворки, ORM. И разработчиков найти проще.
Ответы: >>1353884
Аноним 2019/02/24 10:10:42  №1353831 14
>>1353803

И, конечно, непонятно, как просто использование Питона или Руби повышает качество кода. С чего бы вдруг? Что, менеджер по продажам, прошедший экспресс-курсы по Питону, будет писать более качественный код, чем после курсов по PHP? Вы, товарищи, просто распространяете очень далекие от реальности стереотипы.
Ответы: >>1353884
Аноним 2019/02/24 11:00:51  №1353884 15
>>1353827
>В PHP больше возможностей статической типизации, есть фреймворки, ORM. И разработчиков найти проще.
Это все нивелируется с существование жабы. Если бы ее не было, возможно пхп был бы еще уебищней.

>>1353831
Качественный код может написать любой человек который умеет читать доки.

Какую-то хуйню не аргументированную спизданул.
Ответы: >>1353901 >>1354506
Аноним 2019/02/24 11:12:24  №1353901 16
pyha.png (7, 799x506)
506x799
>>1353884
>Это все нивелируется с существование жабы.
Ну так и есть, пхп второй после жабы, пикрелейтед. Где жабу поднимать геморно, но удобство и функциональность жабы нужна, поднимают пхп.
Ответы: >>1353992
Аноним 2019/02/24 11:50:51  №1353942 17
ОП, я сделал все задания из твоего поста и прочитал все книги из оп-поста + некоторые проскакивающие в обсуждении про шаблоны. Что мне делать дальше?
Ответы: >>1353946 >>1353992 >>1354503
Аноним 2019/02/24 11:54:53  №1353946 18
Аноним 2019/02/24 12:32:36  №1353992 19
>>1353901
>бекенд
>мочаскрипт

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

>>1353942
>Что мне делать дальше?
Делать сайты. Магазины, склады, игровые сайты, фильмы и т.д. Но мне тебя жаль.
Ответы: >>1354232 >>1354503
Аноним 2019/02/24 14:23:40  №1354111 20
А объясните на пальцах, какую проблему решает DI?
Ответы: >>1354206
Аноним 2019/02/24 15:01:23  №1354129 21
Вопрос на засыпку:
есть два скрипта. В одном весь код поделен на методы вплоть до абсурда, например, метод hasProperty имеет всего лишь одну строчку кода return isset(prop); и методов очень много, сами понимаете, код раздут, код ради кода. В другом все написано в одном методе. Какой из этих скриптов отработает быстрее?
Ответы: >>1354503
Аноним 2019/02/24 16:16:22  №1354206 22
Аноним 2019/02/24 16:21:33  №1354215 23
Спрашивал в JS-треде, но там молчат
Помогите изменить скрипт, пожалуйста.

Логика такая: при загрузке страницы срабатывает скрипт, считывает значение поля amount, отправляет его аяксом в requestUrl.php, принимает ответ и ждёт, пока человек не нажмёт кнопку payButtonId. Нажал - данные улетают в https://pay.realexpayments.com/pay

Проблема в том, что кроме amount нужны дополнительные поля, но пользователь заполняет их уже на странице. То есть, нужно, чтобы он сначала заполнил их, и только потом срабатывала их отправка в requestUrl.php

У меня не получается так сделать. Даже если ввести ещё одну кнопку и повесить на неё скрипт отправки в requestUrl.php, а на вторую отправку в платёжку, то отправка в платёжку не срабатывает. Работает только по $(document).ready

Вот код:
https://jsfiddle.net/tw6f7y2b/
Ответы: >>1359945
Аноним 2019/02/24 16:43:04  №1354232 24
>>1353992
всмысле жаль? ты охуел?
Ответы: >>1354305
Аноним 2019/02/24 18:03:12  №1354305 25
>>1354232
Да. Если бы я был бы тобой и только закончил бы опа таски - то я бы сменил род деятельности ( в програмаче ). Явно не жаба, там слишком много писать. Пошел бы в питон, если бы ничего больше не знал. А если бы я делал выбор сейчас - то остался бы в мобилках. Тут языки не нужно придумывать. Все стандартно. Но для бека я бы выбрал голанг или рельсы.
Аноним 2019/02/24 18:33:53  №1354342 26
>>1354305
Вот этот дело говорит.
мимо-как-год-перекатился-в-божественный-руби
Ответы: >>1354358
Аноним 2019/02/24 18:38:55  №1354348 27
>>1354305
а если в системное програмирование?
Аноним 2019/02/24 18:49:20  №1354358 28
>>1354342
>как-год-перекатился-в-божественный-руби
А я вот выбирал между гошкой и руби. Не понравилась мне динамика. Поэтому делаю внутрипроекты на гошке.
Аноним 2019/02/24 19:04:35  №1354379 29
Добрый вечер, задался вопросом как вообще устроены большие парсеры, есть ли какое-то название у этого и какие технологии используются? Например если есть какой-то агрегатор - на чем именно пишут парсеры для него?
Ответы: >>1354495
Аноним 2019/02/24 21:09:34  №1354494 30
>>1354219

Смысл сервис-контейнера в том, что он может создавать сервисы с зависимостями, не заставляя нас делать это вручную. Принцип DI (внедрение зависимостей) обычно требует передавать зависимости в сервис снаружи. Вручную это выглядит так. Допустим, нам нужен сервис C, который зависит от A и B:

$a = new A;
$b = new B;
$c = new C($a, $b);

С контейнером:

$c = $container->get('C'); // Или $app->make('C') в Laravel

Если что, DI и контейнеры я попытался, как мог, описать в своем уроке: https://github.com/codedokode/pasta/blob/master/arch/di.md - без теории по DI трудно понять, зачем нужен контейнер.

Второй плюс DI контейнера в том, что он умеет сохранять ранее созданный объект и возвращать его, а не создавать новый, при повторном вызове. Это в Ларавель называют "синглтоном".

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

> Заодно вопрос какая структура папок должна быть для контрактов и их реализации.

Не знаю, в документации Ларавел не описано?

> Если бороться с жирными контроллерами через сервисный слой то какую выбрать структуру папок чтоб можно было вернуться к проекту через месяц?

А ты разобрался, что такое сервисы? Проблема "толстых контроллеров" в том, что код в них нельзя повторно использовать. Ты описал, например, код регистрации пользователя в контроллере и после этого ты не можешь создать пользователя программно из другого места кода. Сервисы решают эту проблему.

Если у тебя маленький проект, то ты просто кладешь сервисы в одну папку. В простейшем случае можно для каждой сущности сделать свой сервис (сервис для работы с постами, с комментариями, с пользователями). Если большой - то делаешь, например, подпапки, а сами сервисы разделяешь по задачам: сервисы приема платежей, сервисы для подсчета статистики, итд.
Ответы: >>1354575 >>1356055
Аноним 2019/02/24 21:10:06  №1354495 31
>>1354379

Это правильно называется "скрейперы", и как правило, абсолютно ничего сложного там нет, все элементарно:

- загружаем HTML код
- выделяем куски страницы с помощью какой-нибудь DOM-библиотеки, по имени CSS-класса, по тексту, по еще каким-то HTML-атрибутам
- выводим собранные данные в каком-нибудь формате

Если ты знаешь HTML и DOM, то это обычно элементарная задача.

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

Еще можно, как Телеграм, объявить конкурс и выбрать лучшее решение: https://habr.com/ru/post/438926/

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

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

http://xgu.ru/wiki/HTML_scraping

>>1354305

Какой смысл выучить один язык, забросить, и учить другой? Никакого.

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

Но учить язык только потому, что анонимные эксперты с двача называют его "боежственным", довольно глупо. Есть такие люди, которым в принципе работать не интересно, они весь день сидят, пишут код на Си, PHP, C# или Яве, страдают, а тут рассуждают про "божественные" языки (которые точно так же им наскучат через неделю, если попросить их поучаствовать в большом, реальном проекте на них в команде, с реальным кодом, а не задачками на 500 строк).
Ответы: >>1354777
Аноним 2019/02/24 21:13:46  №1354500 32
>>1354305

В Питоне нет тайп-хинтов, приватных полей. Там везде костыли вроде virtualenv (так как Питон и его окружение по умолчанию пытается устанавливать пакеты в системные директории, что не всегда хорошо). Несколько менеджеров пакетов, причем часто один менеджер используется только для установки другого. Ужасные сокращения, часто нелогичные (например: в matplotlib есть метод set_xlim, а не set_x_limit, но при этом есть set_xscale). Вообще, если брать библиотеки вроде numpy или matplotlib, то нелогичность названий и интерфейса там вполне сопоставима с таковой же в стандартной библиотеке PHP. matplotlib это вообще жесть. Хотя богатство возможностей, конечно, радует.

Расширять библиотеки часто сложно. Например, попробуйте прикрутить DNS-кеш или подменить DNS-резолвер в стандартной библиотеке urllib. Придется поломать голову.

Часто используются глобальные переменные, глобальное состояние, или статические методы. Например: в urllib3 для настройки логгирования вместо DI (создать логгер и передать в urllib3) предлагают использовать код:

logging.getLogger("urllib3").setLevel(logging.WARNING)

А для замены компонента SSL предлагают:

urllib3.contrib.pyopenssl.inject_into_urllib3()

Ну не жесть ли, везде глобальные переменные и кривые костыли вместо DI? Кстати, обратите внимание на разный стиль написания имен функций и бессмысленные части неймспейса вроде contrib.

То же самое в urllib.requests:

> urllib.request.install_opener(opener)
> Install an OpenerDirector instance as the default global opener.

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

Обратите внимание на стиль написания функций:

> urllib.request.build_opener()
> urllib.request.getproxies()

Я не уверен, есть ли бесплатные IDE с анализом кода, показом определений для Питон. Ну и вакансий вроде меньше.
Аноним 2019/02/24 21:14:15  №1354502 33
>>1353705 (OP)
как пересесть с PHP на иглу мужского одобрения?
Ответы: >>1354532
Аноним 2019/02/24 21:14:16  №1354503 34
>>1354129

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

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

>>1353992

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

>>1353942

А что ты хочешь делать? Устроиться на работу, сделать свой проект, сдать сессию, какая у тебя цель?

Если на работу - то с задачами про студентов и файлообменник, навыками верстки, SQL, JS вполне может быть достаточно знаний. Можно, конечно, дополнительно освоить какой-нибудь фреймворк вроде Симфони или Ларавель, или посмотреть какую-то популярную CMS. Вроде как у нас были люди, которые послет студентов или файлообменника устраивались на работу и дальше задачи не делали.
Ответы: >>1354526
Аноним 2019/02/24 21:15:31  №1354506 35
>>1353884

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

Неверно. Вот, допустим, человек прочитал документацию по Питону - станет ли он писать качественный код? Да не факт, Питон очень провоцирует городить списки из словарей, называть переменные непонятно итд. Будет ли этот человек знать MVC, ООП, паттерны? Вряд ли.

Вот посмотри библиотеки matplotlib или urllib. Их, наверно, писали люди, читавшие доки, но качество кода очень страдает, мягко говоря. Они даже функции назвать единообразно не смогли, не говоря уж про такие вещи, как DI. Я не вижу особого различия в качестве между PHP- и Питон-библиотеками.

>>1353745

Тогда что ты, болезный, забыл в нашем треде? Выкатывайся в свой тред и нахваливайте друг друга петухами и кукушками. У нас тут учебный тред, а не тред для самоубеждения, что у нас самый лучший язык.
Аноним 2019/02/24 21:22:26  №1354511 36
15324579917250.mp4 (2249, 854x480)
480x854

>...использование Питона или Руби повышает качество кода
день 00:20 вот-вот начался, а ты уже сделал его
Аноним 2019/02/24 21:28:42  №1354517 37
Шаблон Реестр и класс DI дублируют друг друга? Я смотрю, у них одна и та же структура. Геттер, сеттер и контейнер. Разница между ними лишь идеологическая?
Ответы: >>1354520
Аноним 2019/02/24 21:32:42  №1354520 38
>>1354517

Реестр обычно это глобальное хранилище и он может быть только один. А если ты сделаешь Реестр на нестатических методах как объект, то он от DI контейнера будет не отличим.
Ответы: >>1354531
Аноним 2019/02/24 21:38:23  №1354526 39
>>1354503
>А что ты хочешь делать? Устроиться на работу, сделать свой проект, сдать сессию, какая у тебя цель? Если на работу - то с задачами про студентов и файлообменник, навыками верстки, SQL, JS вполне может быть достаточно знаний. Можно, конечно, дополнительно освоить какой-нибудь фреймворк вроде Симфони или Ларавель, или посмотреть какую-то популярную CMS. Вроде как у нас были люди, которые послет студентов или файлообменника устраивались на работу и дальше задачи не делали.


Я хочу устроиться на работу, но не абы куда, студии мимо, хочу заняться серьезным серверным программированием. Мне в вузе очень нравилось проектировать базы данных, вследствие этого за мной тянется фундаментальный багаж знаний о реляционных и нереляционных баз данных. Здесь я только пхп учил. Смотрел, кто из знакомых по вузу где зацепился, большинство не работает по профессии, некоторые админят (тоже не по профессии), некоторые пашут на мобилках, делают приложения, один ушел в 1С. Говно, в общем. Что делать, куда идти? Может свой проект сначала написать какой-то, чтобы крупные компании на меня обратили внимание?
Ответы: >>1354549 >>1359945
Аноним 2019/02/24 21:45:57  №1354531 40
Ответы: >>1357547 >>1359945
Аноним 2019/02/24 21:47:37  №1354532 41
Аноним 2019/02/24 22:12:40  №1354549 42
>>1354526
В стартап либо компашку поменьше иди джуном. На собесе задавай вопросы, что они там пилят, если какой свой проект и начинают про архитектуру рассказывать, то круто, если про 100500 клиентов и как они им один и тот же фреймворк или цмс фигачат, то не очень. Можно в принципе и в студии свой уровень подтянуть, если по ходу дела книгу вроде зандстры осваивать и кусками паттерны и нормальный код стараться организовывать, но это дольше. Свой проект на гитхабе конечно лучше сразу, если еще и ООП нормальный там будет, то на собеседовании тебя уже будут нормально воспринимать, и будет о чем рассказать.
Аноним 2019/02/25 03:51:48  №1354575 43
>>1354494
резюмируя - в сервис контейнер я пихаю только если у меня присутствует необходимость в зависимости? если у меня просто вспомогательный класс (сервисного слоя) без зависимостей для контроллера я его просто делаю use и использую.
>Не знаю, в документации Ларавел не описано?
контракты в /app/Contracts а реализации их неизвестено где
Ответы: >>1359947
Аноним 2019/02/25 06:01:38  №1354604 44
сап, подскажет мб кто.
В общем у меня есть скрипт пхп вывода значений из mysql, как его засунуть в таблицу на сайте хтмл?
Ответы: >>1359947
Аноним 2019/02/25 06:21:32  №1354608 45
Пиздон или Джава? На чей хуй пересесть? Что анон посоветует?
Ответы: >>1354786
Аноним 2019/02/25 11:19:03  №1354777 46
>>1354495
>Это правильно называется "скрейперы"
Да нет, проблем с написанием его нет. Меня интересует как и на каких технологиях разворачивают крупные скрейперы а-ля momondo или другие агрегаторы. Вот допустим есть агрегатор который должен содержать актуальную информацию, то-есть нужен не только первоначальный сбор инфы с сайта но и постоянный перепарсинг сайта (не учитываем тут защиту сайтов, считаем что её нет и принимаем работу что не все сайты нужно парсить, у некоторых есть удобное API).
Можно ли использовать Apache Beam для таких целей или что-нибудь подобное? Или как вообще они устроены? Докеризированные контейнеры которые разворачиваются on purpose? Меня не сам процесс парсинга интересует (тут я имею немного опыта, писал как PHP-парсеры так и мультипоточные парсеры на selenium-js) а вот та инфраструктура которая позволяет поддерживать беспрерывную работу парсеров под большой нагрузкой и в автоматическом режиме.
Ответы: >>1354803
Аноним 2019/02/25 11:30:58  №1354786 47
>>1354608
Джава, если объект-ориентированный php освоил, то будет минимум отличий и без усилий перейдешь, все довольно похоже. К тому же вакансий на ней поболее и платят там лучше, ну и в джаве более серьезно к качеству кода относятся, чем в питонах.
Ответы: >>1354794
Аноним 2019/02/25 11:35:57  №1354794 48
>>1354786
Тханкс. По пых я всю доку от корки до корки перечитал, долго работал пыхокодером. Хотет перекатиться во чтото для взрослых людей, чтобы быть уважаемым господином.

Т.е. хочу выбрать язык которому я мог бы посвятить жизнь без всяких сомнений, изучать каждый пук. Удачным ли выбором для таких целей является джава?
Ответы: >>1354829
Аноним 2019/02/25 11:48:22  №1354803 49
>>1354777
У нас в шараге под подобное были докеры на амазоне, запускались по таймеру из дженкинс, результаты потом дампом БД пересылались в основную базу. Платили только за время работы парсеров. Но наверняка есть лучшие методы.
Ответы: >>1354827
Аноним 2019/02/25 12:19:58  №1354827 50
>>1354803
То-есть в докере генерились дампы, не было прямого взаимодействия с бд? Был какой-то микросервис отдельный который принимал дампы на импорт? Немного подробнее пожалуйста этот момент объясни.
Ответы: >>1355029
Аноним 2019/02/25 12:23:07  №1354829 51
>>1354794
Питон по синтаксису на мой взгляд посасывает современному PHP, нет неймспейсов как у PHP, там интерпретатор ищет файлы сперва в локальной области видимости, потом в PYTHON_PATH и тд, есть конечно импорт директорий но это на мой взгляд не так удобно как с нейспейсами в PHP, нет тайпхинтов. Есть генераторы списков (удобная хрень) и есть многопоточность
мимо начал изучать python параллельно с основной работой на PHP
Ответы: >>1354838
Аноним 2019/02/25 12:36:21  №1354838 52
>>1354829
Да, тоже пытался питон учить, но подгорел от нитакогокаквсе синтаксиса
Ответы: >>1359948
Crypter someApprentice 2019/02/25 14:14:56  №1354910 53
https://github.com/someApprentice/Crypter

Для начала реализовал сервис авторизации. Можно сказать, что это выполненная задача Студентов https://github.com/codedokode/pasta/blob/master/student-list.md выполненная на JavaScript, с Server Side Rendering и SPA, поэтому если новичкам интересно они могут что-то подсмотреть.

Если у новичков есть какие-то вопросы - чувствуйте себя свободно задавать их.


Всё сделано "как по учебнику" и интересного здесь мало чего, за исключением пару вещей.

1. При первом заходе на сайт, пользователя встречает форма Приветствия, в которую нужно заполнить email и, в зависимости от того зарегистрирован ли пользователь или нет, перенаправляет на страницу регистрации или логина, а соответствующий импут email'а автозаполняется.

Это реализовано с помощью пары строчек, которые добавляют для определенного роута поле data с этим email'ом:

https://github.com/someApprentice/Crypter/blob/master/src/app/auth/welcome/welcome.component.ts#L46-L49

https://github.com/someApprentice/Crypter/blob/master/src/app/auth/registration/registration.component.ts#L75-L77
https://github.com/someApprentice/Crypter/blob/master/src/app/auth/login/login.component.ts#L35-L37

Но получив некий опыт на Ангуляре, я понял что более шаблонным и следовательно простым для понимания было бы обернуть все эти компоненты в отдельный компонент AuthComponent и в нём уже сделать свойство email (а лучше объект user/form) и передавать это значение с помощью "Взаимодействий Компонентов" https://angular.io/guide/component-interaction.

2. Поскольку приложение пререндерится на сервере а так же работает в браузере, ему нужен общий "источник информации" о пользовательском хранилище. Так как, для сервера используются лучшие пользовательское хранилище это Кукисы по сути кукисы не на что не влияют кроме как условий отображения пререндеренной страницы, а для браузера localStorage, то для обоих этих хранилищ написан сервис-обёртка.

https://github.com/someApprentice/Crypter/blob/master/src/app/storage.service.ts#L18-L20
https://github.com/someApprentice/Crypter/blob/master/src/app/storage.service.ts#L22-L26

https://github.com/someApprentice/Crypter/blob/master/src/app/models/StorageWrapper.ts


Небольшие вопросы, которые не критичны, но всё же знать их следует чтобы довести до идеала:

https://github.com/someApprentice/Crypter/blob/master/api/api.ts#L31
Позволяет ли Bearer token защититься от XSRF?

Я детально изучил эту уязвимость и касаемо этого вопроса, критический момент зависит от того, что может ли злоумышленник "обмануть" браузер отправить автоматически запрос с этим токеном. Он может, например, сделать XMLHttpRequests с ним (со своего сайта), но для начала ему нужно узнать этот токен, что практически тоже самое что добавлять csrf-token, чтобы бороться с этой уязвимостью.

Способ с Bearer token'ом технически идентичен с методом Cookie-to-header token ( https://en.wikipedia.org/wiki/Cross-site_request_forgery#Cookie-to-header_token ) за исключением семантики заголовка X-Csrf-Token заменённого на Bearer token.
И в моём случае, токен хранится в Кукисах, которые защищены с помощью HttpOnly и Secure флагов и в localStorage.

Приходит ли вам на ум какая-нибудь слабая точка которую можно эксплуатировать?

https://github.com/someApprentice/Crypter/blob/master/src/app/storage.service.spec.ts#L32-L33
Достаточно ли это строгая проверка на то является ли сущность экземпляром объекта localStorage?

https://github.com/someApprentice/Crypter/blob/master/src/app/models/StorageWrapper.ts
В правильной ли директории находится эта обёртка? Это не совсем сущность, например как User, но места по лучше я не могу придумать для неё. Куда следует помещать обёртки?

https://github.com/someApprentice/Crypter/blob/master/src/app/auth/registration/registration.component.spec.ts#L67
https://github.com/someApprentice/Crypter/blob/master/src/app/auth/login/login.component.spec.ts#L66
Нужно ли делать проверку на каждую валидацию? Например на встроенные в Ангуляр валидаторы или на валидацию по регулярному выражению? https://github.com/someApprentice/Crypter/blob/master/src/app/auth/registration/registration.component.ts#L21-L24


Следующий шаг написания сервиса сообщений.

Он будет реализован с помощь протокола WAMP и на платформе от https://crossbar.io/ , которая написана на Питоне, и для которой для аутентификации клиентов нужно тоже написать код на нём.

https://github.com/crossbario/crossbar-examples/blob/master/authentication/ticket/dynamic/authenticator.py

Поэтому я сейчас буду изучать его, и возможно у меня появиться небольшие вопросы по нему. Могу я задать их в этом треде?

Заодно и реактивное программирование подучу.


Буду признателен за проверку моего завершающего задания на JavaScript.

Это очень много значит для меня. Большое спасибо.
Ответы: >>1356149 >>1361814 >>1361815
Аноним 2019/02/25 15:46:55  №1355000 54
15510076739240.jpg (59, 1200x630)
630x1200
Аноны, меня из фронт-энд треда послали к вам.
Меня интересует возможность удаленного заработка в пределах 40к. Сейчас начал изучать HTMl 5.

И появилась парочка вопросов:
1) Реально ли работая на фрилансе 8-10 часов в день поднимать 40к для среднестатистического человека?
2) Не покажется ли такая работа скучной, через чур сидячей или все зависит от организации раб. места?

Если это реально, то с такой зарплатой в 40к, в своем м-сраснке с населением 150к я буду полубогом.
В принципе, верстать нравится, сейчас пилю нубский сайт по Бри Ларсон.
Ответы: >>1355046
Аноним 2019/02/25 16:15:51  №1355029 55
>>1354827
Да, докер ставился на паузу через дженкинс с внешнего сервера, так что процессорное время не тратилось, когда там ничего не обрабатывалось. Парсеры забирали данные с внешних сайтов, у себя обрабатывали, во время работы на amazon aurora все промежуточные результаты хранили. В конце дамп с авроры делался и копировался на продакшн сервак и микросервис там висел, чтобы внешние парсеры запускать импорт дампов могли. Единственные сложности были с ключами в БД, которые между собой конфликтовали, но мы там потом все составные сделали основной ключ + номер парсера.
Ответы: >>1355051
Аноним 2019/02/25 16:28:41  №1355046 56
>>1355000
На одном html сложновато на фрилансе поднять, обычно клиенты хотят сразу и верстку и фронтенд js и бэкенд на php, за фуллстэк работы в основном платят. Если еще в английский можешь, то 40к самый минимум, обычно больше. Делай задания из шапки, там все есть чтобы на нужный уровень выйти.
Ответы: >>1355049
Аноним 2019/02/25 16:38:09  №1355049 57
>>1355046
Спасибо анон. Я за верстку и считал html, css, js. Только про php узнал сейчас.
И сколько в среднем стоит обычный проект для новичка? И за какое время, например ты сам в начале пути делал верстку
Аноним 2019/02/25 16:39:13  №1355051 58
>>1355029
Благодарю, буду разбираться, ну хоть направление есть теперь
Аноним 2019/02/25 17:02:17  №1355067 59
Аноны, ответьте новичку.

Не могу понять, как работает "поддержка" авторизации на сайтах. Взять тот же ВК. Просмотр страниц доступен только после входа.

Но как потом страницы определяют, что пользователь авторизирован?

Сессии? А в сессии сохранён параметр входа, типа AUTH = TRUE? Что будет, если я скопирую себе COOKIE с id сессии у другого пользователя? Получается, так я могу получить доступ к чужому аккаунту?

Хранение хэшей паролей и проверка на каждой странице мне кажется бредовым решением.

Подскажите, опытные аноны.
Аноним 2019/02/25 17:57:27  №1355104 60
>>1355067
>Получается, так я могу получить доступ к чужому аккаунту?
Да
Аноним 2019/02/25 18:11:57  №1355110 61
Сап! Давно тут сидел, сделал студентов и файлообменник. Потом был очень занят по работе (с кодингом совсем не связано) и где-то год ничего не делал. Теперь снова появилось свободное время и я вкатился в тред. Какую задачу посоветуете, чтобы снова все вспомнить?
Ответы: >>1361817
Аноним 2019/02/25 18:15:50  №1355111 62
15500333745312.webm (3225, 640x744)
744x640
>>1353705 (OP)
ого, эти треды еще живы
года 2 назад вкатился благодаря им и опу, за что ему мое увожение
Аноним 2019/02/25 18:19:00  №1355113 63
>>1355111
Чем занимаешься сейчас?
Ответы: >>1355142
Аноним 2019/02/25 18:19:11  №1355114 64
>>1355111
скока щас получаешь?
Ответы: >>1355142
Аноним 2019/02/25 18:49:03  №1355140 65
Написал я к примеру файл с созданием сервис провайдера и кинул его в папку с сервисами. А реализация сервиса (ну например "соединение с бд" должна в этом же каталоге лежать или где угодно?
Ответы: >>1357547 >>1359946
Аноним 2019/02/25 18:49:19  №1355141 66
Ответы: >>1355151
Аноним 2019/02/25 18:49:41  №1355142 67
15510768244100.jpg (148, 700x875)
875x700
>>1355113
перекатился на голенг, неспешно ищу удаленку, но видимо придется ехать в дс
>>1355114
около 90к
Аноним 2019/02/25 18:54:04  №1355151 68
15503794278460.jpg (109, 861x807)
807x861
>>1355141
ну а чо пилить то
надоело говно вилкой чистить за 18к, вот и решил в ваше айти вкатиться
почти год после работы читал/писал и взяли меня на галеру
поработал там 2 года, понял что на этой галере больше ничему не научиться и теперь пора следующий шаг делать
Ответы: >>1355186 >>1355210
Аноним 2019/02/25 19:23:31  №1355186 69
>>1355151
Фига ты успешный. Чем занимался до этого? Тяжело вкатываться? Сам из м-сранска, зп 15-20к.
Ответы: >>1355418
Аноним 2019/02/25 19:47:39  №1355207 70
Нужно ли делать ячейку DI-контейнера одиночкой, если она нуждается в этом? Понятно, что содержимое ячейки будет возвращаться одно и то же, но ведь можно будет создать экземпляр и не через сервис, а вручную, поэтому я хочу дополнительно обезопасить код. Правильно мыслю?
Ответы: >>1357547 >>1359946
Аноним 2019/02/25 19:49:44  №1355210 71
Ответы: >>1355418
Аноним 2019/02/25 20:09:53  №1355234 72
Сука, уже целый день пытаюсь включить Xdebug в VS Сode. И нихера короче. Чеж так сложно-то? Пипец, пол-интерннета таких же мученников и у всех разные решения везде. Не подхватывает и всё тут.

Может netbeans поставить, а? Может там все из коробки нормально, как думаете?
Ответы: >>1355508
Аноним 2019/02/26 04:16:17  №1355418 73
15510108182730.jpg (71, 811x1081)
1081x811
>>1355186
До этого был петухом в госшараге и всю жизнь руками работал. Ну а вкатываться конечно тяжело. У меня вон почти год это дело заняло, ну и заставлять же себя надо. После работы пришел заебаный - будь добр пиши код, иначе так говно и будешь чистить.
>>1355210
28
Ответы: >>1356280
Аноним 2019/02/26 07:24:25  №1355500 74
>>1355067
>Сессии? А в сессии сохранён параметр входа, типа AUTH = TRUE? Что будет, если я скопирую себе COOKIE с id сессии у другого пользователя? Получается, так я могу получить доступ к чужому аккаунту?
Концептуально так и есть, но если взять пример ВК, то там, возможно, есть какие то Cookie с хэшем которые высчитываются из ip-адреса, поэтому просто своровать их чтобы получить доступ к чужому аккаунту, скорее всего не получиться.
Аноним 2019/02/26 07:36:58  №1355508 75
Ответы: >>1355533 >>1355898
Аноним 2019/02/26 08:27:12  №1355533 76
>>1355508
Попробуй другой порт например. (я по привычке ставлю 9005)
Если у тебя хост на виртуалке - remote_host будет не 127.0.0.1 а 192.168.1.Х (открываешь свойства сети на компе и смотришь свой IP в локалке)
profiler_enable - тебе вряд ли нужен, но будет дико замедлять работу скриптов (будет писаться файловый лог работы скрипта), лучше поставить чтобы по GET-параметру XDEBUG_PROFILER=1 срабатывал профайлер.
Ответы: >>1355536 >>1355557
Аноним 2019/02/26 08:35:35  №1355536 77
>>1355533
Алсо, если у тебя php-fpm не забывай и его перезагружать после изменений в php.ini
Аноним 2019/02/26 09:15:23  №1355557 78
>>1355533
Що ты кажешь? Я наоборот скинул анону, чтобы он увидел как у меня настроено и все работает
Ответы: >>1355565
Аноним 2019/02/26 09:26:34  №1355565 79
>>1355557
А, извини, но я не говорил, что у тебя неправильно настроено, я просто уточнил по некоторым пунктам для него из твоего скрина.
Аноним 2019/02/26 11:38:30  №1355669 80
Посоветуйте бесплатную и без необходимости где-то регаться и не веб страничку блядь клиентскую софтину для redis на линупс
Ответы: >>1355686
Аноним 2019/02/26 11:49:46  №1355686 81
Ответы: >>1355733
Аноним 2019/02/26 12:48:34  №1355733 82
>>1355686
ахаха, ну ты мочишь чувак, пошути про программирование на html, плз
Какие различия между пхп 5.5 и 7 ? Аноним 2019/02/26 13:40:19  №1355762 83
PHP-5-vs-PHP-7.jpg (71, 750x425)
425x750
Какие различия между пхп 5.5 и 7 ?
Ответы: >>1355766
Аноним 2019/02/26 13:46:01  №1355766 84
MVC без шаблонизатора Аноним 2019/02/26 14:26:42  №1355798 85
Верно ли утверждение, что без шаблонизатора мы не можем создать полноценную MVC на пхп, ведь шаблонизатор не убирает скрипты пхп из HTML, а заменяет его код на свой синтаксис, т.е. все скрипты их штмл никуда не деваются. Главная задача MVC отделить логику от представления, разве обязательно юзать шаблонизатор?
Ответы: >>1357547 >>1359947
Аноним 2019/02/26 17:40:44  №1355898 86
>>1355508

https://www.youtube.com/watch?v=k1CN4YVcbHo

Спасибо, бро. Но я скачал нетбинс и охуел от его аскетичности чтоли:
- нет дерева файлов слева, не понял нихуя, наверное, я тупой, предлагает зачем-то импортировать из zip. А не из zip???
- предлагает создать проект html файл. Нахуя мне html? Я же скачал специально php edition...
- старые плагины 2014 года выпуска, например, Emmet вообще нет, он называется по-старому - Zen coding

Чет мне кажется, я говна поем с этой IDE.

Оууукей. скачал Codelobster - там конечно полный фарш по поддержке фреймворков и cms, смотрите сами, НО! Сука дебагер не пашет на php7, хотя вроде поддержка есть. Ладно, пока попишу на php5 свою херню, хотя странно.

Бля как же сложно, я просто хочу писать и отлаживать удобно код, как раньше в дельфи, неужели я многого прошу?

Алсо видео стронгли рилейтед.
Ответы: >>1355928
Аноним 2019/02/26 18:30:28  №1355928 87
>>1355898
шо? В нетбинсе все это есть. Это раз.
Два. Это вторая по популярности ИДЕ после пхпшторма. Три - коделобстер - кусок говна по функционалу, даже если сравнить с обычным блокнотом
Ответы: >>1355930
Аноним 2019/02/26 18:40:48  №1355930 88
>>1355928
По какому функционалу он кусок говна? Поясни-ка, если не трудно.
Ответы: >>1355938
Аноним 2019/02/26 18:51:14  №1355938 89
>>1355930
Я его пробовал несколько лет назад, поэтому точно не помню. Помню что жопа горела дико.

Там какая-то перда была с тем что внутренние окна меняли свой размер, он лагал. Там ты ничего толком не настроишь, он платный. Я уже не помню есть там поддержка композера, гита и пр штук? Терминал имеется? Возможность работать с сервером удаленно?
Ответы: >>1355953
Аноним 2019/02/26 19:15:59  №1355953 90
>>1355938
Терминала нету. А что ты запускаешь в терминале? Artisan?

А что значит - поддерка компоузера?

Удаленный сервер - всё это есть, конечно.
Аноним 2019/02/26 19:50:30  №1355972 91
народ, если тут не отвечают на ваши вопросы, можете вкатиться в телегу к нам в конфу (25 чел). Тут есть как и опытные, уже работающие люди так и новички, которые хотят вкатиться и спрашивают свои ответы. Пишите почту/телегу.
Ответы: >>1355988 >>1356071 >>1356357
Аноним 2019/02/26 20:06:19  №1355988 92
>>1355972
Вы еще где-то есть? Не охота с телегой ебаться.
Аноним 2019/02/26 21:15:04  №1356036 93
Laravel
1. Не понимаю в чем профит сервис контейнера? Уже пересмотрел много видео и статей и примеры. Но я не понимаю через сервис провайдеры мы как бе можем подменять реализации интерфейсов того что будет храниться в сервис контейнере, но мы как бы можем сделать это и без него в чем профит использовать именно его? Да реализация через него синглтона довольна удобно и ясна, но она не так часто нужна, так для чего еще?. Так что вопрос зачем?
2. Заодно вопрос какая структура папок должна быть для контрактов и их реализации.
3. Если бороться с жирными контроллерами через сервисный слой то какую выбрать структуру папок чтоб можно было вернуться к проекту через месяц?
Ответы: >>1356040 >>1356055 >>1356353
Аноним 2019/02/26 21:30:03  №1356040 94
>>1356036
У меня дежа вю от твоего поста.
Аноним 2019/02/26 22:03:58  №1356055 95
Аноним 2019/02/26 22:37:51  №1356071 96
>>1355972
Добавьте меня @PsychoSion
someApprentice 2019/02/27 07:32:12  №1356149 97
>>1354910
>Но получив некий опыт на Ангуляре, я понял что более шаблонным и следовательно простым для понимания было бы обернуть все эти компоненты в отдельный компонент AuthComponent и в нём уже сделать свойство email (а лучше объект user/form) и передавать это значение с помощью "Взаимодействий Компонентов" https://angular.io/guide/component-interaction.

Здесь не получится реализовать "Взаимодействие Компонентов" потому что, всё равно, придется размещать не сами компоненты, а <router-outlet>.
Аноним 2019/02/27 13:56:25  №1356280 98
>>1355418
А что из заданий опа (студенты, файлообменник) успел сделать за год?
Ответы: >>1356479
Аноним 2019/02/27 15:48:58  №1356329 99
15478515464620.webm (15572, 816x592)
592x816
Анончики, помогите найти закавыку:

Допустим, массив всех строк из файла ложится в $key и я хочу организовать поиск по нему.


Дальше такой код: https://ideone.com/PKbkZz

\t
1. Почему у меня выводит только один результат, хотя их десяток в файле?

2. Как мне вывестив результате номер строки именно найденного результата?

Спасибо вам.
Ответы: >>1356364
Аноним 2019/02/27 16:33:54  №1356353 100
Аноним 2019/02/27 16:36:28  №1356357 101
>>1355972
Напиши пожалуйста название конфы
Аноним 2019/02/27 16:42:56  №1356364 102
>>1356329
Strpos возвращает первое вхождение. Он может тебе вернуть 0 т.к нашел с индекса ноль а у тебя true стоит может быть поэтому у тебя не сходится. Мне кажется тебе надо.жестко проверить strpos() !== false
Аноним 2019/02/27 19:55:19  №1356479 103
15511139949370.mp4 (7298, 1280x720)
720x1280
>>1356280
За студентов не скажу, потому что не помню, а вот файлообменник кинул на гитхаб как пример того чо могу(ничего). Ну там еще было задание после файлообменника, но его я не делал. К слову по жс я не умел вообще ничего, даже json запрос написать не мог. Ну и вообще, то что я там пыхтел год можно реально выучить за месяц максимум на реальных проектах, так что чем скорее попадете на вашу первую ламповую галеру за еду, тем быстрее пойдет скилл.
Ответы: >>1357310 >>1358393
Аноним 2019/02/28 16:53:26  №1356794 104
841bd-clip-32kb.png (32, 556x362)
362x556
Проверьте код, пожалуйста, господа. https://ideone.com/XUZklL
Задачка про вопросы из раздела про ООП.
Ответы: >>1356827 >>1369055
Аноним 2019/02/28 17:13:20  №1356827 105
>>1356794
Почему конструктор не используешь?
Ответы: >>1356873
Аноним 2019/02/28 17:47:15  №1356873 106
Ответы: >>1356877 >>1356879 >>1357057
Аноним 2019/02/28 17:57:11  №1356877 107
>>1356873
Ты поля из вне задаешь. Я против такого подхода потому что создается не валидный обьект. Ты через new его создаешь а потом туда пихаешь значения.
Ответы: >>1356943
Аноним 2019/02/28 17:59:48  №1356879 108
>>1356873
Я как клиент твоего класса должен знать , что после new надо в поля записать. А я не хочу)
Ответы: >>1356943
Аноним 2019/02/28 19:48:31  №1356943 109
>>1356877
>>1356879
честно говоря, не особо понял в чем моя ошибка. Скажи,пожалуйста, что мне конкретно нужно переделать?
Ответы: >>1357054
Аноним 2019/02/28 20:07:50  №1356963 110
+ спасибо
Аноним 2019/02/28 20:23:18  №1356973 111
Котаны, совета прошу. Я нуб, пхп осваиваю понемногу. В общем сейчас свое приложение делаю, MVС, на классах, содрал структуру с сети, запросы в базу писать уже научился( с помощью PDO), sql знаю. Суть туда/сюда понимаю. Короче зайчатки разума есть.
На работе появилась задача, которую мне нужно по итогу реализовать, сроки совсем не сжатые, но работу веду по факту ежедневно. Думаю что мой MVC шаблон и станет основой будещего приложения.
Суть приложения проста - сотрудники заходят на сервер и получают перечень доступных им запросов в базу, которые могут использовать.
Какие проблемы для себя я вижу:
1. Как сделать авторизацию в MVC?
2. Как делать права доступа? Т.е. сотруднику №1 доступны все отчеты, а сотруднику №2 только один.
sql-отчетов гипотетически будет много разных.
Делаю это для удобства всех вообще, потому как на данный момент отчеты я ручками пилю при необходимости.
Такой вот учебно-практичный проект возникает.
Где почитать годноты, котаны?



Ответы: >>1357016 >>1359952
Аноним 2019/02/28 22:36:09  №1357016 112
>>1356973
1. В бд есть таблица с логинами и паролями (хешами с солью). Показываешь страницу логина с полями для входа. Если пароль не подходит - посылаешь нахер. Если подходит - в сесию пишешь токен (очень длинную случайную строку). С этим токеном пользователь может лазить по сайту. Без токена - посылаешь на страницу логина. Токен проверяешь в каждом контроллере.
2. В бд есть таблица с правами пользователей. В контроллере проверяешь права - в зависимости от прав выводишь нужную инфу, или вообще посылаешь нахер на первую страницу если пользователь ломиться куда не положено.
Вообще лучше фрейморк какой-то взять (Yii2 или Laravel) - там эта вся хуйня сделана изначально (по крайней мере в Yii2).
Ответы: >>1359951
Аноним 2019/03/01 05:26:32  №1357054 113
>>1356943
$q1 = new ChoiceQuestion("Какая планета располагается четвертой по счету от Солнца?", 'b');
\t$q1->options = array('a' => 'Венера', 'b' => 'Марс', 'c' => 'Юпитер', 'd' => 'Меркурий');
\t$q2 = new NumericQuestion("Чему равна скорость света в км/с?", 300000, 20);
\t$q2->deviation = 20000;

Поля $q1->options и $q2->deviation = 20000 ты все так же задаешь из вне.
Ответы: >>1357116 >>1357138
Аноним 2019/03/01 05:35:14  №1357057 114
>>1356873
И еще мне кажется что делать echo в методе не совсем верно, лучше возвращать строки и пусть кто вызывал твой метод разбирается что с ней делать.
echo " {$key}. {$option}\n"; заменить на return " {$key}.{$option}";
Ответы: >>1357116 >>1357138
Аноним 2019/03/01 08:39:27  №1357116 115
Аноним 2019/03/01 09:17:18  №1357138 116
>>1357054
>>1357057
Переделал вот: https://ideone.com/Lb6iG1.
Если я правильно понял, то переопределить метод изменив количество параметров не получится. Поэтому я в каждый дочерний класс запихнул конструктор. Верно или я ошибаюсь?
Ответы: >>1357141
Аноним 2019/03/01 09:18:17  №1357141 117
Ответы: >>1357205 >>1369055
Аноним 2019/03/01 12:19:00  №1357205 118
>>1357141
Да норм. Конструктор часть конкретного класса. Я бы не рассматривал его как часть интерфейса
Аноним 2019/03/01 15:59:46  №1357310 119
>>1356479
Ого. Я тоже сделал только файлобменник. Учу шаблоны, дабы приступить к изучению Laravel.

Предлагаешь с такими околонулевыми знаниями уже подыскивать галеру?
Ответы: >>1357424 >>1357456 >>1358393
Аноним 2019/03/01 18:51:12  №1357424 120
>>1357310
Ничего себе околонулевые. Сколько учишь уже?
Ответы: >>1357438 >>1358393
Аноним 2019/03/01 19:14:50  №1357438 121
>>1357424
Двачую. Тут люди с одним файлообменником на работу устраивались.
Аноним 2019/03/01 19:32:23  №1357456 122
15473166366290.jpg (183, 550x550)
550x550
>>1357310
Хз, пробуй. Если в дс то изи, если нет, то не очень. Ну от бомжа и не ждут, что он процесс от потока отличает и знает чтото про уровни изоляции транзакций.
лучше поздно чем никогда Аноним 2019/03/01 21:44:41  №1357490 123
Аноним 2019/03/02 00:01:43  №1357536 124
Правильно ли идеалогически подключать несколько View в один шаблон?
Ответы: >>1357547 >>1357584 >>1359951
Аноним 2019/03/02 00:41:47  №1357540 125
>>1353745
Быстро мне накидал CMS с плугами под нормальные языки!
Знаю что напсавший уже и забыл о том что писал, ведь в школе каждый день кипит событиями
Аноним 2019/03/02 01:09:23  №1357547 126
>>1357536
Я не понимаю, мои посты скрываются каким-то специальным скриптом? На них никто не знает ответ? Вопросы дурацкие? Или просто лень отвечать?

>>1355207
>>1355140
>>1354531
>>1355798

И в предыдущем треде дохуя.
Ответы: >>1357562 >>1359946
Аноним 2019/03/02 02:36:51  №1357562 127
>>1357547
Да просто не знают ответа ибо только учатся или посрать пришли
Аноним 2019/03/02 04:47:24  №1357584 128
>>1357536
Это что бы изменение 1 вьюшки были отображены в другой?например я обычно общие куски делаю в partial и их уже где надо подключаю. Какой результвт ты хотел бы получить?
Ответы: >>1357918
Аноним 2019/03/02 11:22:14  №1357720 129
Аноним 2019/03/02 11:29:40  №1357722 130
пакетик 2019/03/02 11:51:54  №1357727 131
>>1357720
Что значит проверить?
Аноним 2019/03/02 12:13:14  №1357736 132
>>1357720
Хорошо. Лучше чем большинство делает в этот ITT треде, обычно пытаются все логические действия впихнуть в одну строку и косячат. Учись дальше.
Аноним 2019/03/02 12:55:22  №1357756 133
>>1353705 (OP)
Есть вопрос по "Вектору".
Правильно ли я понимаю что создание всех этих объектов работников надо как то автоматизировать? Или втупую ручками создавать каждый объект?
Ответы: >>1357759 >>1357797
Аноним 2019/03/02 13:00:24  №1357759 134
>>1357756
Сначала ручками, потом автоматизируешь, протом сравниваешь ощущения.
Ответы: >>1357898
Аноним 2019/03/02 14:14:51  №1357797 135
>>1357756
Ну я когда делал, то парсил из текста с твоей картинки, только там тогда были буквы из латиницы и из кириллицы намешаны, что добавило анальных болей, не знаю было ли это исправлено.
Аноним 2019/03/02 17:32:26  №1357898 136
>>1357759
будет правильным создавать объекты сотрудников с помощью clone?
Ответы: >>1357904 >>1357908 >>1359951
Аноним 2019/03/02 17:49:18  №1357904 137
>>1357898
Чому бы и нет? Паттерн прототип сам просится
Ответы: >>1358201
Аноним 2019/03/02 17:56:08  №1357908 138
>>1357898
Нет. Делай нормальные конструкторы. По факту там и ватоматизировать мало чего. В циклах создаешь объекты и все. Инициализации все равно много будет.
Аноним 2019/03/02 18:04:31  №1357918 139
>>1357584
Я просто еще с фреймворками не работал, так что хз, как оно там везде работает. Есть вот шаблон, куда я подключаю вид, считай, вызываю функцию getView(), которая подключает текущий вид. Например, это список товаров. А еще у меня в каждом виде меняется, к примеру, шапка. Там title разный на каждой вьюхе. И как мне его там менять? Инклюдить всю шапку как виджет в каждый вид, туда передавать параметры для title и потом выводить все вместе или еще как-то можно?
Ответы: >>1357938 >>1359951
Аноним 2019/03/02 18:38:13  №1357938 140
>>1357918
Напрмиер, в шаблоне также как подключаешь вью с товарами, также подключашь нужную шапку. Виджет норм идея, если сможешь сделать его более-менее универсальным (тоесть можно будет использовать больше чем в одном проекте). А если придется допиливать под каждый конкретный проект то лучше всетаки как отдельное вью или типа того оформить.
Ответы: >>1357975
Аноним 2019/03/02 19:28:34  №1357975 141
Аноним 2019/03/03 08:57:53  №1358201 142
rj8raf1riyny.png (301, 1250x811)
811x1250
Аноним 2019/03/03 09:52:48  №1358261 143
Ответы: >>1358314 >>1369057
Аноним 2019/03/03 09:52:51  №1358262 144
Ответы: >>1358320 >>1369058
Аноним 2019/03/03 11:17:19  №1358314 145
>>1358261
Для начала сделай нормальную автозагрузку
Аноним 2019/03/03 11:18:03  №1358316 146
Расскажите нуфагу.
Почему \n работает только на сайте ideone com, а человеческий '<br>', который работает везде, сайт тупо принимает за текст?
Ответы: >>1358368 >>1359950
Аноним 2019/03/03 11:20:39  №1358320 147
>>1358262
Чому тайп хинтинг не используешь? Захардкоженные названия профессий тоже не оч хорошо
Ответы: >>1358386
Аноним 2019/03/03 12:14:19  №1358368 148
>>1358316
Потому что там вывод скрипта используется как простой текст, а не html разметка.
Аноним 2019/03/03 13:01:30  №1358386 149
>>1358320
по поводу тайп хинта понял, а что с названиями не так?
Ответы: >>1358490
Аноним 2019/03/03 13:11:59  №1358393 150
>>1356479
>>1357310
Вкатился на python галеру после задачи с файлообмненником, работаю уже два месяца. Самое забавное, что набирают людей с куда меньшими чем у меня знаниями, так что вкатывайтесь чем раньше, тем лучше. Кстати, огромное спасибо опу за задачки, я, правда, учился в основном, не на его уроках, но все-равно материалы из этого треда были очень полезны.
>>1357424
Ответы: >>1359950
Аноним 2019/03/03 14:07:05  №1358490 151
>>1358386
Я бы добавил константы и в свитчах использовал бы их
switch($this->profession) {
case self::MANAGER итд
Аноним 2019/03/03 14:36:05  №1358506 152
Анон, я хохол. Хочу понаехать в МСК.
Насколько будет проблемно найти работку в МСК пхп кодеру?
Имеется опыт работы 3+ года, знаю ООП, фреймворки и пр. Хуйов в верстке еще немношк знаю джаву и планирую в нее перекатиться.

Будут ли меня обссыкать за то что я шокаю и гакаю?
Ответы: >>1359950
Аноним 2019/03/03 14:42:25  №1358509 153
Screenshot351.png (36, 847x540)
540x847
Screenshot352.png (34, 769x542)
542x769
Анон. Чому он иногда выдает пустоту вместо вопроса?
Ответы: >>1358514
Аноним 2019/03/03 14:52:04  №1358514 154
>>1358509
Потому что количество элементов массива 4 а последний индекс 3. Происходит обращение к несуществующему элементу.
Ответы: >>1358522
Аноним 2019/03/03 14:59:16  №1358522 155
>>1358514
И правда. Спасибо, теперь все норм.
Аноним 2019/03/03 15:22:54  №1358534 156
image.png (216, 1920x1080)
1080x1920
Первый верхний вариант функции работает, а второй нижний нет! Что делать??? В чём причина?

(При вызове функции посередине)
Ответы: >>1358539 >>1359950
Аноним 2019/03/03 15:33:23  №1358539 157
>>1358534
В первом случае инфо это массивчик, а во втором объект?
Ответы: >>1358542
Аноним 2019/03/03 15:38:05  №1358542 158
>>1358539
хмм, походу на то.

Но тогда получается у меня $data - объект, а не в коим случае не объект?

В связи с этим, правильно ли я думаю, что если считывать json файл где всё сосредоточено в
{
//что то
}
то это объект, а если
[
// что то
]
то это массив?
Ответы: >>1358547 >>1358561 >>1359950
Аноним 2019/03/03 15:42:43  №1358547 159
>>1358542
fix:

не объект не массив
Аноним 2019/03/03 16:02:37  №1358554 160
Ответы: >>1369058
Аноним 2019/03/03 16:16:56  №1358561 161
>>1358542
Ну если ты обращаешься к данным через ->, то это признак того, что ты обращаешься к объекту.

В javascript можно обращаться к пустому объекту, просто создав его через {}. В PHP так делать нельзя, объект нужно создать через new, поэтому твой json (ты ведь его получаешь?) сначала нужно распарсить (превратить в массив) и потом уже только обращаться к нему.
Аноним 2019/03/03 17:01:48  №1358583 162
14188451148390.jpg (56, 597x800)
800x597
На пхп вообще есть работа?
В смысле не ковыряние какой-то ублюдской параши с ключевыми словами "битрикс джумла вордпресс", а создание каких-то систем с нуля там, на фреймворках?
Ответы: >>1358591 >>1358608
Аноним 2019/03/03 17:16:03  №1358591 163
>>1358583
Нет. Это фантастика, сынок. А фреймворки это так, хуйня. Фабьен с Тейлором их по приколу напейсали. Вкатывайся лучше в руби
Ответы: >>1359047
Аноним 2019/03/03 17:47:05  №1358608 164
>>1358583
Работа есть, но только как ты выразился ковыряние cmsок в студиях, потому что дешево и быстро.
Аноним 2019/03/03 18:27:00  №1358638 165
А вот такое знает кто?
Есть у меня к примеру экшен, который вызывается один раз по умолчанию, когда юзверь заходит на страниц. Потом, когда программа юзверя запомнила, она будет вызывать другой экшен, при заходе на эту же страницу по умолчанию.
Можно ли сделать вот так?

методПоУмолчанию {
if (тутБылЮзверь) {
методПослеПосещения()
}
"Юзверь, зарегистрируйся!"
}

методПослеПосещения {
выводимИнфу()
}

То есть я понимаю, что чисто физически я могу вызвать один метод в другом, но можно ли так делать в MVC шаблоне?
Ответы: >>1358643 >>1359949
Аноним 2019/03/03 18:31:06  №1358643 166
>>1358638
Почему нет? Только если у тебя фрейморк какой-то то там скорее всего лучше не напрямую вызывать другой экшен, а сделать редирект.
Ответы: >>1358645
Аноним 2019/03/03 18:34:13  №1358645 167
>>1358643
Ага, спасибо. Почему нет, я не знаю, поэтому и спрашиваю, лол. С фреймами пока не работал, на вольных хлебах пока что. Что хочу, то и ворочу.
Аноним 2019/03/04 09:34:47  №1358927 168
Короче, аноны.
Решил написать простенький калькулятор, но после проверки, является ли введенные значения целыми числами, но жидко обсераюсь и ловлю сообщение о том, что там не числа (хотя там числа).

Посмотрите, пожалуйста, где я не прав.
https://ideone.com/gwTPUt
Ответы: >>1358932 >>1369059
Аноним 2019/03/04 09:49:28  №1358932 169
Ответы: >>1358934
Аноним 2019/03/04 09:51:35  №1358934 170
>>1358932
Спасибо. Сейчас разберемся.
Аноним 2019/03/04 13:08:18  №1359022 171
Создал я, значит, сущность юзер, к нему маппер, базу ещё. Заполнился юзер данными, но вот только одна беда, некому оперировать этой сущностью. Какой слой модели вызывает методы этой сущности и возвращает результат контроллеру? Или может контроллер сам это делает?
Ответы: >>1359196 >>1359948
Аноним 2019/03/04 14:16:23  №1359047 172
>>1358591
на руби ноль работы, умирает язык
Ответы: >>1359198
Аноним 2019/03/04 15:04:44  №1359071 173
e2a9d-clip-28kb.png (28, 631x226)
226x631
Господа, подскажите как реализовывать " антикризисные меры" в задачке "Вектор"? Это должна быть отдельная функция на каждое антикризисное решение или это должны быть три разные программы на каждый случай?
Ответы: >>1359591 >>1359948
пакетик 2019/03/04 17:44:47  №1359196 174
>>1359022
В операциях чтения ни чего такого нету. Можешь вызывать из контроллера
Ответы: >>1359366
пакетик 2019/03/04 17:47:24  №1359198 175
>>1359047
Работа тебе нужна только 1.И на руби можно найти ее
Аноним 2019/03/04 21:53:32  №1359348 176
Думаю вопрос поднимался миллион раз, посоветуйте годной advanced литературы/видеокурсов.
Ответы: >>1359390
Аноним 2019/03/05 00:08:43  №1359366 177
>>1359196
Мне кажется, хуевый план. А если мне нужно будет этих юзеров рассортировать, пропустить их через валидатор, то где мне это делать? Явно не в контроллере. Опчик, ты ведь знаешь ответ? Взываю к тебе!
Ответы: >>1359392 >>1359394 >>1359949
Аноним 2019/03/05 05:35:49  №1359390 178
Аноним 2019/03/05 05:37:07  №1359392 179
>>1359366
Операции чтения стейт приложения не меняют.
Поэтому их может быть очень много.
Аноним 2019/03/05 05:44:26  №1359394 180
>>1359366
что тебя смущает я не понимаю.
class Controller
{
private $search;
public function __construct(Search $search)
{
$this->search = $search;
}

public function index()
{
$result = $this->search->search();
}

}
Аноним 2019/03/05 12:52:48  №1359591 181
Аноним 2019/03/05 14:24:07  №1359625 182
$a='2';
test($a);
public function test($a) :int
{
return $a;
}

вернет ли в данном случае int или же string?
Ответы: >>1359634 >>1359948
Аноним 2019/03/05 14:29:49  №1359634 183
>>1359625
Зависит от strict_types. Или сделает приведение типов и вернет число, или при strict_types=1 будет ошибка
Ответы: >>1359640
Аноним 2019/03/05 14:36:40  №1359640 184
>>1359634
да, уже потестил в песочницах.
Но в проекте просто втихую возвращает стринг и никаких ворнингов, ошибок, поэтому и пришел с этим вопросом.
Ответы: >>1359645
Аноним 2019/03/05 14:43:12  №1359645 185
>>1359640
нвм, я дегенерат, дампил значение до его возвращения, а приведение типов работает во время возвращения.
Аноним 2019/03/05 18:34:22  №1359816 186
Есть ли шанс найти галеру если нет технической вышки?
Ответы: >>1359817
Аноним 2019/03/05 18:40:01  №1359817 187
>>1359816
Всем плевать на вышку если ты сильный кандидат (немного похуже в Украине, у них странноватый рынок труда в IT). Больше интересует что бы в армию не ушел прямо с работы или в запой.
1-52 Аноним 2019/03/06 02:31:41  №1359945 188
>>1354215

Вообще, это неудобно. Что, если пользователь нажал кнопку, а данные еще не пришли?

Сначала лучше сделать так: пользователь заполняет все поля и жмет кнопку. Отправляются по очереди все нужные запросы.

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

Если у тебя нет понимания, как это делать, то скорее всего ты пока плохо знаешь Яваскрипт. Пройди учебник http://learn.javascript.ru/ и обрати особое внимание на события, анонимные функции (коллбеки), почитай про промисы.

>>1354526

Часто, чтобы попасть в "серьезную" компанию, надо сначала где-то приобрести опыт, возможно, что в веб-студии, в аутсорсере или где-то еще, где берут джуниоров. Ты можешь сам посмотреть вакансии компании, которая тебе нравится, на hh.ru и оценить требования.

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

>>1354531

Реестр - это паттерн, который описывает объект, в который можно класть и получать данные ( https://martinfowler.com/eaaCatalog/registry.html ). Часто он реализуется на статических методах:

ServiceRegistry::set(ServiceA::class, new ServiceA);
...
$srvA = ServiceRegistry::get(ServiceA::class);

Но это не обязательно. Как я помню, в той же Симфони есть такие реестры:

- реестр кастомных (добавленных пользователем) типов полей Доктрины
- реестр типов элементов форм

Там, где Реестр противопоставляется DI контейнеру - противопоставляется, наверно, статическая версия реестра. То есть подход

ServiceRegistry::get('ServiceA')

и

$container->get('ServiceA');

У Реестра и Контейнера могут быть такие отличия:

- Реестр часто бывает статический, а контейнер - нет
- Реестр не создает объекты: он хранит то, что в него положат. DI контейнер может создавать объекты, если ему дать описание, как это делается (например, описать, что надо передавать в конструктор, или позволить ему самому это понять анализом аргументов в конструкторе).
- Реестр может хранить что угодно, например, числа какие-нибудь или настройки. DI контейнер, как правило, хранит объекты-сервисы. Хотя в Симфони он хранит и настройки.

Ответы: >>1360508
Аноним 2019/03/06 02:32:18  №1359946 189
>>1357547

У меня просто времени иногда нет, последние пару недель адски загружен. Как станет полегче - разберу накопившиеся вопросы. А так, я всем стараюсь отвечать.

>>1355207

> Нужно ли делать ячейку DI-контейнера одиночкой, если она нуждается в этом?

Ни в коем случае. Идея DI контейнера - IoC - предполагает, что жизнью объекта (когда его создать, когда уничтожить, что передать в зависимости) управляют снаружи, что это не его зона ответственности. Это не дело объекта-сервиса знать, сколько экземпляров сейчас создано. Дело сервиса - указать свои зависимости, например, в конструкторе или в методах.

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

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

Потому синглтон - это почти всегда антипаттерн. Не стоит его использовать.

>>1355140

Я думаю, сервис провайдеры и сервисы хранятся в отдельных папках. По поводу организации структуры кода, если ты используешь фреймворк, то стоит делать, как там принято. Если не используешь, то такие варианты:

- если классов мало (< 10), их можно класть в одну папку
- можно делать папки по типам классов: папка для сервисов, для контроллеров, для представлений, для моделек, для классов работы с БД, для вспомогательных утилит. Этот подход начинает фейлиться, когда у тебя становится огромное приложение с сотнями серисов и моделей.
- можно взять предыдущий подход и добавлять подпапки внутри папок. Ну например, папка модели, а в ней: папка пользователи, папка товары, папка статистика итд.
- а можно поступить по-другому, и разбить приложение на "части". Для каждой "части" создаем свою папку, а в ней подпапки: сервисы, модели, контроллеры, утилиты и тд. То есть будет папка "пользователи", а в ней подпапки с моделями пользователей, контроллерами раздела работы с пользователями итд.

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

То есть для огромного магазина, например, можно сделать так:

CommonBundle - общий код, который используется всеми бандлами (не контроллеры или модели, а например, сервисы, утилиты, расширения фреймворка итд)
UsersBundle - управление пользователями, регистрация, личный кабинет
StoreBundle - витрина, вывод товаров, оформление заказа
FinanceBundle - оплата, бонусы
SupportBundle - раздел техподдержки
ForumBundle - форум
AnalyticBundle - аналитика
AdminBundle - админка
Ответы: >>1360508
Аноним 2019/03/06 02:32:48  №1359947 190
>>1355798

> что без шаблонизатора мы не можем создать полноценную MVC на пхп

В теории - можем. Например, если мы делаем сервер API, который отдает не HTML-страницы, а данные в формате JSON, то шаблоны нам не нужны. Ну и в теории, опять же, мы можем без шаблонов сделать вывод HTML кода кучей операторов echo.

То есть, шаблон - это лишь один из вариантов реализации View.

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

Урок про шаблонизаторы: https://github.com/codedokode/pasta/blob/master/php/templates.md

>>1354575

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

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

> если у меня просто вспомогательный класс (сервисного слоя) без зависимостей для контроллера я его просто делаю use и использую.

Для вспомогательных классов можно использовать паттерн Utility Class (класс со статичесикими методами).

> контракты в /app/Contracts а реализации их неизвестено где

Их реализации там, где уместно. Естественно, не в папке Contracts. Вообще, ты можешь посмотреть, как код организован в самом Laravel или стандартных библиотеках к нему.

Если у тебя мало сервисов, можно просто сделать папку App/Services. Если много - то думать, как дробить на части. Можно как-то по смыслу их группировать, по разделу сайта, по компоненту приложения.

>>1354604

По идее так: http://php.net/manual/ru/language.basic-syntax.phpmode.php

Но это даст низкокачественный код, потому читай https://github.com/codedokode/pasta/blob/master/php/templates.md
Аноним 2019/03/06 02:33:28  №1359948 191
>>1354838

Он зато лаконичный. И там есть IPython Notebook - отличнейшая штука. Но отсутствие тайп-хинтов, конечно, убивает.

>>1359625

Вернет в любом случае то, что указано в тайп-хинте, в нестрогом режиме при этом допускает автоматическую конвертацию в int.

>>1359071

Можно как 3 функции, можно как 3 класса, можно как 3 метода в одном классе. Метод может принимать экземпляр Компании и делать с ней какие-то операции.

>>1359022

Зависит от того, как сделана работа с БД. Если у тебя используется дата маппер, то в нем и будет метод для загрузки моделек из БД.

> Какой слой модели вызывает методы этой сущности и возвращает результат контроллеру? Или может контроллер сам это делает?

Вызывать метод загрузки данных может контроллер. Либо сервис, который загружает данные из БД и делает какие-то еще преобразования.
Ответы: >>1360508
Аноним 2019/03/06 02:33:51  №1359949 192
>>1359366

Зависит от ситуации. Контроллер должен быть тонким, то есть в основном в нем вызовы разных сервисов (тех же мапперов) для получения разных данных и передача их во View. Для валидации можно сделать отдельный класс-валидатор. Для сортировки - если это что-то простое, нужно только для вывода и не повторно используемое, то делаем в контроллере. В задаче про студентов сортировку логично сделать аргументом в методе для получения студентов:

findStudents($searchBy, $orderBy, $orderDir, $offset, $limit): iterable

Этот метод может быть в маппере для работы с БД.

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

Контроллер отвечает за управление процессом обработки запроса, за интерпретацию команд пользователя. То есть контроллер как-то (например, из $_GET) определяет, какая сортировка нужна пользователю, и вызывает метод для загрузки студентов с сортировкой по данному полю. А затем передает найденных студентов во View и отдает пользователю сгенерированную HTML страницу.

>>1358638

Обычно это делают так:

class Controller
{
public function indexAction(Request $req)
{
if (!$this->isLoggedIn($req)) {
return $this->redirectTo(...);
}

...
}
}

То есть перед выполнением нужных действий проверяем наличие логина. При отсутствии - редирект на форму логина с передачей текущего URL (и проверкой, что он с нашего сайта). На форме логина пишется: "Чтобы XXX, вам надо зарегистрироваться, или ввести логин и пароль, если вы уже зарегистрированы". При желании можно как-то заморочиться и например, сделать проверку на уровне контроллера (то есть закрыть доступ ко всем методам этого контроллера сразу). Это удобно в админке, например.

В твоем варианте пользователь может попробовать обойти авторизацию, вызвав напрямую метод "методПослеПосещения".
Ответы: >>1360508
Аноним 2019/03/06 02:34:13  №1359950 193
>>1358534

Ты передаешь массив, а пытаешься обращаться к его элементам через стрелку. Кто тебе сказал, что так можно? Это не JS, тут с массивами работают с помощью квадратных скобок, а стрелка для полей и методов объектов.

>>1358542

Прочти также целиком мануал по json_decode. Там написано, когда получается объект класса stdClass, а когда массив.

>>1358506

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

>>1358393

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

>>1358316

<br> это тег языка HTML. Он работает только там, где данные интерпретируются как HTML-код (в браузере). А \n браузер воспринимает просто как разделитель слов и непереносит строку.

На ideone и в консоли данные просто выводятся как текст. Если там будут теги - они выведутся как есть.

Это не единственное отличие. Например, & lt ; в браузере выводится как знак "меньше", а в консоли - как есть.

То есть различай "просто текст" и "HTML текст с тегами".

Если добавить в начало header("Content-Type: text/plain; charset=utf-8"); то браузер перестанет воспринимать данные как HTML и \n начнет работать.
Аноним 2019/03/06 02:35:11  №1359951 194
>>1357898

Если они совсем однотипные то можно, но проще наверно через new.

>>1357918

Обычно делают отдельно шаблон для "лейаута" (шапка/подвал) и "контента". Лейаутов может быть несколько - например, один для морды, другой для админки. Как передавать параметры для лейаута? Тут есть варианты:

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

В фреймворках готового решения нет. Каждый изобретает сам.

>>1357536

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

>>1357016

В сессию токен писать нет смысла. Данные сессии хранятся на сервере и недоступны пользователю, потому можно просто писать туда userId = 123. Это безопасно.

Токен нужен, если используется не сессия, а куки. Тогда писать userId = 123 нельзя, так как пользователь может их подделать. Также, некоторые шифруют и/или подписывают куки для защиты от чтения и/или модификации их пользователем. Плюс: сессии не требуется хранить.
Ответы: >>1360508
Аноним 2019/03/06 02:35:32  №1359952 195
>>1356973

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

Советую реализовать RBAC, в общем.

Статья в википедии про RBAC трудночитаема.

> 1. Как сделать авторизацию в MVC?

В твоем случае:

if (!$this->hasRole(Roles::ROLE_BUH)) {
редиректим на форму логина, либо показываем ошибку нехватки прав;
}
Аноним 2019/03/06 11:03:53  №1360106 196
Я не понял, а где море вакансий для PHP? На ХХ вижу только 20 вакансий PHP Junior.
Ответы: >>1360115
Аноним 2019/03/06 11:26:36  №1360115 197
Аноним 2019/03/06 14:30:52  №1360209 198
Господа, вопросик.
Клонирую объект в свойстве которого лежит массив объектов. Правильно я понимаю, что объекты в массиве тож надо клонировать с помощью __clone()? Если да, то правильной ли будет вот такая функция:

function __clone()
{
\tforeach ($this->arrayWithObjects as $key => $object)
{
\t\t$this->arrayWithObjects[$key] = clone $object;
\t}
}
Ответы: >>1360214 >>1360530
Аноним 2019/03/06 14:38:41  №1360214 199
>>1360209
Ты ведь просто перезаписываешь объект, клонируя его. Какой смысл?
Ответы: >>1360216 >>1360530
Аноним 2019/03/06 14:45:23  №1360216 200
>>1360214
Потом мне нужно работать с этими объектами в массиве и изменять их, но так чтобы оригинальные не поменялись.
Ответы: >>1360353
Аноним 2019/03/06 17:12:25  №1360320 201
Screenshot361.png (36, 1081x418)
418x1081
Аноны, где я не прав?
Ответы: >>1360327
Аноним 2019/03/06 17:19:32  №1360327 202
Screenshot365.png (39, 952x520)
520x952
Screenshot363.png (39, 971x524)
524x971
Screenshot362.png (39, 986x493)
493x986
>>1360320
Так сделал, вроде работает.
Или можно было как- то короче?
Тут я сравнивал не по половинам, а целую строку. Потому что я тупой и не придумал, как сравнить одну половину со второй.
Ответы: >>1369059
Аноним 2019/03/06 18:08:04  №1360353 203
>>1360216
Ты в тот же самый массив записываешь тот же самый объект с тем же ключом. Какой смысл? Массив у тебя как был один, так и будет. Или ты все-таки в другой клонируешь?
Ответы: >>1360452
Аноним 2019/03/06 19:10:15  №1360386 204
reddit.png (48, 1012x616)
616x1012
Аноны, нужен совет.

Одна из моих проблем заключается в том, что я не могу в базовую терминологию, поэтому часто приходится изъяснятся как ретард. Подскажите, как можно обозначить вот эти элементы страницы любого саба на Reddit (pic related)?

Хочу построить простой сайт (на локальном сервере, просто ради практики), который будет что-то листить. Людей, бананы - без разницы. Я просто селебрити выбрал. Сейчас сделал простую html форму для добавления новых записей в базу данных, на той же странице написал PHP скрипт, который пользуется переменными из $_GET для составления SQL INSERT INTO. Всё ок, только теперь не могу понять, каким образом написать скрипт для генерации html файла для каждого добавления в базу данных. То есть, у каждого селеба должен генерероваться свой профиль на основе страницы-шаблона.

Затем будет стоять задача построить механизм фильтрации по атрибутам (first_name, last_name, occupation, location, etc.) при поиске на сайте. Пока не могу даже в гугле толком вопрос сформировать, чтобы найти, что нужно. То есть, как реализовать фильтрацию по базе данных на странице html?

Подскажите, пожалуйста.
Ответы: >>1360464 >>1360530 >>1360531
Аноним 2019/03/06 19:59:23  №1360452 205
>>1360353
В тот же массив я записываю клоны объектов, чтобы потом их изменять, без изменения оригинальных объектов.
Ответы: >>1360493
Аноним 2019/03/06 20:14:33  №1360464 206
>>1360386
> теперь не могу понять
1. Пишешь скрипт который просто генерирует статический профиль.
2. Находишь в профиле всю инфу которая должна тянуться с базы.
3. Выделяешь эту инфу в переменные. Тоесть при генерации профиля инфа не захаркоджена а берется из переменных. Переменные ты инициализируешь перед скриптом генерации.
4. Придумываешь способ заполнить эти переменные инфой из бд.
5. .....
6. профит
Аноним 2019/03/06 22:41:38  №1360493 207
>>1360452
Ты берешь и перезаписываешь оригинал его клонированной копией. Так понятно?

function __clone()
{
foreach (твойМассив как $ключ => $значение) {
твойМассив[$ключ] (текущий ключ форыча, - прим. автора) = clone $объект
}
}

Это равноценно такому

$arr = [0 => 'a', 1 => 'b'];
//первая итерация
foreach ($arr as 0 => 'a') {
$arr[0] = 'a';
}

То есть форыч берет и перезаписывает значение на то же самое. Чтобы работать с копиями, тебе необходимо положить их в новый массив.
Аноним 2019/03/07 00:13:51  №1360508 208
>>1359945
>Реестр - это паттерн, который описыв
Спасибо, исчерпывающий ответ. Написал бы ты всеобъемлющую книгу по всем этим аспектам. Они ведь не устаревают. Будет пользоваться популярностью.

>>1359946
>У меня просто времени иногда нет, последние пару недель адски загружен.

А можно узнать, чем ты занимаешься? В студии трудишься или в каком-нибудь банке софт ваяешь?

>Ни в коем случае. Идея DI контейнера - IoC - предполагает
Хорошо, проблему синглтона контейнер решает.
А вот еще вопрос. Создал я класс подключения к мускулу, сделал для него сервис-провайдер, где он создается, а потом внедряю его, куда нужно.

А вот, скажем, мне нужен не один объект, а нужно итеративно и с условиями получить много, тогда что? Нужно будет в контейнере хранить не объект, а класс, а потом внедрять этот класс и там создавать через new?

>Я думаю, сервис провайдеры и сервисы хранятся в отдельных папках.

Спасибо, теперь все понятно.

>>1359948
Если у тебя используется дата маппер, то в нем и будет метод для загрузки моделек из БД.

То есть вообще всем управляет маппер, а сущности это такие пассивные ячейки памяти, к которым маппер обращается, и сущность сама по себе ничего делать не должна? И в контроллере правильно будет вызывать именно методы маппера?

>>1359949
> В задаче про студентов сортировку логично сделать аргументом в методе для получения студентов:

Спасибо за разъяснение особенно за последний абзац и за метод, ты сэкономил мне кучу времени.

>То есть перед выполнением нужных действий проверяем наличие логина. При отсутствии - редирект на форму логина с передачей текущего URL

А можно такую проверку делать в конструкторах? Например, в общий абстрактный контроллер засунуть. А то не делать же ее в каждом методе (боль, лол). И если юзверь не залогинен, то просто будет редирект на контроллер залогинивания, который этот конструктор не наследует.

>В твоем варианте пользователь может попробовать обойти авторизацию, вызвав напрямую метод "методПослеПосещения".

Но у него не получится, если я объявлю этот метод закрытым. Можно вообще все методы сделать закрытыми и вызывать их через indexAction, в котором сформировать настройки и всякие проверки. Сигнатуру формировать по маршруту. Получится эдакий фронт контроллер, только не физический файл, а метод. Но это что-то идиотское, да? Лол.

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

А это разве не проще, чем файлообменник? Там ведь просто идет редирект на реальный URI при обращении к твоей ссылке. За вечер-другой можно сделать.

>>1359951
>Обычно делают отдельно шаблон для "лейаута" (шапка/подвал) и "контента". Лейаутов может быть несколько - например, один для морды, другой для админки. Как передавать параметры для лейаута? Тут есть варианты:


Я придумал вот что. Я в контроллере общем создал контейнер обычный массив data, куда записываю данные со всех уголков контроллеров и приходящие данные из моделей. В контроллерах-родителях задаю общие данные, в контроллерах специфичные, в методах контроллеров данные еще специфичнее. Данные записываются не через переопределение свойств, а через методы суперкласса.
Потом этот контейнер передаю в вид и обращаюсь к нему из шаблонов типа $data['title'], foreach($data['posts'] as $key => $post) {}, ну и все в таком духе. То есть "лейаут" и "контент" получаются данные из одного глобального массива data, переданного в вид. Так нормально?

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

Ну я имел ввиду, можно ли несколько "контентов" подключать в "лейаут".

Спасибо за ответы, ты будто чистое знание вливаешь мне прямо в мозг. Я, бывает, что-то очень долго ищу, бывает, несколько дней занимает поиск ответа на какой-то вопрос, иногда бывает сам додумываюсь до ответа, но проблема в том, что я не знаю, правильный он или нет. Но вот так очень круто зайти сюда и прочитать ответы на все, что я задавал. Пасиба.
Ответы: >>1360509 >>1361818
Аноним 2019/03/07 00:15:56  №1360509 209
>>1360508
>а нужно итеративно и с условиями получить много, тогда что? Нужно будет в контейнере хранить не объект, а класс, а потом внедрять этот класс и там создавать через new?
Хранить в контейнере factory, через нее создавать объекты.
Ответы: >>1360515
Аноним 2019/03/07 00:35:41  №1360515 210
>>1360509
Еще до фабрик не дошел, сейчас самое время, спасибо, анонче.
Аноним 2019/03/07 00:52:12  №1360517 211
А что лучше AIMPP или XAMPP?
Ответы: >>1360518
Аноним 2019/03/07 00:56:55  №1360518 212
Аноним 2019/03/07 01:47:19  №1360520 213
На чем в 2019 Rest сервисы на пыхе пишут? Надо бы с автодокументацией какой, как в soap, с нормальной структурой и клиентами. Есть что удобное или все свои велосипеды городят? Пока нашел swagger + swagger-php + jane openapi, может еще кто на чем делал?
Ответы: >>1361764
Аноним 2019/03/07 03:57:39  №1360530 214
>>1360209

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

>>1360214

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

>>1360386

Тут есть 2 подхода. Статический и динамический.

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

Их можно генерировать 2 способами:

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

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

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

Есть и другой подход - динамический. При нем мы не храним HTML на диске вообще. Мы генерируем HTML-страницу знаменитости или оглавление на лету, когда пользователь ее попросит, и не сохраняем ее никуда. То есть когда пользователь заходит по адресу /celeb.php?id=123 (адрес можно будет поменять), то запускается скрипт, берет информацию о знаменитости 123, подставляет ее в шаблон и отдает получившийся HTML пользователю. Аналогично делается оглавление.

Плюс динамического сайта - то, что не надо ничего обновлять при добавлении или изменении информации, и что изменения в БД мгновенно отображаются на сайте. Плюс статического сайта - скорость работы, в десятки-сотни раз выше, чем у динамического. Минус статического сайта - по мере роста объема информации обновление занимает больше времени. Представь, что у тебя оглавление содержит 20 знаменитостей на страницу, а всего знаменитостей миллион. При добавлении новой тебе придется обновлять все 50 000 страниц оглавления.

Почитать про шаблоны можно тут: https://github.com/codedokode/pasta/blob/master/php/templates.md

Почитать про архитектуру MVC (для динамической генерации страниц) можно тут: https://github.com/codedokode/pasta/blob/master/arch/mvc.md

Наконец, у нас есть задача сделать список студентов - и в ней есть очень много комментариев, которые подойдут и тебе: https://github.com/codedokode/pasta/blob/master/student-list.md

> Подскажите, как можно обозначить вот эти элементы страницы любого саба на Reddit (pic related)?

Посты, записи.

> на той же странице написал PHP скрипт, который пользуется переменными из $_GET для составления SQL INSERT INTO.

Прочитай обязательно про инъекции: https://github.com/codedokode/pasta/blob/master/security/sql-injection.md

> Затем будет стоять задача построить механизм фильтрации по атрибутам (first_name, last_name, occupation, location, etc.) при поиске на сайте.

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

Со статическим подходом это сделать вряд ли получится, так как фильтры дают огромное количество комбинаций и ты замучаешься генерировать заранее HTML страницу под каждую комбинацию.
Аноним 2019/03/07 04:06:14  №1360531 215
>>1360386

Наконец, есть еще третий подход, который нельзя отнести ни к статическому, ни к динамическому. Это генерация страниц на клиенте (в браузере). Дело в том, что в HTML страницу можно встраивать программу на языке Яваскрипт. Ты можешь сделать сайт из единственной HTML-страницы. При загрузке в браузер программа на JS обратится на сервер, запросит список знаменитостей, оформит с помощью шаблона и отобразит его на странице. Когда пользователь нажмет на знаменитость, JS скрипт запросит данные о ней (или возьмет информацию из ранее запрошенных данных) и сгенерует страницу этой знаменитости.

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

Более того, если знаменитостей ограниченное кол-во (не более нескольких тысяч), можно просто информацию о них сложить в файл JSON (или CSV, XML) на сервере, программа на JS будет скачивать этот файл, и использовать информацию из него. В таком случае нам не придется писать PHP-код, который будет выдавать информацию о знаменитостях.

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

На практике, правда, когда пытаются реализовать этот подход, получается тормозной, глючный, плохо работающий, дергающийся сайт. Потому что этот подход сложный и не всем по плечу. Люди бездумно используют готовые библиотеки и подходы, даже не понимая толком, как они работают, какие у них ограничения.
Ответы: >>1360752
PostgreSQL Аноним 2019/03/07 07:34:51  №1360565 216
Все чаще встречаю PostgreSQL. Хочу освоить.
MySQL знаю хорошо, сильны ли различия?
Где что можно посмотреть/почитать на русском, дабы обуздать PostgreSQL для людей знакомых с мускулем?
Ответы: >>1360568 >>1360712 >>1360792
Аноним 2019/03/07 07:45:10  №1360568 217
>>1360565
>MySQL знаю хорошо
Кому ты пиздишь?
Аноним 2019/03/07 15:21:34  №1360712 218
>>1360565
Смысла по-моему не особо, mysql по уши хватает на задачи реляционных БД. Зато nosql решения часто в добавок к mysql на фирмах требуются, так что полезнее будет их поизучать, mongodb c редисами, elasticsearch.
Ответы: >>1360726 >>1369059
Аноним 2019/03/07 16:05:39  №1360726 219
>>1360712
с редиской знаком, а монго давно как-то мельком юзал. Есть чето на русском годное и исчерпывающее?

И всетаки интересно именно по postgre
Аноним 2019/03/07 17:25:07  №1360752 220
>>1360531
Ого! Thanks for guidance. Буду разбираться.
Аноним 2019/03/07 19:33:15  №1360792 221
Ответы: >>1360810
Аноним 2019/03/07 21:06:51  №1360810 222
>>1360792
Спасиб. Но 5к страниц...
Ответы: >>1369059
Аноним 2019/03/08 02:20:14  №1360840 223
>>1353705 (OP)
Почему в экосистеме PHP такая чудовищно всратая ситуация с поднятием локального сервера?

Вот есть Нода. Спокойно запускает процесс сервера из любого каталога, лишь бы там были нужные файлы и всех пакетов хватало.
То же самое у Питона, но только надо с виртуальной средой чуть заморочиться.
ASP.Net? Да тоже в общем-то обычным процессом запускается, ещё и с exe-шников.
Да что там, даже Хаскель компилится в нормально исполняемый из любого каталога сервер.

И тут я прихожу в мир PHP. И наблюдаю удивительнейшие истории когда для запуска проекта нужно зачем-то пихать его в какую-то папку апача\нгинкса и смотреть как это чудовище пытается запускаться на 80м порту. При этом ещё по дефолту будет как-то странно всё отображать. Ещё и лагать может только в путь.
Блять, ну почему осталось именно так? Почему в 2к19 приходится наблюдать эти 90е?
Я прекрасно понимаю насколько это удачный подход относительно продакшн-сервера уже на готовом хосте, но для локальной работы, ещё и с несколькими проектами это какой-то ужас.
Ответы: >>1360858 >>1360865
Аноним 2019/03/08 05:12:02  №1360858 224
Ответы: >>1360880
Аноним 2019/03/08 05:22:28  №1360865 225
>>1360840
Даун, блядь
php -S localhost:8000
Ответы: >>1360880
Аноним 2019/03/08 07:36:47  №1360880 226
>>1360858
>>1360865
Надо же, не думал что буду так благодарен за струю мочи в мою сторону.
Работает прекраснейшим образом, без лагов и даже настраивать ничего не понадобилось.

Но почему тогда мне отовсюду XAMPP, LAMP, WAMP советуют ставить чтобы хоть что-то запустить?
Я в своё время по сути только из-за этого php и не трогал, что он целенаправленно MySQL пропагандирует с которым я не в ладах. А тут, получается, можно и без этого тоже чтоли?
Ответы: >>1360887
Аноним 2019/03/08 07:48:27  №1360887 227
>>1360880
> XAMPP, LAMP, WAMP советуют
Они желают тебе зла. Если собираешься серьезно погружаться в тему, то только php_fpm + nginx, а по мелочам и встроенного хватит.

>php и не трогал, что он целенаправленно MySQL пропагандирует
Ты шутишь?
Ответы: >>1360890
Аноним 2019/03/08 07:55:28  №1360890 228
>>1360887
>Если собираешься серьезно погружаться в тему, то только php_fpm + nginx, а по мелочам и встроенного хватит.
Что-то с nginx по-моему ебли и допотопности было не сильно меньше чем с Апачем.
>Ты шутишь?
Да не особо. По тем же хостингам если из БД предлагают только MySQL, то уже ясно что хостинг заточен на php. Те же стандартные стаки и почти все гайды - отовсюду предлагают именно MySQL.
Ответы: >>1360904
Аноним 2019/03/08 08:25:36  №1360904 229
>>1360890
Написал большую телегу, но стер все нахуй. Не в коня корм
Ответы: >>1369059
Аноним 2019/03/08 09:26:06  №1360919 230
Screenshot372.png (69, 785x766)
766x785
Хочу немного прояснить за регулярные выражения.

Если мне нужно будет найти определенные буквы, то я могу написать:
[а-жк-у] (от А до Ж, от К до У), то код не слепит вместе Ж и К?
Есть ли какой- то символ, который можно ставить, чтоб чисто визуально видеть, что они (Ж и К) будут врознь?
Ответы: >>1360926
Аноним 2019/03/08 09:50:21  №1360926 231
SPA Аноним 2019/03/08 11:35:54  №1360970 232
Смотрю вакансии фронтенда и везде нужен какой-то из spa фреймворков, что намекает что все хотят полностью перейти на гоняние jsona между еедпоинтами api
Вопрос:"Есть ли тут место php?"
Ответы: >>1360991
Аноним 2019/03/08 12:22:11  №1360991 233
>>1360970
Ну да. А что тебя смущает?
Аноним 2019/03/09 22:09:41  №1361764 234
Аноним 2019/03/09 22:43:06  №1361773 235
Няши, посмотрите верстку по макету, дайте советов мудрых и ответьте на некоторые вопросы. https://jsbin.com/pofasoviqa/edit?html,css,output
Знаю, код очень корявый, но я хочу стать лучше, потому мне нужны ваши ответа
Можно ли сделать плавный переход по якорям без JS?
Можно ли задать плавное всплывание картинок по нажатию на какую-либо из кнопок?
Копирайт всегда должен быть в футере, можно ли их разделить и будет ли это правильно? Я разделил, потому что так в PSD было. С шапкой также сделал.
Подписи к заголовкам обрамлять в <h> на пункт меньше или <p>?
Почему "margin: 0;" в body не работал и мне приходилось подписывать его к каждому элементу?
Ответы: >>1361774 >>1362602 >>1376424
Аноним 2019/03/09 22:45:54  №1361774 236
.jpg (131, 568x895)
895x568
>>1361773
А, и что еще со значками соц.сетей мне делать нужно было? Я фигурку внутри кружка скачал, а она битая получилась, но я вставил все равно.
Аноним 2019/03/10 06:00:32  №1361814 237
>>1354910

Вот что мне в ноде кажется неудобным - так это то, что каждый в Node.JS организует код как хочет. Вот, например, код: bodyParser.json() - непонятно, почему он сделан в виде вызова функции? Если он есть в единственном экземпляре, можно просто было бы использовать свойство bodyParser.jsonParser. Если там каждый раз надо создавать новый объект, можно было бы экспортировать класс: new bodyParser.JsonParser. А тут надо вызвать функцию, причем в ее названии нет ни малейшего намека на то, что это функция-конструктор (хоть бы createJsonParser ее назвали). Понятно, что это сторонняя библиотека, но все же не привычно.

А еще я открыл для себя, что в Express функция get() делает 2 разных вещи, в зависимости от числа аргументов: http://expressjs.com/ru/api.html#app . Кажется, разработчики Ноды решили пройтись по тем же граблям, которые проходили разработчики PHP.

Но в общем-то, я довольно плохо знаком с Нодой. Потому перейдем к коду.

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

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

https://github.com/someApprentice/Crypter/blob/master/server.ts#L30
> const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist/server/main.js');

Это место очень трудно понять. Мне пришлось открыть вопрос по ссылке из комментария и прочесть его:

> // https://stackoverflow.com/a/51391081
> const asyncHandler = fn => (req, res, next) => {

И проблема тут в плохом названии и отсутствии комментариев. Нужно было назвать функцию, например, promiseToCallback, handlePromise или adaptPromise и снабдить комментарием (я еще убрал стрелки так как на мой личный вкус, они плохо читаемы):

// Комментарий
function wrapPromise(asyncFn) {
return function(req, res, next) {
return Promise....;
}
}

Еще я не очень понял:

1) зачем там нужен Promise.resolve(), если асинхронная функция при вызове и так возвращает нам промис.
2) зачем использовать return

Я бы тогда написал так:

// Принимает на вход асинхронный обработчик, и возвращает
// новый обработчик, который отлавливает выброшенные
// в нем асинхронно исключения, передавая их в next().
//
// ссылка на SO
function adaptPromise(asyncFn) {
return function (req, res, next) {
asyncFn(req, res, next).catch(next);
}

}

> Does Bearer token provide XSRF protection?

Я думаю, да, тут XSRF не пройдет, так как браузер автоматически добавляет к отправляемым запросам куки или заголовок Authorization для традиционной авторизации по логину-паролю (на чем и основана уязвимость), но не добавляет его для типа Bearer.

> if (err) throw new err;

А не throw err? err - это функция-констуктор или объект исключения?

> res.cookie('uuid', uuid, ...
> res.cookie('email', email, ...
> res.cookie('name', name, ...

А зачем тут столько кук? Они же уже содержатся внутри токена. А в твоем варианте пользователь может их подменить, и если ты доверяешь им на сервере, то получается уязвимость. Ну и вообще, нужно ли ставить куки в SPA? Это же серверное API, оно наверно не должно ставить куки. А должно отдавать JSON с токеном.

> json(<U> { uuid, email, name, jwt });

Не очень понятно, зачем здесь влеплен Type Assertion? Функции json() он не нужен, это для проверки, что объект соответствует интерфейсу User?

Еще, кстати, вопрос: а при регистрации проверяется уникальность email? Также, я подозреваю, что удобнее может быть сделать отдельную функцию для валидации, чем использовать только встроенные возможности sequelize.

По поводу JWT - я с ним не работал (но с интересом прочитал про него), но у меня уже есть сомнения: почему при подписании токена мы передаем все значения из модели? Получается, что токен перестанет работать в следующих ситуациях:

- пользователь меняет имя
- пользователь меняет email
- пользователь меняет пароль
- мы добавили новые поля в модель пользователя

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

И, кстати, а почему был выбран JWT? Какие-то еще варианты рассматривались?

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

async function createToken(u: User): Promise<string>

Чтобы мы могли бы создавать токены в любом месте API?

> let user = new User({ email });
> await user.validate({ skip: difference(Object.keys(User.rawAttributes), ['email']) });

Это, конечно, выглядит немного корявым способом проверить email. Наверно, можно как-то получить функцию валидации отдельного поля?

> router.get('/email/:email'

Это не очень соответствует REST, так как URL в нем это указатель на "ресурс" (какую-то сущность), и при отсутствии ресурса ты должен отдавать 404. А ты всегда отдаешь 200. Я бы сделал тогда просто /email-exists?email=....

Не очень понятно, зачем ты тут вызвал валидацию и не использовал результат.

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

В наши дни наверно самый популярный формат документирования - это OpenAPI 3.0 (бывший Swagger). Ты описываешь свое API в виде YAML файла, и получаешь на выходе такую красивую штуку: https://petstore.swagger.io/ или такую: https://docs.discourse.org/

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

Еще, кстати, мне интересно, можно ли как-то использовать описания моделей (например, User) для автоматической генерации документации о формате JSON-ответа, и можно ли использовать описания для автоматического тестирования (тест берет Swagger-описание, проходится по всем методам и пробует их вызывать и проверяет, что ответ соответствует описанию).

Ответы: >>1366102 >>1366103
Аноним 2019/03/10 06:03:16  №1361815 238
>>1354910

По тесту:

https://github.com/someApprentice/Crypter/blob/master/api/api.test.ts#L31

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

В твоем случае надо сформулировать требования к функции регистрации. На мой взгляд, они такие:

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

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

В общем, тесты пока сделаны неправильно.

Так как ты тестируешь код, использующий БД, тебе надо предусмотреть, чтобы база была перед тестом в каком-то определенном состоянии (полностью пустая, например, или с какими-то тестовыми данными). Один из вариантов - в самом начале почистить БД/загрузить дамп, а каждый тест обернуть в транзакцию, которая откатывается. Это может быть быстрее, чем загружать дамп каждый раз.

На практике, может быть полезно разместить тестовую БД на ramfs, чтобы избежать вообще обращений к диску и ускорить прогон тестов.

Можно также попробовать добавить тест для обработчика ошибок (вызвать специальный URL, который выбрасывает исключение). Иначе ты можешь его отключить/сломать и не заметить.

> Is there any way to declare all classes at once for a webpack output file?

Я думаю, это не имеет отношения к webpack, так как ты должен в sequelize передать список классов. А для этого их надо импортировать. И вебпак увидит импорты.

По клиентской стороне:

Ты в API при логине ставишь куки вручную, но разве это правильно? По идее, это должно работать так:

- пользователь заходит на HTML-версию и его браузер отправляет запрос на сервер
- на сервере создается "песочница", в которой выполняется Angular-приложение и рендерит страницу
- оно добавляет записи в StorageService
- серверный код видит эти изменения и формирует из них куки

Если ты сделал куки аналогом localStorage для серверного рендеринга, то, наверно, логично абстрагировать это от приложения. Оно работает с StorageService, а куда потом сохраняются данные - не его забота.

Тут конечно мы упираемся в проблему, что объем кук ограничен, в то время как в браузере мы можем кучу информации сохранить в localStorage. Решением наверно тут будет как можно меньше сохранять в storage, когда мы выполняемся в режиме рендера на сервере. В идеале - хранить там только JWT.

Реализовать разную логику для работы на клиенте и на сервере можно, например, через интерфейс:

interface Storage {
getJwtToken(): Promise<string>
setJwtToken(token)
getUserData(): Promise<User>
setUserData()
}

И 2 реализации: клиентская берет данные из localStorage, а серверная - берет из БД или кук. Но это, конечно, требует писать два варианта кода.

Есть еще альтернатива, но она довольно сложная. Мы могли бы сделать что-то вроде "сессий" и делать для каждой "сессии" свой серверный аналог localStorage. То есть пользователь заходит на сайт, на сервере создается некий serverStorage, который не очищается между запросами. И приложение Angular, работая на сервере, работает с ним, как будто это localStorage. Ключом сессии может быть токен JWT. Данные serverStorage могут храниться в памяти Node-приложения или сбрасываться в HASH внутри редис.

То есть, когда приложение работает на сервере, в итоге данные пишутся в redis с ключом на основе JWT. Там конечно еще можно подумать над оптимальным по производительности алгоримом. И опять же, стараться при работе на сервере меньше сохранять данные в serverStorage, если они есть в БД.

https://github.com/someApprentice/Crypter/blob/master/src/app/app.component.html

Тут мне не кажется 100% надежной проверка залогиненности. Тут же нет проверки, что это валидный токен.

И еще, я не очень понял, как будет работать форма регистрации в режиме серверного рендеринга. Как и куда она будет отправлять свои данные?

> let route = this.router.config.find(r => r.path === redirect);
> route.data['email'] = email;

А это передает email только один раз, или ты этот email навсегда в конфиг роутинга вписал? По моем, не очень красиво получается. Разве нельзя передавать email внутри route parameters: https://angular.io/guide/router#route-parameters

Тогда можно сделать так: router.navigate(['/register', { email: email }])

Причем, я бы хранил email не в path, а в query: /register?email=xyz@example.com

> Позволяет ли Bearer token защититься от XSRF?
> Приходит ли вам на ум какая-нибудь слабая точка которую можно эксплуатировать?

Да. У тебя используются куки, и в них тоже есть токен. Предположим, у нас есть HTML версия, работающая без ангулара. Не получится ли, что злоумышленник сделает форму, которая будет имитировать отправку запроса этой HTML версией, и возникнет XSRF?

> Достаточно ли это строгая проверка на то является ли сущность экземпляром объекта localStorage?

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

> В правильной ли директории находится эта обёртка? Это не совсем сущность, например как User, но места по лучше я не могу придумать для неё. Куда следует помещать обёртки?

Это сервис. Помещать - не знаю, в папку для сервисов? Но у меня есть ощущение, что в клиентском приложении файлы и так довольно хаотично разбросаны.

> Нужно ли делать проверку на каждую валидацию? Например на встроенные в Ангуляр валидаторы или на валидацию по регулярному выражению?

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

- эти валидаторы действительно вызываются и проверяют данные
- их результат работы отображается

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

> Следующий шаг написания сервиса сообщений.

> Он будет реализован с помощь протокола WAMP и на платформе от https://crossbar.io/ , которая написана на Питоне, и для которой для аутентификации клиентов нужно тоже написать код на нём.

А чем Node не годится, кстати? Или ты решил изучить Питон и микросервисы? Ок, но на практике такой маленький проект может быть невыгодно разбивать на микросервисы - у них ведь есть и накладные расходы.

> Поэтому я сейчас буду изучать его, и возможно у меня появиться небольшие вопросы по нему. Могу я задать их в этом треде?

> Заодно и реактивное программирование подучу.

Конечно. Только пиши тогда, что именно ты добавил в проект и на что стоит посмотреть, а то он большой и с ходу это будет не очевидно.

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

Ответы: >>1366103 >>1366104
Аноним 2019/03/10 06:05:43  №1361816 239
>>1355067

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

Дополнительно да, сайт может смотреть, с какого IP ты зашел, и если он сильно поменялся, то попросить подтвердить вход ссылкой на email или SMS.
Аноним 2019/03/10 06:09:41  №1361817 240
>>1355110

ТестХаб или задачу на SPA, но ты от нее умрешь, ее пока никто не решил. Можешь попробовать сделать SPA, но попроще, чем описанный в ней, например: сайт, показывающий новости (наподобие мобильной версии Хабра). Можно смотреть список новостей, можно смотреть новости из какого-то хаба, можно читать новость, лайкать и добавлять в закладки. Все это в виде SPA, с умным кешированием, автоматическим обновлением и способностью временно работать без Интернета на кешированных данных. То есть Интернета нет, ты жмешь лайк, он запоминается и при появлении связи отправляется. Или ты жмешь новость, и если она есть в кеше, она открывается. Обновления отслеживаются, если появились новые новости, то ввеху появляется плашка с предложением обновить список и загрузить их. Число лайков обновляется если кто-то жмет лайк. Как тебе идея?


Аноним 2019/03/10 06:19:53  №1361818 241
>>1360508

> А можно узнать, чем ты занимаешься?

Просто обычная удаленная работа.

> А вот, скажем, мне нужен не один объект, а нужно итеративно и с условиями получить много, тогда что? Нужно будет в контейнере хранить не объект, а класс, а потом внедрять этот класс и там создавать через new?

Можно хранить фабрику (класс, создающий нужные объекты), можно в контейнере сделать метод, который позволяет создавать объекты с параметрами. Но вообще, надо подумать, а нужны ли в таких объектах зависимости? Обычно, если это объект типа "Пользователь", у них нет зависимостей и их можно просто создавать через new. То есть такие "сущности" обычно в контейнер не кладут.

> То есть вообще всем управляет маппер, а сущности это такие пассивные ячейки памяти, к которым маппер обращается, и сущность сама по себе ничего делать не должна? И в контроллере правильно будет вызывать именно методы маппера?

Если ты читал мой урок https://github.com/codedokode/pasta/blob/master/db/patterns-oop.md то знаешь, что есть ACtiveRecord, где сущности умеют сами себя сохранять в БД и Data Mapper, где они не умеют.

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

> А можно такую проверку делать в конструкторах?

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

> Я придумал вот что. Я в контроллере общем создал контейнер обычный массив data, куда записываю данные со всех уголков контроллеров и приходящие данные из моделей. В контроллерах-родителях задаю общие данные, в контроллерах специфичные, в методах контроллеров данные еще специфичнее. Данные записываются не через переопределение свойств, а через методы суперкласса.

Это плохо для чтения кода, так как чтобы понять, что передается в шаблон, надо изучать все эти места кода. Удобнее, когда передаваемые данные формируются в одном месте одним массивом.
Аноним 2019/03/10 10:29:13  №1361901 242
Kotlin - это параша.
Ответы: >>1362166
Аноним 2019/03/10 17:47:23  №1362166 243
>>1361901
К чему ты это высрал?
Аноним 2019/03/11 13:46:44  №1362488 244
Господа, а есть какой нибудь хороший ресурс (желательно с практическими заданиями) для изучения sql?
Ответы: >>1362606
Аноним 2019/03/11 17:52:47  №1362602 245
>>1361773
>Почему "margin: 0;"

Выбирай не через body, а через .

{margin: 0; padding: 0;}

>Подписи к заголовкам

В <p>. Our Featured Works и Get in Touch это будет h2.

>Копирайт всегда

@ 2013 Webpaint. All Rights Reserved. - у тебя в футере будет, а область выше это секция (section).

>со значками соц.сетей

У тебя на фото 5 значков, полностью их вырезай из макета, прямо с кружком. Вставляешь каждую по очереди и делаешь их ссылкой. Помести их в блок div.soc-but или типа того, сделай его display:flex и justify-content: space-between.

>плавное всплывание

webref.ru/css/transition

>плавный переход

webref.ru/css/scroll-behavior



Аноним 2019/03/11 17:58:45  №1362606 246
Аноним 2019/03/12 08:00:20  №1362894 247
сап, анонесы, подскажите с чего начать, попал в небольшую стагнацию, освоил процедурный код пхп и дальше никак. Пытаюсь в ооп, но всегда есть какое-то непонимание, нахуя и почему так. Заебался уже читать эти тонны текста по нему, может кто-нибудь подкинет какой-нибудь легкий на подъем гайд с задачками? Чтобы поменьше воды и практикапрактикапрактика, или я не верный вектор взял и нужно не ооп дрочить, а какой-нибудь фрейм/мвц и т.д?
из того в чем разбираюсь норм это sql, pdo, html/css. А куда дальше ковырять не понимаю.
Ответы: >>1362922 >>1362992
Аноним 2019/03/12 09:33:07  №1362922 248
>>1362894
ООП раскрывается на больших проектах которые разрабатываются большими группами людей.
Самому понять трудно нахуя вообще нужны интерфейсы, и зачем по десять раз писать сначала обьвление в интерфейсе методов, потом их реализация. И другие вещи связанные в ООП.
Но на больших проектах оказывается что это наоборот экономит время и позволяет не повторять функционал по сто раз, передавать экземпляры класса как аргумент итд.
Ответы: >>1362954
Аноним 2019/03/12 10:52:29  №1362954 249
>>1362922
вот, и я нихуя не понимаю как мне это учить блждат.
Или ты хочешь сказать забить на ооп и только в теории понимание этого достаточно, пока не началась работа в сфере.
Аноним 2019/03/12 11:15:31  №1362965 250
Разработчики, поясните в каких случаях стоит отделять mysql от сайта, а когда нет
Насколько нормально держать сайт и базу данных на одном сервере, при условии, что у бд указан локалхост вместо интерфейса
Ответы: >>1367265
Аноним 2019/03/12 12:02:08  №1362992 251
>>1362894

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

Если хочешь что-то посложнее, то к твоим услугам задача про ООП-гостинцу и ООП-будильник тут:

- ООП-Будильник: https://phpclub.tech/pr/res/1232710.html#1263399
- ООП-Гостиница: https://phpclub.tech/pr/res/1082507.html#1097078

Дальше, если ты все это сделал или все идеально знаешь, гугли и изучай инкапсуляцию, SOLID, DI. Кстати, у меня есть понятный урок по DI: https://github.com/codedokode/pasta/blob/master/arch/di.md

А еще по интерфейсам: https://github.com/codedokode/pasta/blob/master/php/interfaces.md

Ну и если есть желание, почитай другие уроки тут: https://github.com/codedokode/pasta/ - там есть и про MVC и про другие трендовые слова.

Ну и заодно почитай статью про выпечку хлеба: https://habr.com/ru/post/153225/

Если захочется увидеть применение ООП на практике, изучи библиотеку Symfony forms, разбери ее код и нарисуй диаграмму классов и связей между ними (кто кого наследует, кто кого создает).

Если ты все это прочтешь и изучишь, то ты будешь намного лучше разбираться в ООП и увереннее себя чувствовать. Я готов ответить на уточняющие вопросы, а также подсказать по задачкам или проверить решения.

Изучать ООП надо с основ. Если ты их не освоил, а берешься за паттерны, фреймворки, то конечно ты будешь путаться.
Ответы: >>1363007
Аноним 2019/03/12 12:54:13  №1363007 252
>>1362992
о, спасибо большое анон, отлично все расписал. Займусь сегодня, благодарю, буду вкидывать решения. Еще раз спасибо.
Аноним 2019/03/12 13:31:25  №1363025 253
>>1353705 (OP)
не могу вывести названия элементов из дб в список в php файл
http://beta.phpformatter.com#.XIex79kY6AQ.link

выдает ошибку
Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, null given in мой путь до файла

файл у меня на сайте на локалхосте через апач (опенсервер)
Ответы: >>1363027
Аноним 2019/03/12 13:35:23  №1363027 254
Ответы: >>1363131
Аноним 2019/03/12 14:01:11  №1363045 255
Имеет ли смысл использовать в студентах подобную систему валидации https://3v4l.org/gfBAC? Накидал на скорую руку, получился какой-то карго-культ на валидацию из симфони.

Кстати про симфони, в объектах-наследниках Constraint открытые публичные свойства. Получается бывают ситуации, когда инкапсуляцией можно пренебречь?
https://github.com/symfony/symfony/blob/4.2/src/Symfony/Component/Validator/Constraints/Length.php
Ответы: >>1365292 >>1367261
Аноним 2019/03/12 14:29:53  №1363056 256
Screenshot1.png (37, 773x418)
418x773
Screenshot8.png (34, 671x680)
680x671
Анон, поясни, чому он не печатает номера и почему пишет, что они неправильные все.
Ответы: >>1363067 >>1367265
Аноним 2019/03/12 14:52:49  №1363067 257
Screenshot376.png (33, 546x685)
685x546
>>1363056
Чуть поправил, но эффекта не дало. Блэт.
Ответы: >>1363279 >>1363281
Аноним 2019/03/12 17:25:31  №1363131 258
image.png (13, 577x204)
204x577
image.png (13, 503x191)
191x503
>>1363027
я дебич

короче вот на пиках
первый пик подключение к дб
второй пик это я так пытался вывести тайтлы из дб в столбик
Ответы: >>1363279 >>1363959 >>1367265
Аноним 2019/03/13 03:57:42  №1363279 259
Аноним 2019/03/13 04:30:27  №1363281 260
>>1363067
У тебя регулярка неправильная, [ ] задают список возможных символов, там не работают всякие | и &. Если тебе нужно условие "+7 или 8", то будет `(\+7|8)`.
Ответы: >>1363338
Аноним 2019/03/13 05:22:00  №1363289 261
А как по нормальному деплоятся сайты которые больше визиток? К примеру у меня небольшой веб-магазин, тысяч 60 товаров, 40 гигов фоток к товарам. И я хочу чтобы была возможность одной кнопкой переместить это все на другой сервак. С визиткой скажем понятно. Засунул в докер, где надо запустил с образа. С большими сайтами как-то не ок, так как на стайте каждый день что-то меняют (фотки к товарам + новые товары). Тоесть просто копировать образ докера не получится (если не пересобирать его после каждой новой фотки). Ну и база еще.
Ответы: >>1367264
Аноним 2019/03/13 08:08:34  №1363338 262
>>1363281
Спасибо.
Так и думал, что с "+7 или 8" будут проблемы.
Аноним 2019/03/13 08:48:18  №1363352 263
Аноны, у меня такой вопрос, возможно ли каким-то образом параллельно запустить PHP для обработки данных с Mysql. Т.е. из БД я к примеру делаю запрос вида: SELECT * FROM `table` WHERE ... LIMIT 1000. А затем первые 500 строк обрабатываю в одном потоке, а остальные строки во втором потоке. Сейчас скрипт, который реализует этот функционал выполняется около 10 мин. Вся проблема в том, что записи связаны с другими таблицами, и одна запись из извлекаемой таблицы, может иметь несколько записей из других таблиц. Сам скрипт вносит определнные изменения в эти данные, т.е. вызывается UPDATE.
Ответы: >>1367263
Аноним 2019/03/13 11:02:56  №1363410 264
Если в StudentDataGateway объединить методы add и update в save() + добавить логику определения существования студента, то этот класс можно переименовывать в StudentMapper?

И ещё, в классе работы с БД очевидно нужна функция поиска студентов. Например $studentMapper->find($searchQuery, $orderBy, $orderDir, $offset, $limit);
Что если в find() передавать не кучу параметров, а объект с параметрами класса SearchOptions? Узнал о таком способе решения тут https://www.refactoring.com/catalog/introduceParameterObject.html
Ответы: >>1365292 >>1367261
Аноним 2019/03/13 12:07:09  №1363443 265
Есть вопрос насчёт цепочки исключений.
Вот такая функция:

[code lang="php"] %
public function func1()
{
$x = 0;
try {
///
}
catch(SomeException $e) {
switch ($e->getCode()) {
case 1:
throw new SomeException("message_1", 11, $e);
break;
case 2:
throw new SomeException("message_2", 22, $e);
break;
case 3:
try {
///
}
catch (SomeException $g) {
// brainfuck
$g->previous = $e;
throw new SomeException('message_5', 55, $g);
}
throw new SomeException('message_3', 33, $e);
break;
case 4:
///
break;
}
}
return $x;
}
% [/code]

Сложность в блоке с brainfuck. Так как написано - не получится хотя бы потому что и поля previous нету. Создать копию $g вроде как нельзя - перенесётся message и code, но не trace и остальное.
Как же сцепить исключения таким образом чтобы все данные нормально сохранились? Может тут какая-то стилистическая или структурная ошибка?
Ответы: >>1363467
Аноним 2019/03/13 12:36:57  №1363467 266
>>1363443

Код довольно большой, и не очень понятно, что ты хочешь сделать.

Связь исключений используется. чтобы показать, что одно исключение было вызвано другим. Ну например, чтобы показать, что исключение DataLoadException вызвано исключнием HTTPConnectException (мы не смогли загрузить данные, так как в ходе их получения не удалось соединиться с удаленным сервером). Пример:

function getData($x)
{
try {
$a = loadDataFrom('https://a.example.com/1');
$b = loadDataFrom('https://b.example.com/1');
return $a + $b;
} catch (HTTPConnectException $e) {
throw new DataLoadException("Не удалось загрузить данные из-за проблем связи с сервером", 0, $e);
} catch (AccessDeniedException $e) {
throw new DataLoadException("Не удалось загрузить данные из-за того, что доступ к ним запрещен", 0, $e);

}

Ты же в коде ловишь одно исключение. и создаешь на его основе исключение того же класса. Это выглядит как минимум странно.
Аноним 2019/03/13 16:14:36  №1363604 267
Screenshot378.png (18, 998x413)
413x998
Screenshot377.png (76, 1643x639)
639x1643
Не могу понять, где ставить поиск символов, которые могут быть посреди номера.

Я пробую:
([0-9]{10}) ([\w]{0,}) - цифры и знаки в разных скобках.
([0-9]{10} [\w]{0,}) - цифры и знаки в одних скобках.
[0-9 [\w]{0,} ]{10} - знаки внутри скобок с цифрами.

Как я понял, то, что внутри (этих) скобок считается отдельным блоком, куда можно накидать кучу параметров, написанных [тут].
Но почему- то у меня не работает это никак.

Объясните, как, блять, тут делать, чтоб нормально было.
Ответы: >>1363624
Аноним 2019/03/13 17:20:14  №1363624 268
>>1363604
Читать нормальные статьи где объясняют регулярки.

>>1353705 (OP)
Вы все еще так же сидите на РПР? Это же каким дегенератом нужно быть.
Аноним 2019/03/13 18:32:23  №1363656 269
Screenshot11.png (42, 644x784)
784x644
Я все, я нихуя не понимаю.
Ответы: >>1367263
Аноним 2019/03/13 18:59:44  №1363679 270
wallhaven-36310.jpg (498, 1920x1080)
1080x1920
сап програмач, хочу написать скрипт для регистрации на сайте, что нужно знать для этого, знаю кто то использует API с сайтов с смсками, хелпаните инфой кто какой обладает
Ответы: >>1363682 >>1363959
Аноним 2019/03/13 19:04:37  №1363682 271
>>1363679
для начала хочу каким образом он реализуется
Ответы: >>1363683
Аноним 2019/03/13 19:05:01  №1363683 272
>>1363682
образом* всё я плывву
Ответы: >>1363684
Аноним 2019/03/13 19:05:18  №1363684 273
>>1363683
всё мне пизда пора спать идти
Аноним 2019/03/14 03:29:35  №1363959 274
>>1363679
гугли скрипты для регистрации и делай для своей бд где у тебя юзеры будут храниться
если я правильно понял что тебе нужно

>>1363131
вот тут я просто поменял assoc на array и дописал запрос
кому интересно могу показать

Аноним 2019/03/14 08:48:16  №1364043 275
У вас тут так уютно, можно присоединиться из frontend треда?
Ответы: >>1364131
Аноним 2019/03/14 10:27:06  №1364097 276
Screenshot379.png (26, 614x554)
554x614
Всем приветик в этом чатике, это снова я.
Подскажите, блять, наконец уже, как сделать поиск символов между цифр.

Есть охуенная идея:
Накопипастить ([\W]{0,})([0-9]) десять раз, но это же пиздец как тупо. Уверен, есть другой способ, просто я слишком туп, чтоб его найти.


Подскажите, блэт.
Ответы: >>1364102 >>1364108 >>1364272
Аноним 2019/03/14 10:33:17  №1364102 277
>>1364097
У программиста была проблема которую он предпочел решить регулярными выражениями.
Теперь у него две проблемы.
Ответы: >>1364106
Аноним 2019/03/14 10:36:19  №1364106 278
>>1364102
Так же написано в учебнике, в котором дана эта задачка.
Ответы: >>1364107
Аноним 2019/03/14 10:36:53  №1364107 279
>>1364106
Как думаешь для чего?
Ответы: >>1364109
Аноним 2019/03/14 10:38:06  №1364108 280
>>1364097

- напиши выражение, которое находит ровно 1 цифру и любое число доп. символов за ней
- возьми его в круглые скобки и поставь после них {x}
Ответы: >>1364116
Аноним 2019/03/14 10:38:28  №1364109 281
>>1364107
Чтоб не тратить время на изучение регулярок?
Аноним 2019/03/14 10:41:45  №1364116 282
Screenshot380.png (21, 479x498)
498x479
>>1364108
Чот вообще не то. И неверные номера тоже зацепило.
Аноним 2019/03/14 10:45:29  №1364120 283
Screenshot381.png (25, 639x463)
463x639
Такс.
Мы развиваемся и эволюционируем. Осталось понять, как искать символы между цифрами.
Ответы: >>1364123
Аноним 2019/03/14 10:49:14  №1364123 284
>>1364120
Чот я прикола не понял.
Чому он пропускает некоторые номера? Не могу понять, по какому признаку он их выбирает.
В чем причина моих мозгах, аноны?
Ответы: >>1364125
Аноним 2019/03/14 10:53:58  №1364125 285
>>1364123

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

Также, вместо {0,} можно писать просто звездочку.

Также, вместо \W лучше писать конкретные символы - минусы, скобки, пробелы, а то он что угодно под это выражение подгонит.


Ответы: >>1364135
Аноним 2019/03/14 11:18:39  №1364131 286
Ответы: >>1364877
Аноним 2019/03/14 11:21:39  №1364135 287
Screenshot384.png (36, 998x506)
506x998
>>1364125
Спасибо тебе, помог очень сильно. Долго думал, как быть с пробелом между + и 7, но догадался(!) сделать там просто пробел.

> Также, вместо {0,} можно писать просто звездочку.
> Также, вместо \W лучше писать конкретные символы - минусы, скобки, пробелы, а то он что угодно под это выражение подгонит.

За вот эти советы отдельное спасибо, буду знать и применять.
Аноним 2019/03/14 12:31:23  №1364171 288
Аноны, привет, я нуб. Я тут валандаюсь с своим MVC, сейчас озадачен админкой и ролями и прочим.
Сейчас я очевидно горожу свои костыльные недо-велосипеды.
Может стоит взять какой нибудь фреймворк за основу? Сразу начинать с большого, я думаю о laravel. Или все таки какой то мини-фреймворк? Я правда о таких не знаю.
Основная задача все таки - посмотреть как это должно быть реализованно.
MVC для меня сейчас обязательно, так как я с начала изучения пишу классами на MVC.
Ответы: >>1364223 >>1364246
Аноним 2019/03/14 13:40:28  №1364223 289
>>1364171
Рекомендую 2й уровень курса профит, там как раз про mvc. Очень доступно объясняет.
Аноним 2019/03/14 14:14:20  №1364246 290
>>1364171

Могу предложить простой урок про основы MVC: https://github.com/codedokode/pasta/blob/master/arch/mvc.md

Затем можно посмотреть какой-нибудь фреймворк вроде Yii2 (попроще) или Laravel, Symfony (посложнее). Это как раз подходит для варианта "посмотреть, как реализовано".

Для ролей обычно принято использовать RBAC.
Ответы: >>1364906
Аноним 2019/03/14 14:35:20  №1364272 291
>>1364097
Бля, анон, как же хочется помочь тебе, но мне пиздец как впадлу даже твой скрин смотреть(

Гугли уроки по регуляркам от WebForMySelf

мимо бог регулярок
Ответы: >>1364307
Аноним 2019/03/14 15:37:26  №1364307 292
>>1364272
> WebForMySelf
И на этом спасибо. Чем больше материалов, тем лучше. Где- то одни фичи рассказывают, где- то - другие.
Ответы: >>1364338
Аноним 2019/03/14 16:17:14  №1364338 293
>>1364307
Там все рассказывают по регуляркам, больше тебе нихуя не надо
Аноним 2019/03/14 18:00:13  №1364387 294
В чем разница и какие преимущества между join и выборкой из двух таблиц?
Ответы: >>1364393 >>1364666
Аноним 2019/03/14 18:04:38  №1364393 295
>>1364387
Технически никакой и на скорость выполнения не влияет, просто синтаксически наглядней, особенно если будет огромный запрос, то сразу видно будет какие таблицы юзаются, а в условии будут примитивные конструкции
Аноним 2019/03/15 09:45:10  №1364666 296
>>1364387
Выборка из двух таблиц === inner join.
Есть ещё outer join (с пустыми клеточками) и редко бывает нужен self join (поиск совпадений в таблицах).
Алсо, не забываем о том, что в джойнах есть ключевое слово "ON", с ним код легче читать.
Аноним 2019/03/15 10:08:49  №1364678 297
Многоуважаемые братья пхп-шники, подскажите пожалуйста. Задачка по проверке номера по регуляркам. Как написать регулярку которая: сначала идет +7 или 8, за ними ровно 10 цифр, между которыми может быть любое число скобок, минусов, пробелов
Я сделал как ^(\+?(8|7)\d{10})$ Но как сделать так, чтобы между цифрами могли быть пробелы, или другие символы?
Ответы: >>1364697
Аноним 2019/03/15 11:00:37  №1364697 298
>>1364678
(\+?7|8)([()\-\s]\d[()\-\s]){10}

([()\-\s]\d[()\-\s]){10}
Обязательно одно число от 0 до 9 (\d). Вокруг него может быть, а может и не быть любое количество пробелов, тире, скобок.

Помог как смог.
Ответы: >>1364698 >>1364724
Аноним 2019/03/15 11:02:27  №1364698 299
Аноним 2019/03/15 11:39:27  №1364712 300
1
Аноним 2019/03/15 12:08:02  №1364724 301
>>1364697
Я въехал в регулярку, спасибо!, как сам не допер до этого...
Аноним 2019/03/15 16:19:06  №1364877 302
Аноним 2019/03/15 17:02:53  №1364906 303
>>1364246
>Могу предложить простой урок про основы MVC: https://github.com/codedokode/pasta/blob/master/arch/mvc.md
К сожалению, там упущен один очень важный момент, а именно по поводу тонкого контроллера и толстой модели.
Аноним 2019/03/15 18:02:39  №1364946 304
DvsPcVcWkAEPc90.jpg (180, 930x1140)
1140x930
Недавно начал осваивать Linux (Lubuntu), поэтому никак не могу настроить apache2, чтобы он корректно отображал PHP скрипты.

Все установил через консоль, как описано здесь: https://howtoubuntu.org/how-to-install-lamp-on-ubuntu

Однако когда закидываю свой test.php в /var/www/html, то в результате браузер открывает пустую страницу. Смотрел туториалы рандомных индусов - у них всё отображается.

HTML файлы отображаются без проблем.

В чём может быть проблема? Выручьте идеями, пожалуйста.
Ответы: >>1364960 >>1365890
Аноним 2019/03/15 18:34:38  №1364960 305
>>1364946
/etc/php/<версия>/apache2/php.ini

display_errors = on

как минимум
Ответы: >>1364964
Аноним 2019/03/15 18:35:00  №1364961 306
Ребята, подскажите проект php на github-е, желательно e-commerce, в котором применяется DDD и код придерживается принципам SOLID?
Вроде теорию прочитал - понял, но на практике не могу применять, что касаемо DDD.
Ответы: >>1367261
Аноним 2019/03/15 18:49:09  №1364964 307
>>1364960
Спасибо за вариант! Изменил файл, проблема осталась, к сожалению.
Выходит абсолютно пустая страница.
Ответы: >>1364968 >>1364972
Аноним 2019/03/15 18:55:37  №1364968 308
>>1364964
Что ты изменил :) ?
Какая версия пхп у тебя под апачем работает?
Покажи свой test.php
Что ты в адресной строке набираешь?
Не заставляй ванговать
Ответы: >>1364981
Аноним 2019/03/15 18:58:48  №1364972 309
>>1364964
Еще ты забыл сделать sudo service apache2 restart
Аноним 2019/03/15 19:12:28  №1364981 310
>>1364968
Окей, вот порядок моих действий:
1) sudo vim /etc/php/7.2/apache2/php.ini
2) нашёл строчку display_errors = Off, поменял на On (:wq, конечно же);
3) sudo service apache2 restart

Скрипт простой:

<?php

echo "This is supposed to be displayed!";

?>

Просто без задней мысли вбиваю:
file:///var/www/html/test.php
Ответы: >>1364990
Аноним 2019/03/15 19:28:39  №1364990 311
Ответы: >>1365006
Аноним 2019/03/15 19:44:37  №1365006 312
>>1364990
Я просто очень большой нуб, поэтому я просто создал HTML файл в /var/www/html
Назвал его test.html, положил туда простой контент и кликнул дважды. Затем поменял test.html в строке на test.php и ничего не получил.

Почему я так сделал? Потому что на винде localhost/myfolder выводит список файлов, которые без проблем запускаются по нажатию. Тут такое не работает.

Моя логика действий само собой вызывает улыбку, но вот как-то так.

Анон, большое тебе спасибо. Я не перестаю удивляться, как этот тред умудряется привлекать столько отзывчивых анонов.
Аноним 2019/03/15 20:58:57  №1365040 313
Ребята, существует ли в пхп какой-то встроенный класс который содержит данные запроса?
Ответы: >>1365101
Аноним 2019/03/15 22:50:27  №1365101 314
>>1365040
Есть переменная (массив) $_REQUEST
Аноним 2019/03/16 04:49:19  №1365221 315
Знаю петон, как быстро смогу перекатиться в ваш пхп?
Ответы: >>1365254
Привет пхпешникам! Аноним 2019/03/16 06:38:08  №1365245 316
Сам то я вкатился в бэкэнд яву, но желаю вам всем найти работку за деньги!
Ответы: >>1365957
Аноним 2019/03/16 07:46:04  №1365254 317
>>1365221
Довольно быстро. Но буден непривычно выделять переменные и ставить ; в конце команд.
А так - такой же простой язык, как и питхон.

поначалу орал люто, потому что вместо echo писал print().
Аноним 2019/03/16 09:04:25  №1365283 318
image.png (21, 543x218)
218x543
>>1353705 (OP)
Какую функцию использовать чтобы в zakaz.php отображался свой элемент из моей бд для каждого элемента цикла?
Ответы: >>1365791
Аноним 2019/03/16 09:33:43  №1365292 319
Аноним 2019/03/16 13:39:52  №1365456 320
image.png (264, 1920x1080)
1080x1920
syntax error, unexpected ';'

Что мне делать? :((
Ответы: >>1365486
Аноним 2019/03/16 14:35:06  №1365486 321
>>1365456
> syntax error, unexpected ';'
В 577 строке? Проверь предыдущие.
Ответы: >>1365553
Аноним 2019/03/16 17:07:12  №1365553 322
>>1365486

Хммм, удивительно, но твой способ магическим образом помог
Аноним 2019/03/16 20:20:55  №1365708 323
1212.JPG (69, 1180x626)
626x1180
аноны. хочу сделать ооп ферму. создал классы для 2-х типов животныых. Как мне описать ферму, чтобы она могла добавлять N животных, доить их и вытаскивать продукцию? опиши словесно
Ответы: >>1365742
Аноним 2019/03/16 20:43:50  №1365742 324
>>1365708
Следующие советы подразумевают что ты хочешь поебаться с ООП.
Рефакторишь своих животных чтобы они наследовались от общего базового класса. В базовом классе реализешь генерацию id, а также метод getYeld() - этот метод возвращает массив с дневными профитами с животного, в твоем случае это будет что-то типа ['milk' => 8] с коровы и ['egg' => 1] с курицы. В массиве можно возвращать несколько разных продуктов (если ты хардкорный фермер можно еще навоз например добавить - это важный ресурс). Ключи массива сделать костантами.
В классе фермы делаешь массив для животных. Для добавления животных делаешь метод addAnimal($class, $count) - указываешь класс животного и количество, ферма добавляет нужное количество в массив животных. Делаешь массив для хранения ресурсов. Добавляешь к ферме метод getYeld() который проходит по массиву животных, вызывает у каждого животного getYeld(), полученые результаты суммирует с массивом с ресурсами - тут нужно внимательно проследить чтобы результаты для каждого ключа суммировались с теми что уже есть в массиве, а не перезаписывались новыми.
Ответы: >>1365792
Аноним 2019/03/16 22:18:41  №1365791 325
>>1365283
пиши в sql запрос SELECT*FROM stor WHERE 'столбец цена' AS price AND 'столбец количество' AS quan и т.д , все отсально кроме запроса вроде корректное
Аноним 2019/03/16 22:22:32  №1365792 326
>>1365742
геттеры и сеттеры - антипаттерн.

мимо Егор Бугаенко
Ответы: >>1365795 >>1365835
Аноним 2019/03/16 22:29:58  №1365795 327
>>1365792
Слушать Бугаенко - антипаттерн
Аноним 2019/03/17 00:58:31  №1365835 328
>>1365792
Там нет геттеров и сеттеров.
Аноним 2019/03/17 07:07:34  №1365890 329
Аноним 2019/03/17 08:09:20  №1365937 330
image.png (212, 1920x1080)
1080x1920
image.png (281, 1920x1080)
1080x1920
функция json_decode() не работает к этой строке, json parser-ы и decode-ры говорят что всё ок, но вот json_decode() жалуется

помогите пожайлуста
Ответы: >>1365938 >>1365994 >>1366308
Аноним 2019/03/17 08:11:15  №1365938 331
>>1365937
забыл сказать:

$people получает значение null, а Sssend просто работающий аналог echo
Аноним 2019/03/17 09:01:49  №1365957 332
>>1365245
Стоит ли укатываться в яву?
Ответы: >>1366045
Аноним 2019/03/17 09:25:42  №1365974 333
>>1353705 (OP)
Аноы, чет туплю.
Есть у меня класс Klass, у этого класса есть статический метод Start(){...}

создаю новый объект $obj = new Klass();
И вызываю статический метод из объекта не статическим способом:
$obj->Start(); и так работает
Какой жопой я читал документацию? Разве так можно?


Ответы: >>1365979
Аноним 2019/03/17 09:36:20  №1365979 334
>>1365974
Объявление свойств и методов класса статическими позволяет обращаться к ним без создания экземпляра класса. Свойство класса, объявленное как статическое, не может быть доступно посредством экземпляра класса (но статический метод может быть вызван).

http://php.net/manual/ru/language.oop5.static.php
Ответы: >>1365980
Аноним 2019/03/17 09:38:29  №1365980 335
Аноним 2019/03/17 10:16:42  №1365994 336
>>1365937
Снкачала убедись что file_get_contents правильно читает файл, потом разбивай джон на части пока не найдешь строчку с проблемой
Аноним 2019/03/17 12:22:51  №1366045 337
>>1365957
Хз что сказать.
Имей ввиду что йава ждуниоров фильтруют сложностью тестового.
Это ёба задание на 3-х листах английского текста на неделю, где специально выбирают ёба технологии про которые никто не знает (сразу отваливаются вкатальщики по роликам с ютуба и остаются тру пацаны которые умеют читать доки по английски и гуглить в стековерфлоу)
Если у тебя есть зелёный гит и что нить в сети на пхп то ты уже молодец.

Ответы: >>1366410
someApprentice 2019/03/17 14:55:24  №1366102 338
>>1361814
>Вот что мне в ноде кажется неудобным - так это то, что каждый в Node.JS организует код как хочет. Вот, например, код: bodyParser.json() - непонятно, почему он сделан в виде вызова функции? Если он есть в единственном экземпляре, можно просто было бы использовать свойство bodyParser.jsonParser. Если там каждый раз надо создавать новый объект, можно было бы экспортировать класс: new bodyParser.JsonParser. А тут надо вызвать функцию, причем в ее названии нет ни малейшего намека на то, что это функция-конструктор (хоть бы createJsonParser ее назвали). Понятно, что это сторонняя библиотека, но все же не привычно.
А ещё с TypeScript некоторые возможности теряются https://github.com/someApprentice/Crypter/blob/master/api/api.ts#L8-L9

Моё мнение что на JS не должно быть никакого кода, кроме браузерного, и максимум выдаваться SSR страницы. А серверный код должен написан на языках получше, например PHP.


>Комментариев, конечно мало. Наверно стоило бы хотя бы в начале файла писать, что это за модуль и для чего.
Ой-ой. Ошибка. Нужно было предупредить, что я комментарии оставлял "для себя" чтобы понимать что это и откуда взялось, и что это скорее всего нужно исправить.
К сожалению, инструменты для написания кода на JS ещё не совершены, и не справляются с тривиальными задачами, по моему приземлённому мнению.
Я перенёс эти проблемы в issues задачи https://github.com/someApprentice/Crypter/issues проверять это не нужно, но если у вас есть подсказка, то я с радостью её приму

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

У меня плохо с английским и написание комментариев утяжелит и замедлил разработку. Насколько важно их писать?


>Тут ссылка на отсутствующий в репозитории файл - это нормально? Этот файл ведь из чего-то генерируется, и нельзя ли тут подключать исходный файл. Или хотя бы комментарий написать:
>
>https://github.com/someApprentice/Crypter/blob/master/server.ts#L30
>> const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist/server/main.js');
>
Да, эта папка генерируется после сборки приложения npm run build. Думаю тут тоже можно добавить комментарий.


>И проблема тут в плохом названии и отсутствии комментариев. Нужно было назвать функцию, например, promiseToCallback, handlePromise или adaptPromise и снабдить комментарием
Насчет комментария это да, их стоит добавить. Но я не понимаю почему вы пишите, что эта функция для того чтобы обрабатывать промисы, это не так. Эта функция нужна, чтобы обработать асинхронный обработчик запросов, который Эксрпресс не поддерживает (пока что?).

// Это не сработает
express.get('/route', async (...) => {
await promise = ...
});

https://github.com/someApprentice/Crypter/issues/12


>> if (err) throw new err;
>
>А не throw err? err - это функция-констуктор или объект исключения?
Объект исключения. Исправлю.


>> res.cookie('uuid', uuid, ...
>> res.cookie('email', email, ...
>> res.cookie('name', name, ...
>
>А зачем тут столько кук? Они же уже содержатся внутри токена. А в твоем варианте пользователь может их подменить, и если ты доверяешь им на сервере, то получается уязвимость. Ну и вообще, нужно ли ставить куки в SPA? Это же серверное API, оно наверно не должно ставить куки. А должно отдавать JSON с токеном.
Они нужны для отрисовки данных при серверном рендеренге. Как я уже писал, куки нужны только для условий отображений https://github.com/someApprentice/Crypter/blob/master/src/app/main/main.component.html#L3 . Возможно uuid можно убрать, но почему нет?

Здесь нет уязвимости, т.к. сервер (API) не использует куки.

Сделать приложение работающие без поддержки JS - я отказываюсь от этой идеи.


>> json(<U> { uuid, email, name, jwt });
>
>Не очень понятно, зачем здесь влеплен Type Assertion? Функции json() он не нужен, это для проверки, что объект соответствует интерфейсу User?
Да, именно так. Это лишнее?

>Еще, кстати, вопрос: а при регистрации проверяется уникальность email?
Нет, я забыл её сделать. Исправлю. И наверно нужно ещё это в схему БД добавить.

>Также, я подозреваю, что удобнее может быть сделать отдельную функцию для валидации, чем использовать только встроенные возможности sequelize.
Почему нужно отдельную функцию валидации? Всё же и так в одну строчку делается. https://github.com/someApprentice/Crypter/blob/master/api/api.ts#L50



>По поводу JWT - я с ним не работал (но с интересом прочитал про него), но у меня уже есть сомнения: почему при подписании токена мы передаем все значения из модели? Получается, что токен перестанет работать в следующих ситуациях:
>
>- пользователь меняет имя
>- пользователь меняет email
>- пользователь меняет пароль
>- мы добавили новые поля в модель пользователя
>
>На мой взгляд, токен должен переставать работать только при смене пароля (на случай, если пользователь боится, что у него украли токен и меняет пароль, старый токен должен перестать действовать). Соответственно, в подписи должны участвовать только uuid и хеш пароля. Или я ошибаюсь?
>
>И, кстати, а почему был выбран JWT? Какие-то еще варианты рассматривались?
>
>Также, я не уверен, а правильно ли токен создавать прямо в обработчике? Не логичнее ли сделать функцию такого вида:
>
>async function createToken(u: User): Promise<string>
>
>Чтобы мы могли бы создавать токены в любом месте API?

>почему при подписании токена мы передаем все значения из модели?
Да, я понимаю этот вопрос. Я думал, что можно сделать так, получать из Bearer token этот токен, и получать из него всё что нужно (имейл/что-нибудь ещё), но это, скорее всего нигде не пригодиться, так что это ошибка. Я согласен что достаточно хранить в нём только uuid и хэш.

>И, кстати, а почему был выбран JWT? Какие-то еще варианты рассматривались?
Он популярен. Чем популярнее технология, тем больше решений вопросов связанной с ней. В прочитанных мной статьях по JS приводят примеры именно с ним.


>Также, я не уверен, а правильно ли токен создавать прямо в обработчике? Не логичнее ли сделать функцию такого вида:
>
>async function createToken(u: User): Promise<string>
>
>Чтобы мы могли бы создавать токены в любом месте API?
Я скажу на чистоту мой взгляд на это - Я не понимаю зачем нужно выносить такие функции в отдельные. Это функция понятна любому разработчику и он с первого взгляда поймет что происходит в ней. Почему нужно делать обёртку ради человекопонятного названия функции?

Я правда не понимаю, вот как эта функция будет выглядеть (она кстати не работает на промисах):

function createToken(u: User, cb) {
token.sign(u.dataValues, JWT_SECRET, cb(...))
}

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


>> let user = new User({ email });
>> await user.validate({ skip: difference(Object.keys(User.rawAttributes), ['email']) });
>
>Это, конечно, выглядит немного корявым способом проверить email. Наверно, можно как-то получить функцию валидации отдельного поля?
Это баг библиотеки sequelize-typescript. Чтобы получить валидацию отдельного поля нужно вместо опции skip добавить fields.


>> router.get('/email/:email'
>
>Это не очень соответствует REST, так как URL в нем это указатель на "ресурс" (какую-то сущность), и при отсутствии ресурса ты должен отдавать 404. А ты всегда отдаешь 200. Я бы сделал тогда просто /email-exists?email=....
>Я бы сделал тогда просто /email-exists?email=....
Всё исправлю. Здесь тоже в случае отсутствия нужно отдавать 404?

>Не очень понятно, зачем ты тут вызвал валидацию и не использовал результат.
Хм, возможно валидацию и не стоило вызывать. Почему нет?

>и не использовал результат
Результат валидации либо вбрасывает ошибку, либо возвращает null(?). Эта ошибка обрабатывается в обработчике ошибок https://github.com/someApprentice/Crypter/blob/master/api/errorHandler.ts#L8-L10



>И еще важный момент. У тебя нет документации по API, а это плохо. Если фронтенд-разработчик хочет использовать твое API, где он прочтет документацию? Код что ли разбирать?
>
>В наши дни наверно самый популярный формат документирования - это OpenAPI 3.0 (бывший Swagger). Ты описываешь свое API в виде YAML файла, и получаешь на выходе такую красивую штуку: https://petstore.swagger.io/ или такую: https://docs.discourse.org/
>
>Естественно, логично не писать YAML руками, а генерировать его из комментариев в коде. Так ты получишь и комментированный код, и документацию для разработчиков.
Понял, буду работать над этим. Написать комментарии для документации API мне кажется более понятной задачей, чем писать комментарии для бушующих разроботчиков.

Так вы имели ввиду комментраии для модулей API, а не фронтенд приложения?
Ответы: >>1366731 >>1366734
someApprentice 2019/03/17 14:55:51  №1366103 339
>>1361814
>Еще, кстати, мне интересно, можно ли как-то использовать описания моделей (например, User) для автоматической генерации документации о формате JSON-ответа, и можно ли использовать описания для автоматического тестирования (тест берет Swagger-описание, проходится по всем методам и пробует их вызывать и проверяет, что ответ соответствует описанию).
Я ничего из этого не знаю, но постараюсь разобраться.


>>1361815
>Тут код теста почти повторяет код обработчика. Это не годится, так как ты можешь сделать одинаковые ошибки и там, и там.
А где у меня код повторяется? То что я токен генерирую? А как я узнаю какой токен будет иначе?

>Если мы тестируем функцию вычисления корня, то ее проверяют возведением в квадрат, а не аналогичным вычислением.
Не понимаю сравнение.

var n = 5
expect(sqrt(n^2)).toEqual(n)

Я же тоже "возвожу" данные пользователя в токен и проверяю совпадает ли возвращённый ответ, а именно кукисы, с ним.

var user = { ... }
token(user, (jwt) => {
expect(cookies['jwt']).toEqual(jwt)
});

Ну да, теперь вижу причину. Нужно проверить что пришедший токен в дешифрованном виде равен данным пользователя?

>В твоем случае надо сформулировать требования к функции регистрации. На мой взгляд, они такие:
>
>- она должна создавать аккаунт на сервере, под которым можно залогиниться
Я забыл сделать проверку, что пользователь добавился в БД и данные правильные. Это достаточное условие? Залогинивание проверяется в предназначенном для неё тесте, и там как раз сначала заполняется запись в БД.

>- она должна возвращать токен, с которым можно использовать защищенное API
Нужно сделать проверку как я писал выше, что пришедший токен в дешифрованном виде равен данным пользователя или действительно нужно проверять каким-то методом API?

>- нельзя дважды зарегистрироваться с одинаковым email
Сделаю. то нужно сделать прописав ассоциацию Sequelize на уникальность emai'а. Тогда при повтороном имейле будет вбрасываться ошибка и тест провалится.

>- нельзя регистрироваться без указания обязательных аргументов
Сделаю.

>- и, может, еще какие-то требования по валидации. Например, что при ошибке возвращается объект определенного вида
Сделаю.


>Для каждого требования мы придумываем свой способ проверки. Создание аккаунта на сервере можно проверить, попробовав залогиниться в него. Токен можно проверить, попробовав вызвать защищенное API, например "получить сведения о себе".
>Создание аккаунта на сервере можно проверить, попробовав залогиниться в него.
>Токен можно проверить, попробовав вызвать защищенное API, например "получить сведения о себе".
Почему? Разве не достаточно проверить что запись добавилась в базу? Разве не залогинивание не должно проверяться в своём собственном тесте?
А токен не достаточно проверить просто дешифровав его (как раз метод и называется verify(token))?


>Так как ты тестируешь код, использующий БД, тебе надо предусмотреть, чтобы база была перед тестом в каком-то определенном состоянии (полностью пустая, например, или с какими-то тестовыми данными). Один из вариантов - в самом начале почистить БД/загрузить дамп, а каждый тест обернуть в транзакцию, которая откатывается. Это может быть быстрее, чем загружать дамп каждый раз.
В данный момент для каждого теста БД должна быть в чистом состоянии и после каждого теста база очищается это можно улучшить добавив перед каждым тестом очистку (методо beforeEach()).

>На практике, может быть полезно разместить тестовую БД на ramfs, чтобы избежать вообще обращений к диску и ускорить прогон тестов.
Тяжело понять. Я с таким не сталкивался. Вижу что это как бы "эмулирует" жесткий диск в оперативной памяти. Как для этого настроить psql? Как нужно будет для это настраивать найстройки соеденения к БД в Ноде? Слишком много вопросов для такой маленькой задачи. Возможно позже, с ростом приложения это будет актуально. Если что взял этот подход на вооружение и вернусь к нему, когда тесты будут делаться медленно.


>Можно также попробовать добавить тест для обработчика ошибок (вызвать специальный URL, который выбрасывает исключение). Иначе ты можешь его отключить/сломать и не заметить.
Сделаю.

>> Is there any way to declare all classes at once for a webpack output file?
>
>Я думаю, это не имеет отношения к webpack, так как ты должен в sequelize передать список классов. А для этого их надо импортировать. И вебпак увидит импорты.
В sequlize-typescript можно указать директорию с моделями, но webpack транспилирует всё в один файл, и это ломается.

https://www.npmjs.com/package/sequelize-typescript#configuration
https://github.com/someApprentice/Crypter/issues/7


>По клиентской стороне:
>
>Ты в API при логине ставишь куки вручную, но разве это правильно? По идее, это должно работать так:
Ставлю куки вручную в клиентской стороне? Нет, у меня такого нет. В клиентской стороне куки только берутся из реквеста, чтобы пререндерить страницу с залогиненым пользователем или нет. Для этого они и нужны. localStorage ставиться в ручную(?) в клиентской стороне при залогинивании https://github.com/someApprentice/Crypter/blob/master/src/app/auth/login/login.component.ts#L48-L51 . Не могли бы вы уточнить строку где я это делаю, я не могу понять последующие описание проблемы.


>https://github.com/someApprentice/Crypter/blob/master/src/app/app.component.html
>
>Тут мне не кажется 100% надежной проверка залогиненности. Тут же нет проверки, что это валидный токен.
Так это же отображение. Если что-то не так, то при запросе к API выдастся соответствующая ошибка. Вряд ли, пользователь сможет что-то сломать не лазия в хранилище.


>И еще, я не очень понял, как будет работать форма регистрации в режиме серверного рендеринга. Как и куда она будет отправлять свои данные?
>
>> let route = this.router.config.find(r => r.path === redirect);
>> route.data['email'] = email;
Имеете ввиду версию страницы работающей с отключенным JS? Я решил отказаться от этой идеи. Она бесполезная, по крайней мере для части чата, потому что сообщения будут шифроваться на стороне клиента. Может быть позже можно что-то с этим придумать, но пока этого не будет. Я считаю, что это вопрос доверия пользователя, оно есть в каких-то границах, и эти границы могут как и широки так и малы, т.е. я пытаюсь сказать что зависит от пользователя и его доверия. Я думаю, что для приложения с открытом кодом можно даже задуматься и о вайтлисте js.

>А это передает email только один раз, или ты этот email навсегда в конфиг роутинга вписал? По моем, не очень красиво получается. Разве нельзя передавать email внутри route parameters: https://angular.io/guide/router#route-parameters
>
>Тогда можно сделать так: router.navigate(['/register', { email: email }])
>
>Причем, я бы хранил email не в path, а в query: /register?email=xyz@example.com
Можно, но мне наоборот кажется это не очень красивым, когда в URL что-то появляется. Хочу чтобы было так.
Этот email удаляется из роутинга после уничтожения связанного компонента:

https://github.com/someApprentice/Crypter/blob/master/src/app/auth/login/login.component.ts#L63-L68


>> Позволяет ли Bearer token защититься от XSRF?
>> Приходит ли вам на ум какая-нибудь слабая точка которую можно эксплуатировать?
>
>Да. У тебя используются куки, и в них тоже есть токен. Предположим, у нас есть HTML версия, работающая без ангулара. Не получится ли, что злоумышленник сделает форму, которая будет имитировать отправку запроса этой HTML версией, и возникнет XSRF?
Как я говорил ранее, я принял решение отказаться от версии без ангуляра, что значит что не будет такого обработчика запроса, который будет работать с куками повторюсь в очередной раз, что они нужны только для условий в отоброжении (токен наверно и удалить из кук)


>> Достаточно ли это строгая проверка на то является ли сущность экземпляром объекта localStorage?
>
>Проверка достаточная, но непонятен ее смысл. Тест по идее должен проверять, что данные сохраняются и загружаются, а не какой именно класс там испольуется для хранения.
Проверить... что, например, вот для серверной части есть проверка, что вернулся StorageWrapper и всё работает, а для браузерной тоже аналогично. Это не нужно?
someApprentice 2019/03/17 14:56:40  №1366104 340
>>1361815
>> Следующий шаг написания сервиса сообщений.
>
>> Он будет реализован с помощь протокола WAMP и на платформе от https://crossbar.io/ , которая написана на Питоне, и для которой для аутентификации клиентов нужно тоже написать код на нём.
>
>А чем Node не годится, кстати? Или ты решил изучить Питон и микросервисы? Ок, но на практике такой маленький проект может быть невыгодно разбивать на микросервисы - у них ведь есть и накладные расходы.
У роутеров WAMP'а на Node, нету возможностей для аутентифекации и авторизации соединения, и документации. Вышеупомянутая платформа развита лучше других.


>> Поэтому я сейчас буду изучать его, и возможно у меня появиться небольшие вопросы по нему. Могу я задать их в этом треде?
>
>> Заодно и реактивное программирование подучу.
>
>Конечно. Только пиши тогда, что именно ты добавил в проект и на что стоит посмотреть, а то он большой и с ходу это будет не очевидно.
Хорошо, я буду всё подробно описывать.


>Я пока все не успел проверить, увы, давай сначала с тем, что я написал, разберемся, а потом остальное глянем.
Хорошо, спасибо большое! Я не успеваю ответить в тот же день. Не понимаю почему - занимаюсь каждый день, и всё больше и больше нужно изучить. Я так хочу просто писать код. Я никогда не знал что разработка на JS может быть такой сложной, и приложений вообще.
Я ещё серьёзно задумываюсь о приложениях для устройств, а там либо медленный и кривой JS, либо изучать Java/Swift.

Я так хочу хотя бы браузернное приложение к лету закончить, а приложения к осени.


Спасибо большое, у меня нет слов как мне всё это важно.
Аноним 2019/03/17 18:56:54  №1366247 341
Привет ананасы. Как-то давно начинал делать тестхаб на симфони, потом забил и сейчас опять решил, но уже на ларавель. Я уже даже немного смирился с евойной орм, пока решил не инсертить данные в таблицу. Тут просто ужасно всё, из-за архитектуры орм нельзя как в доктрине без записи в бд привязать определенные вопросы к тесту например, есть метод saveMany, думаешь что он может заинсертить всё одним запросом? он в цикле просто вызывает свой же save() метод, в итоге получается что на каждый объект идет запрос к бд, если у меня 50 вопросов и у каждого по 4 ответа то это получается 200 запросов к базе просто для сохранения. Помню в доктрине можно было банально через сеттер сначала сохранить всё как ты хочешь, а если еще и cascade: persist стоит то вообще можно не напрягаться. Читал что как вариант можно использовать DB::insert( array ), вручную расставлять внешние ключи и вот это всё. А вот та же валидация реквеста намного больше понравилась чем формы в симфони
Ответы: >>1366399 >>1366408 >>1366730
Аноним 2019/03/17 20:48:58  №1366308 342
>>1365937
Чекай
json_last_error,
невидимые символы,
кодировка без BOM
Аноним 2019/03/18 07:16:34  №1366399 343
>>1366247
>валидация реквеста намного больше понравилась чем формы в симфони
Тебе никто не запрещает запилить аргумент ресолвер в симфе и тоже валидировать реквест.
Аноним 2019/03/18 07:36:26  №1366408 344
>>1366247
в чём проблема использовать лару с доктриной ?
Аноним 2019/03/18 07:37:37  №1366410 345
>>1366045
Вот инглиш ща взялся поттягивать. С пыхой на "ты", опыт работы и гитхаб имеется.

С пыхи вообще укатиться сложно? Насколько это будет плюсом при приеме на работу? Или меня джависты будут обоссывать?
Ответы: >>1366520 >>1366568
Аноним 2019/03/18 09:10:31  №1366427 346
>>1353705 (OP)
Вопросы по задаче про список студентов
1)Где нужно создавать базу данны=х? В командной строке(КС), в самом PHP или в PHPadmin?
Если использовать КС или админку, то как сохранять ... код на Git?
2) Так же не понял с, что делать с организацией доступа пользователей. Мне нужно через GRANT создать пользователя и или можно предоставить привилегированный доступ (root)? Я просто не понял, как люди проверяют работу через Git. Им же все равно нужно выгрузить весь код на свой компьютер и потом запустить у себя? Значит не нужно создавать пользователя или все таки нужно?
3) Зачем в этом задании использовать классы? Разве нельзя обойтись без них? Особенно не понял, зачем нужен "класс-помощник". Раз у него отсутствуют свойства, почему бы не использовать обычные функции?
Ответы: >>1366516 >>1366541 >>1366652
Аноним 2019/03/18 12:03:57  №1366516 347
>>1366427
4)Также вопрос про экранирование. В уроке про шаблоны говорилось, что "данные лучше форматировать не в php-скрипте, а в шаблоне. Причина тому в том, что форматов вывода данных может быть много, а php-скрипт, получающий данные из базы, как правило один общий". Да, вроде бы логично, но неужели не правильней будет дать базе данных уже экранированную строку, а не повторять эти действия вновь и вновь в шаблоне?
Ответы: >>1366652
Аноним 2019/03/18 12:06:27  №1366520 348
>>1366410
что в пхп не устраивает?
Ответы: >>1366559
Аноним 2019/03/18 12:43:59  №1366541 349
>>1366427
1) В mysql или какой-то другой БД. У mysql есть удобный интерфейс phpmyadmin, также можно работать через КС.

2) Короче говоря, ты ставишь регистрирующемуся студенту куки которые записываются в том числе в базу данных.
Потом каждого пользователя подключающегося к нашему приложению проверяем на наличие кук. Если они есть, проверяем их на сущестование в БД. При положительном результате производим нужные нам действия, например вывод ФИО данного студента.

3.) Так надо

мимо сам делаю эту задачу
Ответы: >>1366599
Аноним 2019/03/18 12:50:30  №1366549 350
Аноны, где у вас в wamp лежит ваш проект? Просто по стандарту в апач/htdocs и дальше там внутри сам проект, а базу создаёте отдельно где-то на с:/data/db допустим?
Ответы: >>1367259
Аноним 2019/03/18 12:57:59  №1366559 351
>>1366520
1. Хочу больше денех;
2. Хочу глубоко изучать язык, жить этим, хотелось бы выбрать что-то более серьезное, на что не жалко тратить жизнь.
Ответы: >>1366706
Аноним 2019/03/18 13:07:27  №1366568 352
>>1366410
>Насколько это будет плюсом при приеме на работу? Или меня джависты будут обоссывать?
Ты идёшь на ждуна, но ты с опытом чувак, это большой плюс!
Аноним 2019/03/18 13:34:18  №1366599 353
>>1366541
1)Ну про mysql понятно. А как мне создать БД, чтобы записать код в Git?
2)Тоже не то. Есть команда GRANT, управляет доступом БД. Когда я читал, про эту команду, говорилось, что лучше создать через эту команду пользователя(одного), чтобы не входить в БД через root. Вот я и спрашиваю, а оно надо? Как это будет работать, если код будет запущен на другом компе?
3)Ну тут можно было бы сказать, что это сделано для удобства. Но создавать массив объектов Student не затратно по памяти?
Ответы: >>1366602 >>1366610
Аноним 2019/03/18 13:36:08  №1366602 354
>>1366599
>А как мне создать БД, чтобы записать код в Git?
Гугли про миграции и фикстуры.
Аноним 2019/03/18 13:47:00  №1366610 355
>>1366599
>1)Ну про mysql понятно. А как мне создать БД, чтобы записать код в Git?
Может сделать дамп базы (только структура, без данных студентов), например students_list.sql и добавить его в репозиторий? Учитель кажется писал об этом в конце задания.

2.) Понял тебя, довольно интересный вопрос. Я работаю со своей БД через root и даже не задумывался об этом, будем ждать что скажет ОП или другие опытные ребята.

3.) Нужно посмотреть как делают в фреймворках и сделать выводы.
Аноним 2019/03/18 14:51:11  №1366652 356
>>1366427

Ты можешь создавать у себя БД любым способом, но я бы советовал попробовать описать структуру руками в формате SQL (CREATE TABLE ...). Это поможет тебе вспомнить этот язык. Затем сделай дамп БД в формате .sql и положи в репозиторий, чтобы другие люди могли бы себе развернуть этот дамп. Не включай в дамп команды создания самой БД или пользователя, только команды создания таблиц и вставки данных. Так как у людей могут быть другие названия БД и имя пользователя.

Пользователя люди создадут сами, просто опиши в README, в какой файл надо прописать параметры соединения с БД и где лежит дамп.

Классы можно и не использовать, но я думал, с ними будет удобнее. Ты можешь попробовать сделать и без классов.

>>1366516

С экранированной строкой неудобно работать. Допустим, тебе надо проверить длину строки. Тебе придется ее разэкранировать для этого. То же самое, если ты захочешь ее сдампить в файл или отдать через API - придется сначала разэкранировать, чтобы восстановить исходные данные.

А это создает сложности. Где должны экранироваться пришедшие от пользователя данные - в контроллере или в коде сохранения в БД? Функция валидации данных пользователя - что она принимает на вход, экранированные или неэкранированные данные? Функция, ищущая пользователя по id - в каком виде она вернет результат? Тебе надо по всему коду как-то расставлять комментарии, и тщательно проверять, что везде данные правильно преобразуются. Если где-то программист ошибся, то программа будет либо корежить данные, либо в ней появится уязвимость XSS.

Вторая проблема - если мы посмотрим на шаблон, то там нет команд экранирования. Как понять, что тут нет уязвимости? Изучать весь код и все пути, по которым могут передаваться данные? А если завтра новый разработчик добавит новый код, и забудет там поставить экранирование? Глядя на шаблон, мы это не увидим.

Хотя, эти проблемы мы могли бы решить с помощью ООП. Мы бы могли сделать объект SafeString, и у него несколько методов: getRaw(), getHtmlEscaped(), итд, возвращающих данные в нужном формате (и несколько статических конструкторов, позволяющий создать объект из обычной или экранированной строки). Это защитило бы нас от ошибок, так как мы сразу бы видели, какие данные получаются. Но это получается усложнение кода.
Аноним 2019/03/18 16:53:29  №1366706 357
>>1366559
плиз ответь на вопрос,
т.к я обычный вкатывальщик, меня интересует 1 вопрос, твои ожидания по увеличению зп с переходом пхп на яву, на сколько %.
Ответы: >>1366719
Аноним 2019/03/18 17:17:59  №1366719 358
>>1366706
По первой может и меньше быть, но в ближайшей перспективе год-два хотябы в 2-3 раза
Аноним 2019/03/18 17:33:00  №1366730 359
>>1366247

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

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

В твоем варианте, вместо ручной расстановки startTranscation/commit лучше использовать готовый метод: https://laravel.com/docs/5.8/database#database-transactions

Также, ты зря делаешь получение и валидацию внутри транзакции. По моему, лучше сначала подготовить граф объектов (а в идеале еще и валидировать), а только потом внутри транзакции выполнить сохранение в БД.

В твоем коде, тут 'body' => $question['body'] нет проверки, что $question это массив и там есть такой элемент. Не лучше ли использовать получение элемента по пути, как описано тут: https://laravel.com/docs/5.8/requests#retrieving-input или сделать проверку на наличие ключей?

> Помню в доктрине можно было банально через сеттер сначала сохранить всё как ты хочешь, а если еще и cascade: persist стоит то вообще можно не напрягаться

persist() ничего не сохраняет. Она лишь передает сущность под управление Доктрины. Сохранение происходит по flush(): Доктрина сравнивает данные в управляемых сущностях с теми, что были загружены из БД, и формирует запросы INSERT/UPDATE/DELETE, выполняя их в одной транзакции.

Вообще, я бы тебе советовал детально изучить ORM в Laravel, и в коде немного поковыряться, чтобы ты мог сравнивать Доктрину vs Eloquent и видеть плюсы/минусы.
Ответы: >>1366855
Аноним 2019/03/18 17:34:08  №1366731 360
>>1366102

А напомни пожалуйста, зачем ты решил делать server-side rendering, если ты все равно поддерживаешь только браузеры с JS? Для изучения SSR?

Просто обычно SSR используется либо для поддержки поисковых ботов, либо для пользователей без JS или для создания "облегченной" версии. У тебя же ситуация усложняется тем, что ты пытаешься на сервере имитировать localStorage. Если бы у тебя был сайт вроде инстаграма или твиттера, то там можно было бы сделать SSR для поисковиков, и не было бы никаких сложностей. А для страниц с авторизацией делать SSR чуть сложнее.

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

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

Да, комментарии нужны там, где назначение модуля не очевидно.

> https://github.com/someApprentice/Crypter/issues/1

Тут я кстати обратил внимание, что у тебя в стектрейсе обфусцированные имена функций. Лучше было бы в dev использовать неминифицированные файлы, с исходными названиями функций, а то сложно разбираться в функции с именем t._e(). Не знаю, где это настраивается, может быть, в angular.json (но я не уверен).

Вообще, по моему мнению, в dev удобнее не склеивать файлы, а подгружать динамически (через что-нибудь вроде require.js или загрузчик для модулей ES6). Тогда в dev tools и в стек трейсах ты видишь файлы с теми же именами, как в оригинале, а не огромный main.js. Но я, увы, не знаю, легко ли это сделать в твоем случае.

> У меня плохо с английским и написание комментариев утяжелит и замедлил разработку. Насколько важно их писать?

Там, где я работаю, проблему решили написанием комментариев на русском языке. А так, я думаю, что важно. Пока ты работаешь один, ты многое можешь держать в голове. Но что, если придет новый человек, и ему надо разобраться с кодом? Тут важно не количество комментариев, а насколько легко разобраться в проекте.

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

> Эта функция нужна, чтобы обработать асинхронный обработчик запросов, который Эксрпресс не поддерживает (пока что?).

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

> Как я уже писал, куки нужны только для условий отображений

По идее, эти данные на сервере проще получить из БД по токену авторизации. Значит, куки можно было бы не делать. То есть тут получается избыточность, как мне кажется.

>> Функции json() он не нужен, это для проверки, что объект соответствует интерфейсу User?
> Да, именно так. Это лишнее?

Нет, я просто хотел спросить, зачем так сделано.

> Почему нужно отдельную функцию валидации? Всё же и так в одну строчку делается. https://github.com/someApprentice/Crypter/blob/master/api/api.ts#L50

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

> Я скажу на чистоту мой взгляд на это - Я не понимаю зачем нужно выносить такие функции в отдельные. Это функция понятна любому разработчику и он с первого взгляда поймет что происходит в ней. Почему нужно делать обёртку ради человекопонятного названия функции?

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

> Я правда не понимаю, вот как эта функция будет выглядеть

function createToken(u: User): Promise<string> - наверно так?

> Всё исправлю. Здесь тоже в случае отсутствия нужно отдавать 404?

По идее, да, можно так, если ты хочешь следовать идеям из REST. Либо можно возвращать JSON с true/false, если не хочешь.

В идеологии REST (да и в стандартах HTTP что-то может быть), как я помню, URL соответствуют ресурсам, по типу:

/user/123 - пользователь 123
/book/some-book - какая-то книга

И ты можешь слать к этим ресурсам запросы GET/POST/PUT/DELETE. Такая схема очень хорошо работает с кешем - ты можешь просто использовать URL ресурса в качестве ключа кеша. У REST могут быть и минусы, например, может потребоваться делать много запросов для получения всех данных (хотя это зависит от того, как спроектировано API).

Потому не все используют REST. Например, у Ютуба в API для получения списка видео и одного видео используется один и тот же эндпойнт, просто с разными параметрами: https://developers.google.com/youtube/v3/docs/videos/list

> Результат валидации либо вбрасывает ошибку, либо возвращает null(?). Эта ошибка обрабатывается в обработчике ошибок

Там теряются подробности ошибки:

if (err instanceof ValidationError) {
return res.sendStatus(400);
}

Ну и довольно неочевидная штука, я бы не додумался лезть в обработчик ошибок смотреть код.
Ответы: >>1367597
Аноним 2019/03/18 17:36:18  №1366734 361
>>1366102

> Так вы имели ввиду комментраии для модулей API, а не фронтенд приложения?

Главное, чтобы в коде было проще разбираться.

> Я же тоже "возвожу" данные пользователя в токен и проверяю совпадает ли возвращённый ответ, а именно кукисы, с ним.

Ты в тесте просто скопировал код из серверного API. Если ты его неправильно написал, то ты мог сделать одинаковую ошибку и в серверном коде, и в тесте. Потому проверять работу функции нужно другим кодом, другим алгоритмом, а не тем же самым.

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

Да и это нелогично, получатель токена ведь не должен знать, как он устроен внутри. Ему достаточно того, что этот токен дает доступк API, а как он устроен - не его дело.

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

Тесты проверяют требования (ТЗ) для API. У тебя в требованиях (если их сформулировать и записать пиьменно) вряд ли сказано, что "функция регистрации возвращает токен JWT такой-то структуры, зашифрованный таким-то ключом". Она возвращает просто токен, неважно какой. Знание о том, как он устроен, должно быть сконцентрировано в модуле для генерации и проверки токена, а остальным знать это не важно. Потому я и советовал вынести функции генерации и проверки токена в отдельный модуль авторизации.

Принцип разделения ответственности здесь нарушается. Это легко видеть по тому, что код теста использует секрет, который нужен для генерации токена. Тесты ведь имитируют поведение пользователя API. А у него нет этого секрета.

> Ну да, теперь вижу причину. Нужно проверить что пришедший токен в дешифрованном виде равен данным пользователя?

Мне кажется, это будет плохая идея. Получатель токена не должен знать, как он устроен.

> Я забыл сделать проверку, что пользователь добавился в БД и данные правильные. Это достаточное условие? Залогинивание проверяется в предназначенном для неё тесте, и там как раз сначала заполняется запись в БД.

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

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

> Тяжело понять. Я с таким не сталкивался. Вижу что это как бы "эмулирует" жесткий диск в оперативной памяти. Как для этого настроить psql?

Я почитал тут:

- https://ru.wikipedia.org/wiki/Tmpfs
- http://www.k-max.name/linux/ramdisk-ramfs-tmpfs-in-linux/

Лучше использовать tmpfs. По идее, ты создаешь диск и монтируешь его в папку одной командой (могут понадобиться права рута, но можно прописать этот диск в /etc/fstab с опцией монтирования пользователем). tmpfs не тратит память, если на виртуальном диске нет данных, более того, она по моему не создает структуру каталогов и служебные области, а как-то хранит файлы напрямую в памяти.

После этого ты как-то настраиваешь psql, чтобы данные для тестовой базы хранились бы в папке с tmpfs. Я не знаю, как это сделать, но гугление выдает статьи вроде такой https://www.manniwood.com/postgresql_94_in_ram которая описывает создание отдельного инстанса Postgres с данными в tmpfs.

> В sequlize-typescript можно указать директорию с моделями, но webpack транспилирует всё в один файл, и это ломается.

Можно придумать какой-то костыль, например, читать список файлов и создавать файл "models.js", импортирующий все эти модели. Пока моделей мало, проще просто вручную перечислить.

> Я считаю, что это вопрос доверия пользователя, оно есть в каких-то границах, и эти границы могут как и широки так и малы, т.е. я пытаюсь сказать что зависит от пользователя и его доверия. Я думаю, что для приложения с открытом кодом можно даже задуматься и о вайтлисте js.

Проблему можно решить, выложив клиентский код в открытый доступ и собрав из него electron-приложение. Если мы сами собрали его из проверенных исходников, то никто не сможет подменить код клиента.

> Можно, но мне наоборот кажется это не очень красивым, когда в URL что-то появляется. Хочу чтобы было так.

Так это не сохраняет состояние. Если мы обновим страницу, или используем навигацию в браузере (вперед/назад), то email потеряется. Потому аргументы и хранят в URL.

Тут тогда логичнее было просто сделать единую страницу регистрации/логина на одном роуте с двумя формами и скрывать одну из них. А email хранить в обычной переменной. И не понадобятся такие явно ненадежные костыли.

> Проверить... что, например, вот для серверной части есть проверка, что вернулся StorageWrapper и всё работает, а для браузерной тоже аналогично. Это не нужно?

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

> У роутеров WAMP'а на Node, нету возможностей для аутентифекации и авторизации соединения, и документации. Вышеупомянутая платформа развита лучше других.

Да, но это можно добавить. А в случае с Питоном, ты не сможешь вызывать функции из приложения Node, тебе придется возможно дублировать их, или настраивать взаимодействие. Я не против такого варианта, но готовься к сложностям. И надо правильно спроектировать взаимодействие между питоновским и нодовским приложениями. Это уже почти микросервисы получаются со всеми их плюсами и минусами.
Ответы: >>1367598
Аноним 2019/03/18 20:10:49  №1366798 362
reg.png (12, 439x506)
506x439
Сап двощь, как сделать так чтобы между словами всегда оставался один символ замены, в данном случае | ? Ищу пробелы или % и хочу их поменять на один пробел, чтобы потом удобно было разбить массив по этому пробелу, в регулярках не силен
Ответы: >>1366861
Аноним 2019/03/18 21:55:17  №1366855 363
Untitled.png (66, 606x576)
576x606
>>1366730
Привет ОП. В ларавеле я пока не особо хорошо разбираюсь, складывается ощущение что всё почти идеально пока у тебя какая-то типичная веб-задача, немного навязывается стиль написания кода, но мне как бы и норм, пока что хз какие бест практис и можно доверять фреймворку. Готовый метод транзакции кстати делает абсолютно тоже самое что и у меня, только через анонимную функцию. Не раз замечаю что на одну функцию может идти несколько алиасов, просто чтобы было чуть более интуитивно. А граф объектов у меня уже провалидирован, на том скрине не видно, но это не обычный Request, а ларкин FormRequest, обёртка, которая при создании валидирует входные данные на правила, как на скрине, и если валидация фейлится то в контроллер даже не пускает. Я её еще не доделал правда.
Я сделал объект Attempt, который представляет собой попытку прохождения теста, у него может быть два глобальных состояния, в процессе прохождения и завершен. Так вот я пока что не уверен что делать, когда клиент пытается завершить прохождение теста, но при этом присылает неправильные данные, например входной массив будет иметь вид [ключ_вопроса => ключ_варианта_ответа], клиент присылает свои варианты, но оказывается что указанный вопрос не имеет такого ответа, он относится или к другому вопросу, или его вообще не существует, айди ответа какой-то левый. Мне в таких случаях отправлять обратно что-то в стиле "Вы там у себя разберитесь, а потом перезвоните" и на этом всё или сразу завершать прохождение, помечать как зафейленное, при счете баллов можно например просто притвориться что пользователь банально не ответил на вопрос? То же относится и к отношению Тест -> вопросы в принципе.
Ответы: >>1367259
Аноним 2019/03/18 22:09:54  №1366861 364
>>1366798
Покажи для начала, что ты уже сделал. Потому что твой скрин говорит о том, что ты ленивая хуйлуша.
Ответы: >>1366870
Аноним 2019/03/18 23:11:55  №1366870 365
reg.png (18, 517x499)
499x517
>>1366861
Мне после твоих слов прям обидно стало и я разобрался без понятия как это работает
Аноним 2019/03/19 00:10:46  №1366879 366
Аноны, решаю задачу про проверку телефонов из учебника. Объясните мне пжалста, почему номера со скобками с пробелами рядом (вроде 8 (800) ...) определяются как неправильные? При этом просто с пробелами (8 8 00..) или со скобками (8(800)...) или даже со скобками и пробелами но не рядом (8 8(0)0 ...) - все нормально?

https://ideone.com/2ro2xS
Ответы: >>1367259
Аноним 2019/03/19 18:59:23  №1367239 367
>>1353705 (OP)
Антоны, мне нужно написать веб-морду для управления кое-каким сервисом. Основная функциональность - это внесение правок в конфиги, которые лежат на сервере, перезапуск этого сервиса ну и снятие парочки метрик с него.
Сейчас это делают написанные мной скрипты на баше, но хочу чего-то более юзер-френдли для других юзеров.
Ну и с авторизацией и разграничением прав, конечно (почти наверняка это будет в виде ldap учеток)

С программизмом я никак не связан, писал только скрипты на баше. Питон не знаю, да. Посоветуйте какую-нибудь книжку (а лучше видеокурс), чтобы быстро вкатиться в какой-нибудь простой пэхапэ-фреймворк. Думаю, что идеально было бы, если б учили сразу пилить какую-нибудь веб-морду/cms.
Ответы: >>1367648 >>1367655 >>1367662
247-340 Аноним 2019/03/19 19:28:49  №1367259 368
247-340

>>1366549

На линуксе обычно проекты кладут в /var/www/название. На windows - можно сделать отдельную папку на каком-нибудь диске. Например, c:\projects\. В apache/htdocs обычно лежит тестовая страница самого апача.

>>1366879

Если посмотреть на твою регулярку, то она написана примерно так:

- сначала идет 8
- затем 1 или больше скобок
- затем 1 или больше пробелов
- затем цифра

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

Чтобы написать "любой символ из указанных", можно использовать квадратные скобки, а потом добавить к ним звездочку.

>>1366855

> Так вот я пока что не уверен что делать, когда клиент пытается завершить прохождение теста, но при этом присылает неправильные данные, например входной массив будет иметь вид [ключ_вопроса => ключ_варианта_ответа], клиент присылает свои варианты, но оказывается что указанный вопрос не имеет такого ответа, он относится или к другому вопросу, или его вообще не существует,

Проще всего приравнять это к отсутствию ответа (отстутствию ключа в массиве). Можно еще в лог варнинг писать, вдруг это фронтенд-специалист накосячил и не те данные шлет.
Ответы: >>1373952
Аноним 2019/03/19 19:29:36  №1367261 369
>>1363045

Вообще, проще наверно было бы совместить Constraint и ConstraintValidator. Не очень понятно, зачем делать 2 отдельных класса. В Симфони одна из причин - это использование аннотаций, Constraint это аннотация, потому оно сделано отдельным классом. В более простой системе разделять здесь код на 2 класса может быть, нет необходимости.

Код в классе Constraint в конструкторе немного усложнен. Не очень понятно, зачем присваивать свойствам значения из массива, если значения по умолчанию можно просто прописать при объявлении свойства.

> Кстати про симфони, в объектах-наследниках Constraint открытые публичные свойства. Получается бывают ситуации, когда инкапсуляцией можно пренебречь?

Там скорее всего аннотации, которые никто руками не создает, а которые создаются при разборе кода. А так, иногда делают объекты из одних публичных свойств. Видимо, решили, что инкапсуляция там не требуется.

>>1363410

Наверно можно переименовать.

> Что если в find() передавать не кучу параметров, а объект с параметрами класса SearchOptions?

Вполне хорошая идея. Я думаю, что этот объект может пригодиться и в других местах, например, при генерации ссылок для пагинации.

>>1364961

Я не знаю, есть ли там DDD или нет, но есть Magento - это e-commerce проект.
Аноним 2019/03/19 19:30:07  №1367263 370
>>1363656

У тебя в регулярке написано [0-9]{10}, а это значит "10 идущих подряд цифр", без каких-то символов между ними.

> Как я понял, то, что внутри (этих) скобок считается отдельным блоком, куда можно накидать кучу параметров, написанных [тут].

Квадратные скобки [abc] - обозначают "ровно один любой символ из набора a, b или c"

Круглые скобки () используются для группировки, и позволяют применять квантификаторы ко всей группе. Сравни: abc+ - здесь плюс применяется только к букве c и регулярка ищет строки abc, abccc, abcccc. a(bc)+ - здесь плюс применяется к группе (bc) и регулярка ищет строки abc, abcbc, abcbcbcbc.

>>1363352

Да. Ты разбиваешь данные на N блоков, а затем просто запускаешь несколько PHP скриптов параллельно, передавая им границы диапазоны. Ну например:

php script.php 1 199 &
php script.php 200 399 &
php script.php 400 1000 &
wait

Здесь & - это синтаксис линуксовой оболочки bash, который запускает команду в фоновом режиме. А команда wait ждет завершения всех фоновых программ.

Но здесь может быть проблема. Если ты используешь транзакции (а их стоит использовать) , то они блокируют данные, с которыми работают, и если нескольким скриптам надо работать с одними и теми же данными, то может так получиться, что работать будет только один скрипт, а другие будут ждать освобождения блокировки.
Аноним 2019/03/19 19:30:31  №1367264 371
>>1363289

В случае докера, данные обычно не помещают внутрь образа. Докер часто используют только для того, чтобы засунуть программу + ее конфиг + зависимости (библиотеки) внутрь контейнера. То есть у тебя будет контейнер с nginx, с php-fpm, с mysql и docker-compose, чтобы их всех одновременно запускать. Но картинки и файлы таблиц базы данных не хранятся в этих контейнерах.

Более того, если у тебя есть dev сервер, тебе не требуется на нем держать все картинки с продакшена. Зачем? Пусть они на продакшене и лежат.

Обычно деплоят только код. Изменения в БД деплоят как миграции. Если у тебя докер, то наверно придется заморочиться со сборкой и выгрузкой образов, но если их содержимое не изменилось, то они будут быстро создаваться на основе закешированных данных.

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

Сине-зеленый деплой ( https://habr.com/ru/post/309832/ ) - это когда у тебя 2 папки для сайта. Сайт работает из первой папки, а деплой ты делаешь во вторую папку, и после завершения переключаешь настройку на веб-сервере, чтобы сайт отдавался теперь из второй папки. А следующий деплой делаешь в первую папку.

В случае с докерами и сине-зеленым деплоем, ты можешь сделать деплой кода в новую папку. Поднять там все докеры, используя другие номера портов (php-fpm, mysql). И затем переключить нгинкс на использование кода из новой папки. А старые докеры остановить.

Это дает бесшовные обновления без даунтайма. Если в момент переключения работали скрипты из старой папки, то они спокойно завершают свою работу используя старый код, а все новые запросы идут в новую папку.

Единственная проблема может быть с долгоживущими cli-скриптами (за время их жизни код в папке, из которой они запущены, мог обновиться), хотя на практике это маловероятно.
Аноним 2019/03/19 19:30:52  №1367265 372
>>1363131

Скорее всего ошибка при выборке данных, например в SQL запросе. Ты должен после каждой команды работы с mysqli проверять, что она не вернула null или false. Или же настроить выброс исключений при ошибке и тогда проверять не придется.

Также, почитай про шаблоны и про XSS:

- https://github.com/codedokode/pasta/blob/master/php/templates.md
- https://github.com/codedokode/pasta/blob/master/security/xss.md

>>1363056

[+7|8] значит "ровно один любой символ из набора: +, 7, | или 8"

>>1362965

Если ресурсов сервера хватает, то можно держать на одном сервере. Разносят, чтобы например можно было запустить несколько отдельных php-серверов, и они бы не отъедали CPU у базы данных.
Аноним 2019/03/19 19:55:14  №1367276 373
Свежее интервью с сore-разработчиком Yii - Александром Макаровым: https://youtu.be/uHHfnZDRHs8?t=109
Слушать всем, кто сомневается брать ли PHP сейчас, полезно послушать.
Ответы: >>1367290
Аноним 2019/03/19 20:19:12  №1367290 374
Аноним 2019/03/20 04:16:58  №1367370 375
Задача "Grammar Nazi"
$text = "Жырный тролль сдесь.зделал координально срач а модеры?смотрят но всем плевать";
$regexp = '/([.,;:!?](\\S))|жы|шы|координально|сдесь|зделал|([^,] (а|но) )/ui';
$match = [];
if (preg_match_all($regexp, $text, $match) > 0) {
\tforeach ($match[0] as $number => $mistake) {
\t\t$number++;
\t\techo "{$number}-я ашипка - {$mistake}\n";}}
выводит
1-я ашипка - Жы
2-я ашипка - сдесь
3-я ашипка - .з
4-я ашипка - координально
5-я ашипка - ч а
6-я ашипка - ?с
7-я ашипка - т но
Объясните мне, почему не видит слово "зделал"?
Аноним 2019/03/20 09:33:55  №1367463 376
В прошлый раз никого не нашел, репост. Нужен толковый чувак, веб-разработчик широкого профиля (фуллстак).

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

Языки программирования: PHP (на сервере 7.2), JS, HTML/CSS, SQL (на сервере MySQL или MariaDB).
Фреймворки: Yii, jQuery.
Технологии и инструменты: scss(sass), gulp, git, PHPStorm.
Нужен опыт работы над крупными yii-проектами (крупнее лаба10.пхп и сокращателя ссылок).

ЗП 40-50 в месяц (на руки). Если вы крутой и с ходу хотите больше (более-менее адекватно предложению) - говорите, сколько.

Задачи: доработка существующего продукта, который, по идее, написан неплохо (MVC, вся фигня), с нынешним разработчиком познакомлю, введем в курс дела.

dvachheadhunting@yandex.ru
Ответы: >>1367474 >>1367502
Аноним 2019/03/20 10:09:52  №1367474 377
>>1367463
без уи вобще никак? если симфоня есть например? если ванильное мвц есть например?
Ответы: >>1367478
Аноним 2019/03/20 10:26:20  №1367478 378
>>1367474
Вряд ли, проект уже имеющийся на yii написан, там куча строк кода, и его надо развивать, дорабатывать, фреймворк активно используется. Если ты сможешь быстро вкатиться в йиишные фичи (всякие там актив рекордс, актив форм, гридвью, контроль доступа, миграции) - то в принципе вариант.
Аноним 2019/03/20 11:43:43  №1367502 379
>>1367463
Начинаю джун на подсосе случайно не нужен?
Ответы: >>1367503 >>1367536
Аноним 2019/03/20 11:44:02  №1367503 380
Аноним 2019/03/20 12:36:52  №1367536 381
>>1367502
Возможно будет нужен через пару месяцев, пока ищу основного разраба в проект.
Аноним 2019/03/20 14:23:05  №1367587 382
Аноны, почему, черт возьми, этот код на идеоне не запускается?!!! https://ideone.com/Nl5UmE
Я, блядь, полночи бился, выискивая ошибку в каждой букве, только чтобы обнаружить, что на phptester.net или на runphponline.com он прекрасно работает! Какого хрена?! Ну и проверьте, что ли, как я вообще решил эту задачу про палиндромы. Нормальный код?
Ответы: >>1367599
someApprentice 2019/03/20 14:41:30  №1367597 383
download.png (113, 1920x1051)
1051x1920
>>1366731
>А напомни пожалуйста, зачем ты решил делать server-side rendering, если ты все равно поддерживаешь только браузеры с JS? Для изучения SSR?
>
>Просто обычно SSR используется либо для поддержки поисковых ботов, либо для пользователей без JS или для создания "облегченной" версии. У тебя же ситуация усложняется тем, что ты пытаешься на сервере имитировать localStorage. Если бы у тебя был сайт вроде инстаграма или твиттера, то там можно было бы сделать SSR для поисковиков, и не было бы никаких сложностей. А для страниц с авторизацией делать SSR чуть сложнее.
>
>То есть, я хочу понять, зачем и как используется SSR и что в этом случае можно сделать с хранилищем для сервера. Идея передавать кучу данных в куках мне не особо нравится.

>А напомни пожалуйста, зачем ты решил делать server-side rendering, если ты все равно поддерживаешь только браузеры с JS? Для изучения SSR?
Для ускорения загрузки приложения. И для поддержки поисковых ботов, конечно.

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


>> https://github.com/someApprentice/Crypter/issues/1
>
>Тут я кстати обратил внимание, что у тебя в стектрейсе обфусцированные имена функций. Лучше было бы в dev использовать неминифицированные файлы, с исходными названиями функций, а то сложно разбираться в функции с именем t._e(). Не знаю, где это настраивается, может быть, в angular.json (но я не уверен).
>
>Вообще, по моему мнению, в dev удобнее не склеивать файлы, а подгружать динамически (через что-нибудь вроде require.js или загрузчик для модулей ES6). Тогда в dev tools и в стек трейсах ты видишь файлы с теми же именами, как в оригинале, а не огромный main.js. Но я, увы, не знаю, легко ли это сделать в твоем случае.
У меня сейчас получилось сгенерировать не минифицированные файлы, убрав просто флаг --prod из команды сборки ng build --prod && ng run Crypter:server && webpack --config webpack.server.config.js

Добавил новый стактрейс: https://github.com/someApprentice/Crypter/issues/1#issuecomment-474728547

>Тогда в dev tools и в стек трейсах ты видишь файлы с теми же именами, как в оригинале, а не огромный main.js.
Разве и так в dev tools нельзя посмотреть все файлы даже после компиляции webpack'ом?pic-1


>> У меня плохо с английским и написание комментариев утяжелит и замедлил разработку. Насколько важно их писать?
>
>Там, где я работаю, проблему решили написанием комментариев на русском языке. А так, я думаю, что важно. Пока ты работаешь один, ты многое можешь держать в голове. Но что, если придет новый человек, и ему надо разобраться с кодом? Тут важно не количество комментариев, а насколько легко разобраться в проекте.
>
>У тебя в README даже не описана общая архитектура, как все связано. Я не очень хорошо знаком со всеми этими компиляторами и средствами сборки, и я путаюсь от того, что там в корне лежит куча разных конфигов. Если бы в README было описано, как происходит процесс сборки и какой конфиг за что отвечает, думаю, было бы понятнее.
Если честно, я сам путаюсь от такого количества конфигов, и я сам первый раз сталкиваюсь с этими всеми компиляторами и средствами сборки. Это бесконечная яма если я буду и это ещё изучать во всех тонкостях. Мне нужно изучить Python, мне нужно изучить crossbar.io (сегодня собираюсь писать действительный код), мне нужно изучить реактивное программирование, мне нужно написать само приложение, и на каждом шажке всплывает ещё 1000 подводных камней, которые нужно изучать. Я так никогда не закончу эту приложение.

Простите, что противлюсь вашим наставлениям - я исправлю это после всего... А пока, всё что нужно знать о сборке, тому кто хочет протестировать приложение, нужно всего лишь набрать npm run build.

Комментарии в коде для обёртки я обязательно добавлю.


>> Эта функция нужна, чтобы обработать асинхронный обработчик запросов, который Эксрпресс не поддерживает (пока что?).
>
>Я имею в виду, что когда смотришь на код, абсолютно непонятно, зачем эта функция и что за магию она делает. Я не знал, поддерживает ли express возврат промисов из обработчиков (теперь знаю, что нет). А если бы там был комментарий - было бы понятнее. Ну и мне кажется, функцию, которая адаптирует асинх. функцию к использованию в express вполне можно называть адаптером.
Хорошо, я переменную функцию и добавлю к ней более вразумительный комментарий.


>> Как я уже писал, куки нужны только для условий отображений
>
>По идее, эти данные на сервере проще получить из БД по токену авторизации. Значит, куки можно было бы не делать. То есть тут получается избыточность, как мне кажется.
Да, можно написать и серверный код в Angular-приложении за счет проверки на isPlatformServer(), но для этого нужно будет... хм, внутри этой проверки делать отдельные импорты библиотек (sequelize, dotenv, весь серверный код) чтобы они не тянулись в браузерной части. Мне не нравится этот стиль написания кода, так ещё не понятней будет, и к тому же нужно будет писать другую абстракцию - ничего от этого не выигрывается и только теряется время на написание дополнительных комментариев, увеличения кода, роста количества файлов, и что значит сложности в изучении проекта.

Я вижу вашу мысль об избыточности и понимаю, что это связанно с тем что есть и localStorage и кукисы, но почему бы и нет? Это нормально использовать и кукисы и localStorage. Что мешает этому? Это же машинное хранилище, и им нужно пользоваться.
Можно посмотреть на это так - сервер рендерит страницу с помощью кук, а js приложение подхватывает полученную страницу и уже работает с localStorage. То с чем и должен работать js, не получая доступ к кукам. Разве это не плохо что js имеет доступ к кукам?


>> Почему нужно отдельную функцию валидации? Всё же и так в одну строчку делается. https://github.com/someApprentice/Crypter/blob/master/api/api.ts#L50
>
>Пока это не требуется, но если ты захочешь сделать проверку уникальности или другую проверку, требующую обращения к БД или сервисам, то из модели ты не сможешь это сделать, так как у нее нет ссылок на эти сервисы. И тебе понадобится внешняя функция валидации.
А, хорошо. Конечно, для таких случаев я бы написал сервис валидации.

>Чтобы избежать дублирования кода. Чтобы не надо было в нескольких местах править одинаковый код. Ну и чтобы не писать код длинной портянкой, а разделять на отдельные части.
В данный момент тогда лучше сделать сервис с методом .login(...), потому что, пока что, код дублируется в двух местах и нужен как раз для залогинивания. Думаю, всё таки нужно написать сервис Authorizer.


>> Я правда не понимаю, вот как эта функция будет выглядеть
>
>function createToken(u: User): Promise<string> - наверно так?
Я выше написал, что для этой функции нужно передать коллбэк и в итоге получится тоже самое, либо нужно делать отдельную функцию для каждого случая createTokenForLogin(u: User) Promise<string>, createTokenForSomething(smth: any) Promise<string>... Может правда лучше разбить сам код на функции, и там пользоваться функцией создания токена как есть?


>> Результат валидации либо вбрасывает ошибку, либо возвращает null(?). Эта ошибка обрабатывается в обработчике ошибок
>
>Там теряются подробности ошибки:
>
>if (err instanceof ValidationError) {
>return res.sendStatus(400);
>}
>
>Ну и довольно неочевидная штука, я бы не додумался лезть в обработчик ошибок смотреть код.
А как иначе нужно делать? Делать блоки try/catch каждый раз и каждый раз повторять один и тот же код? Разве в PHP на Slim'е не была такая логика обработки ошибки?
someApprentice 2019/03/20 14:41:54  №1367598 384
>>1366734
>> Я же тоже "возвожу" данные пользователя в токен и проверяю совпадает ли возвращённый ответ, а именно кукисы, с ним.
>
>Ты в тесте просто скопировал код из серверного API. Если ты его неправильно написал, то ты мог сделать одинаковую ошибку и в серверном коде, и в тесте. Потому проверять работу функции нужно другим кодом, другим алгоритмом, а не тем же самым.
>
>Плюс, второй недостаток теста - ты в нем используешь знание о том, как устроена функция регистрации, как она генерирует токен. Если в алгоритме генерации токена что-то поменяется, тебе придется преределывать тест.
>
>Да и это нелогично, получатель токена ведь не должен знать, как он устроен внутри. Ему достаточно того, что этот токен дает доступк API, а как он устроен - не его дело.
>
>В твоем случае, если ты вызываешь API регистрации, логичнее всего проверить, что полученный токен можно использовать для доступа к защищенному API. Или хотя бы вызвать функцию проверки токена.
>
>Тесты проверяют требования (ТЗ) для API. У тебя в требованиях (если их сформулировать и записать пиьменно) вряд ли сказано, что "функция регистрации возвращает токен JWT такой-то структуры, зашифрованный таким-то ключом". Она возвращает просто токен, неважно какой. Знание о том, как он устроен, должно быть сконцентрировано в модуле для генерации и проверки токена, а остальным знать это не важно. Потому я и советовал вынести функции генерации и проверки токена в отдельный модуль авторизации.
>
>Принцип разделения ответственности здесь нарушается. Это легко видеть по тому, что код теста использует секрет, который нужен для генерации токена. Тесты ведь имитируют поведение пользователя API. А у него нет этого секрета.

>Плюс, второй недостаток теста - ты в нем используешь знание о том, как устроена функция регистрации, как она генерирует токен. Если в алгоритме генерации токена что-то поменяется, тебе придется преределывать тест.
У меня в тесте с логином, я сначала добавляю пользователя в БД, а потом проверяю само залогиневание. То есть я здесь тоже использую знание о том как устроенна функция. А что если алгоритм сохранения пользователя тоже поменяется? Здесь тоже ошибка? Как тогда быть? Нужно писать какую-то абстракцию над БД во время тестов? Значит, нужно сначала вызвать функцию регистрации?

>Принцип разделения ответственности здесь нарушается. Это легко видеть по тому, что код теста использует секрет, который нужен для генерации токена. Тесты ведь имитируют поведение пользователя API. А у него нет этого секрета.
Мне тяжело понять лежащий глубокий смысл в таких принципах как SOLID. Я похоже нарушил один из его принципов. Напишу здесь чтобы не забыть - что мне нужно детальнее ознакомиться с примерами этих принципов чего я не делал.

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

Всё исправлю.

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


>> В sequlize-typescript можно указать директорию с моделями, но webpack транспилирует всё в один файл, и это ломается.
>
>Можно придумать какой-то костыль, например, читать список файлов и создавать файл "models.js", импортирующий все эти модели. Пока моделей мало, проще просто вручную перечислить.
Я плохо разбираюсь как настраивать webpack. В проблемах этой библиотеке, мне сказали, что нужно написать плагин для этого.
Буду пока вручную перечислять, хоть и знаю что это плохо.


>> Я считаю, что это вопрос доверия пользователя, оно есть в каких-то границах, и эти границы могут как и широки так и малы, т.е. я пытаюсь сказать что зависит от пользователя и его доверия. Я думаю, что для приложения с открытом кодом можно даже задуматься и о вайтлисте js.
>
>Проблему можно решить, выложив клиентский код в открытый доступ и собрав из него electron-приложение. Если мы сами собрали его из проверенных исходников, то никто не сможет подменить код клиента.
Вот именно. Код и так будет в открытом доступе. Только, к сожалению, не каждый пользователь сможет сделать это самостоятельно. Даже я думаю, что это не так просто, как вы говорите.

Что вы знаете о других инструментах созданий приложений? Я знаю о таком инструменте как React Native и нагуглить NativeScript, но учитывая свой печальный опыт с React'ом, я боюсь что с ним тоже будет не всё так гладко. Ну конечно же, это ни секрет что JS медленный.
Вы знаете что-нибудь об их этих инструментах и как легко с ними будет работать? После ваших слов, создаётся ощущение, что в случае с Electorn'ом это действительно будет достаточно склонировать репозитирий и собрать из него десктопное приложение - и мне интересно, будет ли здесь всё так же просто?


>> Можно, но мне наоборот кажется это не очень красивым, когда в URL что-то появляется. Хочу чтобы было так.
>
>Так это не сохраняет состояние. Если мы обновим страницу, или используем навигацию в браузере (вперед/назад), то email потеряется. Потому аргументы и хранят в URL.
>
>Тут тогда логичнее было просто сделать единую страницу регистрации/логина на одном роуте с двумя формами и скрывать одну из них. А email хранить в обычной переменной. И не понадобятся такие явно ненадежные костыли.
Мне кажется так удобно будет для каждого пользователя. Например, мы же не можем знать заранее зарегистрирован человек или только хочет зарегистрироваться, и всё что ему нужно это просто ввести свой email и дальше система определит, что он хочет сделать. Я такое видел только в моей бывшей любимой соц.сети - tumblr'е, но сейчас они убрали эту функцию. Я считаю это очень удобным и типо приветливым.


>> Проверить... что, например, вот для серверной части есть проверка, что вернулся StorageWrapper и всё работает, а для браузерной тоже аналогично. Это не нужно?
>
>Проверять это логичнее, пытаясь что-то туда сохранить, а не проверкой, к какому классу относится объект.
Понимаю, исправлю.


>> У роутеров WAMP'а на Node, нету возможностей для аутентифекации и авторизации соединения, и документации. Вышеупомянутая платформа развита лучше других.
>
>Да, но это можно добавить. А в случае с Питоном, ты не сможешь вызывать функции из приложения Node, тебе придется возможно дублировать их, или настраивать взаимодействие. Я не против такого варианта, но готовься к сложностям. И надо правильно спроектировать взаимодействие между питоновским и нодовским приложениями. Это уже почти микросервисы получаются со всеми их плюсами и минусами.
Можно вызывать функции приложения из Node с помощью Remote Procedure Calls паттерна реализуемым WAMP.

Я не знаю, о каких функциях приложения Node вы говорили, но у crossbar.io есть возможность сделать компонент(?) и на другом языке https://crossbar.io/docs/Guest-Configuration/?highlight=node.js
Аноним 2019/03/20 14:41:58  №1367599 385
>>1367587
Что ты там выискивал, если тебе прямым текстом говорится, в чем ошибка? Похоже, что у них похапе без расширения ext-mbstring
Ответы: >>1367607
Аноним 2019/03/20 14:59:04  №1367607 386
>>1367599
>расширения ext-mbstring
А что это вообще?
Ответы: >>1367619 >>1367622 >>1367643
Аноним 2019/03/20 15:23:55  №1367619 387
>>1367607
Не работают там функции с приставкой mb_ , твёрдо и чётко.
Аноним 2019/03/20 15:27:47  №1367622 388
>>1367607
Расширение, которое добавляет в пхп функции с приставкой mb_
Ну например mb_strlen().
Аноним 2019/03/20 16:46:39  №1367643 389
>>1367607

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

Увидеть список основных расширений, и какие в них есть функции, можно в мануале: http://php.net/manual/ru/funcref.php

Кроме них, бывают еще сторонние расширения.

Про установку расширений можно почитать тут: http://php.net/manual/ru/install.pecl.php Под Windows обычно ты просто скачиваешь расширение, кладешь в папку и указываешь его в конфиге.
Аноним 2019/03/20 17:06:02  №1367648 390
>>1367239
Короче нихуя не ответили - говно, а не доска
Ответы: >>1367653
Аноним 2019/03/20 17:14:33  №1367653 391
>>1367648
Народ по полгода вкатывается, а тут Васян пришёл - быстренько подайте ему супер-курс по двухдневному вкату.
Прост нахуй иди.
Ответы: >>1367668 >>1367697 >>1367780
Аноним 2019/03/20 17:19:06  №1367654 392
Привет, анончики, на связи вкатывальщик. Желаю задачи из учебника в шапке, почему-то залип на первой же, связанной с циклами.
Неожиданно нашел решение, но мне кажется оно какое-то... Ну не то оно какое-то. Пните, скажите как надо было сделать красивее.
https://ideone.com/N2Zr7R
Ответы: >>1367657 >>1368691
Аноним 2019/03/20 17:19:20  №1367655 393
>>1367239
Курс с символичным названием "$Профит$". Найдешь на торрентах
Ответы: >>1367668 >>1367780 >>1367836
Аноним 2019/03/20 17:22:00  №1367657 394
>>1367654
Всё правильно, с почином!
Ответы: >>1367658
Аноним 2019/03/20 17:23:24  №1367658 395
>>1367657
Благодарю! Пока что эта больше всего времени заняла, хотя решалась в одно действие, но тем приятнее все же было победить.
Ответы: >>1367772
Аноним 2019/03/20 17:26:38  №1367662 396
>>1367239
>Посоветуйте какую-нибудь книжку (а лучше видеокурс), чтобы быстро вкатиться в какой-нибудь простой пэхапэ-фреймворк
Документация к Laravel\Symphony\etc.

Следующий.
Ответы: >>1367668 >>1367780
Аноним 2019/03/20 17:33:30  №1367668 397
>>1367653
>супер-курс по двухдневному вкату
Кто тебе сказал, что по двухдневному?

>Народ по полгода вкатывается
Полгода вкатывается во что? В запись файлов на пхп? Соболезную

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

>>1367662
>Документация к Laravel\Symphony\etc.
Документация == видеокурс? Похоже, у тебя с восприятием еще хуже, чем у антона выше, лол или ты просто хреново умеешь читать представляю, какой у тебя код

>>1367655
Тосто и тупо тут, видимо, все аноны такие же тупые?
Ответы: >>1367673
Аноним 2019/03/20 17:37:59  №1367673 398
>>1367668
Тебе тут никто уже не поможет.
Ответы: >>1367675
Аноним 2019/03/20 17:39:23  №1367675 399
>>1367673
Ага, я понял, поэтому сменил тему разговора со своего реквеста на обсуждение тупости местных анонов
Ответы: >>1367679
Аноним 2019/03/20 17:44:11  №1367679 400
>>1367675
>запись файлов на пхп
>видеокурс
>...
>называет кого-то тупым
Давай дальше развлекай.
Ответы: >>1367685
Аноним 2019/03/20 17:52:41  №1367685 401
>>1367679
>Давай дальше развлекай.
Хорошо

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

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

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

Пиши, если тебя что-нибудь еще заинтересует
Ответы: >>1367690
Аноним 2019/03/20 17:57:04  №1367690 402
>>1367685
Парни, подгоните этому гению 15 часовой курс лекций по конкатенации строк в пыхе, у кого есть.
А ещё тут где-то анон ходил, с 9 часовым курсом по регуляркам.
Ответы: >>1367697
Аноним 2019/03/20 18:04:42  №1367697 403
>>1367690
>Парни, подгоните этому гению 15 часовой курс лекций по конкатенации строк в пыхе, у кого есть.
Опять сказал какую-то херню и даже не понял, что сказал херню
Держу пари, ты этот самый фантазер >>1367653

>А ещё тут где-то анон ходил, с 9 часовым курсом по регуляркам.
Снова нерелевантная хуйня. Я бы на твоем месте прошел курс по мат.логике от мфти
Ответы: >>1367769
Аноним 2019/03/20 18:24:51  №1367769 404
Что-то вспомнилось недавнее - из треда айтишников. Там аналогичного идиота вычислили, с похожим стилем постов как у этого >>1367697. Уволили ещё которого за то, что народ хуесосил и вообще токсичное чмо.

Ты смотри, пацан, такая манера общения быстро прилипает. Сам не заметишь как в реале хамить людям начнёшь, а там в щи быстро прилетит административно или физически.
Ответы: >>1367780
Аноним 2019/03/20 18:29:01  №1367772 405
2e717221a2.png (3, 194x81)
81x194
>>1367658
Перед десяткой не помешал бы пробел.
Ответы: >>1367777
Аноним 2019/03/20 18:35:11  №1367777 406
>>1367772
Тогда уж и \n не нужен и лучше PHP_EOL использовать.
Хотя это всё мелочи.
Аноним 2019/03/20 18:41:20  №1367780 407
>>1367769
>Сам не заметишь как в реале хамить людям начнёшь, а там в щи быстро прилетит административно или физически.
В реале я с такими мудаками обычно не сталкиваюсь. А если сталкиваюсь, то они никогда не входят в круг моего постоянного общения, очевидно же. Ну а незнакомым людям на улице я и не хамлю без причины, так что за щи не беспокойся

>вообще токсичное чмо
Проиграл с адеквата:
>токсичное чмо
>>1367655 >>1367653 >>1367662
Ответы: >>1367786
Аноним 2019/03/20 18:50:29  №1367786 408
image.png (46, 514x510)
510x514
>>1367780
>Проиграл с адеквата:
Это разные люди, токсичный шизик. Ты сам не понимаешь чего несёшь. Не позорься и замолкни лучше.
Ответы: >>1367794
Аноним 2019/03/20 19:12:52  №1367794 409
>>1367786
>Это разные люди, токсичный шизик.
А где я сказал о том, что это один и тот же человек? Я намекнул на то, что токсичная мразь не я, а они.

>Ты сам не понимаешь чего несёшь.
Нет, я прекрасно понимаю.

>Не позорься и замолкни лучше.
Я пока еще ни разу не опозорился, никаких противоречий в моих словах нет, это твои маняпроекции.
Ответы: >>1367803
Аноним 2019/03/20 19:22:02  №1367803 410
>>1367794
>токсичная мразь не я, а они
Так-то тебе вполне нормально посоветовали. Хочешь по-быстрому, то читай доки. Не поймёшь 80% так как у тебя базы нет так как ты с программизмом никак не связан, но ты сам просил "чтобы быстро вкатиться", а не нормально - значит страдай.

По курсам от "Профита" не скажу - не смотрел.
Ответы: >>1367836 >>1367836
Аноним 2019/03/20 20:14:52  №1367836 411
>>1367803
Ага, ясно

>>1367803
>По курсам от "Профита" не скажу - не смотрел.
А, такой курс на самом деле есть, лол? Вычеркиваю >>1367655 из списка мудаков
Ответы: >>1367842
Аноним 2019/03/20 20:32:32  №1367842 412
Аноним 2019/03/21 04:18:04  №1367914 413
Аноны, пытаюсь сделать большие буквы после знака препинания и пробела.
$regexp = '/([.,!?])( )([а-я])/u';
$text = preg_replace($regexp, '$1$2mb_strtoupper($3)', $text);
Однако нихера, программа вместо перевода $3 в верхний регистр просто выводит mb_strtoupper буквально. Как сделать так, чтобы прога воспринимала это как команду?
Ответы: >>1367968 >>1367969 >>1368017
Аноним 2019/03/21 09:13:38  №1367967 414
Аноним 2019/03/21 09:16:34  №1367968 415
>>1367914
У тебя функция в кавычках - конпелятор её как строку воспринимает.
Аноним 2019/03/21 09:19:50  №1367969 416
>>1367914
1. функция в строке работать не будет;
2. $3 - эту хуйню в строке ждет функция preg_replace, для mb_strtoupper - она нихуя не значит, поэтому сделать так, как ты задумал нельзя. Другие способы ищи
Аноним 2019/03/21 11:59:22  №1368017 417
>>1367914

Нужно использовать preg_replace_callback. Ты создаешь функцию, передаешь ее и preg_replace_callback вызывает ее на каждое совпадение с регуляркой и спрашивает, на что заменить текст.
Аноним 2019/03/21 14:08:28  №1368056 418
Анчоусы, объясните нубу или направьте на доки, почему здесь $elem[0], это индекс массива или что?

P.s это задачка.
>Ведите на экран только те числа из массива, которые начинаются на цифру 1, 2 или 5.
Ответы: >>1368058 >>1368065 >>1368069
Аноним 2019/03/21 14:10:35  №1368058 419
>>1368056
>fix
Блин, зачем то сполйер сделал, интересует индекс, почему [0]
Аноним 2019/03/21 14:54:07  №1368065 420
>>1368056
>$elem[0], это индекс массива или что?
Да, индекс массива.

Но в твоём примере цикл foreach разбирает массив на элементы, возвращая их уже без индекса. То есть у $elem нет индекса, это тупо переменная со значением.

А если интересно, то у каждого элемента твоего массива, значения проставляются автоматически по порядку добавления. У первого добавленного элемента будет 0, у второго 1 и т.д.

Вот как оно выглядит
$arr = [0 => 10, 1 => 20, 2 => 30, 3 => 50, 4 => 235, 5 => 3000];

И да, не нужно числа оборачивать в кавычки '' из-за этого они становятся строками.
Ответы: >>1368067
Аноним 2019/03/21 15:04:51  №1368067 421
>>1368065
Огромное спасибо, я довольна дотошный, за это отдельное спасибо.
>И да, не нужно числа оборачивать в кавычки '' из-за этого они становятся строками.
P/s
Просто не смог найти больше подробностей, по поводу
>Но в твоём примере цикл foreach разбирает массив на элементы, возвращая их уже без индекса. То есть у $elem нет индекса, это тупо переменная со значением.
Ответы: >>1368088
Аноним 2019/03/21 15:05:19  №1368069 422
>>1368056
Намекну. Чтобы отрезать первую цифру от цельного числа, можешь использовать функцию substr($number, 0, 1).

Помог как смог.
Ответы: >>1368076
Аноним 2019/03/21 15:10:46  №1368076 423
>>1368069
>substr
Спасибо, но она со строками работает, а я сделал ошибку, анон выше правильно заметил, я числа в строку превратил, зачем? да хуй знаетдумал всегда надо оборачивать в ковычки, любые данные.
Аноним 2019/03/21 15:36:47  №1368088 424
>>1368067
>Просто не смог найти больше подробностей, по поводу
https://ideone.com/WAO6Ts
Примерно так оно работает, короче с опытом придёт понимание.

>Спасибо, но она со строками работает
Соображаешь, но она может приводить числа к строке и успешно их считать. Хотя при строгом сравнении === это не прокатывает.
Ответы: >>1368097
Аноним 2019/03/21 15:49:21  №1368097 425
>>1368088
>Примерно так оно работает, короче с опытом придёт понимание.
Надеюсь, я понял как происходит индексация элементов массивавсегда с 0, но можно это переделать за счет удаления , я просто не мог понять, как скрипт понимает, что надо выдергивать определенные элементы из массива, еще и с определенными условиями.
P/s.
https://ideone.com/WAO6Ts
Я посмотрел, да красиво и элегантно непонятно мне еще учиться и учиться до PHP_EOL (string) .
Спасибо еще раз за подробное объяснение, у меня проблемы с циклами, вот я и решаю с разных сайтов задачки, что могу решить, хочу довести до автомата это понимание.
Ответы: >>1368115
Аноним 2019/03/21 16:24:55  №1368109 426
пхпэшник1.jpg (56, 640x640)
640x640
Аноним 2019/03/21 16:51:37  №1368115 427
>>1368097
>я просто не мог понять, как скрипт понимает, что надо выдергивать определенные элементы из массива, еще и с определенными условиями.

$массив = [ключ => значение];
$значение = $массив[ключ];

$array = [4, 20, 34];
То же самое, что и:
$array = [0 => 4, 1 => 20, 2 => 34];

$array[0] вернет число 4;
Ответы: >>1368117
Аноним 2019/03/21 17:04:21  №1368117 428
>>1368115
Понятно, теперь все по полочкам в моей голове.
Аноним 2019/03/21 17:59:50  №1368140 429
Есть ли различия у Сервис-Локатора и Контейнера Зависимостей?
Ответы: >>1368154 >>1368238 >>1368246
Аноним 2019/03/21 18:39:11  №1368154 430
>>1368140
Первый передается в конструктор и там уже берется зависимость. Контейнер не передается в конструктор, он передает зависимость аргументом извне.
Ответы: >>1368184
Аноним 2019/03/21 18:44:05  №1368156 431
kateesnameyarik1.png (16, 517x529)
529x517
Ответы: >>1368164 >>1368226 >>1368243
Аноним 2019/03/21 19:00:03  №1368164 432
>>1368156
Молодец, сколько времени затратил на создание?
Ответы: >>1368168
Аноним 2019/03/21 19:07:11  №1368168 433
>>1368164
20 дней в сумме. Бывало, что над какой-то мелочью думал целый день, а бывало, что целый компонент мог написать за пару часиков. Но это нормально в программировании, как я понял.

В фаерфоксе таблица не на всю ширину открывается, какие-то баги.
Аноним 2019/03/21 19:22:55  №1368176 434
Screenshot15.png (30, 884x482)
482x884
Вечерочка.
Анон, как занести в массив несколько совпадений, а не только первое?
Ответы: >>1368182 >>1368209
Аноним 2019/03/21 19:36:31  №1368182 435
Screenshot16.png (9, 573x371)
371x573
>>1368176
Нашел PREG_SET_ORDER.
Но оно выводит массив, который в массиве, который в массиве.
Как просто вывести совпадения?
Ответы: >>1368183
Аноним 2019/03/21 19:38:17  №1368183 436
Ответы: >>1368185
Аноним 2019/03/21 19:39:55  №1368184 437
Аноним 2019/03/21 19:40:11  №1368185 438
>>1368183
Да и так его использую, но он выводит тогда "МассивМассив".
Аноним 2019/03/21 19:48:20  №1368187 439
Screenshot18.png (16, 668x624)
624x668
Screenshot17.png (22, 808x458)
458x808
Короче.
Когда и вызываю [$i[0]], то он выдает пустоту.
Когда вызываю просто [$i], то получаю массив, в котором массив, в котором массив.
Как фиксить?
Ответы: >>1368191 >>1368194
Аноним 2019/03/21 19:53:17  №1368191 440
>>1368187
Кинь ссылку на айдеон.
Ответы: >>1368192
Аноним 2019/03/21 19:54:05  №1368192 441
Ответы: >>1368197 >>1368204 >>1368213
Аноним 2019/03/21 19:57:20  №1368194 442
>>1368187
>Когда и вызываю [$i[0]], то он выдает пустоту.
Ты пытаешься получить значение нулевого ключа в переменной $i, которая не является массивом и вообще содержит число.

Вбрось код с ideone, посмотрю.
Ответы: >>1368197 >>1368199
Аноним 2019/03/21 19:59:06  №1368197 443
>>1368194
Вот тут >>1368192.

>переменной $i, которая не является массивом
Ай, блять.
Аноним 2019/03/21 20:01:37  №1368199 444
>>1368194
Я думал, что $i тоже массив, так как при использовании echo мне выводит, что $mails[$i] это ArrayArray.
Аноним 2019/03/21 20:05:22  №1368204 445
>>1368192
Вот так можно. Нулевой индекс содержит все совпадения (в твоем случае, все индексы содержат все совпадения), берешь и достаешь оттуда мыла.

https://ideone.com/n9kudx
Ответы: >>1368210 >>1368217
Аноним 2019/03/21 20:07:36  №1368209 446
>>1368176

preg_match находит только первое совпадение, тебе нужен preg_match_all. Придется раскурить мануал, и поработать с var_dump, чтобы понять, в каком формате он возвращает данные.
Аноним 2019/03/21 20:08:16  №1368210 447
>>1368204
Спасибо тебе, я понял свою ошибку.
Я выводил [ 0 [0] ],то есть, внутри одних скобок, писал другие.
Надо было просто рядом поставить, блять.
Ответы: >>1368218
Аноним 2019/03/21 20:08:54  №1368213 448
Ответы: >>1368217
Аноним 2019/03/21 20:10:52  №1368217 449
>>1368213
>>1368204
Задача одна, а решения разные.
Спасибо, буду иметь ввиду.
Ответы: >>1368221
Аноним 2019/03/21 20:11:15  №1368218 450
>>1368210
Да ничего, я в начале пути еще не так ошибался, лул.
Аноним 2019/03/21 20:14:16  №1368221 451
>>1368217
Да то же самое решение, просто он вместо вайла взял форыч, и регулярку прям в функцию вставил.
Ответы: >>1368224
Аноним 2019/03/21 20:17:14  №1368224 452
>>1368221
Регулярка укороченная, кек
/\S+@\S+/i
Ответы: >>1368229
Аноним 2019/03/21 20:20:41  №1368226 453
image.png (18, 924x160)
160x924
>>1368156
>Autoloader.php
Почему ты не реализовал загрузчик классов как на пике, а написал целый класс? Мне думается, что громоздко вышло.

>init.php
Почему ты его решил в конфиг положить? Я такое обычно прямо в корень кладу - инициализация приложения вроде как.
Или ты просто не заморачивался на этот счёт?

Намотал себе на ус несколько твоих приёмов.
Ответы: >>1368228 >>1368234
Аноним 2019/03/21 20:25:21  №1368228 454
>>1368226
Не задумывался каким образом будешь показывать страницу ошибки, если пользователь захочет зайти на несуществующую страницу или где-то выбросится исключение?

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

мимо другой анон, делающий студетов
Ответы: >>1368231 >>1368246 >>1368251
Аноним 2019/03/21 20:29:30  №1368229 455
>>1368224
Я лично постоянно забываю, что означают все эти классы буквенные в регулярках. Намного нагляднее писать вместо \S - [a-z0-9.+_-], сразу видно, что ищем, читается проще, хоть и длиннее. + можно отредактировать тут же, если какой-то символ не понадобится.
Аноним 2019/03/21 20:34:26  №1368231 456
>>1368228
>каким образом будешь показывать страницу ошибки
Если маршрут не найден, то маршрутизатор возвращает заранее определённый адрес страницы ошибки. Потом всё это дело идёт на выполнение.
Но я про автозагрузку классов спрашивал, а не роутинг. Это немного разное.
Аноним 2019/03/21 20:46:33  №1368234 457
>>1368226
>Почему ты не реализовал загрузчик классов как на пике, а написал целый класс? Мне думается, что громоздко вышло.

Видел бы ты, сколько у композеровского загрузчика классов, вроде 5-8, если мне не изменяет память.

Я размышлял так: автозагрузчик это ведь тоже некая сущность, а для каждой сущности нужен свой класс.

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

>Намотал себе на ус несколько твоих приёмов.
Поднял мне чсв, лол. Только не копипасть, не думая. Я даже если копипащу что-то откуда-то, то всегда переписываю другим способом, чтобы понять, как это работает.
Ответы: >>1368238
Аноним 2019/03/21 21:06:50  №1368238 458
>>1368234
>автозагрузчик это ведь тоже некая сущность
Но получается так, что при добавлении нового неймспейса тебе приходится лезть в этот класс и править его исходник, дописывая пути.

Алсо, обрати внимание на этот диалог >>1368140 так как твой DI это Сервис-Локатор, а не Контейнер Зависимостей. Если я не ошибаюсь, то у тебя он целиком в конструкторы передаётся, что есть бад-практис, так как в норме сторонние классы не должны знать поимённо сервисы в контейнере зависимостей - внутри они их по своему даже могут называть. Потом просто при тестировании проблемы будут, и при изменении имён сервисов тоже возни много - по всему коду лазать, вместо правки в месте создании объекта.
Ответы: >>1368246 >>1368254
Аноним 2019/03/21 21:24:02  №1368243 459
Screenshot4.png (10, 1397x371)
371x1397
>>1368156
Забыл про расширение на затемнение всех сайтов, подумал, пиздатый ты дизайн сделал, въеби мб так приммерно или это мне уже глаза выжигает белый с непривычки, если отключить расширение?
Ответы: >>1368246
Аноним 2019/03/21 21:38:24  №1368246 460
>>1368238
>Но получается так, что при добавлении нового неймспейса тебе приходится лезть в этот класс и править его исходник, дописывая пути.

Щас уже не вспомню, почему я так сделал. Была какая-то причина вроде той, что этот анон пишет. >>1368228


>Алсо, обрати внимание на этот диалог >>1368140 так как твой DI это Сервис-Локатор, а не Контейнер Зависимостей.

Это я и отвечал.

> у тебя он целиком в конструкторы передаётся
Он целиком передается только в контроллер, чтобы не передавать все зависимости вручную и в класс запуска приложения. Это этап загрузки приложения, так что тут не стоит говорить плохой практике.

>в норме сторонние классы не должны знать поимённо сервисы в контейнере зависимостей

А они и не знают. Сервисы это ведь не сами классы, а способ их создания. В шаблоне Service Locator контейнер передается в конструктор класса и уже там извлекаются зависимости, а в моих сервисах передаются только сами зависимости.

>>1368243
Я дизайн на коленке сваял, а цветовую схему взял с картинки какой-то в стиле 80х. Мне не режет ничего. Да и не дизайнер я, чтобы глаза твои беречь, лол.
Аноним 2019/03/21 22:08:06  №1368251 461
>>1368228
ОП, в правильном ли направлении я думаю?
Аноним 2019/03/21 22:14:49  №1368254 462
>>1368238
Покопался щас в своем коде. Да, действительно, в описании Connection я напрямую передаю контейнер в конструктор класса. Это ошибка, которую я не исправил. Я в самом начале написания программы где-то прочитал, как нужно готовить DI-контейнер и это оказалось брехней. Человек спутал локатор с контейнером. Но я обязательно исправлю.
Ответы: >>1368256
Аноним 2019/03/21 22:20:08  №1368256 463
>>1368254
>Человек спутал локатор с контейнером.
Частое явление, как я смотрю - тоже встречал такое пару раз. Подводные камни как есть.
Ответы: >>1368259
Аноним 2019/03/21 22:41:49  №1368259 464
>>1368256
Материалов нет нормальных на русском. А что есть - либо какая-то общая информация из переведенных надмозгом книжек, либо неверное понимание шаблонов. Почти везде одна теория. А практика если и есть, то очень сферическая в вакууме. Нет кода из реальных проектов, пусть даже учебных.
Про платную информацию не говорю, не знаю, может, и есть что-то.
Ответы: >>1368260
Аноним 2019/03/21 22:44:43  №1368260 465
>>1368259
>Материалов нет нормальных на русском.
Ну, кроме ОПовских. Но часто ли его ссылка мелькает в выдаче гугла? Хотя это хорошо, с другой стороны, конкуренция слабее.
Аноним 2019/03/22 01:26:17  №1368297 466
image.jpeg (551, 1800x1795)
1795x1800
image.jpeg (676, 1800x1618)
1618x1800
Анон, расскажи, где я не прав.

Вроде бы и флаг верный, но работает только с первым массивом, со вторым - второй пикрил.

Может я чего-то не понял, но прег_сет_ордер должен раскидывать по массивам совпадения, но при вызове второго массива я получаю хуй.
Ответы: >>1368511 >>1368537 >>1368546
Аноним 2019/03/22 09:06:03  №1368379 467
>>1353705 (OP)
1) В статье про архитектуру MVC в программе сервиса для управления студентов есть строчки типа:
/
@var Post[] Список объявлений
/
что это значит? Зачем нужна собачка?
2) И еще, если кто сможет объяснить, там есть дерево файлов. Можете объяснить всю схему:
Есть 2 папки public и view. На этом уровне есть файлы bootstrap и Post. А где PostService? Он просто странно расположен.
Статья про MVC
https://github.com/codedokode/pasta/blob/master/arch/mvc.md
Ответы: >>1368380 >>1368381 >>1368414
Аноним 2019/03/22 09:11:33  №1368380 468
>>1368379
Ой, там звездочки были в первом примере. Две звездочки после /, одна звездочка перед @var и одна звездочка перед /
Попробую обойти вакабу ари помощи комментов, но если что в статье можно найти
>/
> @var Post[] Список объявлений
>
/
Ответы: >>1368384
Аноним 2019/03/22 09:12:47  №1368381 469
Аноним 2019/03/22 09:14:28  №1368384 470
>>1368380
Так это многострочный комментарий, почитай в гугле, что такое phpdoc.
Аноним 2019/03/22 10:38:48  №1368414 471
>>1368379
>А где PostService? Он просто странно расположен
Где угодно. MVC-шаблон не обязывает хранить модели, контроллеры или представления только в определённых папках. Можно даже просто в корень всё бросать, правда это не очень удобно.
Я в таких маленьких приложениях классы в папку lib кладу. Вроде как бибилиотека классов.
Аноним 2019/03/22 14:19:50  №1368511 472
Ответы: >>1368517 >>1368520
Аноним 2019/03/22 14:37:23  №1368517 473
>>1368511
Та ты заебал со своими регулярками. Я тебе скинул уроки - смотри, там все есть, доступно и понятно
Ответы: >>1368537 >>1368597
Аноним 2019/03/22 14:44:32  №1368520 474
>>1368511
Так может и нет ничего во втором массиве, посмотри, что в нем.
Ответы: >>1368597
Аноним 2019/03/22 15:34:51  №1368537 475
>>1368297

Для вывода массива лучше использовать var_dump.

У тебя в регулярке стоит ^ - привязка к началу строки. Второе и далее слова она никогда не найдет.

>>1368517

Не нравится - не читай. Это обучающий тред.
Ответы: >>1368593 >>1368597
Аноним 2019/03/22 15:36:48  №1368539 476
Кстати, задачка для тех, кто хочет подумать. Как бы вы спроектировали стандартные функции preg_match и preg_match_all ? Какие аргументы они должны принимать и что возвращать?
Аноним 2019/03/22 15:54:23  №1368546 477
>>1368297
^ - вот этот символ означает начало строки. То биш в твоей регулярке всё что не является первым словом не соответствует регулярному выражению.

А вjобще удобней проверять регулярки если сразу наглядно видно как она работает. Можешь посмотреть как она работает на таких сайтах как regexr или regex101.
https://regexr.com/
https://regex101.com/

Аноним 2019/03/22 16:57:15  №1368569 478
Обратил внимание, что во фреймворках получают данные от пользователя не через функции типа $_POST и подобные, а объектом класса Request. Я так понимаю это нужно для тестирования? Стоит ли пилить подобный класс в списке студентов?

Будет нужно сделать что-то подобное?
https://ideone.com/iF8vXE
Ответы: >>1368591 >>1368592
Аноним 2019/03/22 16:59:06  №1368571 479
Установил yii с помощью композера. Страница приветствия «Congratulations!» недоступна. Нужно веб-сервер устанавливать? Встроенный сервер php может запускать такое? Посоветуйте мануал.
Аноним 2019/03/22 17:11:43  №1368578 480
Таки запустил yii на встроенном сервере. Нужно чтобы все позеленело в Requirement Checker? У меня например Intl extension желтый, PDO MySQL extension, и еще несколько зависимостей.
Аноним 2019/03/22 17:34:31  №1368591 481
>>1368569
>Стоит ли пилить подобный класс в списке студентов?
Думаю, что можно и без него, но с ним будет лучше - по PSR.
Аноним 2019/03/22 17:46:30  №1368592 482
>>1368569
>Я так понимаю это нужно для тестирования?
Нет. Это абстракция скрывающая ненужное, и выделяющая существенное. Чтобы поворачивать на авто удобно руль использовать. При этом не нужно знать что под ним, как он крепится, и как управляет механизмами поворота колес. Request работает по такому же принципу. Поэтому дело тут отнюдь не в тестировании.
Аноним 2019/03/22 17:46:45  №1368593 483
>>1368537
>Не нравится - не читай. Это обучающий тред.
Не нравится не бугурть. Это анонимная борда
Аноним 2019/03/22 17:57:44  №1368597 484
>>1368517
Хочу учиться среди людей.

>>1368520
Да, там пустота.

>>1368537
Указал на ошибку. Спасибо за это.
Сейчас понял, в чем дело было.
Аноним 2019/03/22 19:07:11  №1368625 485
Начинаю делать файлообменник. Можно ли просто и без задней мысли попробовать энджин-икс вместо апача? Или он не создан для того, чтобы быть полноценным серваком?
Ответы: >>1368635
Аноним 2019/03/22 19:25:33  №1368635 486
>>1368625

Конечно, используй. Никакого требования использовать Апач нету. Только вместе с ним тебе скорее всего придется освоить php-fpm (менеджер процессов PHP и FastCGI сервер).
Ответы: >>1368638
Аноним 2019/03/22 19:35:03  №1368638 487
>>1368635
А пригодится это вообще в работе дальнейшей? Не то чтобы я пекусь о том, что зря, а что нет, просто у меня срок сделать все задачи из оп-поста до сентября, хочу все успеть.
Ответы: >>1368670
Аноним 2019/03/22 19:48:05  №1368642 488
Еще раз репостну, мб найдется кто. Не злитесь, хочу найти няшу-двачера и лампово работать, а не пидорга-кидалу с хэдхантера.

Нужен толковый чувак, веб-разработчик широкого профиля (фуллстак).

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

Языки программирования: PHP (на сервере 7.2), JS, HTML/CSS, SQL (на сервере MySQL или MariaDB).
Фреймворки: Yii, jQuery.
Технологии и инструменты: scss(sass), gulp, git, PHPStorm.
Нужен опыт работы над крупными yii-проектами (крупнее лаба10.пхп и сокращателя ссылок).

ЗП 40-50 в месяц (на руки). Если вы крутой и с ходу хотите больше (более-менее адекватно предложению) - говорите, сколько.

Задачи: доработка существующего продукта, который, по идее, написан неплохо (MVC, вся фигня), с нынешним разработчиком познакомлю, введем в курс дела.

dvachheadhunting@yandex.ru
Ответы: >>1368664 >>1368674 >>1368821
Аноним 2019/03/22 20:44:22  №1368664 489
>>1368642
Если имел дело с laravel,