Этого треда уже нет.
Это копия, сохраненная 3 ноября 2019 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Клуб изучающих PHP #112 /php/ 1475112 В конец треда | Веб
Привет. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.

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

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

Предыдущий тред был тут: >>1446969 (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? — Да, однозначно. Посмотри любую вакансию.
grammar.png56 Кб, 500x644
2 1475114
Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть. Если каждый будет оформлять код как хочет, будет бардак.

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

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

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

- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт и найди название для переменной там
- в именах классов используется 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
3 1475117
Напомню себе, как будет время, проверить из предыдущего треда:

- https://github.com/asdasdasdasddasasdasdas/StudentList из >>1448614
- https://github.com/baraboolka/StudentList из >>1460026
- https://github.com/hikkej/student_list из >>1460537
- https://github.com/asdasdasdasddasasdasdas/Filesharing из >>1462815
- github.com/deadj/student-list/ из >>1466025

Если я кого-то еще пропустил или не ответил, можно напомнить о себе в этом треде.
4 1475121
>>475117
Спасибо, оп, ты занят богоугодным делом
5 1475132
скажите пожалуйста,
$id = $_GET["ID"];
$str = file_get_contents($id); // почему файл не загружается
if ($str == false) {
return '{"error":'.$id.'}';
}
6 1475139
>>475132

Включи отображение ошибок (display_errors) либо посмотри логи.
7 1475161
Аноны а ничего что я спиздил чужой проект себе в гитхаб? ну я в нем разобрался, еще некоторые изменения внес, но на 85% спизжено, работодатель может это проверить как-то и пиздили ли вы чужие проекты?
8 1475249
>>475161

>маленький жджун


>пришел на работу в папкиных джинсах, а под ними - краденные колготки старшей сестры


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


>запустил ворованную виндоус


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


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



посмотри какая лицензия стоит у того проекта. Если свободная, то можешь использовать проект на свое усмотрение, только по-моему авторские камменты нельзя стирать.
Не думаю что твой работодатель будет заставлять тебя каждый новый проект с нуля на голом php писать, лишь бы соблюсти чистоту и нравственность коллектива и не ударить в грязь лицом перед конкурентами "СтудияВасиШтыря" или "СайтыВологдаТут"
9 1475289
>>475249
Дело не в том что я боюсь то что я там спиздил чужую интеллектуальную собственность, а то что работодатель узнает что спиздил и решит что я тупой и бездарныйчто правда но все таки не могу сам, с нуля написать полностью mvc-фреймворк и на нем сайт и сразу откажет мне в работе.
10 1475328
>>475289
У джунов в других языках почему-то нет страха, что они не могут написать свой фласк или рельсы
11 1475351
>>475112 (OP)
Отправлял резюме на пхп разраба, предложили попробовать пройти на разработчика искуственного интеллекта.
Я диплом социолога, вкатываюсь в айти по этому треду. 27 лет кун
12 1475357
>>475351

>Я диплом


имею
быстофикс
someApprentice !EaaiHmIJms 13 1475571
>>475117
Упс, а мой пост пропустили...

https://phpclub.tech/pr/res/1446969.html#1461363
14 1475584
Как же я ненавижу ваш трижды выблядский красноглазый композер. ЧТО ЕМУ НЕ НРАВИТСЯ??? ПОЧЕМУ ОН ПИШЕТ ЧТО У МЕНЯ ВЕРСИЯ ХПХ 5, ХОТЯ Я ЛИТЕРАЛЛИ ВЫВОЖУ ПХПИНФО С 7 ВЕРСИЕЙ????
15 1475646
>>475584
Веб-сервер у тебя сконфигурирован с 7.2, но композер ломится через консоль.
Посмотри что выведет php -v. И какие пути в переменной окружения PATH .
.png6 Кб, 495x76
16 1475687
>>475646
Лолшто, почему так и как пофиксить?
.png9 Кб, 678x85
17 1475690
>>475646
Все, пофиксил в переменной PATH. Мне казалось это должно происходить автоматически со сменой версии в опенсервере.
18 1475755
>>475690

Опенсервер не может поменять переменную PATH глобально. Она наследуется при создании нового процесса, а в уже запущенном процессе не меняется и чтобы поменять ее везде, надо поменять значение в реестре и перезагрузиться или перезалогиниться (чтобы перезапустить оболочку и чтобы она установила эту переменную на основе значения из реестра).

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

Проверить текущее значение PATH в данной консоли (оно может быть разным для разных программ) можно командой echo PATH если я не путаю. В линуксе - echo $PATH
19 1475794
>>475289
Работодателю скорее важно, насколько хорошо ты умеешь обращаться с уже готовыми фреймворками, а не как ты умеешь писать свои костыли. Топовые фреймворки, которые написаны опытными разрабами, имеют хорошую архитектуру, они показывают употребление многих паттернов и включают в себя лучшие практики. Мне кажется, выгодней будет смотреться джун с простым проектом, который правильно реализовывает возможности фреймворка. Такой начинающий разработчик смотрится перспективней, нежели джун с, может быть, чуть более сложным проектом, но написанным на самопальном фреймворке с сомнительными практиками и антипаттернами.
20 1475798
>>475794
Тоже на счет этого комплексую, что ли.
Не могу понять получается у меня в программирование или нет. Вот сделал я кое-какой проект(можно ли тот же файлообменник называть проектом? Ибо в моем кривом понимании "проект" - что то сложное, делающееся командой людей) на известном фреймворке Laravel/Yi2/Symfony. Но я в нем ничего тяжелого не вижу. Сложно было при обучении(глаза разбегаются, все не знакомо), когда я себе только цель поставил. А после выполнения я похожий проект сделаю в 5 раз быстрее, не особо напрягаюсь. Вот и сижу думаю: то ли так должно быть, то ли я хуйню какую то делал
задачи с шапки можно за проекты считать? на гит там заливать, в резюме отправлять? Кстати, спасибо ОП, за ценные гайды и советы

мимодругой
21 1475803
>>475798
Same feels bro. У ОПа отличные задания, подающиеся с хорошей градацией сложности. После каждого из них чувствую себя другим человеком. Тот же самый файлообменник, если реализовать весь предложенный ОПом функционал, получается весьма непростым и комплексным проектом. Если не уверен в своих навыках программирования, можешь попробовать помимо основных веб-проектов делать что-нибудь интересное, что будет ставить перед тобой новые и необычные задачи, которые будут заставлять тебя читать соответствующую литературу и искать алгоритмы их решения. Например, я сейчас пробую делать простые игры на js и canvas. Кстати ещё много интересного для начинающих веб-разработчиков можешь найти тут https://github.com/kamranahmedse/developer-roadmap
22 1475811
Не понял, нужно ли мне запоминать ОП про абитуриентов, но на всякий случай продублирую здесь

ОП, глянь задачу про абитуриентов, пожалуйста.
Гитхаб https://github.com/deadj/student-list
Хостинг http://f914421i.beget.tech
23 1475812
>>475811

>запоминать


Напоминать

Быстросамофикс
24 1475821
>>475812
Анон, если при регистрации у тебя на сайте в отправленном серверу запросе переменная year будет содержать число меньше 1919 или больше 2004, пользователю вернётся страница с выводом фатальной ошибки. Проверь первое условие метода checkYear() у валидатора. Также у тебя код не проверяет значения переменных accommodation и gender перед отправкой их в датабазу. Если при регистрации у тебя указать значения этих переменных, отличные от тех, что предусмотрены в форме, то php вернёт mysqli_sql_exception. Кстати тут тебя бы спасло перехватываение исключений, вот урок ОПа на эту тему - https://github.com/codedokode/pasta/blob/master/php/exceptions.md
25 1475867
ананас, помоги найти ... Короче задача, есть сайт, надо чтобы была регистрация, и пользователи могли прикреплять в отдельной странице свои файлы (сканы документов), а админ мог этим файлам проставлять текстовый статус (в работе, отклонено, принято, etc).

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

(вообще сам сайт-то на джумле, но я так и не понял как там сделать возможность проставлять статусы)

(я десктопный прогер на доисторических языках из девяностых и в вебе не шарю (это не моя область, просто пересеклось)
И нет, нанять макаку не могу - мне самому платят так мало что даже на дошик не хватает
26 1475879
Перенёс бота для телеги на другой хостинг и заметил, что последовательные сообщения он стал отправлять куда медленнее. Сейчас потестил - 15 текстовых сообщений отправляются 3,5-4 и более секунды. На старом хостинге 1,6-1,7 секунд. От чего может быть такая разница? Использую curl. Можно как-то ускорить это?
27 1475905
>>475879
Добавил это.
curl_setopt($curl, CURLOPT_ENCODING, '');
curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
И вынес создание и закрытие сеанса curl за функцию.
Скорость не изменилась вообще. Наверное, придётся разбираться с сокетами? Или еще есть какие идеи?
28 1475940
>>475811
Пиздец же, анон. Ты делаешь восемь блядь запросов к базе, чтоб достать одного студента. Не надо так. Не надо на каждое поле писать по методу, если оно не трогается и не будет трогаться отдельно где-то, сделай один метод, который будет работать сразу со всеми. Всякие createStudentFromDB() и иже с ним надо убрать из контроллеров, этому там не место. И не надо руками генерить id, есть автоинкремент для подобного.
29 1475987
>>475867
Тебе платят - ты и разбирайся.
30 1476019
>>475905

>И вынес создание и закрытие сеанса curl за функцию.


Я сделал это неправильно. Сейчас уменьшил время до 1,5 секунд за те же 15 сообщений. Меня устраивает результат, но если будут еще советы - будет интересно послушать.

Когда тестировал на сотне запросов, то разница могла быть и в 300%, и в 500+%. Но всякие CURL_IPRESOLVE_V4 и сжатие (почти?) не работают, по крайней мере в моем случае.
31 1476028
>>476019
Наверное, быстрее всего будет просто делать curl_init в начале скриптов и curl_close в конце?
1234567890.jpg10 Кб, 300x270
32 1476270
Аноны, в моём миллионнике на hh с фильтром "Нет опыта" и т.к. хочу совмещать с учебой "Гибкий график" сплошной 1с битрикс. Да, наслышан о мерзопакостности этого чуда , но выбора нет. Так вот, прошу помощи с источниками для изучения.
33 1476278
>>476270

>наслышан о мерзопакостности этого чуда


Чем он плох?
Тут 1с тред есть.
15687960544060.png12 Кб, 649x309
34 1476293
Блять, забыл, что тред перекатили. Поэтому спрошу ещё раз.
Не совсем понял Query parameters.
На сайте должна быть строка по которой можно найти человека и если есть совпадения, то должны передаваться его id, first_name т.д. ?
35 1476314
>>476278
Нагуглил уроки Михаила Базарова, но это 2013 год.

>Чем он плох?


Если верить прошлым тредам - всё криво, недружелюбно и запутанно.

>Тут 1с тред есть.


Не, я про Bitrix Framework. Правильно понимаю, что это система управления сайтом?
36 1476366
>>476314

>всё криво, недружелюбно и запутанно


Битрикс не трогал, но про вордпресс так можно сказать. Сделано максимально ебануто и не для людей.
37 1476419
>>476314

>Не, я про Bitrix Framework. Правильно понимаю, что это система управления сайтом?


на торрентах всё есть.
38 1476482
>>475112 (OP)
Вопрос по Laravel.
Я правильно понял, что для того чтобы просто считать данные из БД MongoDB нужно обязательно создать модели для каждой коллекции?

Переношу бэк с ноды. У меня куча однообразных коллекций, лень для каждой прописывать модели и контроллеры, на ноде всё через
общие циклы запилено.
39 1476519
>>476314

>2013 год


Ничего с тех пор особо не изменилось
40 1476545
>>476293
ты же помнишь что ты делаешь апи а не сайт ?
41 1476565
>>476482
С помощью этой библиотеки ты можешь извлекать данные из MongoDB с помощью Query Builder - https://github.com/jenssegers/laravel-mongodb
42 1476567
>>476565
Спасибо, то что нужно.
В ларавеле есть фича для регулярного выполнения задач?

https://laravel.com/docs/5.8/scheduling
Выше - с использованием cron (не для винды). Не хочу зависить от конкретного дистрибутива (чтобы в случае чего было легче сменить хостинг)
43 1476568
>>476567
Исли я правильно тебя понял, то тебе нужно это - https://laravel.com/docs/5.8/scheduling
44 1476569
>>476568
Фак я тупой(
45 1476599
>>476545
Помню, но тогда как как сделать строку поиска ?
46 1476615
>>476545
>>476599
Блять, всё я понял. Пиздец я тупой нахуй
47 1476679
Помогите: устроился работать после универа сделать компании сайт, плюс задачи эникейщика были (думал, сделаю несложный сайт, подучусь и джуном куда-то пойду). В итоге я выбрал Symfony под эту цель, сайт я сделал быстро, все ок, но к новой работе считал себя еще не готовым, а тем временем здесь добавилось текучки, плюс еще какие-то около-ИТ задачи навалились.

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

Теперь мне надо как-то уйти, так как сотрудники увольнялись, прошло 2 года почти здесь, задач иного плана еще больше стало, а я хочу быть программистом и вроде готов, но понимаю ведь, что после меня всё кто-то будет с нуля делать и, скорее всего, на какую-то CMS переведет. Получается, налажал и с задачей не справился, как уходить-то?
Снимок экрана от 2019-09-19 14-15-41.png58 Кб, 561x822
48 1476746
Аноны, подскажите, пожалуйста.

Откуда там может быть единица?
49 1476752
>>476679
С таким изложением мыслей тебе вообще будет сложно по жизни. Сочувствую.
50 1476767
>>476679
Просто уходи.
Не нужно брать на себя все грехи этого мира.
Ты 2 года делал то, что мог.

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

И подумай, не обманываешь ли ты себя.
Может быть ты просто боишься выйти из зоны комфорта, и ищешь оправдания?
Соберись с силами - и уходи.

>>476752
И ты тоже уходи.
51 1476774
>>476746
Статическая переменная, хули тут непонятного.
Это как глобальная переменная, но, в пространстве имён класса. Ты изменил её в одном месте, прочитал в другом.
52 1476781
Котаны, пилю по работе сервис отчетов, система разграничения прав что имею - это мой личной говновелосипед.
Хочу повелосипедить, но уже в более грамотную сторону.
Пока что знаю о существования такого подхода как ACL. Какие еще варианты разграничения прав существуют?
И где по ACL почитать оченьподробно.
53 1476797
>>476774
Спасибо бля.
54 1476838
>>476781
Вопрос в том, к каким ресурсам ты хочешь давать/не давать доступ.
Если на уровне URL - это одно, на уровне объектов в БД - другое. И т.д.

В Java EE, например, используется вариант с URL и "ролями".
Пользователь имеет роли. В конфиге аутентификатора задаётся, какие URL (маски) доступны каким ролям. Проверка прав происходит прозрачно, при любом обращении к любому объекту по любому URL. При этом, в коде можно и явно запросить request.isUserInRole(roleName).
55 1476855
>>476767
Спасибо!
56 1476883
>>476855
>>476767
Верно, да и с ростом нагрузки/ответственности зарплата не менялась.

Забыл ответить про зону комфорта. Есть такой момент, но более меня беспокоит чувство незаконченности, долга и вины, хотя, конечно, обеим сторонам будет лучше от моего ухода: я найду другую работу — они найдут другого человека/компанию для решения своих задач. И чем раньше, тем лучше опять-таки для всех.
57 1476888
>>476838
На данном этапе на уровне URL. Для каждого пользователя будет перечень доступных ему отчетов ( а их много разных будет, десятки ) будет браться из sql-базы.
В принципе конечная и утилитарная цель - буквально одна страница с перечнем доступных отчетов, и соответственно реализация функционала самих отчетов.
Пользователю в принципе особо не предполагается никаких функций кроме как заполнить поля формы,нажать кнопку отправить, и получить отчет.
Основной напряг в самих отчетах, база у нас оче-большая, запутанная и кривая.

Нов дальнейшем я допустим захочу прикрутить админку, личный кабинет ленту новостей, личные блоги, двач etc поэтому хочу заморочиться разграничением ролей.
Но не очень понимаю общую логику ни в ACL ни в RBAC. Чем одно от другого отличается и что лучше другого не знаю.
И инфы подробной нет, если есть сурсы, скиньте пожалуйста.
58 1476889
>>476883
Ты прям как я с бывшей, лол
59 1477183
>>476888

>буквально одна страница с перечнем доступных отчетов


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

Делай как считаешь нужным - никаких жестких правил тут нет, если только ты не используешь какой-то готовый фреймворк.
Можно комбинировать роли (url) и списки (db objects) и т.п.
60 1477325
>>475821
Спасибо, анон.
А каким образом можно отправить иные accommodation и gender, если это radio и post запрос?
61 1477340
>>477325
Через инструменты веб-разработчика браузера ты можешь менять html и css веб-страницы. Например, ты можешь убрать атрибут required у input элемента, и форма не будет препятствовать отправке незаполненного поля. Или ты можешь поменять value у элемента, в одном из input gender поставить value что-то типа girl_inside, и форма будет содержать girl_inside в переменной gender при отправке на сервер. Поэтому никогда не полагайся на клиентскую сторону и всегда проверяй приходящие запросы.
62 1477374
>>477340
Спасибо
63 1477392
Анон, посоветуй самый минималистический php фреймворк для ковыряния и обучения. Чтобы вот вообще минимум-минимум, и без всяких там компосеров-хуезеров

Сейчас ковыряю codeigniter - мне нравится ее минимализм, но мне совершенно не нравится то как там сделали MVC - на любой чих надо создавать 10500 файлов. Да еще и ссылки в итоге упоротые (да и сам постоянно забываю как какую страницу надо открывать - маршрутизация не спасает)

(вообще в идеале бы фреймворк без этой допотопной MVC модели, а чего-нибудь другого или вообще без всякой хипстерской херки - просто код блядЪ)
64 1477393
>>477392
Может тебе тогда библиотеки нужны, а не фреймворк?
65 1477401
>>477393
может и библиотеки.
мне нужна регистрация и возможность грузить файлы со стороны клиента на сервер.
66 1477420
>>477183
Если не сложно, объясни будь добр как работает ACL.
Пусть на примере блога.
Есть страничка, на ней можно добавить статью, редактировать, удалить статью.
page/add
pagr/delete
page/redact
группа users может только добавлять статью, admins - все вообще.

Как тут прикрутить ACL, нихуя подробного обьяснения найти не могу. Везде только абстракции
67 1477451
>>477392

>вообще в идеале бы фреймворк без этой допотопной MVC модели


Уважаю. И чтобы база данных деревянная такая, со счетами, в чулане стояла
68 1477464
Какой редактор кода почоветуете на смартфон поставить? Или любой популярный сгодится?
69 1477537
1
70 1477583
>>477420
потому что ты не там смотришь , тебе нужно не ACL а RBAC
https://www.sitepoint.com/role-based-access-control-in-php/

во многих фреймах он реализован

мимо другой анон
71 1477597
>>477420

>нихуя подробного обьяснения найти не могу. Везде только абстракции


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

Как бы ты хотел проверять права, например?
Технически, каким образом?
Как бы ты хотел идентифицировать ресурсы?
А права?

Например, можно просто в коде метода вызывать $user->hasRight(CREATE_POST)
Соответственно, у тебя должны быть права (фиксированный набор) и группы (изменяющийся набор).
Группы - строки в таблице, права - колонки. 1 = есть, 0 = нет. По-умолчанию - 0.
Как связать пользователей (логины) и группы, я думаю, ты догадаешься.

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

И ресурсы, и права и пользователей можно объединять в группы - вводить дополнительный уровень обобщения (рисовать круг вокруг точек). И строить связи уже между группами. Или можно объединять в группы только что-то одно, например, пользователей. Как построить связи в БД ты должен знать.

Можешь ещё посмотреть, как эта задача решается в имеющихся опенсорсных приложениях.
72 1477616
Может быть запилить чатик? Не всегда удобно писать здесь
73 1477632
>>477616
d_i_s!c_o+r!d. g g /Mfk9QTa
Screenshot37.png6 Кб, 409x174
74 1477646
Что это за говно? Они же одинаковые.
Как phpunit, так и сравнение на типы (===) показывает, что массивы разные.
75 1477652
>>477646

Посмотри внимательно. Пробел и подчеркивание. Будь внимательнее. И радуйся, что различие в видимых символах, а не в невидимых (если такое будет, то сдампь строки побайтово для сравнения, например, функцией bin2hex, хотя неудобно, что она пробелы между числами не вставляет, читать неудобно).
76 1477665
>>477652
Вот же пиздец, ничего себе.
Спасибо.

Короче дело в том, что это json_encode заменил пробел на символ подчеркивания какого-то хуя.
77 1477680
>>477665
Я неправильно парсил json-запрос.
Надо так:
$jsonInputDecoded = \json_decode(\file_get_contents('php://input'), true);
78 1477691
>>477632
>>477632
>>477632
>>477632
добавьте в шапку треда ссыль на чат
15627712287050.jpg49 Кб, 523x599
79 1477703
Поцоны, помогите с SQL-запросом.
Есть в нем строка IF('down' IN (сложный подзапрос), 'down', 'up') AS state. Сложный подзапрос возвращает таблицу из строк вида up и down, однако, может вернуть и пустую таблицу, в таком случае state должно стать NULL, а сейчас оно становится up. Как пробросить NULL наружу, не городя два IF с идентичными запросами?
80 1477727
>>477703
Переделывать на join'ах надо, я думаю.
81 1478012
>>475112 (OP)
Как лучше всего хранить длинные JSON-строки (несколько мегабайт), используя Laravel. Config::set?
82 1478482
Сап двощь. Длинный вопрос про архитектуру. Например, есть правило, что если юзер забанен, то он не может писать комментарии в тред. И допустим этот юзер пытается отправить комментарий, наш код на сервере(например прямо в контроллере или сервисе, или просто в наших бизнес моделях) перед тем как запушить комментарий в тред проверяет через if user->canSendComment(), в котором уже будет проверка на бан пользователя и т.д. Вопрос в чем, во многих фреймворках есть компоненты для работы с этими вещами, в ларавел это гейты и полиси, их можно сразу к рутам биндить даже, в симфони недавно читал про voters но сам не пользовался.

В итоге получается что пользователь таки может отправить комментарий будучи забаненным, просто наш клиентский код в контроллере или сервисе не дает сделать вызов какого-то send метода у треда или сообщения. И если этот if убрать то всё как бы и ок и отправится, в бд появится запись, хотя наше приложение может и не готово к такому событию. Мне кажется что лучше просто попробовать отправить сообщение без всяких проверок(например тред удален, пользователь забанен и т.п.), а контроллировать весь процесс валидации в самих методах бизнес модели и выбрасывать исключения, а в контроллере или сервисе ловить, обрабатывать, отсылать ответ. Получается что наша папка с Entity(я просто доктрину использую) может быть польностью скопирована в другой проект, или просто работать вообще без фреймворков, т.к. абсолютно весь код от начала до конца именно в этих объектах и еще каких-то доп. бизнес моделях если нужно. Мне такой подход кажется более консистентным
83 1478489
>>478482
Дополню, что есть большой(или не очень) минус в дублировании кода валидации скалярных переменных. На примере того же комментария, мы хотим ограничить его содержимое по длине в 255 символов. Фреймворк дает тулзы для валидации переменных в запросе, мы этими тулзами пользуемся и всё ок, если хттп клиент отсылает невалидные данные, то мы ему отправляет ответ с сообщением об ошибке. Но, если мы делаем валидацию входных параметров в самих бизнес моделях, то мы должны скорее всего продублировать их и в конструкторе. Это опять же дает возможность не зависить от одного хттп контекста, а использовать приложение через консоль и другие транспорты, но конкретно в хттп получается дублирование кода. У меня просто такое чувство что с таким подходом можно писать больше юнит а не integrity тестов
84 1478599
>>478482
Возможно.

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

Вот пример:
https://developers.braintreepayments.com/reference/general/result-objects/php

Можно гуглить Result object, Either, Maybe, etc.
https://marcosh.github.io/post/2017/06/16/maybe-in-php.html
23-84 85 1478761
>>478482

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

public function validateComment(Comment $comment): array
{

}

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

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

Что касается Ларавел - там есть классы для валидации, и я не вижу никаких проблем использовать в том числе и их внутри описанной выше функции ( https://laravel.com/docs/5.8/validation#manually-creating-validators ).

Кстати, описанный у них подход с сохранением ошибок в сессию и редиректом при ошибке - на мой взгляд, неудачный, у меня есть урок с другим подходом к обработке форм: https://github.com/codedokode/pasta/blob/master/forms.md

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

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



Так тоже можно делать. Минус, что если комментарий можно добавлять из нескольких мест (сайт и API), то надо не забыть эти ограничения ввести и там и там.

> в симфони недавно читал про voters но сам не пользовался.



Это для более сложных проверок, вроде того что только автор комментария может его редактировать.

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



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

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



Не понял где дублирование, если мы сделаем функцию валидации, как я описал выше.
23-84 85 1478761
>>478482

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

public function validateComment(Comment $comment): array
{

}

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

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

Что касается Ларавел - там есть классы для валидации, и я не вижу никаких проблем использовать в том числе и их внутри описанной выше функции ( https://laravel.com/docs/5.8/validation#manually-creating-validators ).

Кстати, описанный у них подход с сохранением ошибок в сессию и редиректом при ошибке - на мой взгляд, неудачный, у меня есть урок с другим подходом к обработке форм: https://github.com/codedokode/pasta/blob/master/forms.md

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

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



Так тоже можно делать. Минус, что если комментарий можно добавлять из нескольких мест (сайт и API), то надо не забыть эти ограничения ввести и там и там.

> в симфони недавно читал про voters но сам не пользовался.



Это для более сложных проверок, вроде того что только автор комментария может его редактировать.

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



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

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



Не понял где дублирование, если мы сделаем функцию валидации, как я описал выше.
86 1478762
>>478599

Имхо эти объекты - переусложнение. Если тебе хочется типизации, то есть несколько вариантов:

- сделать объект ErrorList
- вспомнить, что для представления ошибок есть исключения и возвращать массив исключений

В чем смысл делать объект Success или Maybe, я не понимаю. Если ошибки нет, можно вернуть просто пустой список ошибок.

> Вот пример: https://developers.braintreepayments.com/reference/general/result-objects/php



Имхо, это бесполезные объекты. Зачем делать обертку для массива, который мы отдадим в JSON? По моему, так контроллер для метода API выглядит примерно так:

public function getUsersByCity(City $city) {
$users = $this->userFinder->findBycity($city);
$userArray = $this->jsonHelper->exportUsers($users);

return $this->json(200, [
'users' => $userArray
]);
}

Зачем сюда добавлять какие-то объекты-обертки, какой цели они служат, какие преимущества дают, я не понимаю.

Пример по ссылке является оберткой для API. Он вводит эти объекты-ответы, чтобы представить ответ от API. В обычном коде я не вижу, зачем они нужны.

> Можно гуглить Result object, Either, Maybe, etc. https://marcosh.github.io/post/2017/06/16/maybe-in-php.html



Опять же, тут введение такой "монады" представляется излишним усложнением. Скорее всего оно даст увеличение объема кода относительно варианта с использованием null. Есть какой-то пример кода, демонстрирующий преимущества? Там пока я вижу 3 класса, которые должны заменять вариант с использованием null.

Если там предлагается использовать это как-то так:

$maybeUser = findUserByEmail('xANUSexample'%0PUNCTUMcoVAcm');
$maybeName = $maybeUser->map(function ($user) {
return $user->getName();
);

То это выглядит огромным усложнением в сравнении с прямолинейным кодом:

$user = findUserByEmail('^uIxANUSexa,OTmplePUNCTUMcoG4ym');
$name = $user ? $user->getName() : null;

Или в сравнении с

if (!$user) {
throw new Something(...);
}

$name = $user->getName();

Плюс, этот Maybe неудобно передавать в функции, так как если мы ставим тайпхинт Maybe, то нам приходится все передаваемые значения оборачивать в этот Maybe.
86 1478762
>>478599

Имхо эти объекты - переусложнение. Если тебе хочется типизации, то есть несколько вариантов:

- сделать объект ErrorList
- вспомнить, что для представления ошибок есть исключения и возвращать массив исключений

В чем смысл делать объект Success или Maybe, я не понимаю. Если ошибки нет, можно вернуть просто пустой список ошибок.

> Вот пример: https://developers.braintreepayments.com/reference/general/result-objects/php



Имхо, это бесполезные объекты. Зачем делать обертку для массива, который мы отдадим в JSON? По моему, так контроллер для метода API выглядит примерно так:

public function getUsersByCity(City $city) {
$users = $this->userFinder->findBycity($city);
$userArray = $this->jsonHelper->exportUsers($users);

return $this->json(200, [
'users' => $userArray
]);
}

Зачем сюда добавлять какие-то объекты-обертки, какой цели они служат, какие преимущества дают, я не понимаю.

Пример по ссылке является оберткой для API. Он вводит эти объекты-ответы, чтобы представить ответ от API. В обычном коде я не вижу, зачем они нужны.

> Можно гуглить Result object, Either, Maybe, etc. https://marcosh.github.io/post/2017/06/16/maybe-in-php.html



Опять же, тут введение такой "монады" представляется излишним усложнением. Скорее всего оно даст увеличение объема кода относительно варианта с использованием null. Есть какой-то пример кода, демонстрирующий преимущества? Там пока я вижу 3 класса, которые должны заменять вариант с использованием null.

Если там предлагается использовать это как-то так:

$maybeUser = findUserByEmail('xANUSexample'%0PUNCTUMcoVAcm');
$maybeName = $maybeUser->map(function ($user) {
return $user->getName();
);

То это выглядит огромным усложнением в сравнении с прямолинейным кодом:

$user = findUserByEmail('^uIxANUSexa,OTmplePUNCTUMcoG4ym');
$name = $user ? $user->getName() : null;

Или в сравнении с

if (!$user) {
throw new Something(...);
}

$name = $user->getName();

Плюс, этот Maybe неудобно передавать в функции, так как если мы ставим тайпхинт Maybe, то нам приходится все передаваемые значения оборачивать в этот Maybe.
87 1478764
>>477703

Можно приджойнить подзапрос и написать SELECT COUNT(x = 'down') AS downs, COUNT(x = 'up') AS ups FROM ... JOIN подзапрос GROUP BY ....

Можно попробовать переделать подзапрос на

SELECT ....
(SELECT CASE WHEN SUM(x = 'down') > 0 THEN 'down' WHEN SUM(x = 'up') > 0 THEN 'up' ELSE 'null' ... ) AS state,
...

>>477691

Если такие ссылки тут запрещены, то ничем не могу помочь.

>>476781

ACL это просто список разрешений (Access Control List). Он используется, например, для контроля доступа к файлам. Там просто у каждого файла есть ACL, в нем перечислены пользователи или группы и их права (читать, писать, удалять, создавать). И также права могут наследоваться от родительского каталога.

Тебе надо гуглить RBAC (role-based access control). Там каждому пользователю назначается одна или несколько ролей, а в конфиге или в коде ты определяешь связь между ролями и разрешениями (например: разрешение "удалить пост" есть у ролей "модератор" и "автор поста").

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

Ты можешь посмотреть компонент Symfony Security, это библиотека, которую можно использовать отдельно от Симфони: https://symfony.com/doc/current/security.html
88 1478765
>>477392

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

Если хочется минимализма, бери Slim, но там кроме роутера по сути ничего и нету. Если хочется собрать свой фреймворк, бери Symfony Components (не фреймворк Симфони, а независимые библиотеки), и собирай из них.

> Да еще и ссылки в итоге упоротые (да и сам постоянно забываю как какую страницу надо открывать - маршрутизация не спасает)



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

>>475821

> Если при регистрации у тебя указать значения этих переменных, отличные от тех, что предусмотрены в форме, то php вернёт mysqli_sql_exception. Кстати тут тебя бы спасло перехватываение исключений



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

>>477325

Утилитой командной строки curl или программами типа postman можно сформировать и отправить любой запрос с любыми параметрами.

curl -X POST --data accomodation=12345 https://example.com/register
89 1478766
>>476482

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

>>475798

> Не могу понять получается у меня в программирование или нет.



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

> Но я в нем ничего тяжелого не вижу. Сложно было при обучении(глаза разбегаются, все не знакомо), когда я себе только цель поставил. А после выполнения я похожий проект сделаю в 5 раз быстрее, не особо напрягаюсь. Вот и сижу думаю: то ли так должно быть



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

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

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

> Ибо в моем кривом понимании "проект" - что то сложное, делающееся командой людей) на известном фреймворке Laravel/Yi2/Symfony.



Этим ты будешь заниматься после устройства на работу.
90 1478768
>>478762

>то нам приходится все передаваемые значения оборачивать в этот Maybe.


Нет. Есть такое слово "lifting".
Но, это отдельная тема, далеко выходящая за рамки пыхотреда.

И да, ты прав, на php так обычно не пишут.
Особенно ньюфаги.
91 1478771
Подскажите как простейшим способом сделать на странице звук щелчка? Нужно что бы когда происходит что-то то простой глуховатый звук проигрывался периодически.
93 1478780
>>478761
Я просто пока не пойму одну вещь в ооп, вот делаю я публичный конструктор, мой класс любой может трогать, а в тайпхинте например стоит просто стринг, хотя чтобы класс работал корректно нужна строка именно не больше 255 символов. Должен ли я отдавать клиенту моего класса возможность передать некорректные данные? Можно канеш упороться и создать какой-то класс String255. От этого и сомнение где делать валидацию каких-то бизнес действий, что по сути тоже бизнес логика. Есть у меня класс Thread, хочу я туда закинуть сообщение через какой-то метод, должен ли сам объект треда всегда хавать любой объект Message, который ему дают? Если давать управление этой логики какому-то сервису уровнем выше, то получается что и большая часть поведения у моих домен объектов переносится в этот сервис.
94 1478783
>>478780

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

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

Но ты можешь попробовать поэкспериментировать с таким подходом и рассказать про результаты.
95 1479208
Как думаете, норм курс? 20к я бы не платил конечно, но за косарь...
https://www.udemy.com/phpmasterwfs/?signupsuccess=1
96 1479223
>>479208
на nnm-club возможен бесплатный просмотр.
97 1479225
>>479223
Я тоже сразу туда пошел, но чет не нашел, ща ещё гляну.
98 1479229
>>479223
Ну все нашёл, кайф, спасибо.
99 1479250
>>477583
>>477597
Спасибо. Примерно понял, буду реализовывать в своем приложении фрейм-ворке
100 1479507
Что думаете насчет этого https://refactoring.guru/ru?
101 1479574
>>479507
очередной говнокурс инфу о котором можно найти в открытом доступе.
102 1479735
>>479574
зачем собирать всё по крупицам, когда можно взять из одного места. Ммм?
103 1479739
>>479507
Вольный пересказ Рефакторинга Фаулера с картинками
104 1479761
Знающий ано, подскажи по композеру. Пытаюсь добавить в проект библиотеку из гита, а он выдает ошибку:

>- The requested package jamesheinrich/getid3 could not be found in any version, there may be a typo in the package name.



вот сама библиотека
https://github.com/JamesHeinrich/getID3

вот что в джейконе пишу
"require": {
"slim/slim": "^3.0",
"slim/twig-view": "^2.5",
"jamesheinrich/getid3": "dev-master"
},
"repositories":[
{
"type":"git",
"url":"https://github.com/JamesHeinrich/getID3"
}
],
пытался через композер инсталл, инсталл говорит "сначала обнови". Обновляю, выдает ошибку. Подскажи в чем проблема?
105 1479763
>>479761
Аноны, нашел такой же пакет на pacegist.org и все, тьфу-тьфу, заработало. Но все равно не понимаю, почему с гитом не получилось?
сёга 106 1479893
Как думаете конвертация вордовских файлов в хтмл странички в качестве тестовго задания тянет на кидалово?
107 1479941
>>479761
Я зашел в композер.жсон в репе и вот что там написано

> "name": "james-heinrich/getid3",


Попробуй с дефисом установить

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

> пытался через композер инсталл, инсталл говорит "сначала обнови"



Не понял. Надо было привести полностью текст из консоли.

В твоем конфиге композера указан repositories. Не его указывать не надо, так как getId3 есть в стандартном репозитории композера packagist ( https://packagist.org/?query=getid3 )

Далее, прочитай документацию по версиям и по опции stability: https://getcomposer.org/doc/articles/versions.md#minimum-stability

В заключение еще можешь прочесть https://getcomposer.org/doc/faqs/why-are-unbound-version-constraints-a-bad-idea.md

Если у тебя есть composer.lock, то удали его перед повторением попытки.

Если после этого остались какие-то вопросы, задавай.
109 1480050
>>479941
>>479966
По композеру спасибо, аноны, сейчас все хорошо. Я, видимо, две ошибки допустил: не посмотрел, что нужная библиотека уже есть на пакеджисте и в названии дефис пропустил. Спасибо еще раз
110 1480103
Может кто плиз дать вк свой чтобы помочь?)
111 1480106
Может кто дать вк и помочь подробно с задачей плиз?
112 1480116
>>480106
>>480103
Сюда кидай.
113 1480175
Анончики, я правильно понимаю, что Slim нужно использовать вместо самописного роутера, который был в задаче про список абитуриентов, и на этом его функционал кончается?
114 1480499
Анон, хочу будить свой комп POST-запросом на свой сервер. Код ниже работает, но я впервый раз пишу что-то на PHP. Всё ли я верно сделал? Что можно улучшить? Какие можно придумать альтернативные решения для пробуждения пека запросом?
[code]
<?php
$mac = '<MAC-адрес моего кудахтера>';
$json = file_get_contents('php://input');
$data = json_decode($json);
$pass = "password";
$getPass = $data->pass;

if ($getPass == $pass) {
exec("wakeonlan $mac");
echo 'Success!';
} else {
echo 'Test!';
}
[/code]
curl -d '{"pass": "password"}' -X POST https://<domain>/wol.php
115 1480603
>>480175
Там еще есть маленькие удобные штучки типа встроенного функционала работы с загруженными файлами $request->getUploadedFiles(), тебе не надо свой класс придумывать. Плюс можно совместимый шаблонизатор твиг приделать. Аноны выше писали что он в основном для api используется
116 1480645
>>480175
В Слим можно подключить шаблонизатор, логгер, орм через контейнер зависимостей. Зависит от задач.
117 1480729
>>480603
>>480645
Спасибо, анончики
118 1480735
119 1480790
Представляете, а я только что завалил собеседование на первом же вопросе: -«Сколько вам лет?», и я ответил: -«Давайте лучше перейдём к вопросам о моих навыках.», и всё интервью посыпалось.

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

Я не понимаю как можно устроится на работу, если важны такие глупости как возраст.
сёга 120 1480799
выполнил тестовое на вроде неплохую вакансию по зп но
сразу написал во первых что это cli скрипт и надо ставить зависимости
но мне ответили что не могут запустить и кидают ссылку на файл на шареде
вот теперь не знаю даже если переделанный под веб хостинг примут стоит ли работать с такими программистами
немного сочувствую теперь их организации
121 1480814
>>480790

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


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

>>480799

>стоит ли работать с такими программистами


>немного сочувствую теперь их организации


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

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


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


Спасибо, Аноним. Я как раз этими мыслями себя и успокаиваю. Мне просто кажется, что так каждая компания будет собеседовать.

К примеру, у меня нету опыта работы и 26 лет, но 4-5 лет опыта разработки, и если я назову свой возраст, то у собеседователя возникнет вопросы "а чем я всё это время занимался?" или "почему нет опыта работы?", или "почему у меня нет образования?", и отвечая на эти вопросы у него возникнут ещё больше вопросов. Это ошибка отвечать на них.

Что нужно отвечать на вопрос о возрасте? Я считаю что так же попросить перейти к следующему вопросу.
123 1480945
Ребята подскажите пожалуйста. Делаю калькулятор с формами html. Присутствуют две текстовые формы (а и b) и форма в виде списка с операциями(слож, вычитание, деление и умножение). Так вот, как соединить операцию из списка с формами а и б? Чтобы при нажатии в списке сложить, числа в текстовых строках складывались, при вычитании вычитались и т д?
124 1480994
Ребята, это нормально, что при изучении пхп я чувствую себя дико глупым? Простейшие какие-то задачки я решаю по 20-30 мин и бывает, что вообще сдаюсь и подсматриваю решение на том же codebasics в обсуждениях.
Все прям очень туго идет, хотя есть интерес, желание, мотивация.
125 1481114
>>480945
Не понел зачем тут пэхэпэ? На жабаскрипте же все делается. Либо все "инпуты" засунуть в одну форму. И на серваке уже смотришь какой параметр прилетел из третьего инпута и делаешь чо надо с данными из первых двух
>>480994
Какого ты ответы ждёшь?
1. Да это нормально. не парься. вся жизнь в впереди.
2. нет это не нормально! В твои годы билгейц уже изобрел компуктеры а курткобейн сидел на героине а ты пэхэпэ не можешь освоить капец.
Не сиди на дващах а сиди и учи дальше если интересно. А если не интересно то забей хуй. Все просто.
126 1481133
>>481114
Ну, да. Я реально хуиту спросил. Сорян
127 1481589
>>480879

>а чем я всё это время занимался?


аноны из работо-треда очень годный ответ посоветовали: говори что все это время работал неофициально\без оформления у знакомого. Никто не будет твоего знакомого искать
128 1481590
>>480994

>Простейшие какие-то задачки я решаю по 20-30 мин


ну они столько и решаются, не волнуйся вообще. Я бы на твоей месте больше беспокоился о том, что ты натурал. Потому что, судя по современным веяньям, все прогеры - геи
129 1481613
>>481590
*гои
быстрофикс
130 1481618
>>481590
С чего это ты взял, что он натурал? Может он тот еще любитель питонов
131 1481649
Перекатываюсь с питона. Встал вопрос: как распаковать значения из генератора? Типа как через list для массивов.
132 1481661
>>480879

>К примеру, у меня нету опыта работы и 26 лет


И что? ты считаешь что этот возраст уже ВСЁ?
133 1481756
>>478766

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


Дело в том, что я на Ларавеле пытаюсь делать. Много там всего, конечно. Смотрю тот 20-часовой курс по созданию форума с ларакаста, чтобы в фреймворке разобраться, посмотреть как правильно писать. Ясное дело, что тот кто курс этот записывал - тот еще синьёр-помидор, но как же он быстро и на автоматизме это делает. Я когда на работу устроюсь, вокруг все так быстро пишут? Вообще не могу понять, зачем джуны нужны, если один такой синьёр за 3 рабочих дня сделает проект, который несколько джунов будут ковырять месяц.

>Если ты хочешь еще что-то изучить, то я бы не советовал делать то же самое


Спасибо. Учить всегда есть что. У меня глаза разбегаются, пытаюсь откусить всего по чуть чуть. Вроде и все это нужно, но в то же время хочется сосредоточиться на чем нибудь одном
123.jpeg45 Кб, 717x640
134 1481780
>>480879
Женат?
Мне тоже 26
Не хочешь объедениться?
135 1481782
>>480879
Женат?
Мне тоже 26
Не хочешь объедениться?
136 1481810
>>481589
Двачую, знакомая устроилась js джуном в 29 лет, сказала, что работала неофициально в поддержке интернета, больше ее ниче не спрашивали, при чем она по образованию - химик.
137 1481829
Здесь есть люди, которые вкатились в 25+? Насколько это реально?
138 1481848
>>481829
А почему нет? Я 20-летний студент, не понимаю что зависит от возраста? Как по мне, так наооборот - это показывает что человек в свои года нашел силы, сел учить/заниматься ремеслом веб-проганья.

Меня больше волнует вопрос о дипломе. Нужен ли вообще, если нужен - то смотрят ли на престижность вуза и т.д.
Ибо я в своих пердях учусь, мне даже лабы делать тошно. Из программирования был только предмет с алгоритмами (сортировки, графы, хэш-таблицы), и на том дед просто сказал "Вирта читайте епта". Остальные предметы зачастую вызывают смех, например когда препод Религовед всю пару рассказывает что Украины завтра не станет.
У меня мнение такое, что ну такие вузы нахуй, ведь работодателю нужна не корочка, а человек который будет делом заниматься. Но это только мое мнение, может кто из более опытных ребят считает по другому?
139 1482024
>>481829

>Здесь есть люди, которые вкатились в 25+?


Анон, я тебя удивлю, но, судя по уровню образования, который дают в институтах, ВСЕ вкатываются в 25. В столицах да, тебе прямо в универе будут питоны давать. А на фронтире ты будешь пять лет учить социологию, историю и фокс-про с аксессом по учебникам 60-х годов. И это на IT специальности. Так что после универа такому прогеру с чистого листа вкатываться придется как раз в 25
140 1482028
>>481848

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


в молодых прогрессивных или западных фирмах - да. В гос-организацию скорее возьмут чела с дипломом. Другое дело, что в гос-организациях обычно платят так себе, поэтому большая текучка, и в конце концов возьмут любого
141 1482255
Как правильно производить авторизацию с использованием сессий и куки?
142 1482308
143 1482342
>>481756

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


Ну так джуны так же за 3 дня должны написать такой форум.
144 1482352
>>482342
Как? Если это не форум, а какой то новый проект. У синьера когда он код пишет, уже в голове план что будет даьше делать. А у джунов такого опыта нет, да и знания в php/смежных технологиях не так велики могут быть
скачанные файлы.jpg8 Кб, 183x275
145 1482568
ОП посмотри плиз.
Вектор Часть 2: https://ideone.com/y9ierO
146 1482633
Аноны, какие жизнено важные JS фишки нужно знать? Такие как Ajax
147 1482644
>>481829
Вкатился в 28, спрашивайте свои ответы.
148 1482652
>>482644
Что на собеседовании спрашивали? Что было в портфолио?
149 1482666
>>482644
Ti gaY?
150 1482669
>>482652
В резюме указал навыки, которыми владею, то есть фреймворк пхп, разные базы данных, гит и ссылку на гитхаб с двумя говно проектами. Про опыт напиздел, что отработал около года в местной студии.
На собесе ничего необычного, тян расспрашивала про опыт, сколько человек было в команде, задавала вопросы по языку, разные штуки на логику. После разговора думал я пиздец зафейлил, но через пару недель позвонили и предложили оффер.
Алсо, даже с таким хуевым резюме как у меня и немаленькими запросами на ЗП для джуна, мне стабильно раз в пару недель звонят эйчары зовут на собес, понятия не имею хули вы тут сидите дрочите годами.
151 1482674
>>482669
Какого рода говнопроекты? Что за вопросы по языку? Сам сейчас пишу резюме, пездос.
152 1482675
>>482669
Какой фреймворк? Js, верстка на каком уровне была? Город? Сейчас тебе сколько или только получил оффер?
153 1482684
>>482674
Проекты уровня реализации работы функций фреймворка, ничего особенного не выдумывал. А вопросы ну типа показывают сложную конструкцию на языке и просят объяснить что это такое. Еще спрашивали какие-то базовые штуки про js и верстку, здесь ничего сложного.

>>482675

>Какой фреймворк?


yii

>Js, верстка на каком уровне была?


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

>Город? Сейчас тебе сколько или только получил оффер?


Сам с задницы мира, сижу на удаленке, 28 лет, начал работать с этого года.
154 1482737
>>480499

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


wolcmd
У меня батник будит по удалёнке нетбук через неё.
155 1482751
>>482644
Сколько времени потребовалось на вкат?
Есть ли ВО?
156 1482808
Подскажите почему со временем могут пропадать php воркеры? Раз в несколько дней приходится делать на серваке php restart, в конфиге минимальное число задано, но все равно со временем пропадают.
157 1482823
>>482751
Вышка есть. Вкатывался два года, но если убрать большие перерывы, то получится около одного. Думаю, студентики могут легко уложиться в месяцев 6, потому что у них больше свободного времению
158 1482855
>>482684
На каком сайте ты резюме выкладывал чтобы тебе аж по сто человек в день стучаться, аношка? И дай ссылку на резюме. Не умею резюме составлять
14243349517532.gif1,4 Мб, 360x239
159 1482863
>>482855
поясните про сфинкс, аноны. В задаче про файлообмен надо поиск делать на сфинксе. Чем он хорош? Он быстрее? Он популярней? Это стандарт разработки?
160 1482873
>>482855
На hh.ru. Ссылку не дам, потому что деанон. Там не 100 человек в день. Всего за три месяца что резюме висело получил 100 просмотров. Из 40 откликов на вакансии что я оставлял, ответили примерно на 15, из них может 5 скинули тестовое или пригласили собеседоваться. Кроме этого еще на телефон звонят периодически, он тоже указан там.
161 1482879
>>482873
спасибо
162 1482891
>>482644
Сколько зп джуна на удаленке?
На москву или бугор?
163 1482909
Анины, не могу найти нормальное руководство по sphinx. Может кто знает ссылку? На хабре статья "для новичков" начинается с "ну мы уже установили сфинкс и сделали представление, давайте щас потестируем"
164 1482965
>>482909
Делай на Slim. Или на большом фреймворке.
165 1482968
>>482965

>Делай на Slim. Или на большом фреймворке.


Не понял тебя, анон. Я и делаю на slim. Но там оп в задании написал типа "приделайте к слиму поиск на сфинксе". Мне бы проще было тупо через базу и like искать. Но я так понял сфинкс везде используется и он в будущем пригодиться.
Нашел вот статью https://gist.github.com/codedokode/10539366 по сфинксу со знакомой фамилией
166 1483076
Подскажите адекватные гайды/книги по ооп, плез
167 1483086
>>483076
А гайд ОП не зашёл?
168 1483109
>>483086
Либо я тупой, либо мне показалось, что там не очень много инфы
169 1483111
>>483076
Design Patterns: Elements of Reusable Object-Oriented Software
170 1483112
>>483111
Благодарю
171 1483121
>>482968
Это я тебя не правильно понял, бро. По сабжу пробуй на английском искать инфу/документацию. Я загуглил, мне сразу php мануал, доки, пару статей выдало. Не ленись, если что пользуйся гугл переводчиком
172 1483192
>>480799
Сэкономь силы/время. Выложи свое тестовое на гитхаб и пытай удачу со следующей конторой.
173 1483219
Как в пыхе сделать чисто ООПшный обработчик формы, чтобы было не action=validateForm.php в html с процедурной проверкой в validateForm, а какое-то FormValidator($form)? И так вообще делается?
174 1483246
>>482891
Джунов на удалёнку обычно не берут, это не эффективно. За джуном должен кто-то опытный приглядывать и обучать, удалённо это гораздо сложнее чем с коллегой в офисе. Вообще вопросы трудоустройства лучше обсуждайте в перезвоним треде.

>>482968
Через like не будет работать стемминг (выделение основы слова, отбрасывание окончаний), fuzzy search (опечатки как в гугле). Нужен поисковый движок для этого. Сфинкс сейчас не очень популярный, во всех новых проектах я натыкаюсь на Elasticsearch, а Sphinx только на проектах 10-и летней давности. В постгресе есть встроенный мощный поисковый движок:
- https://www.postgresql.org/docs/10/datatype-textsearch.html
- https://www.postgresql.org/docs/9.1/fuzzystrmatch.html
В любом случае разобраться с каким-то одним поисковым движком будет полезно, подойдёт и Sphinx.

>>483219
Делается. Посмотри Symfony Form: https://symfony.com/doc/current/forms.html
175 1483322
>>475112 (OP)
Привет всем ИТТ. Ровно три с половиной года назад сидел и учил с вами в этом треде похапе. С тех пор полёт нормальный, повысили до синьора пару месяцев как, могу поотвечать на вопросы. ОП поменялся или тот самый ещё?
176 1483325
>>483322
Фулл стак или чисто бэк? В бэке используешь только php?
177 1483354
>>483322
>>483325
Бамп вопросу. До какого уровня нужно знать фронт? Понятное дело понимать что там и как в css,html,js. Нужны ли js фреймворки и прочее?
178 1483364
>>483325
>>483354
поначалу был фуллстак, в говнноконторах, где и швец и жнец, потом в нормальном месте уже чисто в бек ушёл и не возвращался. Как верстать и прочее уже и забыл, они пап. Сейчас вот го учу.
179 1483369
>>483364
Спасибо, удачи анон
180 1483474
>>483322
Круто! Расскажи в чем выражался твой прогресс от джуниора к мидлу и от мидла к сеньеру, кто должен по твоему мнению какие задачи выполнять, в общем как ты видишь всю эту иерархию.
181 1483480
>>483474
Заметил. что периодически тут такие посты всплывают - про вкатившегося и спрашивают ОПа. Это или сам ОП семёнит, или ебанутый какой-то.
182 1483494
>>483480
Ну в любом случае, мой вопрос все ещё актуален.
183 1483535
>>483480
хз, помню, приходил в тред где-то год назад, и примерно то же писал, но он утонувший был и я хз, ответил ли мне вообще кто-либо, так как забыл проверить. Вот решил снова зайти, вспомнить корни, лол

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

Ну и на собеседования похаживаю иногда, в последний год с руками отрывают всюду, даже после моего отказа названивают и приглашают повторно.
Думаю перекатываться куда-нибудь в новый стек (джава, го, you name it), но не охота терять в деньгах.
184 1483569
Котаны, скажите в sql есть конструкция которая может проверить существование PDO параметра?
Типа если :param не сущетвует (я его не передал) то тогда значение какое нибудь по умолчанию
185 1483572
>>483569
Этим валидатор заниматься должен. SQL и сам PDO только с базой работают - гугли разделение ответственности.
186 1483706
>>483121
>>483246
спасибо
187 1483707
>>483572
То что валидатор - это понятно. Это я просто чет маняфантазировать начал. Спасиб.

Посоны, мне к своему сервису который пишу на работе нужно прикрутить авторизацию, на данный момент стоит моя страшно велосипедная дичь.
Подскажите какую нибудь не сложную и современную библиотеку авторизации, которую можно и использовать в рабочем проекте, и глубоко поизучать.
188 1483714
>>483707
п.с.

В оппосте ОП ( да хранит его пророк и приветствует ) упоминает фреймворк Slim
Он подойдет для моих целей?
189 1483884
>>483707
https://symfony.com/doc/current/components/security.html
Но с нуля наверное трудновато будет это всё быстро настроить. Если уже работающий велосипед есть и он реально работает и к нему вопросов нет, то зачем менять?

>>483569

>Типа если :param не сущетвует (я его не передал) то тогда значение какое нибудь по умолчанию


Этим не пдо должен заниматься а код уровнем выше. Ты наверное и параметры запроса прямо из $_GET берешь? Можешь сделать свою функцию типа getInput($field, $default = null), куда вторым аргументом передавать дефолтное значение если $field == null, если у тебя готовый массив со значениями то можешь через array_replace поменять, где первый массив это массив с дефолтными значениями, а второй это пользовательский инпут(который всё равно нужно валидироватб ну ёп)
190 1484019
>>475112 (OP)
С понедельника ищу работу я решил, но совершенно не знаю как это делать, вводные, 20лвл без диплома, с военником, сделал магаз на пхп и еще 1 простой сайт сверстал, сам пхп вроде знаю, но не очень хорошо, немного трогал yii2, что в резюме писать? на какие вакансии откликаться? и как подготовиться к собесу?
191 1484044
>>483569

>Типа если :param не сущетвует (я его не передал) то тогда значение какое нибудь по умолчанию


Если тебе обязательно нужно делать поле со значением по-умолчанию, то БД вполне умеет ставить эти значения.
1484138161161842172.jpg26 Кб, 800x533
192 1484061
Вопрос о кошках-мышках:

>Собака прыгает на 2 клетки в 1 из 8 направлений, если там есть свободная клетка.


Это значит что она прыгает только на две клетки? Или может и на одну и на две в стороны? Это важно прояснить для определения границ, ибо если только на две, то в одной клетке от границы ход в нужную сторону уже не возможен. Вот как ниже, К - собака, допустим ходим вправо.
xxxxx
xxxКx
xxxxx
193 1484063
>>484019

>что в резюме писать?


Да пиши как все:
опыт 3 года
фуллстак
делал высоконагруженные коммерческие сайты
тут перечисли набор аббревиатур, которые хотя бы расшифровать можешь внятно если даже понимаешь зачем эта хуита нужна, то вообще топ-синьор
про вёрстку не пиши - программист-верстальщик только всяким васянским студиям с кабанчиками нужен, это даже не галеры - это дно веба
но то, что знаешь её это +
ну ещё чего-нибудь из личного добавь: если маме помогаешь, то пиши - ответственный и отзывчивый, если друзей много - пиши общительный, если тряпка и куколд - пиши уступчивый и тд

потом на собесе уже пояснишь, если спросят
3 года ты не сайты делал, а в скайрим играл, левой пяткой php.net читал
фуллстак у тебя не полный - без фронта и вообще ты вроде на бекендера пришёл устраиваться
высоконагруженные коммерческие сайты у тебя есть, но только в виде учебных проектов
ещё добавь, что ты напористый и давно интересуешься вебом

Верное средство - всегда помогает.
194 1484350
>>484063
У меня жир с экрана начал течь.
please be patient.jpg32 Кб, 400x400
195 1484503
Платиновый вопрос: как правильно заэкранировать символы при подстановке пользовательских параметров в SQL-запрос?

Да, я юзаю ебаный PDO уже хуй знает сколько лет, который все это делает автоматом, но тут попался такой случай, когда невозможно использовать prepared statements, ибо идет запрос в сторонний софт, который тупо принимает готовую строку SQL-запроса, где уже все должно быть подставлено.
Я уж забыл, как это вообще делается бля.
196 1484627
197 1484712
>>483714
анон, а в слиме нету авторизации вроде. Это просто роутер, то есть он тебе позволяет на введенный урл запустить какую-нибудь функцию, а функцию пишешь ты сам. Конечно будет проще писать админку, потому что у тебя будет место, где обрабатывать запрос типа my-site/админ, но обработчик ты сам делаешь. Если нет, пусть альфаги поправят
198 1484714
>>484061
Делай самый тебе удобный вариант, задачи можно по разному трактовать, главное делать
199 1484845
ОП часто заходит?
200 1485226
>>484712
Да я сразу почти посмотрел, нет авторизации.
Роутиг у меня и свой есть тоже всратый но работает, а вот авторизация моя на даже на фоне моего роутера - тот еще голлум-голлум
201 1485232
>>483246
Так я конкретно у того анона спросил, ведь он на удаленку залетел джуном.
202 1485236
Открываю новое окно через newWindow = window.open(...);
Потом сразу делаю newWindow.myVar = 123;

В отктытом окне написано console.log(myVar);

И это нихуя не работает в хроме, что я делаю не так???
203 1485256
>>483884

>>Но с нуля наверное трудновато будет это всё быстро настроить.


Ну да, модуль из симфони великоват.
Может знаешь какую нибудь популярную библиотеку для авторизации/регистрации. Или модуль security из какого нибудь не большого фреймворка?

Мой велосипед меня не очень устраивает. Пришло время посмотреть нормальный код на
ту тему.
204 1485277
Ы
205 1485357
У меня есть сайт с bootstrap 4. Нужно подключить к нему модуль, написанный с использованием bootstrap 3. Подключать сразу два бутстрапа нельзя, переписывать модуль под мой бутстрп лень. Как это вообще должно разруливаться по фен-шую?
206 1485360
>>485357
Да, и сразу добавлю, что в идеале мне вообще нужен код, который бы не зависел от версии бутстрапа. Это возможно вообще без полного перепиливания всех имён классов и айди на кастомные, которых нет в бутстрапе?
207 1485365
бутстрап не нужен
208 1485367
>>484845
Эпизодически. Чаще появляется к перекату, то есть к посту 500 или 600. Но сегодня конец месяца, зарплату дали, может появится
209 1485447
>>485360

>в идеале мне вообще нужен код, который бы не зависел от версии бутстрапа


Значит пиши руками.

>>485365
Вполне годный фреймворк для вёрстки.
Мне, например, медведь в глаза насрал и я в дизайн не могу, а тут из коробки нормальные шрифты и адаптивность.
Скорее это ты не нужен со своим мнением.
210 1485468
>>485232
Работаю на рашку, один из регионов, зп 40к.
211 1485844
Пытаюсь в ларавеле разобраться. Я правильно понял, что сервис провайдеры нужны, чтобы добавлять сервисы в контейнер? Или их еще как-то по-другому можно использовать, но как?
212 1485857
>>485844

Они могут еще какие-то вещи делать при инициализации, как описано в мануале: https://laravel.com/docs/5.8/providers

Я думаю, они для того, чтобы инициализация связанных между собой вещей (несколько сервисов и вьюшек) была не раскидана по коду, а находилась бы в одном месте.
213 1485864
>>485844
В провайдере ты можешь указать, что твой сервис должен вызываться как сингелтон. Ты можешь здесь указать какую реализацию использовать для вызываемого класса. Здесь же можешь указать, какие агрументы поступят на конструктор класса во время его инициализации.
214 1485876
>>485864

>сингелтон


это же уже как 1000 лет антипаттерн
215 1485881
>>485876
Ты прав, и лучше сингелтоном не злоупотреблять.
14276354936751.jpg83 Кб, 750x563
216 1486032
Вопрос на миллион сто раз поднимавшийся, в каком бы порядке ты, анон, имеющий опыт использования, расположил следующие фреймворки с оглядкой на распространенность у работодателя/эффективность/простоту изучения:
Yii, Symfony, Laravel
217 1486040
>>486032
yii и laravel встречаются примерно одинаково, может yii чуть чаще, но не намного. Симфони видел намного реже в вакансиях.
218 1486138
У меня есть файл, в который записываются сериализованные массивы. Потом файл считывается целиком и отправляется джава-скрипту. Нужно обработать эти массивы в цикле. Но там тупо одна строка. Можно ли её вообще разджисонить так, чтобы получился массив массивов? Я пока только придумал заменить в переданной строке все "}a:" на"}|a:", а затем превратить строку в массив строк по разделителю, и уже по ним делать цикл. Но как-то это монструозно.
219 1486156
>>486032

Ты бы мог посмотреть количество их упоминаний на hh

>>485876

В данном случае "синглтон" значит, что контейнер при втором запросе сервиса не создаст новый объект, а вернет созданный в первый раз. Таким образом, сервис живет долго и сохраняет свое состояние. Антипаттерном это не является, так как это формально не Синглтон, а лишь особенность контейнера. Синглтон принципиально запрещает создание 2 экземпляров класса. Данный подход не запрещает создавать их вручную или через второй контейнер.

>>485357

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

- засовываешь свой виджет в ифрейм
- либо ставишь всем классам в нем префиксы (вроде tb3-...) и руками нарезаешь из бутстрапа 3 CSS файл для них
220 1486164
>>486156

>засовываешь свой виджет в ифрейм


Нежелательно. Ломается статистика кликов и всё такое.
Я пытался выкусить из используемого бутстрапа нужные теги, а потом уменьшить, оптимизировать и переименовать, но плюнул. Нашёл другой модуль, без бутстрапа. Не такой симпатичный, но сойдёт. Теперь допиливаю его.
221 1486183
Кто нибудь пользовался библиотекой cartalyst/sentinel ?
222 1486282
>>478764

>Если такие ссылки тут запрещены, то ничем не могу помочь


Кто сказал что запрещены?
223 1486286
Вроде бы можно просто "дискорд/Mfk9QTa" добавить
224 1486288
Как думаете, насколько сложная задача?)
"На диске лежит файл image.png, размер 20000 на 20000. Вывести картинку как баннер размером 200 на 100 пикселей."

ебусь с Image magick, дочерними процессами. Сейчас думаю просто longpool сделать
225 1486289
Посоны поясните, почему в данной строке:

return $instance->{$method}();

имя метода в фигурных скобках?
еще не знаком с данным синтаксисом
226 1486333
>>486289
Это динамический вызов метода, где имя метода передается в фигурных скобках. Например у $instance есть методы first() и second(), а $method = 'first', ну ты понял, полезно бывает для пхпшной магии (гугли магические методы)
227 1486382
Аноны, сколько стоит ждать ответа на резюме?
228 1486397
>>486382
На hh пишет среднее время ответа работодателя.
+- 2 дня.
229 1486490
>>486333
А, понял, спасибо
230 1486634
А это нормально что я сделал резюме PHP-разработчика, указал какие технологии знаю, свой гитхаб, а мне звонят и приглашают менеджером по работе с клиентами работать? При чем я еще никому не кидал свое резюме, меня сами нашли.
231 1486647
Анончики, посоветуйте чо почитать по html, в шапке не нашел каких-то ресурсов конкретно по html, на курсере записался на курс мфти по теме, но учебник как то не могу найти.
233 1486652
>>486634
Лол. Похоже просто продаванов на холодный обзвон ищут.
234 1486743
Аноны, сайт для тестов с шапки много человек делали?
190 - 234 235 1486798
>>486743

Можешь поискать в архиве тредов по слову testhub: https://phpclub.tech/search/?q=testhub

>>486647

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

>>486289

Вообще, судя по мануалу (почитай его: https://www.php.net/manual/en/functions.variable-functions.php ), можно писать без фигурных скобок:

$foo->$funcname(); // This calls $foo->Variable()

Зачем нужны фигурные скобки, я сам не понимаю. Возможно, это связано с проблемами парсера в старых версиях PHP. В PHP7 парсер был переделан и текущая документация не упоминает скобки.

Посмотри описание изменений тут: https://www.php.net/manual/en/migration70.incompatible.php#migration70.incompatible.variable-handling

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

Скобки полезны в таких извращенных примерах кода (не пиши так):

$x->{$field['value']}

Без них это интерпретируется как

($x->field)['value']
190 - 234 235 1486798
>>486743

Можешь поискать в архиве тредов по слову testhub: https://phpclub.tech/search/?q=testhub

>>486647

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

>>486289

Вообще, судя по мануалу (почитай его: https://www.php.net/manual/en/functions.variable-functions.php ), можно писать без фигурных скобок:

$foo->$funcname(); // This calls $foo->Variable()

Зачем нужны фигурные скобки, я сам не понимаю. Возможно, это связано с проблемами парсера в старых версиях PHP. В PHP7 парсер был переделан и текущая документация не упоминает скобки.

Посмотри описание изменений тут: https://www.php.net/manual/en/migration70.incompatible.php#migration70.incompatible.variable-handling

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

Скобки полезны в таких извращенных примерах кода (не пиши так):

$x->{$field['value']}

Без них это интерпретируется как

($x->field)['value']
236 1486799
>>486288

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

При чем тут long poll (если ты это имел в виду), вообще непонятно. Она работает в браузере, а тут речь о серверном коде.

>>486282

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

>>486164

> Я пытался выкусить из используемого бутстрапа нужные теги



Если виджет небольшой, то можно просто открыть инспектор в браузере, прокликать все HTML-элементы виджета и в инспекторе посмотреть примененные к ним правила CSS, которые нетрудно скопировать.
237 1486800
>>486138

Ты страдаешь ерундой. То, что сериализовано, можно восстанавливать только через unserialize. А затем уже преобразовать в JSON и отдать скрипту.

Если ты хочешь сэкономить проц. время и скачивать файл аяксом без дергания PHP скрипта, то надо сохранять данные в файл не в формате serialize, а сразу в JSON.

Формат serialize недокументирован. Он может быть изменен в любой версии PHP без предупреждения. Не полагайся на него для долговременного хранения и не пытайся читать его чем-либо, кроме unserialize() в PHP. Используй JSON, CSV или другие форматы для обработки данных из нескольких языков сразу.

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

То есть если у тебя есть в коде объект вида (или он есть в какой-то из библиотек):

class X {
private $file;
function __destruct()
{
unlink($this->file);
}
}

то атакующий может с помощью этого объекта удалить любой файл на сервере, для которого хватит прав доступа.
238 1486801
>>485256

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

>>485236

> Открываю новое окно через newWindow = window.open(...);


> Потом сразу делаю newWindow.myVar = 123;



Если я правильно понял, ты ожидаешь, что сначала выполнятся эти 2 строки, а только потом будет выполняться JS-код в новом окне? Это не так. Это ошибка в твоих рассуждениях.

Вообще, JS-интерпретатор однопоточный и выполняет код последовательно. Но трюк в том, что в новом окне будет свой, независимый от первого экземпляр интерпретатора JS, свой экземпляр DOM (в общем, почти что свой браузер), и он будет работать параллельно с первым, и никаких гарантий, в какой последовательности выполнится код, нету. К моменту выполнения второй строки newWindow.myVar = 123 возможен любой вариант: HTML в новом окне полностью разобран, а JS код выполнен или же, наборот, HTML еще не разобран, а JS код не выполнялся или и то и другое сделано частично.

В теории JS-код в старом и новом окне (а также разбор HTML в новом окне, подгрузка CSS/JS файлов) может выполняться в любой возможной последовательности. Если у тебя многоядерный процессор (а сейчас трудно найти одноядерник), то он может выполняться полностью параллельно, на двух ядрах процессора.

Это создает кучу проблем:

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

Решение:

- передавать переменную через параметры URL окна (popup.html#x=1&y=2)
- опираться на какие-то методы синхронизации. Например, на событие load. Родительский код создает окно, дожидается события onload в нем, и после этого вызывает гарантированно существующий к этому моменту метод в дочернем окне.
- вызывать метод родителя parent.getMyVar() из дочернего окна
- использовать сообщения, postMessage (гораздо более красивый подход, но работает только в новых браузерах: https://caniuse.com/#search=postmessage ). Дочерняя страница загружается, шлет родителю сообщение get-my-var, в ответ на него приходит сообщение return-my-var с данными.
238 1486801
>>485256

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

>>485236

> Открываю новое окно через newWindow = window.open(...);


> Потом сразу делаю newWindow.myVar = 123;



Если я правильно понял, ты ожидаешь, что сначала выполнятся эти 2 строки, а только потом будет выполняться JS-код в новом окне? Это не так. Это ошибка в твоих рассуждениях.

Вообще, JS-интерпретатор однопоточный и выполняет код последовательно. Но трюк в том, что в новом окне будет свой, независимый от первого экземпляр интерпретатора JS, свой экземпляр DOM (в общем, почти что свой браузер), и он будет работать параллельно с первым, и никаких гарантий, в какой последовательности выполнится код, нету. К моменту выполнения второй строки newWindow.myVar = 123 возможен любой вариант: HTML в новом окне полностью разобран, а JS код выполнен или же, наборот, HTML еще не разобран, а JS код не выполнялся или и то и другое сделано частично.

В теории JS-код в старом и новом окне (а также разбор HTML в новом окне, подгрузка CSS/JS файлов) может выполняться в любой возможной последовательности. Если у тебя многоядерный процессор (а сейчас трудно найти одноядерник), то он может выполняться полностью параллельно, на двух ядрах процессора.

Это создает кучу проблем:

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

Решение:

- передавать переменную через параметры URL окна (popup.html#x=1&y=2)
- опираться на какие-то методы синхронизации. Например, на событие load. Родительский код создает окно, дожидается события onload в нем, и после этого вызывает гарантированно существующий к этому моменту метод в дочернем окне.
- вызывать метод родителя parent.getMyVar() из дочернего окна
- использовать сообщения, postMessage (гораздо более красивый подход, но работает только в новых браузерах: https://caniuse.com/#search=postmessage ). Дочерняя страница загружается, шлет родителю сообщение get-my-var, в ответ на него приходит сообщение return-my-var с данными.
239 1486802
>>484061

Я имел в виду, ровно на две и по прямой без изгибов: либо на 2 клетки вверх-вниз, либо на 2 в сторону, либо на 2 по диагонали.

Можешь сделать по-другому.

> ибо если только на две, то в одной клетке от границы ход в нужную сторону уже не возможен.



Верно.

>>483714

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

>>483569

Если у тебя ситуация вроде фильтров (показать все товары, где цена > 100 рублей, причем это условие может отсутствовать), то тебе надо собирать SQL запрос по кусочкам. Грязный способ: напрямую собирать куски строк, вести массив с параметрами:

if (передано условие мин. цены) {
$priceCond = ' AND price > :minPrice ';
$params['minPrice'] = $minPrice;
} else {
$priceCond = '';
}

Более правильный способ: использовать паттерн query builder:

$qb = new QueryBuilder;
$qb->select('*')->from('table');

if (передано условие цены) {
$qb->andWhere('price > :minPrice');
$qb->setParameter('minPrice', $minPrice);
}

$sql = $qb->getSql();

В примере я использовал библиотеку Doctrine DBAL (не путай с Doctrine ORM).

Заметь, что с QB код более чистый, хотя запрос стал менее читабельным, и появилась куча скобочек, стрелочек и прочего визуального мусора, затрудняющего понимание в сравнении с чистым языком SQL.
239 1486802
>>484061

Я имел в виду, ровно на две и по прямой без изгибов: либо на 2 клетки вверх-вниз, либо на 2 в сторону, либо на 2 по диагонали.

Можешь сделать по-другому.

> ибо если только на две, то в одной клетке от границы ход в нужную сторону уже не возможен.



Верно.

>>483714

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

>>483569

Если у тебя ситуация вроде фильтров (показать все товары, где цена > 100 рублей, причем это условие может отсутствовать), то тебе надо собирать SQL запрос по кусочкам. Грязный способ: напрямую собирать куски строк, вести массив с параметрами:

if (передано условие мин. цены) {
$priceCond = ' AND price > :minPrice ';
$params['minPrice'] = $minPrice;
} else {
$priceCond = '';
}

Более правильный способ: использовать паттерн query builder:

$qb = new QueryBuilder;
$qb->select('*')->from('table');

if (передано условие цены) {
$qb->andWhere('price > :minPrice');
$qb->setParameter('minPrice', $minPrice);
}

$sql = $qb->getSql();

В примере я использовал библиотеку Doctrine DBAL (не путай с Doctrine ORM).

Заметь, что с QB код более чистый, хотя запрос стал менее читабельным, и появилась куча скобочек, стрелочек и прочего визуального мусора, затрудняющего понимание в сравнении с чистым языком SQL.
240 1486803
>>484019

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

По собеседованию - начинающих гоняют по теории: PHP, ООП, SQL, с какими библиотеками/фреймворками работал, транзакции, нормальные формы в БД, HTML, CSS, JS. Гугли "задачи к собеседованию PHP, задачи к собеседованию веб-разработчика". Таких статей море и если ты хотя бы штук 5-10 прочтешь и внимательно разберешь (не заучишь ответ, а разберешься в теме) каждую задачу в них, то у тебя появятся реальные шансы на прохождение.

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

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

>>483322

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

>>483480

То есть ты просто не веришь, что люди могли изучить нужные технологии и найти работу?
241 1486805
>>480790

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

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

То есть этот ответ выглядит странно. Если у тебя есть веская причина не раскрывать свой возраст, то ты бы мог сказать: "по причине X, я бы не хотел называть свой возраст. Не можем ли мы провести собеседование без этого?" (например: "мне кажется, оценка моих знаний будет более объективной, если мы не будем оглядываться на возраст"). С большой вероятностью, правда, тебе ответят, что при заключении трудового договора будут переписаны твои паспортные данные с годом рождения и скрывать тут нечего.

Проще всего было назвать возраст и не комплексовать из-за него. Тебе 80 лет что ли? Или привести убедительную причину не раскрывать его.
242 1486836
>>486803
Спасибо за ответ, но резюме я уже написал, подсматривал как составляют другие и брал то что нравится себе, а теорию выписываю непонятные мне темы в блокнот и позже разбираю их.
243 1486839
>>486634
мне еще звонил робот приглашающий на работу в роботизированный колл центр
но вакансии при этом у них небыло
244 1486840
>>486839
Лол ну и дичь.
245 1486841
>>486839
вакансии только для роботов, сорри
ха-ха, мясной мешок
246 1486848
>>475112 (OP)

Сап, пхпшечка-куны, объясните пожалуйста:

Прохожу гайд, и не совсем понял по поводу массивов: в пхп такие структуры данных как массивы, списки, хэш-таблицы заменяются одними array? И они - один ответ на все?
247 1486862
>>486801

>Решение:


>...


так как в родителе сделать казалось бы логичную последовательность:

newWindow = window.open();
newWindow.someVar = 123;

и потом в свежем окне someVar давала undefined, то я пошел от обратного:

В родителе сделал:

//объявляю переменную до открытия окна
someVar = 123;
открываю окно
newWindow = window.open();

Потом в свежем окне вызываю её через:
someVarInNewWindow = window.opener.someVar;
Все заработало нормально.
248 1486863
>>486800
Спасибо за подробный ответ. Понял, что с сериализацией ошибся и переделал на JSON.
249 1486870
>>486798

>>Вообще, судя по мануалу.....


Да я уже понял. Спасибо за ответ.
Я выше задавал вопрос про библиотеку авторизации.
Выбрал cartalyst/sentinel, буду на ее примере разбирать авторизацию, а так же стиль нормального кода. Норм вариант?
2.png70 Кб, 593x307
250 1486879
Аноны, есть ли какая-нибудь библиотека с панелью редактирования текста, как на пике, которую можно подключить к голому php?
251 1486895
>>486870
судя по доке там все на статиках и хешкартах - это НЕ тот стиль к которому есть смысл стремиться
252 1486903
>>486895
Учту.
Однако другой библиотеки для авторизации я не знаю, поэтому буду смотреть как эта работает.
Если знаешь другие решения, то подскажи
253 1486932
>>486040
спс
254 1486938
>>486848

>в пхп такие структуры данных как массивы, списки, хэш-таблицы заменяются одними array?


Не знаю на каком языке ты пишешь, но в том же c# все вышеперечисленное это тоже один условный массив, просто с некоторыми обертками, надстройками и другим названием
255 1487169
>>486938
Он просто не интересовался структурами данных и алгоритмами их обработки.
2019-10-02 15.53.05 codepad.org ff66f6a3374a.png93 Кб, 652x723
256 1487190
Объясните тупому анону как решить через цикл for
http://codepad.org/WSrCiaIu
257 1487212
>>487190
Через массивы и двойной цикл. Первое что на ум пришло
258 1487214
>>487190
Дай ссылку на задание.
260 1487277
Есть один модальник, в котором пользователь может накликать галочек, потом он может нажать условную кнопку confirm и все это должно перезагрузить страницу.

Смысл в том, что если он ничего не накликал то я сразу могу перезагрузить страницу.

Если же он накликал там всякого, то я в цикле шлю аякс запросы, и после цикла у меня стоит перезагрузка страницы:

for () {
//аякс запросы
}
location.href = ...

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

Поэтому нужно что-то такое:
for () {
//аякс запросы
}
if (все запросы отработаны или вообще не посылались) {
location.href = ...
}

Как это можно реализовать?
261 1487301
>>487190
Тут как бы самому надо думать.
262 1487318
>>486799

>Думаю, подвох тут в требовании к памяти.


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

>При чем тут long poll, вообще непонятно. Она работает в браузере, а тут речь о серверном коде.


long poll в браузере? Там вообще-то с двух сторон. Браузер не должен виснуть, или сбрасываться в timeout, а php скрипт не должен завершиться прежде чем будет создан баннер.

https://github.com/readonly18/image_resize
Вот мое решение к задаче. Как думаете, пойдет?
Помогите плиз скажите что не так с задачей Лиличка 263 1487333
264 1487334
>>475117
Скажите пожалуйста что не так с задачей "Лиличка"
http://ideone.com/WExq8D
265 1487337
>>487333
Скидывай хотя бы усовия задания. Не думаю что людям в кайф его искать
266 1487339
>>480790
что это вообще за долбо%бы, которые спрашивают про возраст? так что-ли не видно... какого пола не уточняли?

зарплату сбивают

>>486805

>Мы обычно всегда отказывали, если были странности в общении


не странные? ) программисты?
267 1487340
>>487339

>что это вообще за долбо%бы, которые спрашивают про возраст?


Ну например если у них команда - 23-летние синьоры, а ты такой на джуна в 35 пришёл к ним. Логично, что ты просто не впишешься. И наоборот - синьор с молоком на девственных усиках пришёл зубрами командовать.
image.png141 Кб, 1346x695
268 1487352
Анон, может подскажешь что я сделал не так? Начинаю осваивать git, сделал первый коммит проекта, он вроде как загрузился. Почему в в ide у меня все красное нахуй? Как я понял красные файлы те, которые будут загружаться на гит, желтые файлы находятся в гитигноре. У меня теперь всегда название файлов цветными будут? Как от этого избавиться?
image.png3 Кб, 278x31
269 1487368
>>487352
Блядь, ничего не понял. Закоммитил через phpstorm, получил пикрил. Возможно это из за отключенной синхронизации файлов
270 1487377
>>487352
Красные файлы не индексированы. Ты сделал git add ?
271 1487382
>>487352
Смотри, красные файлы вне индекса, зелёные те, которые ты уже добавил в индекс гита, они будут добавлены в следующий коммит, белые(обычный цвет) те которые синхронизированы с репозиторием. Ты наверно только init файл добавил как гитхаб советует. Рекомендую пройти гайд на githowto, там достаточно подробно расписывают как все это работает.
272 1487386
>>487377
>>487382

Да, я делал файлообменник. Решил что пора начинать пользоваться гитом через консколь. Порядок действий такой
git init
git add .
git commit -m "Initial Commit" -a
git remote add origin pathname
git push origin master

На git залилось, но в phpstorm файлы стали красно-желтые.
Потыкал коммит в ide, все цвета вернулись на место, в ide-консоле закомитилось 0 файлов. Скорее всего просто нужно было синхранизировать файлы в ide (автосинхронизация отключена в целях экономии мощности железа).

Проблема решена, сори за тупой вопрос, спасибо за ответы.

>Рекомендую пройти гайд на githowto


Спасибо, попробую
Безымянный.png186 Кб, 1440x900
273 1487470
Такие деласо 2 раза выпало А еще нихуя не выводит, кто выиграл, ЧЯДНТ?
274 1487479
>>487470
Тебя exit не смущает посреди кода?
275 1487490
>>487479
точняк я думал типо 2 разных скрипта и так и надо, поправил - заработало
276 1487594
>>487352

> Закоммитил через phpstorm, получил пикрил. Возможно это из за отключенной синхронизации файлов



Ты наверно не сделал add сначала. В коммит отправляются не файлы из рабочей папки, а файлы из staging area (они добавляются туда с помощью add). Это позволяет делать частичные коммиты, не закоммичивая все файлы.

Если ты не изучал, изучи гит получше, и изучай его в консоли. Вот учебник на русском: https://git-scm.com/book/ru/v2

Изучать гит надо в консоли, так как там ты видишь, какие команды ты пишешь, и какой на них приходит ответ, так же ты всегда там можешь набрать git status. После того, как ты изучишь гит, ты можешь переходить на инструменты с графическим интерфейсом. Не разобравшись в гите, ты им нормально пользоваться не сможешь.
277 1487610
>>487318
Бамп
278 1487614

>Ты наверно не сделал add сначала


Да, скорее всего. Потом за меня ide добавила

> Вот учебник на русском


Собирался, но пока не уверен что есть время дабы читать учебник по гиту (нет необходимости в таком доскональном знании). Столько всего выучить нужно, гит на уровне "залить/обновить проект" нужен.
В шапке учебник 2009 года. Если этот лучше, может заменить?

>Изучать гит надо в консоли


Угу. Мне после установки линукса даже нравится в консоле работать.

Аноны, может кто в двух словах отписать на каком уровне нужно знать верстку/js фуллстаку и чисто бэку?
Правильно ли я понимаю, что если я изучаю laravel, мне нужно изучить еще и vue, bootstrap?
279 1487631
>>487277

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

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

- https://learn.javascript.ru/promise-basics
- https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise
- https://promisesaplus.com/

Не забудь также правила работы с аяксом, которые мало где пишут: https://github.com/codedokode/pasta/blob/master/js/ajax.md

А именно:

- индикация прогресса
- обработка ошибок
- возможность повторить запрос при ошибке, если это возможно и имеет смысл
- блокировка формы на время отправки данных для защиты от повторной отправки
-
280 1487633
>>487277
асинхронность и цикл проще всего сделать через async await, прямо как обычный код пишешь только добавляешь await перед запросом

иначе придется немножко помучиться
второе по удобству это Promise.all

примеры и того и другого легко найти на stackoverflow
image.png20 Кб, 736x96
281 1487634
>>487614
И еще. Есть ли смысл делать такие роуты? Или изменение статуса/аватара стоит запихнуть в ProfilesController? Во всех 3 контроллерах по 1 методу.
282 1487645
Чем отличаются эти запросы:
Первый: SELECT FROM a, b WHERE a.id=b.a_id;
Второй: SELECT
FROM a JOIN b ON a.id=b.a_id;

Действительно чем, они ведь идентичны не?
283 1487704
Предлагаю внести в шапку

phpthewrongway.com
https://github.com/dypsilon/frontend-dev-bookmarks
284 1487716
>>487645
В первом у тебя вторая половина курсивом, а во втором - первая. И ещё JOIN.
285 1487720
Кто что может сказать про Observable паттерн? Как оно в жс, пхп?
286 1487728
>>487704
у меня встал и вышел из комнаты
287 1487745
>>487340

>> 23-летние синьоры, а ты такой на джуна в 35 пришёл к ним



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

Будучи за 30 уже стремно приходить совсем-джунома я так как то ходил на собес, я тогда ток JS знал, поверхностно. С ноля реальный вкат если не пинать хуй - +/- полгода. Через полгода sql, php , js и общую логику построения вэб-приложения можно понять, и начать говнокодить свои говноприложения. Если человек после 30 вкатывается больше года, при условии что у него много свободного времени 3-4 часа минимум, и нихуя реально пусть и хуево написанного показать не может - то нахуй такой человек не нужен в конторе. Потому что этот человек еще не преодолел ключевые психические косяки лень, инертность , неорганизованность и прочее - а значит ничего толкового от него не жди.

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

Потому что личность человека - это больше чем его навыки. Навык можно набрать, а вот личность, привычки, особенно после 30 что бы исправить - это нужно реальную силу воли приложить. Я знаю.
288 1487750
>>487340
хуйня надуманная если честно

>>487745
большинство великовозрастных вкатывальщиков меняют профу а не бывшие хикки домоседы как ты
289 1487774
>>487745
Как Теклид говорит.
- Не тратить время ни на что кроме кодинга в рабочее время.
- Обед желательно иметь под рукой и не отвлекаться от кодинга.
- Планировать все дела и создавать окно для внешних дел после чего возвращаться к работе.
- Все сериалы, игры и подобное оставляю на вечер, и то на них времени не будет потому-что вы будете заняты делами по дому в свое время. Или максимум одну серию посмотрите.
И только тогда можно чего-то добиться.
290 1487775
>>487745
Только недавно осознал, что я нихуя не делал год. Хотя мог бы уже писать какие то приложения...
291 1487781
>>487750
Я не хикки домосед, совсем. Я из сис-админов перекатываюсь.

>>487774

>>И только тогда можно чего-то добиться.


Так и есть.

>>487775
Самое смешное что за месяц можно прогрессировать так, как за год порою не сможешь.
292 1487814
>>487781

>Самое смешное что за месяц можно прогрессировать так, как за год порою не сможешь.


Во-во, все что требуется это посвящение времени. Днем учиться/работать, вечером заниматься своими делами и остужать мозг.
Иногда просто заносит в дебри и сам не осознаешь как проходит время которое ты мог бы посвятить работе на всякие глупости которые не принесут выгоды.
Как научиться вот этой дисциплине? Я уже понял что планировка это самое лучшее средство для прогресса. С вечера записывать всё на чем остановился и ставить какую то месячную цель. Разбивать на подцели пока не станет просто и понятно. Качаться по принципу какой нибудь рпг, становиться сильнее.
Алсо еще самый трудный момент который сложно отследить это практика своих знаний. Я могу ошибаться, но в этом треде кто-то говорил что 80% должно быть практики и 20% теорий которую ты туда тут же вкладываешь.
Простите за простынь.
293 1487822
Как в математике вот, ты забудешь всё что изучал если не будешь разбивать примеры или решать задачки. Практика, практика и еще раз практика. А то люди выходят из университетов некоторые и говорят что ничего уже не помнят, а всё потому-что не прикладывали возможно знания схваченные с лекций за день на практику или исследование дома.
Точно. Механики например без опыта, как им понять как работает двигатель если они его не разбирали на запчасти? Даже если им объяснили пример и они его поняли, все равно процесс его разбора поможет тебе закрепить знания.
294 1488001
>>487750

>хуйня надуманная


Хуйня надуманная это ты, а мне впизду не тарахтело с малолетками работать например.
295 1488034
>>487774
Этих петухов нельзя слушать, согласиться можно только с не пинать хуи - остальное нахуй, надо свои права защищать и пора бы уже погроммистишкам вылезти из штанишек и какой-нить профсоюз создать. Проходили - они все больше и больше будут требовать, потом уже играй на дуде как клован, ходи по канату, знай индийский и еще 100500 языков и фреймворков.
296 1488040
>>487631
>>487633

Спасибо, в итоге сел разобрался с промисами на зачаточном уровне.

В модалке пользователь мог чему-то накликать событие send, а чему-то cancel
Сделал так что у меня когда пользователь сабмитит модалку, то создаются 2 промиса.

Соответственно промис резовится либо сразу если нечему send/cancel делать, либо когда последний аякс рапортует о комплите. Далее у меня Promice.all в который я кормлю оба этих промиса и когда они оба выполняются, то все перезагружается с дальнейшими гет-запросами.
297 1488101
Дайте какой-нибудь пример канонично сделанного сайта, чтобы смотреть как он устроен и делать так же. Перекатываюсь с "нормального" языка и хочу узнать паттерны и прочее
298 1488109
>>476314
А новее есть хороший материал по битриксу?
299 1488113
>>487716
На собесе был такой вопрос. Сказали что разница существенная, а не просто синтаксис разный.
301 1488192
>>488101
Тебе нужен не сайт, а скорее фреймворк типа Laravel или Symfony.
302 1488260
>>488101
Ебани какой нибудь гайд "пишем MVC фреймворк бесплатно без смс"
303 1488261
>>488163
То есть разница только в том, что с join более читаем запрос и нужно отделять объединение таблиц и фильтрацию, я правильно понял?
304 1488268
>>488261
Да чушь какая-то, с точки зрения реляционной муры все одно и то же выдается, а по скорости все будет одинаково потому что соптимизируется в один код, короче пошли они нахуй
305 1488272
Отправил резюме на вакансию мне сказали сделать 2 задачки:

Первая на диске лежит файл image.png, размер 20000 на 20000. Вывести картинку как баннер размером 200 на 100 пикселей.
Обратите внимание на размер и пропорции.

Я сделал так, создал блок div, добавил ему стили width:200px; внутри блока разместил картинку со стилями max-width 100%; height: auto; картинка получилась 200 на 134 пикселя, зато не проебаны пропорции, не знаю правильно ли решил.

Но вот мне интересно как вы бы решили задачку с изображением?

Вторая задачка с массивом и нужно было вывести количество последовательных пар одинаковых элементов, но она простая с ней проблем не возникло.
306 1488275
>>488268
Ну работодатель наверно хочет услышать ответ в духе, что лучше использовать запрос с join, там где идет объединение таблиц, так как он более читаем, а where применять при фильтрации результатов, по крайней мере я бы так сказал на собесе.
307 1488287
>>488272
Тут можно было max-width применять сразу к img тегу. А в задании не уточнялось, что ты должен уменьшить изображение силами php?
308 1488289
>>488287
В задании сказано только html/css использовать.
309 1488293
>>488287
А и max-width я к img и применил, то есть такая структура получилась:

<div style="width: 200px;">
<img src="image.jpg" style="max-width: 100%; height: auto;">
</div>
310 1488294
>>488272
Background-size: cover
311 1488296
>>488289
Тогда либо через html атрибуты width и height, или css свойство max-width и max-height, тут больше нет способов.
312 1488299
#image {
width: 200px;
height: 100px;
object-fit: cover;
}

что-то какие-то легкие задания да еще и про ксс дают вкатывальщикам
хорошо быть студентом наверное
313 1488301
>>488272
алсо втф

>файл image.png, размер 20000 на 20000


>картинка получилась 200 на 134 пикселя


>не проебаны пропорции


без кропа что-то тут не так
вот это картинку не кропает >>488293
т.е. картинка не была изначально квадратом
314 1488311
>>488299
Спасибо, про это свойство я не знал, но это не тестовое, а просто чтобы резюме просмотрели нужно эти задачки сделать и отправить им.
315 1488521
>>488299

>хорошо быть студентом наверное


хорошо кичиться тем что знаешь чуть больше студента наверное
316 1488580
Сап двач. Посоветуйте какую-то тему для проекта, хочу на симфони сделать чтобы хоть на собес позвали, на гитхабе только ларавел проекты не очень хорошего качества. Хочу попробовать за 1 день сделать какой-то круд с тестами, очередями и вот этим всем, шоб солидно было, тестхаб от опа наверное больше времени займет хоть предметная область и очень интересная
317 1488582
Ребят. А на верстке подзаработать хороший вариант как для заработка так и для обучения?
318 1488609
>>488580
в одной конторе предлагают такое:
сделать полностью с нуля на пхп мвц приложение
публичный список задач с прикреплением картинки
к нему админку где их можно отмечать и удалять
из стороннего можно использовать только бутстрап для верстки

вот можешь попробовать сделать на симфе _солидно_
319 1488610
>>488609
ну и да лимит один день
а с симфой то тебе по идее гораздо быстрее
320 1488646
ОП, нужна помощь в решении задачи "Навигатор", буксую на месте не могу понять в чем проблема. То она по одной точке топчется прежде чем двинуться на другую станцию, то прыгает по несвязанным станциям, то вообще не запускается в дебагере. Фикшу одно - ломается другое. https://3v4l.org/M6KOc
[Ссылка]
M6KOc
https://3v4l.org/M6KOc
321 1488654
Какого типа данные должны показываться при загрузке видео/аудио/изображения на файлообменник? Название, расширение, размер понятное дело. Из того что получаю с помощью getid3 есть вариант сохранять продолжительность видео/аудио, разрешение, битрейт. Но нужно ли это?
322 1488657
>>488272
Хаха, деанон по городу и конторе. Я не знаю берут ли там только одного, или несколько человек, но было бы прикольно устроить там двач тусовку.
323 1488662
>>488657
город начинается на В, а контора на Ин?
324 1488668
>>488657

>но было бы прикольно устроить там двач тусовку


Согласен, будем на этой тусовке няшить тебя в пукан :3
325 1488675
>>488668
Хотел тебе скинуть свое решение, но ты какой-то ебанутый. Так что иди нахуй
bac440bd-c686-441f-9af7-c2be001f9c07.jpg53 Кб, 640x360
326 1488679
>>482568
Продублирую, чтобы ОП не забыл посмотреть.
327 1488756
>>488657
Я и не скрывал ничего, все равно работать с 1с-битриксом особо не хочу, просто для интереса сделал задачки.
328 1488757
>>488675
Да выше уже все решили.
image.png821 Кб, 1080x1080
329 1488955
Привет, анончики. Нужен фронт-энд разработчик в стартап проект. Тележка для связи: @madmadnez

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

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

У нас продуманы концепции инструментов, на которых будет функционировать будущий сервис (они раскроют намного больше возможностей), разработана дорожная карта, составлен бизнес план формата UNIDO, сформирована команда единомышленников — людей самых разных навыков, которые двигают разработку. Мы пока в начале пути и привлечь нам удалось лишь 106к рублей инвестиций — мелочь, но мы набираем обороты. Совсем недавно в сырой версии выкатили презентационный сайт, который активно допиливается. Сейчас переходим к этапу малой маркетинговой кампании. Все члены команды, которые вносят вклад в развитие проекта впоследствии получат справедливую долю в компании. Однако, и уже сейчас мы стараемся платить какие-то деньги, из идущих инвестиций, согласно потребностям людей, и приобретать необходимые для эффективной работы вещи. В ближайшей перспективе планируем перекатываться на иностранный рынок.
330 1488963
>>488955
Вы планируете использовать линейное программирование в стартапе? А симплекс-методом пользоваться планируете? Готовы пожертвовать первоначальными интеллектуальными вложениями на благо будущего проекта?
331 1489079
>>488955
оптимизировать экономику планеты без фронта нереально
без пышных лендосов инвестиций не дождешься жеж!
332 1489100
>>488955
Сейчас бы искать рабочих на дваче.
333 1489103
>>489100
сейчас бы подписываться на проект какой-то шняги, который аж 108 тысяч рублей инвестиций собрал
334 1489106
>>489103
108 000 руб звучит серьезно
335 1489191
>>488955
Шизоид, тебя скоро банить начнут. Хватит на доске срать.
336 1489442
Я понимаю, что всех заебали подобные вопросы, но как лучше вкатиться в веб, через пых или шарп? Шарп нравится из-за вижуалки, опенсорц, писать можно не только веб, статическая типизация, элементы ФП. С другой стороны, пых вроде как дефолтный выбор для бэкенда. Пхамагите.
337 1489472
>>489442

>как лучше вкатиться в веб


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

>Шарп нравится из-за вижуалки, опенсорц, писать можно не только веб, статическая типизация, элементы ФП.


Я конечно наверное не прав, но то что ты написал выше - чушь ебаная, а не критерии выбора языка. Не могу представить как вкатывальщика такие вещи как статическая типизация, опенсорц и прочая чепуха ебать должна.
338 1489474
>>489442
На пхп много вакансий для начинающих, но эдак 60% это веб-студии, клепающие джумлобитрикс хуйню, это не лучшее введение в бэкенд. И фронт в таких конторах это не смузиреакты, конечно, а тупое верстание с краденными жквери кнопками. Шарп же в другой ситуации, вакансий полно вроде, но именно в вебе эдак половина-треть, из них для начинающих не то что и много остается. Зато компании обычно нормальные, серьезные, не ИП Оганесян.
339 1489479
>>489472

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


Лол, а что меня ебать должно?
К статической типизации я привык, т.к. пишу для себя и для учебы на плюсах. Опенсорц -- потому что можно взять и без задней мысли посмотреть исходники библиотек без задней мысли. Да, не факт, что мне это вообще понадобится, но сама возможность впечатляет.
ФП мне просто нравится само по себе, хотя я и не то, чтобы в нем очень прошарен.
>>489474
Спасибо.
340 1489486
>>489479
Меня как вкатывальщика ебет кол-во работы в моем городе и нужный стек технологий для этой самой работы. php надоест или понадобится что то другое изучить - изучу. Или ты 20 лет на одном c# , php сидеть собрался?
341 1489493
>>489486
В моем городе кроме крестов нихуя нет, я надеюсь перекатиться в дс2, т.к. он в трех часах езды отсюда.

>Или ты 20 лет на одном c# , php сидеть собрался?


Через 20 лет не факт, что шарп и пых будут актуальны, лол.
342 1489499
>>489493
Ну ты так вопрос задал, будто не язык для старта выбираешь, а жену с которой тебе ближайшие 20 лет жить и детей растить.
343 1489505
>>489499
Ну хорошо.
344 1489673
Вот и я вкатился, хотя читал истории успехов и не верил, что тоже могу. Год сидел с вами. Как только запилите простой круд типа студентов, сразу идите на собесы и не ссыкуйте.
345 1489674
>>489673
Да, ОП, огромное спасибо, я думал, что нихуя не знаю, но на собесах сказали, что очень хорошая база для джуна и шарю в деталях, почти все благодаря твоим пастам и задачам.
346 1489676
>>489673
Что умеешь, учил ли фреймворки? С SQL как дела, с версткой?
И удачи тебе, анон.
347 1489682
>>489676
Сделал студентов и почти файлообменник, sql и верстка достаточно норм были, фреймворки особо не трогал и на собесах их не спрашивали, начал только лару учить перед собесами. Много читал по сетям, алгоритмам, это кстати помогло на собесах. Было даже несколько оферов на пыху, но вышло, что я пошел не на php, потому что фирма хорошая и готовы научить рубям, пилят свой продукт давно уже.
348 1489835
Я раскидал резюме по разным конторам, вот в одну пригласили на собес в понедельник, я обрадовался, но щас проверил это кароч веб-студия, сотрудников там очень мало, инфы о ней никакой практически нет, как-то странно, есть только 1 сайт сделанный их руками какого-то ресторана на 1с-битриске и все, что думаете идти? Зарплата хорошую предлагают, выше чем в 'нормальных' конторках, может ли там вообще какой-то наеб быть?
349 1489840
>>489835
Бабье нытье какое то.
Сходи и узнай что к чему.
350 1489844
>>489840
Ну я схожу, просто интересно что ждать, может кто-то в такие студии устраивался и расскажут подводные.
351 1489885
>>489844

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

Единственный совет - иди, и держи ушки на макушке.
352 1489916
Хочу сказать что этот ваш слим прям пипец похож на express.js для ноды
353 1489955
>>489916
п.с.
Почитал - такой подход микро-роутеров пришел с руби-фреймворка Sinatra. С тех пор такие фреймворки почти одинакоы везде.
354 1490008
>>489885
Я нагуглил страницу владельца веб-студии, вообщем он социоблядь и качок, мне кажется общий язык мы с ним не найдем, но все равно схожу, я же без опыта и образования, может вообще мой единственный шанс.
355 1490046
>>490008
Прости, но ты дурак.

>> вообщем он социоблядь и качок


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

Иди обязательно. Бонусом будет как раз знакомств с этим человеком. Как он себя ведет, как говорит. Окружай себя не двачерами а нормальными людьми по возможности.
356 1490057
>>489955
>>489916
Для меня первее был фалькон, но мысли такие же возникли про слим потом. Просто трудно придумать проще и логичнее подход я думаю. Потому что для роутинга всегда придется делать как минимум две вещи: парсить урл и вызывать что-то соответственно распарсенному.
357 1490065
>>490046
Спасибо за ответы, все таки схожу, думаю если что то перекачусь с битрикса куда-нибудь поинтереснее.
358 1490206
>>490057
На данный момент у меня есть со slim определенные проблемы.
Так как я не хочу портянку из роутов на каждый url - то я допустим на "user/login" вызываю контроллер User и метод Login. И уже в контроллере\модели все действия провожу.
Трабла возникла с тем как из контроллера произвести допустим рендер другого представления, или реализовать редирект куда угодно.
359 1490209
>>490065
Будь инициативным и решительным! Удачи, отпишись потом чтоле.
360 1490336
>>490206
Хм, покажи, пожалуйста, как это выглядит у тебя? З.ы. мне вот наоборот удобнее, когда роуты в одном файле и все перед глазами. Например в первом ангуляре писался от этого, а вот во втором сейчас требуют разносить все по модулям, невозможно сразу прикинуть дерево урлов, такая боль.
361 1490363
>>490336
С тем вопросом разобрался, просто в контроллер нужно $this передать а я $app передал, а он отказывается работать.
Весь день сегодня развлекаюсь с этим фреймворком.

Вот обработчик роута:

https://ideone.com/MnQeDZ

Там по тексту еще пара вопросов, может ответишь.
362 1490413
>>490363
Тебе не надо use, по крайней мере в твоем коде. Вот из документации даже:

>>If you use a Closure instance as the route callback, the closure’s state is bound to the Container instance. This means you will have access to the DI container instance inside of the Closure via the $this keyword


у тебя как раз замыкание.
Возвращать в роутах в принципе ничего не нужно, это где ты такое прочитал?
363 1490591
>>490363
Анон, это пиздец, что это за велосипед? У тебя же есть готовый роутер, зачем-ты поверх него своё говно делаешь? Объясни чем "портянка" из рутов хуже твоего кода? Ты понимаешь что твоё поделие невозможно дебажить?

>в документации вроде сказано что $response обязан быть возвращенным


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

>$response = $this->view->render(...)


то это по идее не сработает потому что ты перетираешь ссылку, по логике такой рут отдаст скорее всего дефолтный ответ типа 200 ОК, который приложение дало тебе в контроллер, но ссылку на который ты перезаписал другим ответом. Проще наверное просто return new Response(...) писать
catPNG132.png243 Кб, 500x433
364 1490764
ОПушка, проверь файлообменник, пожалуйста. Анончики, будьте добры, оцените.

http://catslovephp.ru/ - сайт
https://github.com/medbrat13/jesus-saves-your-file - код

Прошу, не загружайте слишком большие файлы, VPS не резиновый.
365 1490771
>>490764
Писать контроллеры в замыканиях роутера - не лучшая идея, как по мне. Там есть удобная возможность вынести это в нормальные классы, да и инициализацию сервисов тоже можно в отдельный файл убрать.
У тебя слишком много разной логики в index.php находится.
366 1490773
>>490591

>Анон, это пиздец, что это за велосипед?


Удвою. Выглядит дико.
367 1490777
>>490771
Понял, спасибо за отзыв.
368 1490793
>>490591
>>490773

>>Объясни чем "портянка" из рутов...



По фану, я по итогу и контроллер динамически вызываю. Короче по итогу два роута get и post. Ясен пень что такую структуру кода применять нельзя. Скачать boilerplate и сделать все как нужно не велика беда.
369 1490816
Котятки, совет для тех кто только начал изучать фреймворк:

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

YAGNI, KISS, SOLID
371 1490821
А как передавать через контейнер класс, у которого лишь статические методы? Я вот хочу класс, управляющий куками передать в контроллер, получается мне нужно строчку с названием класса передать? Как тут тогда будет сохраняться соблюдение типов?
372 1490835
>>490816
А руки перед едой мыть нужно?
Я бы сказал котятки, ебаште как можно больше кода, Господь своих разберет
ток не нужно для коммерческих приложений велосипедить
373 1490932
Объясните плиз на пальцах, что такое middleware в Slim? И примерчик, если можно.
374 1490974
>>490835

>ток не нужно для коммерческих приложений велосипедить


Как ты научишься не велосипедить, если не понимаешь как правильно хотя бы потому, что в петах говнокодишь постоянно?
375 1490977
>>490793

>По фану


Если по фану, то нормально форкай и переписывай местный роутер на динамический вызов, а не пиши этот бред поверх старого.
376 1490987
хочу запилить спа сайт.
но есть вопрос,чтобы не тащить все тяжелые фреймворки,можно ли к голому каркасу подключить пару пакетов(или как там)-работа с бд и работа юзерами-регистрация и вход?
377 1490999
>>490987
ты какие фреймворки имеешь ввиду?
спа без фронтэнд фреймворков сделать конечно можно, но очень велосипедно, ну а бэкэнд фреймворки не нужны особо
378 1491007
>>490999

>бэкэнд фреймворки не нужны особо


Тогда попробуй сделать спа на бутстрапе, лол.
379 1491010
>>491007
бутстрап это ксс фреймворк, к бэкэнду не имеет отношения
380 1491016
алсо спа по своей сути подразумевает что большая часть нагрузки ложится на динамически меняющий страницу фронт, а от бэка нужен самый минимум вроде запросов к бд
381 1491022
>>490999
фронт-ангуляр будет,вопрос про бэк
382 1491035
>>490987
>>490999
Вы так говорите как будто разница между апи и фулвеб это просто 1 миллион зависимостей, хотя там по факту только шаблонизатор явно не нужен. Хотя я как-то пробовал использовать Lumen (это от создателя Laravel) который вроде как микрофреймворк и весь такой для апи, и охерел просто от того как всё неудобно потому что половину функционала даже с регистрацией разных зависимостей выпилили и перепилили, подозреваю что это потому что некоторые компоненты сильно завязаны на фреймворке и отдельно их не получается использовать.

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


можно
Я бы лучше начал с симфони 4, в котором вообще кроме http basics ничего нет, для юзеров тот же security компонент юзать а для дб как вариант dbal или полноценную орм если нужно.
Зачем нужен тот же слим, когда есть симфоня 4 я тоже пока что не понял.

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


по сути одни и те же операции только данные в разных форматах возвращаются
383 1491042
>>491035

> симфони 4,


тяжеловесный монстр
384 1491075
>>490977

>>Если по фану, то нормально форкай


Вот поуказывай мне еще, зануда :)

>>490974
Это демагогия все.
У дзен вкус середины.
385 1491078
>>491016
Угу, то то там холивары идут, сколько данных тянуть с сервера, фильтровать их на бэке, или уже во фронте, и все такое. На хабре срачи почитай. Вообще фронт это срач на сраче, потому что пубертатные 22 летние "сеньеры" на 90 % озабочены манифестом своего эго, а фактически работа им до пиздбы.

Я это вижу так, когда SPA - бэк отдает онли данные. Вся разметка и логика с ней связанная уже на фронте. Функционал динамического отображения перетек на фронт.
386 1491083
>>491078
мне кажется что большой разницы обрабатывать данные на фронте или на бэке нет, это все равно спа если вместо шаблонов происходит манипуляция дом деревом одной страницы чтобы ее переделать в совершенно другую
387 1491086
>>490987

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

Одно дело, если это какой-то сайт со статьями, на который люди приходят из гугла, читают статьи, комментируют и уходят. Зачем тут SPA? Оно лишь замедлит загрузку сайта.

Другое дело, если это, например, редактор электрических схем, мессенджер или система для какой-то отчетности (вроде задач для курьера или поквартирного обхода). Тут, наборот, SPA нужно, так как тут есть высокая интерактивность, нужно хранить данные на клиенте, может пропадать интернет.
388 1491087
>>491086
в чем усложнение? статьи хранишь в бд, тем же реактом генеришь страницу и дергаешь на нее из бд текст статьи
на бэке тебе буквально нужно только отдача статики и запросы к базе данных и все
389 1491088
>>491087

В том, что больше работы для выполнения той же задачи. И как правило это тормозная загрузка, особенно на слабых мобильных телефонах, хотя в теории есть разные техники, чтобы избежать тормозов (вроде не использования тяжелых огромных библиотек и впекания части JSON данных в тело страницы. Но это опять же лишняя и непростая работа).
390 1491089
>>491088
не вижу в чем тут больше работы, не надо возиться с шаблонизатором и такое простое спа любой телефон отрендерит на ура
391 1491090
>>491088
Разделение клиента и сервера позволяет больше использовать кэширование. При правильной реализации время загрузки данных уменьшается.
392 1491109
>>490209
Вообщем съездил на собес, меня у дома встретил владелец студии, повел в подвал где она сама и находится, зашел в небольшую комнатку, в которой 3 человека сидели 1 тянка и 2 куна, я поздоровался с ними, затем он меня посадил за свободный пк, скинул тестовое, там были просто 15 вопросов по ооп, надо на время выполнить и еще один по основам php, но он не запустился хех, в итоге сделал 11 из 15, потом он скинул мне курс по битриксу, сказал как пройдешь, сделаешь тестовое оттуда, скинешь на гитхаб и мы оценим, еще добавил что могу уже сейчас к ним ездить и этот курс здесь проходить, задавая вопросы если что или дома и тоже можешь звонить или писать в телеграмм, я выбрал второе, так с завтрашнего дня сяду за этот курс, а дальше посмотрим как пойдет.
393 1491150
>>491090

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

Твои рассуждения насчет "легкости" SPA скорее всего тоже теоретические. Если тебе хочется обычный сайт, но с аяксом вместо перезагрузки, то просто возьми легкую библиотеку pajax https://github.com/MoOx/pjax и не усложняй себе жизнь.
394 1491152
>>475112 (OP)
гшгшгшгшгшгш
395 1491185
>>475112 (OP)

Сап, анончики, а должна быть какая-то специализация внутри выбранного языка? Вот скажем, если мне нравится учить sql и работать в linux, я могу в резюме как-то по-особенному это отметить? И вообще есть ли смысл джуну зеленому выебываться тем, что он что-то "знает" лучше, чем что-то другое?
396 1491191
>>491150
какое говно только не посоветуют...
397 1491201
>>491010
Ты сам сказал, что для спа бэкенд не нужен особно - вот и пили. Алсо, там не только ксс, но и жикуери есть, так что вполне полноценный вронтенд.
398 1491204
>>491201
ты хоть сам себя понимаешь?
при чем тут бутстрап? спа фронтэнд фреймворки это реакт, вью, ангуляр, свелте и т.п.
399 1491207
>>491204

>это реакт, вью, ангуляр, свелте


Там бекенда вполне достаточно, если ты не знал.
400 1491208
>>491207
анон ты бредишь
401 1491210
>>491109

Молодец, поздравляю!

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

А так, желаю удачи!
402 1491211
>>491208
Просто ты имеешь мнение о том, чего не понимаешь.

Тебе данные на фронт аллах присылает что ли? Все фронтенд фремворки используют бэкенд, а некоторые с той же нодой сразу идут.
403 1491216
>>491211
не понимаешь тут не я а ты
я сказал что бэкэнд фреймворки не особо нужны а не то что бэкэнд не нужен
я пхп не помню толком (я джаваскриптер) но иирк ему не нужен фреймворк например для запроса базе данных и возвращения джейсона
кроме того, спа можно иметь полностью серверлесс, например с помощью амазона, база данных в облаке и всё такое
а если взять сотовый телефон, там реакт тот же может бд и другие ассеты держать прямо на телефоне т.е. в клиенте

р при чём тут бутстрап
404 1491218
Как обычно реализуют крупные проекты, где допустим sitename это просто олдскул ларавельный монолит с блейдом, а sitename/draw это spa для рисования, которое дергает sitename/api/draw, ну и так еще какой-нибудь монолит love.sitename и spa sitename/play. Все эти мало связанные приложения через несчастный фронт контроллер index.php с rewrite rule идут? Или разносят по разным серверам вообще
405 1491229
ананасы, кто-нибудь сталкивался с неточностями отслеживания кампании в Google Analytics?
Например, в письме с рассылкой от нашего сайта есть ссылка: http://dvachery.com/advertisement?utm_campaign=ananas_express&utm_source=newsletter&utm_medium=email

В статистике Гугла 50 переходов, в нашей личной статистике 100 переходов. Почему может быть такая разница?
406 1491273
>>491216

>>я сказал что бэкэнд фреймворки не особо нужны а не то что бэкэнд не нужен


У тебя проблема с пониманием понятия фреймворк, как мне кажется.
Ты сейчас что то типа деления на ноль сделал. Фреймворк - просто структура, определеная под задачу. Нельзя по сути сказать - фреймворк не нужен, а бэкенд нужен. Потому что в сущности любой переиспользуемый код - это фреймворк. Ничто мне не мешает навелосипедить свою авторизацию, и пихать в каждый свой проект. Чем не фремворк.
У реакта типа свои задачи, что не мешает тебе накатать свой реакт, со стейтами и пропсами, не помню че там еще есть. Давно на нем что то делал.
407 1491290
>>491109
как пиздато жить в городе
408 1491294
>>491216

>база данных в облаке и всё такое


В результате у тебя вся логика на клиенте. С таким же успехом можно сказать, что фронтенд фреймворки не нужны и всё делать на бэкенде.
409 1491306
>>491229
а ты какие заходы считаешь?
гугл тоже сразу после юзера дергает страницу
считай его отдельно в стате по юзер агенту
410 1491313
Посоны задание на стороки

>>На картинке — часть программы, создающая философское настроение. Принцип работы таков: есть 5 наборов слов, из которых случайно выбираются слова, образуя такую структуру:


> слово1 слово2 слово3


> слово1 слово2 слово3


> Я слово4 слово5


Задание
Доделай программу

Так пойдёт http://ideone.com/NOsrH5 ???
411 1491328
>>491306
Уникальные заходы по ссылке, связка URL => UserId в нашей системе. Гугл тоже по идее уникальные должен считать, основываясь на ClientId, записанных в кукисах. Но в Гугле почему-то юзеров в 2 раза меньше.
412 1491341
>>491313
Пойдет, делай дальше. Зачем вы по несколько дней сидите за задачками на 1 функцию, которая за вас уже и написана. Ваша цель ознакомиться с языком и функциями, а не красиво результат вывести.

> $random1 = array_rand ($word1);


> $words1 = $word1 [$random1];


Это можно записать в массив, если очень хочется

>$result[0][] = $word1[array_rand($word1)]



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

Как скопировать именно класс в переменную?

use \my\class\MyClass;

$c = MyClass;

var_dump($c);

парсер ругается на то что нет такой константы.
Как мне допустим вернуть именно класс из функции к примеру?
414 1491366
>>491328
Я вижу в описанной ситуации три возможных варианта:
№1. Задержка обновления - будет всегда
№2. Трекалка гугла нестабильно срабатывает:
а. Неправильно вставляете - перечитываются инструкции, вносятся исправления при необходимости
б. У заходящих блок скриптов, аналитики и т.д. - no luck
№3. Плохо трекаете:
а. Вместе с url брали query, а там мусор - проверяй через запросы со случайным мусором в query
б. Просто забыли учет id - проверяется через f5
415 1491368
>>491366
Спасибо за предположения, анон, но почему половина URL трекается, а половина нет?
В query никакого мусора нет, только utm_* метки для гуглоаналитики.
image.png53 Кб, 780x369
416 1491385
>>491362
Потому что так в принципе нельзя.
Класс не является сущностью первого порядка.
Вместо токена с именем класса в пхп везде используется строка с его именем.
В качестве исключения оператор instanceof позволяет указывать имя класса как токен.
В переменную ты можешь положить только объект класса.
image.png53 Кб, 965x405
417 1491393
>>490764
Долго делал? Чому без странички просмотра картинки/аудио/видео?
Название файла вылазит, если больше ~60 символов
Это, наверное, поможет

> white-space: nowrap;


> overflow: hidden;


> text-overflow: ellipsis;

418 1491394
>>491362

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

$name = Some\Class::class;
var_dump($name); // Some\Class
bug1.png105 Кб, 1274x732
419 1491395
>>490764

Открываем сайт в новом фаерфоксе, прокручиваем и внизу страницы какая-то белая полоска, а вверху красная фигня наползает на линейку прокрутки, смотри пик.
image.png104 Кб, 1365x688
420 1491397
>>491395
В хроме так. Думал это фишка такая
421 1491399
>>491273

>Потому что в сущности любой переиспользуемый код - это фреймворк.


чушь
есть либы которые более ограничены в функционале и делают что-то одно
есть функционал языка или среды из коробки
422 1491406
>>490764

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

Вместо "выберите файл..." логичнее писать "нажмите, чтобы выбрать файл (или открыть диалог выбора файла) или перетащите файл сюда".

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

Ты пишешь "размер 107.9 KB", но в России числа пишутся через запятую, а "килобайт" как "Кб". Нелогично смешивать российский и западный стиль в одной фразе.

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

Еще один баг - кривая дата загрузки на пикрелейтеде.

В списке файлов у файла есть крестик, но нет подсказки при наведении на него и непонятно, что он делает.

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

- справа нет линий (картинка bug3.png)
- непонятно, что значит пунктирная линия и что сплошная. Лучше было не выпендриваться и выделять выбранный пункт подсветкой. Также, имхо, толстые линии неудачно смотрятся.
- кнопка Фильтры не становится выделенной, когда попап раскрыт
- если открыть фильтры, а затем кликнуть в поле поиска, они не скрываются. Если сделать поиск, то попа фильтров перекрывает надпись "ничего не найдено". Нужно скрывать фильтры при перемещении фокуса табом или клике за их пределы.

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

Показать: [ мои файлы | все файлы ] Сортировка: [ дата ^ ]

То есть думай не только о красивости, но и об удобстве. Раскрывающаяся панель экономит место (которого вообще-то достаточно), но взамен требует лишние 2 клика на раскрытие/скрытие и не позволяет увидеть, что спрятано, без клика по ней.

Не очень понятно, зачем кнопка "найти", если поиск работает без нее.

Нет ссылки на страницу одного файла, а как тут поделиться ссылкой-то? Прямой ссылкой на файл делиться?

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

Не выполняются правила работы с аяксом: https://github.com/codedokode/pasta/blob/master/js/ajax.md

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

Протестировал ли ты поддержку картинок с анимацией (gif), с полупрозрачностью (png)? Хотя, вроде как вижу такие картинки.
422 1491406
>>490764

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

Вместо "выберите файл..." логичнее писать "нажмите, чтобы выбрать файл (или открыть диалог выбора файла) или перетащите файл сюда".

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

Ты пишешь "размер 107.9 KB", но в России числа пишутся через запятую, а "килобайт" как "Кб". Нелогично смешивать российский и западный стиль в одной фразе.

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

Еще один баг - кривая дата загрузки на пикрелейтеде.

В списке файлов у файла есть крестик, но нет подсказки при наведении на него и непонятно, что он делает.

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

- справа нет линий (картинка bug3.png)
- непонятно, что значит пунктирная линия и что сплошная. Лучше было не выпендриваться и выделять выбранный пункт подсветкой. Также, имхо, толстые линии неудачно смотрятся.
- кнопка Фильтры не становится выделенной, когда попап раскрыт
- если открыть фильтры, а затем кликнуть в поле поиска, они не скрываются. Если сделать поиск, то попа фильтров перекрывает надпись "ничего не найдено". Нужно скрывать фильтры при перемещении фокуса табом или клике за их пределы.

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

Показать: [ мои файлы | все файлы ] Сортировка: [ дата ^ ]

То есть думай не только о красивости, но и об удобстве. Раскрывающаяся панель экономит место (которого вообще-то достаточно), но взамен требует лишние 2 клика на раскрытие/скрытие и не позволяет увидеть, что спрятано, без клика по ней.

Не очень понятно, зачем кнопка "найти", если поиск работает без нее.

Нет ссылки на страницу одного файла, а как тут поделиться ссылкой-то? Прямой ссылкой на файл делиться?

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

Не выполняются правила работы с аяксом: https://github.com/codedokode/pasta/blob/master/js/ajax.md

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

Протестировал ли ты поддержку картинок с анимацией (gif), с полупрозрачностью (png)? Хотя, вроде как вижу такие картинки.
423 1491407
>>490764

Непонятно, зачем ты сделал меню в адаптивной версии ради единственного пункта. Если у тебя один пункт, не заставляй юзера делать лишний клик.
424 1491408
Просил рассказать про пакеты,а развели срач про спа
425 1491417
>>491408
Что тебе про них рассказывать? Берёшь и пользуешься каким хочешь.
426 1491422
>>491393

>Долго делал?


Месяца 2.

>Чому без странички просмотра картинки/аудио/видео?


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

>>491395

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


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

>>491406

>Вместо "выберите файл..." логичнее писать "нажмите, чтобы выбрать файл (или открыть диалог выбора файла) или перетащите файл сюда".


Мне показалось это слишком многословным, я еще короче хотел написать.

>Ты пишешь "размер 107.9 KB", но в России числа пишутся через запятую, а "килобайт" как "Кб". Нелогично смешивать российский и западный стиль в одной фразе.



https://ru.wikipedia.org/wiki/Килобайт#cite_note-IEC80000-2

>Допускается применение международного обозначения единицы информации с приставками «K» «M» «G», рекомендованного Международным стандартом Международной электротехнической комиссии МЭК 60027-2 (KB, MB, GB, Kbyte, Mbyte, Gbyte).



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



Правило cursor: pointer срабатывает, прямо сейчас проверил, с какого браузера капчуешь?

>Еще один баг - кривая дата загрузки на пикрелейтеде.


Интересно, а какова природа этого бага? Пересмотрю метод, форматирующий дату и время.

>В списке файлов у файла есть крестик, но нет подсказки при наведении на него и непонятно, что он делает.


Надо будет UX подтянуть, а то что-то совсем много ошибок насобирал хоть и не фронтендер.

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



Полностью согласен, собирал на коленке дизайн, но...

> справа нет линий (картинка bug3.png)


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

>- кнопка Фильтры не становится выделенной, когда попап раскрыт


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



Сознательно не стал это делать, хоть и просто, потому что лазанья из js, которая перевалила за 1к строк, перестала меня вдохновлять на какие-либо действия. Импорты с модулями у меня почему-то не работали, надо было брать в проект jquery.

>Не очень понятно, зачем кнопка "найти", если поиск работает без нее.


У меня телефон со старым браузером, под который перестали выпускать ПО с 2013 года, и там не работает событие input, наверняка я не один такой динозавр.

>Нет ссылки на страницу одного файла, а как тут поделиться ссылкой-то? Прямой ссылкой на файл делиться?



А вот тут действительно промах, какой файлообменник без кнопки поделиться.

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

>>491407

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



Предполагалось добавить туда еще 1-2 пункта меню с регистрацией и входом, но что-то я поленился это делать. Сделаю на полноценном фреймворке уже.
426 1491422
>>491393

>Долго делал?


Месяца 2.

>Чому без странички просмотра картинки/аудио/видео?


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

>>491395

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


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

>>491406

>Вместо "выберите файл..." логичнее писать "нажмите, чтобы выбрать файл (или открыть диалог выбора файла) или перетащите файл сюда".


Мне показалось это слишком многословным, я еще короче хотел написать.

>Ты пишешь "размер 107.9 KB", но в России числа пишутся через запятую, а "килобайт" как "Кб". Нелогично смешивать российский и западный стиль в одной фразе.



https://ru.wikipedia.org/wiki/Килобайт#cite_note-IEC80000-2

>Допускается применение международного обозначения единицы информации с приставками «K» «M» «G», рекомендованного Международным стандартом Международной электротехнической комиссии МЭК 60027-2 (KB, MB, GB, Kbyte, Mbyte, Gbyte).



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



Правило cursor: pointer срабатывает, прямо сейчас проверил, с какого браузера капчуешь?

>Еще один баг - кривая дата загрузки на пикрелейтеде.


Интересно, а какова природа этого бага? Пересмотрю метод, форматирующий дату и время.

>В списке файлов у файла есть крестик, но нет подсказки при наведении на него и непонятно, что он делает.


Надо будет UX подтянуть, а то что-то совсем много ошибок насобирал хоть и не фронтендер.

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



Полностью согласен, собирал на коленке дизайн, но...

> справа нет линий (картинка bug3.png)


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

>- кнопка Фильтры не становится выделенной, когда попап раскрыт


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



Сознательно не стал это делать, хоть и просто, потому что лазанья из js, которая перевалила за 1к строк, перестала меня вдохновлять на какие-либо действия. Импорты с модулями у меня почему-то не работали, надо было брать в проект jquery.

>Не очень понятно, зачем кнопка "найти", если поиск работает без нее.


У меня телефон со старым браузером, под который перестали выпускать ПО с 2013 года, и там не работает событие input, наверняка я не один такой динозавр.

>Нет ссылки на страницу одного файла, а как тут поделиться ссылкой-то? Прямой ссылкой на файл делиться?



А вот тут действительно промах, какой файлообменник без кнопки поделиться.

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

>>491407

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



Предполагалось добавить туда еще 1-2 пункта меню с регистрацией и входом, но что-то я поленился это делать. Сделаю на полноценном фреймворке уже.
427 1491424
>>491422
Кстати, ты ведь еще аудио плеер самопальный не видел.
Я там забил на перемотку вообще, но зато с красивостями тоже постарался.
428 1491450
>>490764
Я не ПХП кодер но мне нраица. Форканул.

<spoiler>ОПыч я потом начну пыхать, обещаю</spoiler>
15547497148240.png214 Кб, 500x466
429 1491451
>>491450

><spoiler>


Когда уже совсем поехал на верстке
430 1491456
>>491210
Ну так через неделю я буду с ними в студии работать, если им понравится мое практическое конечно.
431 1491482
Мечтаю стать Web разработчиком, в моем городе есть неплохие вакансии для джунов. Стоит ли начинать самостоятельно изучать всю базу или лучше пойти на какие-нибудь курсы? И расскажите пожалуйста про минимальные системные требования пк, а то есть подозрение, что мой 10 летний старичек с 2гб оперативы не справится (или справиться?)
432 1491487
>>491394
>>491385

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

$container['sentinel'] = function ($container) {

$Sentinel = Cartalyst\Sentinel\Native\Facades\Sentinel;

return $Sentinel;
};

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

Понятно что я могу просто в самом роуте вызвать класс, и автолодер его загрузит.
Но мне интетесна именно именно то, как бы это сделать из контейнера.
433 1491489
>>491482

>>или лучше пойти на какие-нибудь курсы


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

За инфо-циган ниче не могу сказать.
434 1491492
>>491487
Ты не можешь передать класс.
Передавать строку в данном случае тоже неправильно.
Неважно что методы статические, тебе придется делать объект.
К объекту также можно обращаться за статическими методами:

$object = new BadClass();
$object::staticMethod();

Лучше создать интерфейс и прокси без статики снаружи.
В контейнере обращаться к ним.
Уже в своём прокси дергать статический класс.
В будущем ты сможешь свапнуть этот класс на что угодно.
Инверсия зависимостей как раз для этого и существует.
Если будущее бессмысленно - используй статические методы без контейнера.
Так можно делать если ты понимаешь зачем, а не просто ленишься.
435 1491493
>>491482
Справится.
436 1491505
В IE11 скрипт полностью падает из-за syntax error
на стрелочной функции.

Просто спрятать скрипт в:
if ( ! IE11 ) {
мой скрипт
}
- не помогает, браузер все равно его читает перед выполнением, решил просто избавиться от фатала и не запускать скрипт, вот собственно поясните является ли этот код идентичным?
437 1491515
>>490764
Можно было бы вместо нажатия кнопки "показать еще" сделать так, чтобы само подгружало новые элементы по достижению кноики, вместо нажатия кнопки, как например это сделано в ВК.
439 1491519
Всетаки какое тупое говно тупого говна в пхп эта вашя ебля с static, self, parent. И какие то ебанутые правила вызова статических свойств в объекте через self.
Запутанное говно. Сложно запомнить
Понятно что типа что бы не сломать совместимость.
JS в плане этом гораздо проще.
А пистон так вообще.
440 1491521
Ебанутое дело

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

Нахуя такой диззайн

каждый раз когда лезу себе напомнить - фрустрирую от этого говна, модл ООП в прнципе простая, но запутанная бладж
441 1491525
>>491521
п.с.
А в доке написано это
" Свойство класса, объявленное как статическое, не может быть доступно посредством экземпляра класса (но статический метод может быть вызван)."

А вот тут я закис. В доке ниже следующий пример опровергает это утверждение.
$foo::$my_static; - и статический метод доступен.
Что за хрень?
442 1491532
>>491505
У стрелочной нет своего this. Так что к анонимной функции придется биндить this.
443 1491536
>>491505

Ты сам виноват что используешь слишком новый стандарт JS (ES6), который не поддерживается в ИЕ11: https://caniuse.com/#feat=es6

Он поддерживается только с 2017-2018 года и по моему глупо отсекать все браузеры вышедшие до этого момента.

Тебе надо:

- выучить, какие есть стандарты JS (ES3, ES5, ES6 и что там дальше не помню)
- выучить примерно с какого года они поддерживаются браузерами

В твоем случае, тебе надо либо вручную переписать код на ES5, либо использовать транспиляторы вроде Babel, которые умеют преобразовывать код ES6 в ES5. Тогда ты можешь писать на ES6, а в браузеры отдавать ES5.

Учти что в стрелочных и обычных функциях по-разному передается this.
444 1491537
>>491532

Это легко решается костыльком:

var self = this; // или var that = this;

something.then(function (x) {
return self.doSomething(x);
});

И не требуется bind(), появившийся в ES5.
445 1491538
>>491537
Ну ты совсем динозаврие.
446 1491633
>>491399
Твое утверждени строится лишь на стремлении к демагогии.
По мне хоть пирожком называй этот код. А границы его ограниченности - это для тех кому хочется поупражняться в словесности, на мой взгляд.
447 1491658
>>491633
"The framework dictates the architecture of your application." "Reuse on this level leads to an inversion of control between the application and the software on which it's based. When you use a toolkit (or a conventional subroutine library for that matter), you write the main body of the application and call the code you want to reuse. When you use a framework, you reuse the main body and write the code it calls. You'll have to write operations with particular names and calling conventions, but that reduces the design decisions you have to make."
Выдержка из книги «Банды четырёх».
448 1491670
>>491658
А если не диктует? А если диктует на половину? полу-фреймворк?
Я прекрасно понимаю ход твоей мысли.
На практике просто все равно как и что классифицируется. Главное что оно подходит задачам.
449 1491672
>>491670
п.с. по факту основной функционал любого популярного фреймворка - стандартизация.
450 1491702
>>491422

>задолбался я с этим файлообменником


У меня тоже было со студентами - переписывал раза 2 их потому, что экспа капала хорошо. Потом просто задолбало один проект пилить столько времени и фан кончился.
451 1491821
Работяги, есть вопрос. Скоро сдавать диплом, какой проект сделать? Желательно альтернативы посту ОПа, возможно то, чего Вам не хватает, т.е. полезное.
452 1491829
>>491516
Тут дело не в кнопках, а в scroll
453 1491862
Аналогичный вопрос с ajax
https://toster.ru/q/381852
там дали ответ, но мне кажется это не самый лучший вариант.
Может быть кто подскажет?
454 1491893
>>482669
спасибо,анон

ты немного ослабил мой страх и смотивировал
455 1491966
>>491450
Cпасибо, чувак.

>>491515
Да, можно.

>>491702
Надо сразу пилить нормально, смотри, как другие пишут и повторяй, спрашивай себя, почему именно так написано, а не иначе, выясняй, правильно ли вообще написано. Например, в Yii можно писать такую ебанину, которую потом не то что тестами не покроешь, а сам запутаешься в нескольких файлах. В ларавеле и особенно симфони ты уже не можешь писать абы как, нужно знать шаблончики.
456 1491995
>>491966

>Надо сразу пилить нормально


Ну да - надо сразу пилить нормально и сразу 30ккк\наносек зашибать. По другому-то не работает.
457 1492014
>>491966
Пробовал уже работу искать? Фреймворки учишь?
458 1492147
>>491995
Никто не говорит про 300к\наносек, забудь про деньги вообще, если к кодированию душа лежит, то и бабки потом грести лопатой будешь. Главное - не суетиться, а идти по четко намеченному плану.

>>492014
Пока не искал, резюме вот только начал составлять. Забыл поставить галочку в резюме, чтобы оно не было доступно для эйчаров, спустя минут 20 после опубликования написали из какой-то украинской компании, мол, не хотите к нам на удаленку на Yii магазины поддерживать, но я что-то промямлил в ответ, типа еще недостаточно хорош. Хотя на самом деле я просто не хочу с этим фреймворком связываться, мне не нравится то, что он слишком простой, и примерно представляю людей, которые на нем пишут, да и вроде как он поддерживаться перестал. Сейчас хотят третью версию выпустить, которая сломает обратную совместимость с предыдущими версиями, но все равно не хочу.

Сначала выбор пал на Симфони, но уж больно плохо я пока что знаю все шаблоны, а работу уже хочется найти, так что этаким компромиссом стал Ларавел, а Симфони буду изучать в следующем году. Начал на нем проект новый писать, уже не по ОПовским идеям, а самостоятельный, ну и параллельно курс Елисеева по этому фреймворку смотрю. 69 часов он длится, что ли. Надеюсь, до нг успею проект доделать, если на ларавеле все быстро пишется. Короче, после нового года если на работу на ларавеле, стреляю себе в ногу из пневмата.
459 1492148
>>492147

>если на работу не устроюсь


hotfix
460 1492169
>>492147

>>Главное - не суетиться, а идти по четко намеченному плану.


Верное замечание.

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



Умение зарабатывать деньги - это вообще иная плоскость. Больше не от тех-навыков зависит, а от личности конкретного человека.
Просто в глазах двачера - прогинг это типа работа мечты, добрый и богатый дядя возьмет тебя на работу, будет давать задания и много платить. От двачера требуется ноль инициативы, онли умение программировать.
Реальность конечно немного не та.
461 1492175
А мне slim зашел, я на express.js немного говнокодил, и мне такая парадигма роутинга нравится.
Пожалуй свой рабочий проект перетащу со своего самописного роутера на slim. Да и потом, как свалю, подерживать моему последователю проще будет. Стандартизация рулит.

А роутеры в симфони/ларавел по такому же принципу строятся?
Вообще эти роутеры отдельно от фрймов можно юзать?
462 1492182
>>492169

>Умение зарабатывать деньги - это вообще иная плоскость.


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

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


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

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

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

>А роутеры в симфони/ларавел по такому же принципу строятся?


>Вообще эти роутеры отдельно от фрймов можно юзать?



Можно, роутер в слиме - один из компонентов Symphony, просто дергай, какой тебе нужно и пиши в свое удовольствие. Можно даже собрать свой фреймворк из этих компонентов под свои нужды, Symphony в чистом виде наверное редко кто юзает, либо создают самый базовый скелетон и обвешивают его нужными компонентами, либо берут весь фреймворк и добавляют в него еще кучу всего. Зависит от проекта опять же.
464 1492189
>>492182

>>Согласен. Тут жилка нужна предпринимательская


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

Для меня прогинг в первую очередь это гештальт я много работал сис.админом, а по факту эникеем. Которые нахуй не нужын никому а сейчас я уже достаточно много знаю. И воторое - это видимо саморазвитие, результат без инициативности, целеустремленности, самоконтроля - не получить просто.
465 1492192
>>492189
Это ж надо место брать, лицензию, фуру под товар, разгрузка, выдержать конкуренцию и гнёт хачей
466 1492196
>>490764
Прикольно, а как ты привязал прогресс бар к реальному прогрессу загрузки файла?
467 1492216
>>492192
Ну, она от среднего двачера так же далека как Альфа Центавра от Солнца. Человек другого мира, потомственная илитка.
15034308314580.jpg50 Кб, 471x604
468 1492788
>>491966
Есть пара вопросов по твоему файлообменнику:
- зачем ты начал пилить недоларавель на базе слима? Зачем нужна эта куча классов сервис-провайдеров с одним единственным методом? У слима есть своя парадигма определения зависимостей. Опять же в ларавель зависимости разрешаются с помощью рефлексий и там есть смысл регистрировать классы целиком, а у тебя ничего такого нет.
Один роутер велосипедит поверх слимовского, второй кучу ненужного кода написал, по сути усложнив проект на ровном месте, что хреново. Что за жажда писать код, не взирая на здравый смысл, пачаны?
- про индекс тебе уже сказали - можно прибрать код в классы-контроллеры, а не вываливать всё в индекс.пхп. Это удобно и создаёт порядок в коде - просто попробуй.
- что за копипаста там с if ($cookieUserId === null) ? Может стоит прибрать это в какой-нибудь AuthController и вызывать одной строкой, а не копипастить целые блоки в контроллерах? Заодно можно было бы убрать туда вообще всю работу с куками, а не делать этого в контроллерах.
- вот эта хрень пиздос как стрёмно выглядит:

>unset($app->getContainer()['errorHandler']);


>unset($app->getContainer()['phpErrorHandler']);


по другому совсем нельзя было сделать?
469 1492837
>>492196
Да легко, гугли, там буквально несколько строчек кода.

>>492788
>>492788

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



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

>>492788

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



Хорошо, окей. Но вот я тут вопрос задал один, мне не ответили.
Есть PSR-7 совместимая либа для управления куками. Но объекты этой либы нельзя создавать, там все на статических методах. Каким образом мне доставать либу из контейнера и передавать аргументом? Какой тип в сигнатуре писать, если я, чтобы вызвать статику, должен передать имя класса? String? Тогда туда что угодно можно будет передать. Или может быть забить на все правила и напрямую в контроллере вызывать CookieClass::setCookie()?

> что за копипаста там с if ($cookieUserId === null) ? Может стоит прибрать это в какой-нибудь AuthController и вызывать одной строкой, а не копипастить целые блоки в контроллерах? Заодно можно было бы убрать туда вообще всю работу с куками, а не делать этого в контроллерах.



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

>- вот эта хрень пиздос как стрёмно выглядит:


>unset($app->getContainer()['errorHandler']);


>unset($app->getContainer()['phpErrorHandler']);


по другому совсем нельзя было сделать?

Удивишься, но я этот кусок кода из документации Слима скопипастил. Может и можно в четвертой версии как-то иначе написать, я делал проект на третьем Слиме.

Спасибо вообще за ответ, люблю критику по делу.
469 1492837
>>492196
Да легко, гугли, там буквально несколько строчек кода.

>>492788
>>492788

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



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

>>492788

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



Хорошо, окей. Но вот я тут вопрос задал один, мне не ответили.
Есть PSR-7 совместимая либа для управления куками. Но объекты этой либы нельзя создавать, там все на статических методах. Каким образом мне доставать либу из контейнера и передавать аргументом? Какой тип в сигнатуре писать, если я, чтобы вызвать статику, должен передать имя класса? String? Тогда туда что угодно можно будет передать. Или может быть забить на все правила и напрямую в контроллере вызывать CookieClass::setCookie()?

> что за копипаста там с if ($cookieUserId === null) ? Может стоит прибрать это в какой-нибудь AuthController и вызывать одной строкой, а не копипастить целые блоки в контроллерах? Заодно можно было бы убрать туда вообще всю работу с куками, а не делать этого в контроллерах.



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

>- вот эта хрень пиздос как стрёмно выглядит:


>unset($app->getContainer()['errorHandler']);


>unset($app->getContainer()['phpErrorHandler']);


по другому совсем нельзя было сделать?

Удивишься, но я этот кусок кода из документации Слима скопипастил. Может и можно в четвертой версии как-то иначе написать, я делал проект на третьем Слиме.

Спасибо вообще за ответ, люблю критику по делу.
15239485108300.jpg72 Кб, 552x716
470 1492918
Тред все равно скоро утонет, поэтому спрошу. Не срача ради.
Откуда в "програмистской" среде хейт к PHP?

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

Кому не лень отпишитесь.
Меня смущает одинаковая реакция незнакомых друг с другом людей. Они мне помочь хотят, повыебываться, или может они завидуют чему-то, и пытаются направить меня на более трудную дорожку?
снимок.png28 Кб, 946x289
471 1492919
>>490764
Конструктор с 9 входящими параметрами это прямо совсем ад. Не могу навскидку сказать как это переделать, но если твой метод принимает больше 5-6 параметров, следует разбивать его на более мелкие части.
Заметил еще, что ты используешь названия вроде doFind. Тоже не очень хорошая практика, лучше давать имена из нескольких слов, например getUserName, ну ты понял, чтобы сразу было видно что именно он делает.
Алсо, почитай про стандарты psr, у тебя код местами неправильно оформлен, но это все мелочи конечно, ты молодец, с таким проектом тебе будет не очень сложно вкатиться на галеру джуном.
472 1492926
>>492918
Я вижу проблему в том, что пхп используют конторы уровня ип иванов, местные лендингоклепальщики и тп. Отсюда идет отношение к пхп как не профессиональному программисту, а к васяну.

Хотя по сути все языки одинаковые
473 1492927
>>492918

>Когда я спрашивал, что же мне учить и куда развиваться - мне укасывали на Си и Джаву.


Белые люди пишут на питоне, го, руби, элике.

Зачем лезть в тырпрайз?

>PHP у меня очень легко заходит, так что я как-то очень сомневаюсь.


Нравится язык - учи. В чем проблема?

ушел.
474 1492967
>>492927
На этих языках нет почти джуниорских позиций, но полно мидлосиниорских, это как так устроиться надо? Просто прийти и сказать без задней мысли вот я сделал тудулист на го или руби, есть два года опыта на пыхпыхе ПОД КЛЮЧ, возьмите меня?
475 1492971
>>492919

>Конструктор с 9 входящими параметрами это прямо совсем ад.


Так это же сущность, каждое поле сущности соответствует полю в таблице базы данных. Что мне, бд переделывать теперь? А зачем, если таблицы соответствуют трем нормальным формам?

>Заметил еще, что ты используешь названия вроде doFind. Тоже не очень хорошая практика, лучше давать имена из нескольких слов, например getUserName, ну ты понял, чтобы сразу было видно что именно он делает.



Я этот прием использую только при реализации шаблона Data Mapper. Есть один абстрактный маппер с описанными методами общими типа find, findOne, insert и абстрактные методы doFind, doInsert у каждого маппера, и есть уже конкретные мапперы, которые у реализуют doFind и прочие каждый по своему.

Наверно вы подумоли, што я хлеб, и придумал это сам, но нет, этот прием я взял из последнего издания книжки Мэтта Зандстры по PHP, украденной с торрент-трекера. Вот так-то.

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

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

>Алсо, почитай про стандарты psr, у тебя код местами неправильно оформлен



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

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



От души спасибо тебе, меня впервые похвалили в этом треде, значит, чего-то я уже достиг все-таки.
476 1492980
>>492926
Давай не будем холиварить, ладно?
Такое отношение к языку сформировалось у людей чисто по инерции, потому что его до 5.6 считали говном, жрущим память, сейчас же это почти что форк джавы, и весьма неплохой, хочу сказать.
мимо пересел с кофе на дудку
477 1492989
>>492971
>>492919
Еще забыл написать по дата мапперу.
Если тебе нужна какая-то сущность, ты просто берешь и дергаешь метод find с именем поля, если нужно от имени маппера вот так:
$this->FileMapper->find();

Самого метода find() в этом маппере нет, но он дергается из абстрактного родителя, который уже в свою очередь вызывает нужный doFind. Одно слово - полиморфизм.
478 1493036
как мне бомбит с синтаксиса и той лапши,которую я вижу,как это блядь читать?
479 1493038
>>493036
Не программируй.
480 1493054
>>488646
Пока ОП не успел проверить мою задачку, я тут сам слегка ее подправил. Теперь другая проблема - в пройденном пути сохраняется один лишний элемент. Вывод текста на экран реализую потом т.к. один фиг считает криво. https://3v4l.org/2dgoU
[Ссылка]
2dgoU
https://3v4l.org/2dgoU
481 1493056
>>493038
а кушать то хочеться
482 1493057
>>493056
бля с ошибкой
483 1493062
>>492837

>Где об этом вообще почитать? Как это называется?


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

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


Значит надо делать враппер(класс-обёртку) над этой библиотекой и уже изнутри него вызывать статические методы. И вот обёртку уже можно, как обычно, передавать в зависимости.
Просто надо помнить, что статические классы это фактически просто набор функций.
484 1493065
7.4 теперь ваще летать будет?
485 1493072
кто пользовался swoole
какие ощущения и мысли?
486 1493082
>>492918

>Они мне помочь хотят, повыебываться


Второе.
Обычно так говорят люди, не писавшие на современном ПХП. Какой смысл выражать своё мнение в стиле "не читал, но осуждаю"? Это именно выебоны.
487 1493083
>>493065
Похуй на скорость, главное - типы ввели.
488 1493085
>>492927

>Белые люди пишут на питоне, го, руби, элике.


Покажи, где эти вакансии.
Сайты на питоне писать пиздецово по лишним телодвижениям, имхо. Он занял свою нишу в нейросеточках и будет сидеть там.
Го слишком низкоуровневый для сайтов.
Руби уже не актуален давно.
На элике вообще вакансий нет.
489 1493088
>>493062

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



Понял, ну хоть научусь коммиты откатывать.
А куда потом девать инициализацию эту, в индекс.пхп?

>Значит надо делать враппер(класс-обёртку) над этой библиотекой и уже изнутри него вызывать статические методы. И вот обёртку уже можно, как обычно, передавать в зависимости.


Просто надо помнить, что статические классы это фактически просто набор функций.

Понял, спасибо, я и не додумался даже.
490 1493089
>>493036
У меня тоже бомбило, когда я не понимал. Единственный способ тут - разобраться, иначе бомбить и дальше будет. Потом забьёшь ваще.
491 1493090
>>493089
Это нормальная реакция - бомбить, если что-то не понимаешь. Главное охлаждать вовремя это взбамбливание периодическое, так много гениальных программистов сгинуло вникуда.
492 1493093
>>493088

>куда потом девать инициализацию эту


Я обычно выношу инициализацию в отдельный файл bootstrap.php или startup.php
Получается довольно удобно - если надо ещё сервисов добавить\поменять, то все они конфигурируются и запускаются в одном файле.
493 1493094
>>493093
А куда сам файл кидаешь? Рядом с индексом или куда-нибудь в корень?
494 1493097
>>493094
У меня всегда есть папка для публичных данных - которые отдаются на клиент (public), папка композера, и папка src, которая содержит код самого приложения. И вот в папке с приложением у меня и лежат контроллеры, модели, исключения, интерфейсы, и прелоадер этот startup.php который и файл конфигурации проекта с настройками. Прямо в корне и лежит, рядом с конфигом.
Опционально ещё в корне папка со всяким говном для разработки - описание проекта и наброски всякие, папка cli для доступа через консолько, кэш там ещё если надо.
495 1493099
>>493097

>Прямо в корне и лежит, рядом с конфигом


В смысле корне папки приложения, а не самого сайта.
496 1493106
>>493085

>Руби уже не актуален давно.


в USA еще как актуален
497 1493116
>>493106
Ну мы с тобой не в Америке, верно?
498 1493120
Аноны, как правильно делать простую авторизацию? Где почитать? Я вообще не понимаю принцип:
1.Пользователь заводит логин и пароль.
2.Я хеширую пароль, чтобы не хранить его в голом виде в базе.
3.Как только разлогиненный пользователь хочет авторизоваться, он вводит логин и пароль
4.Я сравниваю то что он ввел со значениями в базе.
5.После того, как проверка прошла успешно, я выдаю ему куку сроком на день.
6.Каждый важный скрипт перед выполнением проверяет, есть ли у пользователя кука. Если ее нет, открывает окно авторизации.

Правильно? Или как то через сессии делать? Сайт простой, не база данных пентагона
499 1493124
>>493116
а что мешает работать на фрилансе или удаленке?
500 1493125
>>493120
Простая это через куки или локалсторедж, у тебя с хешами уже не такой уж и простой auth.
501 1493127
>>493124
Лично мне - отсутствие разговорного английского и сильная боязнь общения по вебке, телефону и прочим современным вещам.
502 1493128
>>493125
спасибо, анон, а что лучше - куки или сессии?
503 1493129
>>493128
тайд или кипячение?
504 1493134
>>493128
Ничто не лучше, это две разные хреновины, которые работают бок о бок. Сессии вообще никак не связаны с авторизацией, они просто запоминают некую информацию на одной странице и передают ее на другие. То есть если даже пользователь обновил страницу, куки сохраняются, но после того, как он покинет сайт - куки уничтожатся.
505 1493136
>>493129
>>493134
Благодарю, добра вам
506 1493137
>>493134
Ой, блять, что я несу. Не куки, а сессии. Даже если пользователь обновляет страницу или переходит по внутренним ссылкам, то сессии сохраняются, а после закрытия вкладки удаляются.
507 1493140
>>493134
Куки же сохраняются в базе данных браузера и хранятся столько времени, сколько ты скажешь.
508 1493192
>>493127
ну тогда страдай
509 1493269
>>475112 (OP)
хелпаните, всю голову сломал, в общем делаю задачу , сделал класс с конструктором и методами , padRight отрабатывает отлично, но вот padLeft работает только если указать отступ так $functions->col1, то есть col2, col3 ,col4 вообще не отрабатывают. Если явно указать число 8 то все работает как надо , в чем может проблема? конструктор вроде нормально написан, методы одинаковые по сути
510 1493304
>>493269
завардампал $functions->col2 , ответ NULL, я теперь вообще не ебу почему он не отрабатывает
511 1493309
>>493304
Потому, что ты синтаксис не знаешь.
return прекращает выполнение метода на своей строке. Т.е. после первой строки в конструкторе дальше выполнение не идёт.
И вообще в конструкторах return не пишется, потому, что конструктор сам возвращает экземпляр класса.

Мало учил ООП.
512 1493312
>>493309
йоу, спасибо, не с той ноги встал сегодня, вспомнил только после того как ты сказал что return там не нужен
513 1493492
>>491521
А мне нрав, в этом есть логика. Сразу видно что есть что
514 1493668
>>493269
А что за приставочка .inc.?
515 1493680
>>493192
на пхп и в сша пишут, у меня знакомый там работает, давно уже. Щас чет типа сеньера. 10-12 штук в месяц у него.
516 1493687
>>493680
Он фулл стак или чисто бэк?
517 1493717
Пора бы уже перекат запилить, не?
518 1493718
>>493717
в раене 800 - 900 постов обычно
519 1493737
>>493687
Бекенд. Он в крупной амерской it конторе работает.
520 1493738
>>493737
п.с. он давно уехал, лет 10 назад, у него уже детей там двое. Идет в руководители.
521 1493742
>>493269
поясните нубу по конструкту: зачем в конструкте возвращать четыре раза свойства? Разве после первого ретурна функция не закончится? И зачем вообще возвращать? Ладно бы это была фабрика, а тут делать конструкт чтобы вернуть свойство, которое тебе же в конструкте и суют?
522 1493744
>>493742
>>493309
А вот ты уже написал, аношка, молодец
1.jpg95 Кб, 800x537
523 1493747
>>493668

>А что за приставочка .inc.?


Инкапсуляция
524 1493751
Пиздос, попросили сделать тестовое, cli приложение небольшое без фреймворков но с композером(для автозагрузки), я в ридми написал просто какой файл запустить но не написал что нужно composer install запустить для загрузки автолоад файла, и в фидбеке первым пунктом прилетает "программа не запустилась, цели не достигнуты", это гг
Хотя там были и другие пункты с которыми я отчасти согласен, но вот это ваще пиздец тупо ща было
525 1493754
>>493751
а какие другие пункты, м.б. тебе повезло еще

мне кидали тестовое, позже выяснилось что они _не могут_ запускать пхп из консоли
526 1493784
>>493754
Нужно было робота сделать, который по ссылкам на сайте ползает и сохраняет какую-то инфу
Отсутствует понимание ООП -> моё лицо ¯\_(ツ)_/¯
Отсутствует понимание абстракций -> (ノ°Д°)ノ︵ старался везде использовать интерфейсы, возможно стоило еще организовать очередь не зашитим массивом в классе а отдельным объектом, это мой фейл, а так не думаю что подразумевалось создавать например класс файлсистем чтобы вызвать fopen и т.п., это был бы пиздец
Отсутствует обработка исключений -> согласен, я просто возвращал пустое значение так, чтобы программа не упала но при этом ничего лишнего не делала, иначе у меня было бы много трай кач блоков, которые ничего не делают, в задании об этом ни слова, например что делать если пхп не может спарсить хтмл, помечать юрл как невалидный, просто скипать его?
Отсутствуют комментарии -> у меня вообще комментов не было, хотя я не думаю что они рассчитывают на то что я каждую строку буду комментить и объяснять что эта строка делает, учитывая что сама прога не сложная, возможно нужно было хотя бы через phpdoc все сервисы описать
Еще исполняемый скрипт просто через switch вызывает команды(функции в том же файле), хотя в теории можно было бы сделать полноценный класс приложения с классами командами, но мне это показалось лишним т.к.такими темпами можно и свой контейнер написать чтобы руками объекты не создавать
Были и другие пункты с которыми я согласен, но мне уже было лень это доделывать, опять же мой фейл
В общем полезный опыт того что делать и не делать когда тз состоит из 5 строчек и нужно некоторые нюансы додумать самому.
527 1493795
>>493784
Добавлю что я не выебываюсь и согласен что можно было сделать лучше, и вина только моя, просто сразу возникает чувство что я сразу мимо по первому пункту, неважно даже какой у меня код
528 1493834
>>493751

>программа не запустилась, цели не достигнуты


>>493754

>они _не могут_ запускать пхп из консоли



А я бы и не парился - придёшь туда, а там алень синьором работает. Оно вам нужно - с дураком работать? Может и к лучшему, что не взяли.
529 1493836
>>493795

>> и вина только моя


Думаю тут в принципе нет понятия вины. К вопросу приема на работу нужно спокойно подходить. Нет, и нет - извлек опыт.
530 1493837
>>493795
Чуваки, конечно, странные, но часть замечаний звучат объективно.
С composer install, кстати, советую тебе выучить урок.
Я своим джунам в своё время распечатывал и вешал на стенку перед лицом бумажку с текстом "Задача считается выполненной, когда она задеплоена на инстанс и проверена и тобой, и QA".
Это частый факап, когда разработчик заканчивает писать код и говорит "я сделал". Нифига, код - это ничто. От разработчика ожидают рабочего решения, которое запущено и приносит ожидаемое business value.
Соответственно, твоя отсутствующая запись про composer install говорит о том, что ты не полностью учёл такую вещь, как доставку. Значит, ты можешь не учесть её в реальной работе, значит, ты не можешь полноценно работать в одиночку, за тобой нужен присмотр. Значит, на миддла не тянешь.
К слову, также часто забывают про инициализацию, миграции, логирование и прочие вещи.
Возвращаясь к таким вещам, по классике обычно пишется мейкфайл, в котором прописаны все подготовительные команды, проверяется наличие php, композера и прочего. Ну и лично я бы ещё в докер всё обернул, чтобы запустить этого робота можно было через docker run.
531 1493840
>>493837

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


Ну да - не учёл доставку, и всё пропало. Обратно вернуть на доработку ведь нельзя - неположено. Нужно сразу вообще всё предусматривать и не дай бох что-то позабыл по неопытности.
Может проще быть, не?
532 1493852
>>493840
Я за такую мелочь, как неучтённый composer install ещё никого не сбривал, тестовое задание всегда оценивается комплексно, по целому ряду критериев.
Просто пытаюсь показать, как на это смотрит работодатель, чтобы у кандидатов не возникало мыслей, что это не важно и к ним придираются.
У меня был случай, когда один сотрудник-фронтендщик перепутал ссылки на гугломаркет и эпплмаркет, когда делал страницу. Он задеплоил и не проверил. В итоге, нам позвонил клиент и спросил, ЧЗХ происходит на его сайте? И шутки-шутками, а осадочек-то остался. Два-три таких момента и клиент начнёт считать нас идиотами, которые не проверяют то, что делают - и доверять нам перестанет.
Важно короче думать о том, как твоя работа попадает к кому-то и как он её оценивает. Думать и проверять за собой обязательно.
533 1493858
Котаны, подскажите нубу по исключениям в slim а может и вообще.
Как исключения работают я в принципе понимаю, как унаследовать и прочее тоже. Теперь:

Где то в slim определены классы исключенией, которые extends от нативных php классов исключений. Назову их slimExeption.
Выглядит, если я правильно понимаю, это так : где-то в программном коде, в тот момент когда что т о идет не так - разработчики предусмотрели выборс slimExeption, и соответственно выше это исключение ловится catch и обрабатывается установленным образом - в случае slim на экран выводится ошибка. Я правильно понимаю? В своем коде - ты выбрасываешь исключения какие хочешь и когда хочешь. Но в slim исключения по дефолту уже отловлены и обработаны.

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

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

И еще, допустим в коде где то выбрасывается дефолтное исключение, пусть это BadFunctionCallException. Я создал мое кастомное MyBadFunctionCallException исключение, наследуемое от этого BadFunctionCallException. И это кусок кода я обернул в try{}Catch(){} где в catch я отлавилваю свое MyBadFunctionCallException (но я его нигде руками не выбрасываю). И вот происходит косяк в коде, и вываливается дефолтное BadFunctionCallException.Будет ли это исключение отловлено моим обработчиком?

Запутанная тема эти исключения конечно.

двощ, ты моя резиновая уточка
534 1493861
>>493837

> тестовое


> полноценный парсер в угадайку


> docker



Двачую, без докера даже уборщицу бы не взял, намоет полов в неизолированном окружении или версия швабры не совпадет с тряпкой???

Так что тестовое для уборщицы - сначала пусть арендует здание, оформит аналог нашего офиса, импортирует инструменты версии строго по номенклатуре, пропишет полностью план уборки а также обработку всех потенциально возможных исключений (например если работник выпадет из окна), и форомит всё это в реплицируемую через b2b процедуру со всеми необходимыми документами.
В тексте задания при этом напишу "что думаете о политической ситуации в Зимбабве?".
Тогда можно будет ПОДУМАТЬ стоит ли ей доверять полы...
535 1493872
как на пхп сделать веб сокеты?
536 1493892
>>493861
Докер - это просто удобное средство доставки. Какой-нибудь phpmyadmin вообще идеально запускать через докер, потому что ты не засираешь систему лишними файлами.
Плюс, не требуется, чтобы у человека стояла в точности такая же версия php (представь, что у них там php 7.1, а ты что-то из php 7.2 заюзал в коде). Оно просто заработает.

Короче, не обязательно, но даёт удобство. Плюс, если мы говорим конкретно о собеседовании, то оно даёт возможность на практике продемонстрировать, что ты знаком с контейнерами.
537 1493898
>>493872
Взять какой-нибудь ratchet либо поднять рядом ноду с вебсокетами, которая будет эдаким апи гейтвеем - ловить все события и пихать в php (и ты уж сам решай через что, очередь и демоны, http-запросы или ещё что-то).
Первое выглядит проще архитектурно, зато второе позволяет оставить php работать в ванильном режиме запрос-ответ, что может избавить от излишних проблем (видел я говнобиблиотеки, которые пихают мусорные данные в static и никогда не чистят).
538 1493901
>>493858

>Запутанная тема эти исключения конечно.


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

Чужие исключения вообще не трогай.
539 1493903
>>493858

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



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

По теме велосипедостроения, рендери в трай блоке шаблон, лови исключение, и выбрасывай своё в катч блоке, которое обрабатывай в слимовском хендлере и выбрасывай слимовский 404 нот фаунд
540 1493907
>>493858

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


Там есть отдельный контейнер для обработки 404 ошибки. Не нужно никуда глубоко лезть.

http://www.slimframework.com/docs/v3/handlers/not-found.html
Назначь свой хэндлер одной функцией и всё.
541 1493908
>>493898
а свул?
542 1494042
>>493908
Ну или свул. Но я всё равно боюсь, что той хуйни, что этой. И то и это делает что-то несвойственное php и ты не узнаешь, как оно повлияет на остальные библиотеки/экстеншены/всё такое.
Но для пет-проекта юзани, чего бы нет.
А на работе я бы всё-таки рядом ноду поднял, невелика сложность брать сообщения из сокетов (к слову, не бери чистые, бери socket.io) и класть в очередь либо просто стучать в php-шный сервер.
543 1494051
>>494042
а что есть из реально чисто асинхронного и поточного,без костылей как это пхп и наверно у питона тоже?
544 1494058
какая же нода говно за пределами работы по исполнению кода реакта или ангуляра
545 1494141
Анон, если мне нужна статистика по пользователям. Кол-во сообщений, кол-во загруженых файлов/тредов, или рейтинг какой нибудь прикрутить. Правильней создать новую таблицу для этого, или получать эти данные более сложными sql запросами?
546 1494153
ОП,нахера ты позиционируешь слим для начинающих?
547 1494237
>>494153
Где он это позиционирует? Не хочешь - пили руками в 4 раза дольше
548 1494239
>>494058
Я бота на телеграфе поднимал, вроде норм.
549 1494255
>>475112 (OP)
оп че скажешь за уи1 ?
предлагают работу в конторе, вроде продуктовая что плюс но проект легаси тянет с уи1
говорят якобы мало что осталось, ну там екстеншены, компоненты, алиасы (???)
550 1494283
>>493901

>>У меня такое чувство что ты тот чувак


Да, это я. Но не, я сейчас особо не велосипедю.
>>493903

>>исключения умеют выбрасывать все модули слима


Как это происходит.
>>493907
Это я понял. Меня что то заклинило на исключениях
Я что то не догоняю, либо переусложняю.

Допустим, в коде есть вызов не существующей функции:
f();

Eсть дефолтное исключение BadFunctionCallException, из доки: "Создается исключение, если callback-функция относится к неопределенной функции или если некоторые аргументы отсутствуют."
Что происходит когда я вызываю f() ? php автоматически выбрасывает исключение класса BadFunctionCallException?
У меня выбрасывается это:
Fatal error: Uncaught Error: Call to undefined function fg()
Где выбрасываемое исключение?

И перехватить это таким образом:
try{

fg();

}catch( Exeption $e){

echo $e->getMessage();

}

не получается.

Я естественно читал из оп поста, с хабра. И чето я буксую. пхп сам по себе выбрасывает исключения? Или все исключения пробрасываются вручную через throw?
550 1494283
>>493901

>>У меня такое чувство что ты тот чувак


Да, это я. Но не, я сейчас особо не велосипедю.
>>493903

>>исключения умеют выбрасывать все модули слима


Как это происходит.
>>493907
Это я понял. Меня что то заклинило на исключениях
Я что то не догоняю, либо переусложняю.

Допустим, в коде есть вызов не существующей функции:
f();

Eсть дефолтное исключение BadFunctionCallException, из доки: "Создается исключение, если callback-функция относится к неопределенной функции или если некоторые аргументы отсутствуют."
Что происходит когда я вызываю f() ? php автоматически выбрасывает исключение класса BadFunctionCallException?
У меня выбрасывается это:
Fatal error: Uncaught Error: Call to undefined function fg()
Где выбрасываемое исключение?

И перехватить это таким образом:
try{

fg();

}catch( Exeption $e){

echo $e->getMessage();

}

не получается.

Я естественно читал из оп поста, с хабра. И чето я буксую. пхп сам по себе выбрасывает исключения? Или все исключения пробрасываются вручную через throw?
551 1494284
>>494141
Пили отдельные таблицы, нечего перегружать таблицу избыточными данными.
552 1494323
>>494283
Блядь, я хлебушек
553 1494433
Пишу просмотрщик Вики. Нужны ТЕСТовые страницы, по которым можно будет проверить его качество. Где искать?
554 1494439
>>494283

>Как это происходит.


У гугла спрашивай - тут тебе не школа.
Ты вообще хуйню какую-то творишь.

Вали учить базу сперва.
555 1494474
>>494439

>>У гугла спрашивай - тут тебе не школа.


Ебать ты тут маня-правила устанавливаешь. Нахуй пропутешествуй.
556 1494476
>>494283
Разобрался, короче доки нужно читать не жопой.
557 1494587
>>494474
Это не маня-правила, нуб, а логичный ответ на твой тупой вопрос. Тебя везде нахуй посылать будут, если будешь спрашивать такое.
К чему ты вообще спросил это? Сотня статей в гугле есть, а ты ждёшь, что тебе тут кто-то рассказывать элементарные вещи будет.
Да ты просто охуевший долбоёб.
558 1494590
>>494474
Алсо, ты не вкатишься - слишком много спеси для нуба.
559 1494633
>>494051
В ванильном PHP нет ассинхронщины, и что важнее, возможное ассинхронное применение не учитывается в экосистеме. Ты можешь хоть заобмазываться промисами и корутинами, но если у тебя библиотека в синхронном режиме обрабатывает массив коллбеков - то ты уже ничего не сделаешь, страдай.
Самое стабильное, что можно сделать, это или вынести ассинхронщину во внешние системы (типа сервисов на ноде/го) или делать приложение в виде очередей задач с пулом воркеров и всю асснхронщину пихать в эти очереди. Ну по типу Celery из питона или Gearman в php.
560 1494643
>>494633
почему так щас модно писать асинхронщину?там же много подводных,один косяк-и пиздец всему
561 1494660
>>494590
Отсоси маня, я уже вкатился да-да, не заная как нормально работать с эксепшенами

>>Это не маня-правила, нуб, а логичный ответ на твой тупой вопрос.


Ты забыл где ты, петушок.
562 1494680
>>494660
П.С.
Дополню, почему не нужно воспринимать подобные >>494587
>>494590 больше чем того они заслуживают. Первое и не важное - в них маня эмоции впрочоем они есть в каждом всегда и везде.
На мой взгляд можно спросить самую тупую вещь, потому что в правильно сформированном вопросе - половина ответа. Потому то спросить придется развернуто. Это можно вполне сравнить с этим:
https://ru.wikipedia.org/wiki/Метод_утёнка

И ожидание ответа стимулирует разбираться в вопросе.
563 1494797
>>494153
Ты считаешь что slim сложный фремворк(я об аналогичных фреймворках-роутерах)? Я не о его эусплуатации, а о самом его коде, о парадигме на которой slim построен.
564 1494977
пацаны, привет, знаю пыху на уровне циклы, условия, а также могу сделать простенький запрос к бд и вывести какую-нб инфу через foreach. а, и ещё могу форму обратной связи ебануть. но бля собираюсь засесть за изучение от а до я 7-ой версии. подскажите, сколько времени у меня это займет при занятиях 4 дня в неделю по 3 часа?
и если не впадлу, подскажите, Котерова стоит читать?
565 1494984
>>494680

>На мой взгляд можно спросить самую тупую вещь, потому что в правильно сформированном вопросе - половина ответа


Да, я тоже часто хочу задать какой то тупой вопрос итт, но как только его напишу - спрашиваю у себя, правильно ли я его сформулировал, и понимаю ли я то, о чем написал. В большинстве случаев вопрос решается до нажатия копки "отправить".
А на счет эксепшенов я вообще нихуя не понимаю. То есть я понимаю как их кидать и хватать, но не понимаю зачем. Помню где то прочитал, что их на продакшене убирают, так ли это? Их используют всегда, или только в каких то случаях?
566 1495018
>>494977
Бессмысленный вопрос
567 1495026
Молю, спасите. Битый час не получается достать данные из формочки.

Формочка:

<div class="text"><b>8.</b>email клиента:
<form action="send.php" method="POST" >
<input type="text" name="email" placeholder="email">
</form>
</div>

Пхп:

if (!empty($_POST['email'])) {
$email = $_POST['email'];
}

Перепробовал миллион вариаций, но получаю или Undefined index, или в переменную просто ничего не записывается.
568 1495034
>>495018
почему же?
569 1495038
>>495026
Так а кнопка "отправить" в форму положил?
https://htmlreference.io/forms/
570 1495045
>>495026
У тебя inpyt с type="submit' должен быть
571 1495047
>>495034
Потому что нет на него хоть какого обоснованного ответа.
572 1495051
>>495047
Хорошо, по-другому тогда. Ты бы как поступил? Стал бы Котерова читать с максимально минимальными знаниями в программировании?
573 1495057
>>495051
Можно прочитать сначала шапку треда, но это не точно
574 1495074
>>495051
Расставил бы реальные приоритеты.
А реальность такова, что вкатывальщики не вкатываются годами не по причине того что они метаются между Котеровым , шапкай ОП-поста (которая реально очень не плоха), ХайдиХо(ни к ночи помянут буде) и Откровением Иоанна Богослова.
А потому что

>>сколько времени у меня это займет при занятиях 4 дня в неделю по 3 часа?


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

Подумай скорее о своих качествах, чем о том на чем учится.Учиться на хуй пойми чем можно,документация к php, видосики с ютуба и статьи разные, учебники. Все в кучу.
575 1495163
Разбираться как работает slim пиздец интересно.
576 1495181
>>494643
Потому что во-первых есть ряд задач, которые ты иначе не решишь (сокеты те же), а во-вторых это позволяет намного эффективнее утилизировать ресурсы сервера. Простой пример, представь, что у тебя написано 20 пехапешных воркеров, которые делают какие-то запросы в базу и возвращают данные (классика). И в этот момент я присылаю тебе 20 жирных сложных задач в твои воркеры, каждая из которых будет процесситься хотя бы несколько секунд. Всё, я забил твою систему и все прочие пользователи начнут ждать, бесконтрольно обновлять страницу и ещё сильнее перегружать очередь входящих запросов. А вот если бы всё было сделано ассинхронно, то каждый из воркеров смог бы в какие-то моменты простоя (пока база что-то делает, файловая система думает, ещё что-то) обрабатывать прочие запросы. Обрабатывать больше одной задачи в один момент времениЮ другими словами.
Также хочу заметить, что в других областях типа игр, приложеий, фронтенда и т.д. "ассинхронщина" присутствует вообще по умолчанию, потому что то же взаимодействие пользователя с интерфейсом ты к схеме вопрос-ответ не сведёшь, пользователь может непрерывно мышкой по экрану двигать, к примеру.
В ассинхронщине нет ничего сверхсложного, она просто требует учёта дополнительных моментов при разработке.
577 1495242
>>495074
По факту разъебал, спасибо.
500-577 578 1495297
>>495181

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

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

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

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

>>494283

Первый раз слышу про это исключение. Судя по мануалу, это исключение из SPL https://www.php.net/manual/ru/spl.exceptions.php (встроенной в PHP библиотеки вспомогательных классов). Эти исключения, если я не путаю, PHP не выбрасывает (или выбрасывает только в отдельных случаях, например, из других SPL-классов) и они предназначены, чтобы ты мог их использовать в своем коде.

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

> У меня выбрасывается это:


> Fatal error: Uncaught Error: Call to undefined function fg()


> Где выбрасываемое исключение?



Видимо, PHP его не выбрасывает. В PHP во многих ситуациях используются ошибки (notice, warning, error, fatal error) которые не являются исключениями, и которые там с древних времен и поддерживаются из-за совместимости. Хотя ты можешь превратить их в исключения, почитав мануал по ErrorException.

В новых фичах PHP разработчики стараются использовать исключения вместо ошибок. Например, в новом PHP есть исключение ParseError: https://www.php.net/manual/en/class.parseerror.php

> И перехватить это таким образом:


> }catch( Exeption $e){



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

> пхп сам по себе выбрасывает исключения?



Редко и только в новых фичах.

> Или все исключения пробрасываются вручную через throw?



В основном, да.

Если ты вдруг не читал, мой урок про исключения: https://github.com/codedokode/pasta/blob/master/php/exceptions.md

>>494439

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

Аноны, не ведитесь на такие посты. Наш тред обучающий, а вопросы про исключения вполне нормальные. Просто кому-то было скучно и хотелось потроллить, и я могу этому кому-то только посочувствовать, но не буду. Пусть скучает дальше.
500-577 578 1495297
>>495181

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

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

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

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

>>494283

Первый раз слышу про это исключение. Судя по мануалу, это исключение из SPL https://www.php.net/manual/ru/spl.exceptions.php (встроенной в PHP библиотеки вспомогательных классов). Эти исключения, если я не путаю, PHP не выбрасывает (или выбрасывает только в отдельных случаях, например, из других SPL-классов) и они предназначены, чтобы ты мог их использовать в своем коде.

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

> У меня выбрасывается это:


> Fatal error: Uncaught Error: Call to undefined function fg()


> Где выбрасываемое исключение?



Видимо, PHP его не выбрасывает. В PHP во многих ситуациях используются ошибки (notice, warning, error, fatal error) которые не являются исключениями, и которые там с древних времен и поддерживаются из-за совместимости. Хотя ты можешь превратить их в исключения, почитав мануал по ErrorException.

В новых фичах PHP разработчики стараются использовать исключения вместо ошибок. Например, в новом PHP есть исключение ParseError: https://www.php.net/manual/en/class.parseerror.php

> И перехватить это таким образом:


> }catch( Exeption $e){



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

> пхп сам по себе выбрасывает исключения?



Редко и только в новых фичах.

> Или все исключения пробрасываются вручную через throw?



В основном, да.

Если ты вдруг не читал, мой урок про исключения: https://github.com/codedokode/pasta/blob/master/php/exceptions.md

>>494439

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

Аноны, не ведитесь на такие посты. Наш тред обучающий, а вопросы про исключения вполне нормальные. Просто кому-то было скучно и хотелось потроллить, и я могу этому кому-то только посочувствовать, но не буду. Пусть скучает дальше.
579 1495298
>>494439

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

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

>>494984

> То есть я понимаю как их кидать и хватать, но не понимаю зачем.



Чтобы сигнализировать о невозможности выполнить требуемую операцию или дать требуемую информацию. Есть два подхода:

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

Пример явной обработки ошибок:

[$error, $name] = getUserName($userId);
if ($error !== null) {
showErrorPage();
die();
}

...

Пример использования исключений:

$name = getUserName($userId);

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

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

Или допустим, есть библиотека HTTP-клиент (делает HTTP-запрос к серверу). Тут можно использовать любой из двух подходов.

> Помню где то прочитал, что их на продакшене убирают, так ли это?



Нет.

> Их используют всегда, или только в каких то случаях?



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

Почитай мой урок, если не читал.
579 1495298
>>494439

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

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

>>494984

> То есть я понимаю как их кидать и хватать, но не понимаю зачем.



Чтобы сигнализировать о невозможности выполнить требуемую операцию или дать требуемую информацию. Есть два подхода:

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

Пример явной обработки ошибок:

[$error, $name] = getUserName($userId);
if ($error !== null) {
showErrorPage();
die();
}

...

Пример использования исключений:

$name = getUserName($userId);

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

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

Или допустим, есть библиотека HTTP-клиент (делает HTTP-запрос к серверу). Тут можно использовать любой из двух подходов.

> Помню где то прочитал, что их на продакшене убирают, так ли это?



Нет.

> Их используют всегда, или только в каких то случаях?



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

Почитай мой урок, если не читал.
580 1495299
>>494587

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

>>494433

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

>>494141

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

>>494255

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

>>494153

Твои предложения? Это микрофреймворк и он проще для проектов на три странички, и в нем быстрее разобраться, чем в Симфони или Ларавеле.

>>493872

Для простых случаев поднимается отдельный демон вроде Autobahn, поддерживающий WAMP (Web App Messaging Protocol), и в него ты можешь отправлять из PHP события. Или пишется что-то свое на ReactPHP или на любом другом языке.
581 1495300
>>493858

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

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

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



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

> Я создал мое кастомное MyBadFunctionCallException исключение, наследуемое от этого BadFunctionCallException. И это кусок кода я обернул в try{}Catch(){} где в catch я отлавилваю свое MyBadFunctionCallException (но я его нигде руками не выбрасываю). И вот происходит косяк в коде, и вываливается дефолтное BadFunctionCallException.Будет ли это исключение отловлено моим обработчиком?



Нет. Если ты пишешь catch (A $e) , то ловятся исключения класса A и его наследников, но не предков. Можешь погуглить про принцип подстановки Лисков (это фамилия, а не внеземные существа).

>>493852

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

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

Я где-то читал, что в средневековом Лондоне хлебопеков, испекших плохой хлеб, заставляли его съедать. Так-то.
581 1495300
>>493858

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

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

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



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

> Я создал мое кастомное MyBadFunctionCallException исключение, наследуемое от этого BadFunctionCallException. И это кусок кода я обернул в try{}Catch(){} где в catch я отлавилваю свое MyBadFunctionCallException (но я его нигде руками не выбрасываю). И вот происходит косяк в коде, и вываливается дефолтное BadFunctionCallException.Будет ли это исключение отловлено моим обработчиком?



Нет. Если ты пишешь catch (A $e) , то ловятся исключения класса A и его наследников, но не предков. Можешь погуглить про принцип подстановки Лисков (это фамилия, а не внеземные существа).

>>493852

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

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

Я где-то читал, что в средневековом Лондоне хлебопеков, испекших плохой хлеб, заставляли его съедать. Так-то.
582 1495301
>>493837

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

>>493784

> старался везде использовать интерфейсы,



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

Интерфейсы надо делать не просто так, а для какой-то цели (например: чтобы другие могли бы расширять твой код, не изменяя его, а добавляя плагины). Если ты не можешь объяснить, зачем ты его сделал и чем это улучшит код, то лучше было не делать.

> Отсутствуют комментарии



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

// Удаляет товар из корзины покупателя. Делает изменения в графе объектов, но не
// вносит изменений в БД, для их внесения используйте saveCart().
function removeProduct(ShopCart $cart, ShopProduct $product)

К проекту стоит добавлять README.

> я каждую строку буду комментить и объяснять что эта строка делает,



Это было бы плохо. Не надо пересказывать учебник PHP в комментариях.
583 1495302
>>493747

Видимо include. Не советую писать, так как не имеет никакого смысла.

>>493269

Класс спроектирован плохо. Ответь на вопрос: если мы создадим объект класса, то что он представляет? Какому объекту или сущности реального мира (предметной области задачи) он соответствует? Никакому.

Если ты создал класс "Работник" со свойствами имя, должность, то это логично. А в твоем классе логики нет. У тебя есть поля col1, col2, но они даже не используются в методах. И название - functions - неудачное.

Если тебе нужны просто функции, либо сделай просто функции, либо класс StringHelper/TableHelper со статическими методами (паттерн Utility Class, погугли). Если тебе нужен класс для вывода таблицы, назови его TableHelper и сделай в нем методы для вывода таблицы. Тогда будет смысл в наличии в нем полей col1-col4, так как методы будут их использовать.

Вместо nbsp и <br> я бы советовал добавить HTTP-заголовок header("Content-Type: text/plain; charset=utf-8"), чтобы показать, что у тебя текст без разметки HTML и тогда браузер будет выводить пробелы и переводы строк как надо. Если же ты хочешь использовать HTML, то изучи теги для разметки таблиц вроде <table>, это потом пригодится.

>>493134

Не так. Куки хранятся столько, сколько указано, либо до закрытия браузера, если срок не указан. Сессии хранятся на сервере и удаляются, если в течение N минут не было обращений к ним, N задается в конфиге PHP. Сессия в простейшем случае это просто файл с длинным именем из случайных букв, которое хранится в куке.
584 1495303
>>493120

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

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

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

Получается такая логика: при авторизации мы выдаем пользователю куки, например, с токеном, а на защищенных страницах проверяем наличие и правильность токена.
585 1495309
>>495298
Спасибо, ОП.
586 1495364
>>495297
Спасибо, я уже разобрался. Меня просто заклинило на том что Exeption должны автоматом выбрасываться. Автоматом выбрасываются ошибки унаследованные от класса Error
587 1495368
>>495300

>>Если ты пишешь catch (A $e) , то ловятся исключения класса A и его наследников, но не предков.


Может ты опечатался? Если я тебя верно понял.
На сколько я проверял, если бросать myException которое extends от Exeption
try{
throw myException('бла-бла')
}catch( Throwable $e ){
//исключение будет поймано общим 'предком' для всех //исключений классом Throwable
}
588 1495369
>>495368
п.с.
А, все понял, я по утру протупил. У тебя все верно написано. Это я не в ту сторону воюю
589 1495423
Аноны, выполняю задание "создание списка студентов", в принципе я все могу нагуглить(как подключиться к базе, как сделать чтобы отправляло данные в бд и т.д.), но как-то плохо запоминается, подскажите как лучше всего делать данное задание, чтобы как можно больше знаний отложилось? Или забить на это хуй, и просто сделать, а затем с числом повторений я буду всё это запоминать и лучше понимать?
590 1495429
>>495423
Кратко записывай последовательность основных действий с комментами.
591 1495434
Оп, привет.
Спасибо за тредик, благодаря тебе вкатился в PHP и батрачу уже год за 50к(((
Теперь хочу перекатиться в другую конторку, и мне скидывают однотипные тестовые(реализовать какую-то еботу на натив php)
В чем суть:
ты не могу бы скинуть самых эталонно выполненных студентов, да бы мне накопипастить и сохранить свой выходной
592 1495673
Подскажите, как грамотно закрыть доступ к файлам/каталогам?
Роутер у меня slim.
У меня индексный файл находится в
public/index.php

В корневом каталоге $_SERVER['DOCUMENT_ROOT'] у меня находится .htaccess с таким содержанием:

AddDefaultCharset utf-8
Options -Indexes # это ограничивает доступ к каталогам
RewriteEngine On
RewriteRule ^(.)$ /public/$1

в каталоге public рядом с index.php у меня такой .htaccess :

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.
) index.php?$1 [L,QSA]

Какие варианты у меня:
директива Options -Indexes включена

вызываю http://slim/public/css/style.css - в браузере открывается style.css.
вызываю http://blog/public/css/ - доступ к каталогу ограничен.
То что мне не понятно как работает (напомню что index.php у меня не в корне сервера, а уровнем выше в каталоге public):
вызываю допустим:

http://blog/models/User.php - это существующий файл на сервере, и он не открывается ( появляется ошибка обработчика slim). Это связано с тем, что по указанию первого .htaccess все запросы и к папкам и к каталогам в том числе не глядя сервер отправляет на public/index.php , и там они уже обрабатываются? Так?

http://blog/models/ - не открывается каталог

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

В принципе в моем случае я все сам понял, но раз уж написал - запостю, что бы кому то начинающему помогло.
И какие существуют другие паттерны закрытия доступа к файлам и папкам на сервере?
592 1495673
Подскажите, как грамотно закрыть доступ к файлам/каталогам?
Роутер у меня slim.
У меня индексный файл находится в
public/index.php

В корневом каталоге $_SERVER['DOCUMENT_ROOT'] у меня находится .htaccess с таким содержанием:

AddDefaultCharset utf-8
Options -Indexes # это ограничивает доступ к каталогам
RewriteEngine On
RewriteRule ^(.)$ /public/$1

в каталоге public рядом с index.php у меня такой .htaccess :

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.
) index.php?$1 [L,QSA]

Какие варианты у меня:
директива Options -Indexes включена

вызываю http://slim/public/css/style.css - в браузере открывается style.css.
вызываю http://blog/public/css/ - доступ к каталогу ограничен.
То что мне не понятно как работает (напомню что index.php у меня не в корне сервера, а уровнем выше в каталоге public):
вызываю допустим:

http://blog/models/User.php - это существующий файл на сервере, и он не открывается ( появляется ошибка обработчика slim). Это связано с тем, что по указанию первого .htaccess все запросы и к папкам и к каталогам в том числе не глядя сервер отправляет на public/index.php , и там они уже обрабатываются? Так?

http://blog/models/ - не открывается каталог

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

В принципе в моем случае я все сам понял, но раз уж написал - запостю, что бы кому то начинающему помогло.
И какие существуют другие паттерны закрытия доступа к файлам и папкам на сервере?
593 1495690
>>495673
П.С.
У меня нет доступа к файлам которые лежат не в каталоге public потому что мой index.php находится не в корневом каталоге, а выше.
А как ограничить в Апач прямой доступ к файлам, если индексный файл находится в корневом каталоге? В таком случае по прямой ссылке на файл любой файл открывается. Как в таком случае сделать открытым для клиента толко каталог public, а остальные для клиента оставить не доступными?
594 1495767
>>495434
Какие задачи стоят перед джуном на работе в конторе? Допустим, на каком нибудь фреймворке. Я вроде и учусь, вроде и с фреймворком знаком, и в js-фреймворк могу, но резюме в контору скинуть стремно. Мало ли я свой уровень завышаю, и я еще не тяну на джуна. А посылать по 10 резюме в день не вариант, ибо 1.5 вакансии на область
595 1495812
>>495297

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


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

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


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

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


Ну так вспомни когда они писались. И прочитай про майнкрафт, где автор тоже сделал расчёт всего в едином цикле (и к каким эффектам приводило) и как чуваки из майрософта матерились после покупки, поддерживая и переписывая это дело.
И не сравнивай простенький платформер и шутан двадцатилетней давности (когда 3d шутер - это было инновация) и современные игры со множеством подсистем и большими потоками данных на переслать и на обработать. Те же rts вспомни, представь, сколько ресурсов уходит на поиск путей, механики, сетевое взаимодействие..

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


Я считаю, что написать можно что угодно на чём угодно, обложить кэшами и прочим, сам лет семь назад поддерживал пару сайтов-миллионников на пхп.
Но в какой-то момент бизнес расширяется (зачастую лавинообразно) и натурально упирается в оперативную память (потому что к примеру больше 100 пехапешных демонов на одной машине ты за раз не запустишь, а тяжёлых запросов к тебе приходит в разы больше.
И в такой момент ты по частям переписываешь нагруженные части на любой другой язык, который снизит твои траты на сервера. Сейчас в тренде golang, несколько лет назад на ноду все пересажвались.
Я это к чему, никто не говорит, что ассинхронщина - это прям серебряная пуля и решит все проблемы. Для старта нового бизнеса имхо ничего лучше нормального фреймворка на пхп не придумали, потому что быстро кодится, разработчики стоят дёшево и на маленьких нагрузках сильно накосячить они не смогут.
595 1495812
>>495297

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


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

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


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

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


Ну так вспомни когда они писались. И прочитай про майнкрафт, где автор тоже сделал расчёт всего в едином цикле (и к каким эффектам приводило) и как чуваки из майрософта матерились после покупки, поддерживая и переписывая это дело.
И не сравнивай простенький платформер и шутан двадцатилетней давности (когда 3d шутер - это было инновация) и современные игры со множеством подсистем и большими потоками данных на переслать и на обработать. Те же rts вспомни, представь, сколько ресурсов уходит на поиск путей, механики, сетевое взаимодействие..

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


Я считаю, что написать можно что угодно на чём угодно, обложить кэшами и прочим, сам лет семь назад поддерживал пару сайтов-миллионников на пхп.
Но в какой-то момент бизнес расширяется (зачастую лавинообразно) и натурально упирается в оперативную память (потому что к примеру больше 100 пехапешных демонов на одной машине ты за раз не запустишь, а тяжёлых запросов к тебе приходит в разы больше.
И в такой момент ты по частям переписываешь нагруженные части на любой другой язык, который снизит твои траты на сервера. Сейчас в тренде golang, несколько лет назад на ноду все пересажвались.
Я это к чему, никто не говорит, что ассинхронщина - это прям серебряная пуля и решит все проблемы. Для старта нового бизнеса имхо ничего лучше нормального фреймворка на пхп не придумали, потому что быстро кодится, разработчики стоят дёшево и на маленьких нагрузках сильно накосячить они не смогут.
596 1495827
почему в бенчах джанго рвет ларавел многократно?
597 1495846
>>495827
Надо смотреть, что за бенчи. 90% бенчмарков, что я видел, были написаны идиотами кем-то, кто специализируется только на одном стеке. В итоге скорее всего питоновый код написан и сконфигурирован правильно, а ларавел просто стандартным установщиком поставили и начали мерить.
Вообще по идее (смотря что именно мерять, конечн) седьмая пыха работает быстрее питона, различия должны быть в том, какую дополнительную работу совершают фреймворки. Ну и через что пхп запускался тоже важно, как простой cgi или через php-fpm, апач или nginx, всё такое.
598 1495850
>>495846
https://www.techempower.com/benchmarks/
в программаче часто бывает
599 1495856
>>495850
зенд быстрее ларки?не,херня какая то
600 1496102
Аноны, а я могу добавить в аргумент $_ POST переменную?
Допустим, я хочу сделать функцию которая будет принимать данные из форм
например, у меня есть несколько чекбоксов var1, var2, var3 ... varN. я предполагаю что получу все &_POST['var1...'], проверяю каждый вариант на существование и добавляю к переменной с помощью .=.
Как это можно реализовать? Функция же не может принимать в качестве аргумента name формы?

Извините за тупые вопросы, чесн не смог нагуглить.
601 1496122
>>496102
Потратил ещё час и все равно ничего не понял.

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

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

Спасите, аноны. Я в замешательстве.
602 1496127
>>496122
В общем, я внезапно понял, что мой вопрос не имеет смысла. $_POST -- массив, следовательно обрабатывать его можно только если мы знаем его индексы/значения, или весь в общем.

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

Видимо, избежать дублирования кода не удастся и придется делать так:
if (!empty($_POST['var1'])) {
$message .= 'some text'
}
И так до каждого var.

Надеюсь, я не прав.
603 1496174
>>496127
Ты не прав. $_POST нужно использовать в одном единственном месте за всё приложение, все прочие функции должны принимать уже нормальные аргументы.
604 1496181
>>496102
>>496122
>>496127
Прости, я нихуя не понял что ты хочешь:(

>>496174
Послушай этого анона, копируй $_POST в $post и делайс ним что хочешь.
605 1496263
>>496181

> Послушай этого анона, копируй $_POST в $post и делайс ним что хочешь.


Раскрою.
Ты в одном (!) месте извлекаешь из запроса всё, что тебе нужно (обычно в методе контроллера, если фреймворк сам этого не умеет), любые GET и POST-параметры - и засовываешь их в соответствующие переменные.
Затем ты вызываешь сервисы, которые уже делают какую-то бизнес-логику.

Т.е. у тебя в приложении есть слой контроллеров, которые принимают запросы, извлекают из них всё, что нужно и, возможно, валидируют это (как минимум на типы) - и слой сервисов, которые отвечают за логику твоего приложения, принимая конкретные аргументы.
Таким образом твоя бизнес-логика (то, что полезного делает твоё приложение) становится отделена от транспорта (через что твоё приложение работает). Так их можно независимо писать, тестировать, менять транспорты и так далее.
606 1496272
>>494587

>а ты ждёшь, что тебе тут кто-то рассказывать элементарные вещи будет.


Ну вообще-то да, этот тред для изучающих пшп. А такие мудилы как ты только отбивают желание учиться. Ты похож на типикал школьника из варкрафта, которого взяли в рейд из жалости, он нафармил шмота, а потом сам стал запрещать брать других в рейд, потому что "не ну а че они плохо одеты"
607 1496276
>>494977

>подскажите, сколько времени у меня это займет при занятиях 4 дня в неделю по 3 часа?


Анон, прежде всего я, как такой же новичок, хочу сказать - ты ебанешься три часа в день сидеть и читать мануал. Самый простой вариант - делать задачи из опа. У тебя УЖЕ есть база, осталось ее развить. Просто делай уроки из шапки, на уровне студентов и файлообменника ты приобретешь опыт больший, чем у среднестатистического деревенского проггера. Мануал читать это хорошо, но надо читать его параллельно с конкретной задачей.
608 1496282
есть ли хороший гайд по ларке для новичков?
видосы на англ не советуйте
609 1496283
>>495303
Спасибо оп. Анишки, а подскажите пожалуйстай еще такую тему:
есть какая-нибудь библиотека, которая позволяет подсвечивать код на странице и делать его раскраску? В учебниках и обучающих сайтах еще есть такие окошки с раскрашеным кодом. Есть готовые решения для такого? И как вообще это делается? Через джава скрипит?
610 1496288
>>496122
Анон, вроде как во всех крутых фреймворках есть место, где создается один массив из массивов гет и пост. А потом из кода все обращаются только к этому массиву. Это уже выше тебе написали. Если ты хочешь добавить еще один элемент в пост, чтобы, например, различать формы, то почему бы не добавить в форму еще одно скрытое поле/инпут с типом хидден и значением, которое тебе нужно? Прямо перед кнопкой. Оно тоже в пост попадет как и остальные
611 1496301
>>496282
Ларакасты
612 1496356
>>475112 (OP)

САП, Анончики. Прохожу тут в одном местечке пхп. Там есть задачка:

Дана верстка корзины в виде таблицы, и массив со значениями товаров (на вроде json'а, где каждый товар это массив с данными, и все товары лежат в общем массиве, поитогу вложенный массив). И задача "Интегрировать данные из массива в верстку".

Я разберусь со всякими техническими штуками, вопос такой: что такое "интегрировать данные в верстку"?

Я до этого всякие задачки решал, и не очень понимаю, что от меня хотят: перетащить данные из массива в хтмл? Что это вообще?
613 1496361
>>496356
Ты правильно понял, нужно вставить данные из массива в html страницу.
614 1496364
>>496361

Спасибо большое за помощь.
615 1496426
>>496301

>Ларакасты


там сплошные видосы
пых пых.jpg34 Кб, 619x326
616 1496446
какой же в пыхе красивый и лаконичный код...
617 1496503
>>496446

Просто ты пишешь, как обезьяна.
618 1496523
>>496503
этот отрывок кода не мой
619 1496529
Можно ли на локалхосте организовать отправку писем? Хотел пощупать как это, прочитал про драйвера mailgun и saprkPost. В первом не могу зарекаться, ибо карточки нет, а на втором "мое местополежние не обслуживается". Есть ли смысл другие пробовать?
620 1496538
>>496529
Попробую через smtp.gmail, вопрос решен.
621 1496556
>>496529
Можешь еще в сторону mailcatcher посмотреть, если я правильно тебя понял.
f4800e5hq.jpg59 Кб, 850x608
622 1496561
>>488679
Продублирую еще разок, чтобы ОП глянул.
623 1496596
>>496523
А писала всё равно обезьяна. Нормальный код нормально выглядит.
624 1496659
>>496596
так называемый норм код все равно говено выглядит,сам синтаксис говно
images.jfif8 Кб, 194x259
625 1496681
Товарищи! Очень нужна помощь.

Я так и не понял, как вставлять пхп в верстку.

Дана вот такая верстка: https://pastebin.com/jNtqkFpJ

Вот такой массив: https://pastebin.com/UAahDYHF

И, собственно, задача:

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

Объясните пожалуйста, я уже сутки гуглю.
626 1496687
>>496276
Да, после вектора и кошек я понял, что плаваю в ооп, а это еще оп не проверял даже, с другой стороны без крепких основ ты сразу закладываешь в свой код мины.
628 1496754
>>496659
Синтаксис обычный, си-подобный. Из уникальностей там толькотдоллары перед переменными.
Магические же комментарии в этих местах не нужны, по идее типы всех свойств должны быть описаны на уровне классов.
629 1496785
>>496754
меня бесят стрелки,по несколько штук в строке!!!
ksNt8KS3thumb.png67 Кб, 200x198
630 1496886
Хочу при сохранении юзером настроек профиля генерировать хеш из всей его модели, и на основе этого хеша рисовать картинку-штрихкод (вот гитхаб рисует кубическую абстракцию, а я хочу просто штрихкод одномерный разноцветный) и подставлять ее, если нет загруженного аватара, но не знаю с чего начать. Ну окей, начать конечно с хеша, это просто, md5/sha, дальше... всё, дальше глухо. Аватарка у меня 100х128 пикселей. Вот видели майонез ряба? Вот такой хочу штрихкод, только разноцветный и не с петухом офк. Если будет штрихкод, я могу просто поверх наложить апнг трафарет с любым рисунком и штрихкод будет просвечивать в нужных местах. Воть. Какие идеи, ананас?
631 1496896
>>496886
Так, ладно. Md5 32 символа в длину, значит 32 полоски. Символы в шестнадцатеричной системе, внезапно цвета тоже можно в шестнадцатеричной. Осталось придумать систему вывода толстой или тонкой полоски. А может быть есть стандарт для 32значных шестнадцатеричных кодов, но я не нашел пока.
632 1496912
>>496896
4 пикселя на знак:
633 1496920
>>496912
возьми лучше любую либу для рендера QR кодов выглядеть будет динамичнее чем полоски
585-633 634 1496949
>>496886

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

Также, ты можешь попробовать инновационный подход. Зачем брать полоски или квадратики, если можно взять векторы? Попробуй из хеша генерировать псевдослучайные линии, дуги, кривые Безье, заполненные цветом фигуры. Можно генерировать SVG картинку, формат не очень сложный (XML) и его удобно генерировать программно. Главное, продумать алгоритм генерации, чтобы линии не выходили за границы и чтобы не было просто случайного месива из линий.

>>496785

Ну так не пиши на PHP, в чем твоя проблема? У нас нет психологической помощи пострадавшим от синтаксиса PHP.
635 1496950
>>496561
>>482568

У тебя в Employee есть поля rateWithRank, litresOfCoffeeWR которые являются вычисляемыми из других полей. Из-за этого ты вынужден их пересчитывать при любых изменениях. Это усложняет код и на практике обычно проще просто не хранить эти поля, а сделать методы для их вычисления (хранить такие поля имеет смысл только если вычисления очень тяжелые и долгие, что явно не так в нашем случае). То есть я бы сделал просто метод вида

function getRateWithRank(): float { ... }

и вызывал бы его, если нам нужно посчитать зарплату.

Я советую убрать поля и увидеть, насколько упростится код.

> public function getAllProperties(){



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

$copy = clone $employee;
$copy->increaseRank();

А если клонирование не подходит - сделать метод вроде $copy = $employee->makeClone().

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

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

$clone = $group->extractEmployee();
$clone->increaseRank();
$staff->addEmployee($clone);

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

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

Мне не нравится метод EmployeeGroup#getEmployee, так как по моему, вместо него должно быть 2 отдельных метода, а не метод, возвращающий 2 значения сразу. Ведь это доставляет лишние неудобства, нам надо распаковывать этот массив, чтобы взять нужное значение.

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

> public function removeEmployeeType(EmployeeGroup $deletedEmployeeType){



Можно было назвать короче

public function removeGroup(EmployeeGroup $group)

> class Manager extends Employee



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

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

$dep = new Department('Отдел продаж');
$dep->getStaff()->addEmployee(new Employee(...));
$dep->getStaff()->addGroup(new EmployeeGroup(...));

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

> $salaryOfEmployees += $position->getRate() $num;



Не логичнее ли здесь было бы поместить код в группу и вызывать метод $group->getTotalSalary() ?

> $employees = $this->employees->getEmployeeTypes();


> foreach ($employees as $employee) {



Неудачные названия. Правильнее было бы:

$groups = $this->staff->getGroups();
foreach ($groups as $group) {

> public function fireEmployee(Employee $deletedPosition, $all = false){


> if ($position == $deletedPosition) {



Ты понимаешь, как происходит сравнение объектов при использовании == и ===? По моему, тут должно бы быть ===, или нет? Та же проблема в методе removeEmployeeType.

Вообще, не очень понятно, почему удаление сотрудников не делается в DepartmentStaff, а в Department. У тебя есть понимание, за что отвечает каждый из классов, где проходит граница между ними и где должен быть этот код?

> function padRight($string, $widthOfCol){


> if ($lengthOfString < $widthOfCol) {


> ...


> return $formattedString;



Если if не выполняется, функция ничего не вернет.

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

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

Также, у тебя есть ошибки:

>foreach ($groups as $group) { /считаем и сохраняем инженеров/


> list($num, $position) = $group->getEmployee();


> if (is_a($position, "Engineer") and !($position->isBoss())) {


> $numOfEng += $num;


> $sortedEngs[$position->getRank()] = $group;



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

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

$staff->filter(callable $filter)

Что он должен вернуть? Массив EmployeeGroup? С ним неудобно работать. Логичнее вернуть "коллекцию" сотрудников, объект класса DEpartmentStaff, получается метод:

function filter(callable $filter): DepartmentStaff

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

function filter(Employee $emp, int $count): int

Аналогично можно реализовать увольнение:

function fireIf(callable $filter)

Вообще, конечно, без групп все это было бы проще.

Как реализовать изменение сотрудников? Можно попробовать метод вида

function transform(callable $transformer)

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

$staff->transform(function (EmployeeGroup $group) {
if (... проверка ...) {
$subgroup = $staff->splitGroup($group, количество);
$subgroup->getEmployee()->increaseRank();
}
});

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

В общем, попробуем сделать увольнение 40% инженеров, начиная с низших рангов:

// Извлекаем всех инженеров
$engineerStaff = $staff->filter(function ($employee, $count) {
return $employee instanceof Engineer ? $count : 0;
});

$count = $engineerStaff->count();
$needToFire = ceil(0.4
$count);

// Сортируем по рангу
$engineerStaff->sort(function ($a, $b) {
return $a->getRank() <=> $b->getRank();
});

// Увольняем
$engineerStaff->each(function ($employee, $count) use (&$needToFire) {
$willFire = min($count, $needToFire);
if ($willFire > 0) {
$staff->fire($employee, $willFire);
$needToFire -= $willFire;
}
});

Вот такой вот адский код, который мог бы быть проще при отсутствии групп или если над ним посидеть подумать еще.
635 1496950
>>496561
>>482568

У тебя в Employee есть поля rateWithRank, litresOfCoffeeWR которые являются вычисляемыми из других полей. Из-за этого ты вынужден их пересчитывать при любых изменениях. Это усложняет код и на практике обычно проще просто не хранить эти поля, а сделать методы для их вычисления (хранить такие поля имеет смысл только если вычисления очень тяжелые и долгие, что явно не так в нашем случае). То есть я бы сделал просто метод вида

function getRateWithRank(): float { ... }

и вызывал бы его, если нам нужно посчитать зарплату.

Я советую убрать поля и увидеть, насколько упростится код.

> public function getAllProperties(){



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

$copy = clone $employee;
$copy->increaseRank();

А если клонирование не подходит - сделать метод вроде $copy = $employee->makeClone().

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

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

$clone = $group->extractEmployee();
$clone->increaseRank();
$staff->addEmployee($clone);

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

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

Мне не нравится метод EmployeeGroup#getEmployee, так как по моему, вместо него должно быть 2 отдельных метода, а не метод, возвращающий 2 значения сразу. Ведь это доставляет лишние неудобства, нам надо распаковывать этот массив, чтобы взять нужное значение.

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

> public function removeEmployeeType(EmployeeGroup $deletedEmployeeType){



Можно было назвать короче

public function removeGroup(EmployeeGroup $group)

> class Manager extends Employee



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

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

$dep = new Department('Отдел продаж');
$dep->getStaff()->addEmployee(new Employee(...));
$dep->getStaff()->addGroup(new EmployeeGroup(...));

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

> $salaryOfEmployees += $position->getRate() $num;



Не логичнее ли здесь было бы поместить код в группу и вызывать метод $group->getTotalSalary() ?

> $employees = $this->employees->getEmployeeTypes();


> foreach ($employees as $employee) {



Неудачные названия. Правильнее было бы:

$groups = $this->staff->getGroups();
foreach ($groups as $group) {

> public function fireEmployee(Employee $deletedPosition, $all = false){


> if ($position == $deletedPosition) {



Ты понимаешь, как происходит сравнение объектов при использовании == и ===? По моему, тут должно бы быть ===, или нет? Та же проблема в методе removeEmployeeType.

Вообще, не очень понятно, почему удаление сотрудников не делается в DepartmentStaff, а в Department. У тебя есть понимание, за что отвечает каждый из классов, где проходит граница между ними и где должен быть этот код?

> function padRight($string, $widthOfCol){


> if ($lengthOfString < $widthOfCol) {


> ...


> return $formattedString;



Если if не выполняется, функция ничего не вернет.

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

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

Также, у тебя есть ошибки:

>foreach ($groups as $group) { /считаем и сохраняем инженеров/


> list($num, $position) = $group->getEmployee();


> if (is_a($position, "Engineer") and !($position->isBoss())) {


> $numOfEng += $num;


> $sortedEngs[$position->getRank()] = $group;



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

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

$staff->filter(callable $filter)

Что он должен вернуть? Массив EmployeeGroup? С ним неудобно работать. Логичнее вернуть "коллекцию" сотрудников, объект класса DEpartmentStaff, получается метод:

function filter(callable $filter): DepartmentStaff

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

function filter(Employee $emp, int $count): int

Аналогично можно реализовать увольнение:

function fireIf(callable $filter)

Вообще, конечно, без групп все это было бы проще.

Как реализовать изменение сотрудников? Можно попробовать метод вида

function transform(callable $transformer)

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

$staff->transform(function (EmployeeGroup $group) {
if (... проверка ...) {
$subgroup = $staff->splitGroup($group, количество);
$subgroup->getEmployee()->increaseRank();
}
});

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

В общем, попробуем сделать увольнение 40% инженеров, начиная с низших рангов:

// Извлекаем всех инженеров
$engineerStaff = $staff->filter(function ($employee, $count) {
return $employee instanceof Engineer ? $count : 0;
});

$count = $engineerStaff->count();
$needToFire = ceil(0.4
$count);

// Сортируем по рангу
$engineerStaff->sort(function ($a, $b) {
return $a->getRank() <=> $b->getRank();
});

// Увольняем
$engineerStaff->each(function ($employee, $count) use (&$needToFire) {
$willFire = min($count, $needToFire);
if ($willFire > 0) {
$staff->fire($employee, $willFire);
$needToFire -= $willFire;
}
});

Вот такой вот адский код, который мог бы быть проще при отсутствии групп или если над ним посидеть подумать еще.
636 1496954
>>496122

Трудно понять, что ты хочешь сделать. $_GET или $_POST это массивы и их можно передавать в функции:

doSomething($_POST);

Обычно во фреймворках есть объект Request, и данные читаются из него. А для работы с формами создаются специальные классы. И никто руками GET или POST не разбирает. Потому тебе стоит задуматься об изучении фреймворков вместо написания кривых велосипедов, которые никто не захочет потом поддерживать.

Ты можешь просто передавать массив $_GET или $_POST в функцию:

// В $data передается нужный массив
function getCheckboxValue(array $data, string $name): bool

Модифицировать $_GET или $_POST ни в коем случае не надо, так как это сделает твой код нечитабельным и непонятным. Если тебе надо что-то извлечь, то создай новый массив и извлекай в него, а не порти исходный массив.

Также, у меня есть урок про работу с формами, вдруг поможет: https://github.com/codedokode/pasta/blob/master/forms.md У меня есть ощущение, что ты изобретаешь что-то свое и неудачное, потому почитай урок и сравни со своими идеями.

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



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

>>496283

Гугли code highligher library. Есть на JS, есть на PHP.
637 1496955
>>495812

Немного отдает фанатизмом. Интернет-магазины это вполне полноценная ниша. Как ты отделяешь "полноценные" ниши от "неполноценных"? По стоимости компании? Самые дорогие из IT-компаний это компании вроде Apple, Facebook, Microsoft и у них полно синхронного кода, и они не переживают по этому поводу. С качеством кода и разработчиков там тоже все в порядке. Amazon (интернет-магазин) тоже небедная компания. Или для тебя критерий это мнение трех с половиной анонимусов с элитного раздела двача? Что для тебя критерий "полноценности"?

> И не сравнивай простенький платформер и шутан двадцатилетней давности (когда 3d шутер - это было инновация)



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

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



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

PHP до определенных пределов прекрасно масштабируется добавлением серверов, а переписывание его на ноду не факт что увеличит производительность, так как это такой же интепретируемый язык с кучей своих тараканов и проблем. Насчет Го не знаю, но подозреваю, что переписывание большого проекта это очень дорого.
638 1496956
>>495690

Проще всего сделать корневым именно каталог public и не связываться с плохими хостингами, которые это не позволяют, а взять VPS.

Ты можешь почитать документацию по Апачу, если хочешь:

- https://httpd.apache.org/docs/2.4/howto/access.html#rewrite
- https://httpd.apache.org/docs/2.4/mod/core.html#directorymatch
- https://httpd.apache.org/docs/2.4/mod/mod_access_compat.html
- https://httpd.apache.org/docs/2.4/rewrite/

Или погуглить по "apache restrict access by directory".

И поколдовать с mod_rewrite. Можно настроить перенаправление запросов в каталог public. Но проще поменять корневую директорию.

Options -Indexes просто отключает показ содержимого каталога.

>>495434

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

>>495423

А ты читаешь подробные комментарии, которые идут после задачи? Прочитай то, что там написано, реализуй это в коде и я думаю, что-то ты запомнишь автоматически. Тебе не требуется учить названия и параметры функций наизусть, для этого есть мануал и Гугл. Тебе надо понять общие принципы, как работать с БД, с формами, что такое MVC, какие бывают уязвимости и так далее.
639 1497015
>>496785
Это называется "текучий интерфейс" (fluent interface), это расхожий паттерн и используется повсеместно от плюсов до джавы.
Пехапешных изысков тут нуль.
Учи матчасть.
640 1497042
>>496956

>А ты читаешь подробные комментарии, которые идут после задачи?



Я через эту тему учу http://old.code.mu/books/php/, мне не понравились уроки которые в шапке(дохуя лишнего, что очень отвлекает).
641 1497087
Котаны, помогите немного.
Проблема с редиректом в слим.
Я сделал определенную конструкцию, и из нее вроде все работает, кроме редиректа.
Вот ссылка:

https://ideone.com/iK3ONO

А вообще в слим, объеты $request и $response не являются свойствами объекста $app?
Я что то читал про то что методы $response не изменяется, может тут косяк?
642 1497090
>>497087
В принципе я заморачиваюсь из за приятного для меня единственного вызова
(new Controllers\TestController($request, $response, $this))->testGetPost();
в обработчике $app->get('t/test' ,....)
В принципе из контроллера возвращать можно данные, или логически состояния поверок. А отрисовывать уже в самом роуте.
Но не поставишь себе задачу-> не поделаешь себ мозг->не поймешь больше
643 1497095
>>497087
вызывать нужные контроллеры можно так - $app->get('/', MainController::class . ':index'); и чтобы сработало, скорее надо написать return $response, и да, так как не изменяется response, а создаётся новая копия, нужно присвоить переменной и ретернить её
644 1497098
>>496954

>Гугли code highligher library. Есть на JS, есть на PHP.


Спасибо
645 1497100
>>496446

>незагеристрированная версия бесплатной программы


Щас бы критику он нищих школопедов слушать
646 1497104
>>497090
p.s.
А вот допустим конструкция:
$this->response->getBody()->write("Hello, Вася");
вызванная из моего контроллера работает. Причем что return, что без return
>>497095

>>и чтобы сработало, скорее надо написать return $response, и да, так как не изменяется response, а создаётся новая копия, нужно присвоить переменной и ретернить её


и с return и без retun , и возвращал в переменную - нихрена.
647 1497106
648 1497123
>>497104
Попробуй классы вынести в других файлы, чтобы правильно выполнялось =)
649 1497125
>>497123
Не тролль.
650 1497132
>>497104
https://ideone.com/d6moNQ
Попробуй так, расскажешь что вышло.
651 1497152
>>496949
У меня аллергия на круги и буквы. Что если так: генерим мд5, затем рисуем на его основе кусочек паззла (ну, такие квадратики с выпуклостями и впуклостями). Можно это даже как рамку использовать, если юзер загрузил аватар. И страничку для поиска коллизий: "познакомьтесь, ваши хеш двойники ...", или: "вот с кем вы идеально стыкуетесь снизу ;)". Надо завязывать с кофеем.
652 1497154
>>497132
Да, получилось. Больше спасибо.
Не очень понимаю логику работы слим, и где return нужен/не нужен, и почему.
Почему для:
//$this->response->getBody()->write("Hello, Вася");
return не нужен
a
//return $this->response->withRedirect('/', 301);
без return не работаеет

Думаю от чтения исходников никто тупеее еще на стад :3
653 1497161
>>497154
Лучше всегда явно возвращать что ты хочешь. я подозреваю что withRedirect возвращает склонированный объект ответа с нужными заголовками, можешь задампить объект ответа, а потом задампить то что возвращает withRedirect, если айдишники разные то и объекты разные
403-can-turn.png193 Кб, 920x680
654 1497183
>>496950
Ля, сложно. Пожалуй перечитаю еще теорию, потом вернусь. Наверное я и кошек мышек уже накасячил.
655 1497233
пых однопоточный?
656 1497245
>>497233
Проще всего сказать что да. Есть, конечно, всякие расширения, прочие хитрости - но это не особенно популярно и стабильно да и не нужно.
657 1497328
Какие задачи стоят перед джуном, на том же Laravel, Yii2. Никак не могу решиться, вдруг мне дадут задачи с которыми я не буду успевать справляться. Хотя в резюме пишут что если мало опыта, то помогут/научат. Аноны которые вкатились, что скажете?
658 1497347
>>497328
В начале будешь править баги, может верстку, писать небольшие круды. По мере освоения будут давать более сложные задачи, но ничего невыполнимого. Если чего-то не будешь понимать, тебе всегда подскажут более опытные коллеги. Уровень у тебя скорее всего слабый, но работодатель это тоже будет понимать, не очкуй слишком сильно.
659 1497433
>>497328
Как правило это фикс багов в существующей логике и тебе действительно кто-то поможет, потому что даже супер-сеньор-ниндзя-мастеру нужно время, что включиться в проект и понять, что где лежит, как происходит и так далее. Главное, упрости свой онбоардинг, постарайся как можно быстрее разобраться, что в коде за что отвечает, какая архитектура, какие правила, какой процесс и так далее.
И проверяй за собой всегда, невнимательность - бич новичков.

И забудьте вы уже про yii2! Он ВО-НЯ-ЕТ! Это плохо задизайненная, плохо написанная, морально устаревшая, не развивающаяся, популярная только в странах СНГ херовина, которая не принесёт вам ничего хорошего. Я серьёзно.
Особенно новички, идите в компании, где или Laravel, или Symfony , или на крайняк что-то на симфоневских компонентах типа Drupal8+. Остальное - сразу нахер, вы только научитесь плохому и снизите свою востребованность на рынке труда в будущем.
660 1497459
>>497347
>>497433

Ну там так и написано, мол если есть желание, то подтянем. Даже фреймворк с гитом входят лишь в "было бы хорошое, если вы знаете". А в них я уже более-менее разобрался.
Yii я как пример привел, сам Laravel разбираю сейчас.
Спасибо за ответы
661 1497464
лара или
662 1497467
>>497464
симфони?
663 1497788
>>497464 элоквинт или
>>497467 доктрина
Выбирай по ним.
Я например блюю от доктрины
664 1497805
>>497788

> блюю от доктрины


Конечно, лучше обмазаться этими вашими говноактиврекордами.
Именно за такие сентенции phpшников и считают копрокодерами.
665 1497816
666 1497822
>>488646
ОП и Компания, помогите дорешать "Навигатор", вроде бы маршруты искать я его научил, а вот отдавать их из функции он категорически отказывается. (С горем пополам вытащил один единственный маршрут) Я хз куда ставить этот return чтоб получить все оставшиеся дорожки. https://3v4l.org/vVLL8
[Ссылка]
vVLL8
https://3v4l.org/vVLL8
снимок.png27 Кб, 605x245
667 1497837
>>497822
Я так понял, тебе нужно массив результатов вернуть из функции. Если да, то вот так.
image.png6 Кб, 319x62
668 1497844
>>475112 (OP)
Антоны, копаюсь в чужом пхп-говне, а там надо добавить условие, типа если $clid_only равна двум двойным кавычкам (""), то $clid_only должна принимать значение "emptyclid"

Делаю так: (на всякий случай то же самое на пике, вдруг вакаба съест)
if ( $clid_only == '"" ') {
$clid_only == "emptyclid";
}


Но когда я после этого вызываю $clid_only, он мне все равно возвращает сраные кавычки, хотя должен возвращать строку emptyclid.
В чем моя ошибка? Может в условии надо как-то хитро экранировать их?
image.png50 Кб, 1481x274
669 1497846
Вот полностью листинг, на всякий случай
image.png50 Кб, 1481x274
670 1497850
Так тоже нихера не меняется
671 1497855
Мда, я тупой. Там же ""
image.png1 Кб, 163x55
672 1497856
673 1497865
>>497805
Им родина дала PDO , нет , они хотят ебли с объектами. Только нативный sql , только хоркор
674 1497879
>>497865
А за такое нужно сразу в лагеря отправлять.
675 1497880
>>497865
неудобная хрень
676 1497987
>>497879

>>писать бекенд


>>незнать sql



Что же с нами стало.jpg

>>497880
Я sql раньше пхп изучил, вполне норм.
677 1497993
Котаны, а как правильно сделать пользовательские сообщения?

У меня отдельный класс типа userMessage
он проверяет опеределенные поря в $_SESSION, ну и выводит на страничке сообщения. Вывод у меня вызовом статического класса прям в хтмл:
<body>
///бла-бла
<?php \lib\myMessages::printMessage()>
///бла-бла
<body>
Это правильный подход?
И такой, достаточно общий вопрос - где и когда принято юзять ajax?
По идее как раз пользовательские уведомления через ajax и нужно реализовывать.
678 1497998
>>496276
лол, я в деревне живу как раз
679 1498006
>>497987
Есть разница между знанием и применением там, где это не нужно. Ты же не станешь самостоятельно выковывать себе велосипед, хотя в принципе знаешь и способен, ты купишь готовый.
В работе с базой данных есть ряд задач, которые тебе в любом случае предстоит решать, это маппинг данных из базы в объекты, работа с нормализацией/денормализацией, написание миграций, преобразование одних данных в другие перед сохранением/загрузкой, динамическое составление запросов и тому подобное.
Соответственно, если ты не возьмешь какой-либо из популярных инструментов (где эти задачи уже решены, либо есть инструменты и подходы для их решения), то тебе придётся решать их самостоятельно. Но поскольку скорее всего у тебя нет столько времени, сколько потрачено на существующие инструменты (а там тысячи часов уже), а также ты вряд ли способен сразу написать правильно в т.ч. с точки зрения архитектуры (а бизнес тебе не даст просто так тратить время и переписывать уже работающее), то у тебя получится кое-как работающая, бажная, неоптимальная, неподдерживаемая поделка, в которой разбираешься только ты.
В итоге ты-то может и почесал своё чсв и накропал себе свой самописный слой взаимодействия с бд, но страдать будут другие разработчики (особенно когда ты уволишься, а вы, велосипедостроители, всегда в итоге увольняетесь) и бизнес.

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

Задроты могли бы здесь возразить, что инструменты строят неоптимальные запросы, имеют оверхед и всё такое. На это я вам отвечу, что во-первых выбирайте инструменты правильно, а во-вторых не впадайте в грех преждевременной оптимизации, чтобы всерьёз упереться в неоптимальные запросы у того же Laravel вам нужен настолько большой трафик, что в этом случае бизнес уже озолотится и у него появятся ресурсы для написания чего-то специализированного под его бизнес.
679 1498006
>>497987
Есть разница между знанием и применением там, где это не нужно. Ты же не станешь самостоятельно выковывать себе велосипед, хотя в принципе знаешь и способен, ты купишь готовый.
В работе с базой данных есть ряд задач, которые тебе в любом случае предстоит решать, это маппинг данных из базы в объекты, работа с нормализацией/денормализацией, написание миграций, преобразование одних данных в другие перед сохранением/загрузкой, динамическое составление запросов и тому подобное.
Соответственно, если ты не возьмешь какой-либо из популярных инструментов (где эти задачи уже решены, либо есть инструменты и подходы для их решения), то тебе придётся решать их самостоятельно. Но поскольку скорее всего у тебя нет столько времени, сколько потрачено на существующие инструменты (а там тысячи часов уже), а также ты вряд ли способен сразу написать правильно в т.ч. с точки зрения архитектуры (а бизнес тебе не даст просто так тратить время и переписывать уже работающее), то у тебя получится кое-как работающая, бажная, неоптимальная, неподдерживаемая поделка, в которой разбираешься только ты.
В итоге ты-то может и почесал своё чсв и накропал себе свой самописный слой взаимодействия с бд, но страдать будут другие разработчики (особенно когда ты уволишься, а вы, велосипедостроители, всегда в итоге увольняетесь) и бизнес.

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

Задроты могли бы здесь возразить, что инструменты строят неоптимальные запросы, имеют оверхед и всё такое. На это я вам отвечу, что во-первых выбирайте инструменты правильно, а во-вторых не впадайте в грех преждевременной оптимизации, чтобы всерьёз упереться в неоптимальные запросы у того же Laravel вам нужен настолько большой трафик, что в этом случае бизнес уже озолотится и у него появятся ресурсы для написания чего-то специализированного под его бизнес.
680 1498007
>>498006

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


На моей практике, кстати, в 9 случаях такого велосипедостроения из 10 на выходе был отборный трешак, на который даже смотреть было больно, настолько там всё плохо. Почему-то серьёзные разработчики имеют привычку концентрироваться на эффективном (цена/качество) решении реальных задач существующими инструментами, а не попытках сделать "не как все". А вот новички грешат этим очень часто, когда при каком-никаком опыте появляется чувство "я всё знаю, сейчас сделаю зашибись".
681 1498057
>>498006
>>498007
Да что же вы раскукарекались то, я же с сарказмом написал.
просто проиграл обдумывая мысль о том как разработчик бекенда не знает sql
Понятно что вы оба правы.
682 1498070
кто пользовался ратчедом,на малых нагрузках 1к-2к игроков сразу норм,или ну его нах и взять ноду?
683 1498106
Есть
Таблицы пользователе и постов.
Как вывести для каждого пользователя его последний пост.
Могу селектить все пользователей а после в цикле селектить пост пользователя лимит 1 от новых к старым
684 1498153
>>498106
Мне кажется что это можно сделать одним sql запросом.
685 1498155
Аноны, есть ли вариант найти бесплатный хостинг, чтобы по-тестить проект на фреймворке? Я в этом не очень разбираюсь, все что нашел это хостинги для статических html страничек
686 1498188
687 1498237
>>498070
Знакомые ратчет использовали, вроде живут как-то, нагрузки на несколько тысяч пользователей. Но я бы взял ноду.

>>498106
Есть простое правило: никогда не используй запросы в циклах. В твоей ситуации всё, что тебе нужно, это выбрать таблицу последних постов по юзерам, а затем заджоиниться к таблице реальных юзеров, чтобы учесть тех юзеров, у кого постов вообще нет.
Что-то вроде:
select user.id, res.id from user left join (select p.user_id, p.id, p.max(date) as last_date from post p group by p.user_id, p.id) as res on user.id = res.user_id
688 1498238
>>498155
А зачем тебе для этого хостинг? Поднимай локально, да и всё.
Ну или юзай хероку
689 1498314
>>475112 (OP)
Отправляю файл через
https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL

Сервак (apache) принимает файл и записывает на диск, но файл не открывается (размер совпадает, но битый формат)
690 1498318
итак анонюги объясните мне нахуй использовать фреймворки типа Laravel yii и чо там еще есть модное, если все для веб хуйни можно делать на чистой пыхе? везде где читаю зачем нужен фреймворк конкретно под пыху пишут что это легче быстрее безопаснее , что конкретно легче быстрее безопаснее, что я не могу сделать на пхп использую стандартные функции ну плюс модули всякие типа тогоже mysqli и там прочей встроенной хуйни
недавно брался за проект в команде, чел якобы хуякобы сам себя же провозгласивший великим кодером и менеджером проекта в одном флаконе, роняя кал и брызжа слюной просил все делать на laravel, ладно ,думаю, мб че нового освою, делаю пытаюсь сделать ресь апи на этом говне, ебаные rewriteRule божественняе в .htaccess в две строки делаются в этом говне пердолингом себя и чей то там матери с пол часа наверно, кинул нахуй эту затею, послал его нахуй, и писал на чистой пыхе, все работает как часы, нахуй оно нужно блять объясните
image.png120 Кб, 720x303
691 1498326
692 1498409
>>498318
Прими галоперидол и успокойся. Всё нормально, это осень, сейчас все на нервах. Это пройдёт.
693 1498410
>>498237
Ну это подзапрос в запросе не ровно так же что с запросом в цикле?
694 1498416
>>498318
Пидор ты тупой, ведь ты читал буквально 10-ю поставми выше полнустью развернутый ответ на твое кукареканье. ЗАчем писал? Тралл мамин?
695 1498430
Хоче небольшое напутствие дать вкатывающимся анонам. Сам я полувкатился. полу, потому что работаю в гос.шараге прогером, ну вы поняли
Так вот - после того как вы вкатитесь в азы и ООП, как разберетесь с общими вопросами , после понимания из чего состоит само приложение , степень синдрома студента снизится и вы начнете писать уже приминимый говнокод, а не постоянно учить и учить и учить.
Ты вы начнете получать удовольствие от кодинга, я гарантирую это.
Решать абстрактный задачки на структуры и алгоритмы - хоть и полезно, но скучно от отсутствия результата.
А вот писать свой какой нибудь класс, который ты будешь юзать в своем приложении - это гораздо гораздо интереснее.
Доползите до этого этапа.
430 - 499, 639 - 693 696 1498466
>>498318

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

>>498314

Попробуй сдампить, что приходит в $file и что получается после декодирования, а также изучить устройство Data URL. У меня есть подозрение, что ты пытаешься декодировать URL вместе с префиксом, плюс там нет гарантий, что он будет в base64? Изучи Data URL от начала и до конца.

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

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

>>498106

Если тебе хочется делать это быстро, то придется как-то кешировать id последнего поста в таблице пользователей либо где-то в кеше.

>>498070

Потестируй.
697 1498468
>>497993

Во-первых, почитай рекомендации по оформлению кода вроде PSR-1, PSR-2 и пиши имена классов с большой буквы, а не изобретай свои стандарты.

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

Во-вторых, не очень понятно, зачем там аякс. Аякс нужен для отправки запроса на сервер или получения данных с сервера без перезагрузки страницы. Если ты хочешь показывать уведомления, то логичнее использовать вебсокеты и библиотеки вроде autobahn.

>>497855

Там еще и пробел затесался, судя по коду.

>>497822

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

Примерно так:

function makeOneStep(существующий_маршрут, цель, ....)
{
если существующий_маршрут оканчивается в цели, то возвращаем существующий_маршрут;

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

отбираем самый лучший маршрут из массива и возвращаем его;
}

Также ты можешь посмотреть другие алогоритмы поиска пути, вроде алгоритма Дийкстры или A-star.
697 1498468
>>497993

Во-первых, почитай рекомендации по оформлению кода вроде PSR-1, PSR-2 и пиши имена классов с большой буквы, а не изобретай свои стандарты.

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

Во-вторых, не очень понятно, зачем там аякс. Аякс нужен для отправки запроса на сервер или получения данных с сервера без перезагрузки страницы. Если ты хочешь показывать уведомления, то логичнее использовать вебсокеты и библиотеки вроде autobahn.

>>497855

Там еще и пробел затесался, судя по коду.

>>497822

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

Примерно так:

function makeOneStep(существующий_маршрут, цель, ....)
{
если существующий_маршрут оканчивается в цели, то возвращаем существующий_маршрут;

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

отбираем самый лучший маршрут из массива и возвращаем его;
}

Также ты можешь посмотреть другие алогоритмы поиска пути, вроде алгоритма Дийкстры или A-star.
698 1498470
>>497233

Для PHP-скрипта - да. Скрипт выполняется в один поток. Но на сервере обычно работает много процессов PHP, выполняющих параллельно разные скрипты.

>>497183

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

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

Если хочешь еще попрактиковаться в ООП, у нас есть задача про ООП-Гостиницу: https://phpclub.tech/pr/res/1082507.html#1097078

Также, можешь попробовать сделать свою мини-реализацию дерева DOM на PHP. Про дерево можно прочесть тут:

- https://learn.javascript.ru/dom-nodes
- https://learn.javascript.ru/dom-navigation
- https://learn.javascript.ru/document

Тут можно увидеть описание существующей реализации DOM в PHP: https://www.php.net/manual/ru/book.dom.php

Тут официальный стандарт на DOM: https://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/ (его читать не обязательно, но можно полистать при желании).

Нужно сделать классы DOMNode, DOMElement, DOMDocument, методы вроде appendChild, cloneNode, insertBefore, removeChild, replaceChild, createElement, getElementById, getElementsByTagName, saveHtml, при желании заморочиться - querySelector, свойства documentElement, nodeName, nodeType, parentNode, childNodes, firstChild, lastChild, previousSibling, nextSibling, ownerDocument.

Остальные классы (DOMText, DOMComment) делать не надо, атрибуты делать не надо, загрузку из HTML делать не надо, экспорт в HTML - желательно сделать.

Знакомство с DOM тебе все равно потом пригодится, так как он используется в браузере, ну и заодно, может быть, поможет с пониманием ООП.
698 1498470
>>497233

Для PHP-скрипта - да. Скрипт выполняется в один поток. Но на сервере обычно работает много процессов PHP, выполняющих параллельно разные скрипты.

>>497183

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

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

Если хочешь еще попрактиковаться в ООП, у нас есть задача про ООП-Гостиницу: https://phpclub.tech/pr/res/1082507.html#1097078

Также, можешь попробовать сделать свою мини-реализацию дерева DOM на PHP. Про дерево можно прочесть тут:

- https://learn.javascript.ru/dom-nodes
- https://learn.javascript.ru/dom-navigation
- https://learn.javascript.ru/document

Тут можно увидеть описание существующей реализации DOM в PHP: https://www.php.net/manual/ru/book.dom.php

Тут официальный стандарт на DOM: https://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/ (его читать не обязательно, но можно полистать при желании).

Нужно сделать классы DOMNode, DOMElement, DOMDocument, методы вроде appendChild, cloneNode, insertBefore, removeChild, replaceChild, createElement, getElementById, getElementsByTagName, saveHtml, при желании заморочиться - querySelector, свойства documentElement, nodeName, nodeType, parentNode, childNodes, firstChild, lastChild, previousSibling, nextSibling, ownerDocument.

Остальные классы (DOMText, DOMComment) делать не надо, атрибуты делать не надо, загрузку из HTML делать не надо, экспорт в HTML - желательно сделать.

Знакомство с DOM тебе все равно потом пригодится, так как он используется в браузере, ну и заодно, может быть, поможет с пониманием ООП.
699 1498472
>>497154

Потому, что withRedirect создает и возвращает новый объект (почитай рекомендацию PSR-7 https://www.php-fig.org/psr/psr-7/ ), а write() пишет данные в существующий объект. И если ты ничего не возвращаешь явно, то видимо Slim берет то, что лежит в $this->response (хотя лучше бы он выдавал ошибку в таком случае).

>>497095

Поправлю, что $app->get() регистрирует контроллер как обработчик для GET-запроса на определенный URL, и ничего не вызывает.

>>497042

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

>>492837

> Есть PSR-7 совместимая либа для управления куками. Но объекты этой либы нельзя создавать, там все на статических методах. Каким образом мне доставать либу из контейнера и передавать аргументом?



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

> Или может быть забить на все правила и напрямую в контроллере вызывать CookieClass::setCookie()?



Логично так и сделать.
700 1498475
>>492971

Более 4-6 аргументов делать не стоит. Тут и на других сайтах есть обсуждение: https://softwareengineering.stackexchange.com/questions/145055/are-there-guidelines-on-how-many-parameters-a-function-should-accept

Можно не передавать эти поля в конструктор, а задавать сеттерами или напрямую, если доступ разрешен:

$file = new File;
$file->setName(...);
$file->setSize(...);

Можно передавать только самые важные поля. Можно передавать массив с данными:

$file = new File([
'name' => ...,
'size' => ...
]);

Картинки для ридми можно положить в репозиторий и ссылаться на них по относительному URL как docs/main.png, будет лучше. В composer.json можно указать требования к версии PHP. В ридми можно добавить краткую инструкцию по разворачиванию проекта.

Мне не очень нравится сложноватый конфиг nginx, можно наверно было обойтись без переписывания URL?

Идея с кучей провайдеров тут https://github.com/medbrat13/jesus-saves-your-file/blob/master/kernel/services/NotFoundHandlerServiceProvider.php мне не очень нравится. Провайдер, как я понимаю, в Laravel используется, чтобы зарегистрировать пачку сервисов и внесения изменений для них в конфигурацию. У тебя же на каждый сервис свой провайдер.

Не проще ли сделать один провайдер со всеми сервисами?

У тебя регистр букв в неймспейсе не соответствует регистру букв в папках - почему? Это не нарушает ли PSR-0/PSR-4?

Смысл класса Connection не очень понятен. Что тебе мешает положить в контейнер сразу объект PDO? Ты по моему дублируешь тут функции контейнера.

https://github.com/medbrat13/jesus-saves-your-file/blob/master/app/controllers/DownloadController.php

Не имеет особого смысла писать throw и catch в одной функции, так как они заменяются на if/else.

Исключения не создают через контейнер, их создают через new. Через контейнер создают сервисы и подобные объекты, которые должны быть в одном экземпляре, у которых есть зависимости и которые не соответствуют какой-то сущности. Объекты-сущности обычно создают не через контейнер, а через new.

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

Плохо, что ты используешь goto. Неужели такая сложная логика, что без него никак?

> protected function doFind(array $values): array



А вот здесь, возможно, стоило использовать объект вместо массива для представления критериев поиска. А то приходит массив и неизвестно, что в нем может быть. Как мне реализовать класс-наследник, если я не знаю, что может быть в массиве? Документации ведь нету.

DataMapper наверно должен работать только с БД и не искать что-то в сфинксе - для этого стоит сделать отдельный сервис.

> if (is_bool($queryResult)) {


> throw new \Exception('Не работает поисковой сервер');



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

> for ($i = 0; $i < count($matches); $i++) {



Почему не foreach? И почему не array_column или подобная стандартная функция?

> array_push($idList,



Можно писать $idList[] = ....

В базовом классе DataMapper стоило поставить комментарии перед абстрактнвми методами, чтобы понять, как они должны работать.

> if (!is_array($result) || empty($result)) {


> return [$this->doCreateObject([])];



Если ничего не найдено, то логично возвращать пустой массив, а не пустой объект. Так как если мы сделаем count(), то для 0 результатов мы получим массив из 1 элемента. Нелогично.

Это, конечно, не все замечания, потом еще гляну.
700 1498475
>>492971

Более 4-6 аргументов делать не стоит. Тут и на других сайтах есть обсуждение: https://softwareengineering.stackexchange.com/questions/145055/are-there-guidelines-on-how-many-parameters-a-function-should-accept

Можно не передавать эти поля в конструктор, а задавать сеттерами или напрямую, если доступ разрешен:

$file = new File;
$file->setName(...);
$file->setSize(...);

Можно передавать только самые важные поля. Можно передавать массив с данными:

$file = new File([
'name' => ...,
'size' => ...
]);

Картинки для ридми можно положить в репозиторий и ссылаться на них по относительному URL как docs/main.png, будет лучше. В composer.json можно указать требования к версии PHP. В ридми можно добавить краткую инструкцию по разворачиванию проекта.

Мне не очень нравится сложноватый конфиг nginx, можно наверно было обойтись без переписывания URL?

Идея с кучей провайдеров тут https://github.com/medbrat13/jesus-saves-your-file/blob/master/kernel/services/NotFoundHandlerServiceProvider.php мне не очень нравится. Провайдер, как я понимаю, в Laravel используется, чтобы зарегистрировать пачку сервисов и внесения изменений для них в конфигурацию. У тебя же на каждый сервис свой провайдер.

Не проще ли сделать один провайдер со всеми сервисами?

У тебя регистр букв в неймспейсе не соответствует регистру букв в папках - почему? Это не нарушает ли PSR-0/PSR-4?

Смысл класса Connection не очень понятен. Что тебе мешает положить в контейнер сразу объект PDO? Ты по моему дублируешь тут функции контейнера.

https://github.com/medbrat13/jesus-saves-your-file/blob/master/app/controllers/DownloadController.php

Не имеет особого смысла писать throw и catch в одной функции, так как они заменяются на if/else.

Исключения не создают через контейнер, их создают через new. Через контейнер создают сервисы и подобные объекты, которые должны быть в одном экземпляре, у которых есть зависимости и которые не соответствуют какой-то сущности. Объекты-сущности обычно создают не через контейнер, а через new.

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

Плохо, что ты используешь goto. Неужели такая сложная логика, что без него никак?

> protected function doFind(array $values): array



А вот здесь, возможно, стоило использовать объект вместо массива для представления критериев поиска. А то приходит массив и неизвестно, что в нем может быть. Как мне реализовать класс-наследник, если я не знаю, что может быть в массиве? Документации ведь нету.

DataMapper наверно должен работать только с БД и не искать что-то в сфинксе - для этого стоит сделать отдельный сервис.

> if (is_bool($queryResult)) {


> throw new \Exception('Не работает поисковой сервер');



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

> for ($i = 0; $i < count($matches); $i++) {



Почему не foreach? И почему не array_column или подобная стандартная функция?

> array_push($idList,



Можно писать $idList[] = ....

В базовом классе DataMapper стоило поставить комментарии перед абстрактнвми методами, чтобы понять, как они должны работать.

> if (!is_array($result) || empty($result)) {


> return [$this->doCreateObject([])];



Если ничего не найдено, то логично возвращать пустой массив, а не пустой объект. Так как если мы сделаем count(), то для 0 результатов мы получим массив из 1 элемента. Нелогично.

Это, конечно, не все замечания, потом еще гляну.
701 1498476
>>492175

> Вообще эти роутеры отдельно от фрймов можно юзать?



Можно, берешь Symfony Routing Component и используешь где хочешь: https://symfony.com/doc/current/components/routing.html

>>491525

Там имелось в виду, что если у тебя есть статическое свойство, то к нему не обратиться через $this, а если есть статический метод, то можно написать $this->staticMethod() и это сработает, хотя я так не советую делать, сбивает с толку.

"посредством экземпляра класса " - это значит через стрелочку -> , а не два двоечточия ::.

К статическим полям и методам правильно обращаться через ::. В нормальном коде нет необходимости для них использовать стрелку.

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

>>491487

Если это библиотека со статическими методами, то не клади ее в контейнер, а вызывай напрямую. Либо сделай свою не-статическую обертку, если хочешь ее подменить на что-нибудь потом.
702 1498503
>>498410
Нет, конечно.
Во-первых, нужно максимум (в рамках разумного) работы по формированию выборки переносить в базу данных, потому что она эффективнее и быстрее это спроцессит. Тут есть грань, которую не стоит пересекать, потому что можно начать пихать в базу данных бизнес-логику, чего стоит избегать. Но такие вещи, как посчитать максимум или перебрать данные в цикле база делает на порядки быстрее, чем PHP.
Во-вторых, каждый запрос в базу идёт по сети, это означает, что он может не дойти, оборваться, его нужно обработать, он может забить сеть и помешать другому запросу, если их будет много и так далее. Общение с базой данных в идеале должно происходить в формате "послал запрос" -> "получил необходимые данные", одним пакетом.
703 1498508
>>498503
А, ну и третья причина. Данные в базе могут измениться между двумя запросами. То есть, ты сделал два запроса, к примеру, сортировка по алфавиту, первые 10 элементов, а потом вторые десять (offset 10). И так случилось, что после первого твоего запроса какой-то другой процесс добавил в таблицу ещё строку, со значением на A. В итоге, данные "сместятся" вниз и твой второй запрос получит строку, которую ты уже получил в первом запросе.
704 1498511
>>498508

Кстати, для решения последней проблемы есть варианты с выборкой по индексу: https://use-the-index-luke.com/sql/partial-results/fetch-next-page
705 1498526
>>498511
По индексу, времени создания и тому подобному - да, конечно, есть разные способы это обойти. Но главное правило всё ещё звучит как "говнокодер хуже пидораса один запрос в базу лучше нескольких", в 99 случаях из 100.
706 1498531
>>498468
Спасибо за ответы, ОП.

>>Подход твой выглядит сомнительно, в том числе из-за использования статических методов.


Я вообще буферезированный html возвращаю этим вызовом, понятно что не стоит идти в обход стандартного рендера ,но это не суть.
Вот что интересно

>>из за использования статических методов.


Почему это считается не комильфо? Какие проблемы может создать?
707 1498538
>>498476
Меня больше laravel интересует. Я где то читал что он популярнее но это не точно.
И в нем роутинг вроде похож на slim-овский, а он мне по душе. Только вот как можно его вытащить отдельно я пока не нашел.
Потому что вкатываться я начинал с js->react->node.js (express)->php
Причины почему все перед php не зашло разннобразны.
И только в пхп я дошел уже до реализации чего то полноценно-серьзного. Неправильные приоритеты не кисло затянули мой вкат, было дохуя метаний я еще и основы питона подрочил.
708 1498559
>>498531
>>498531
Я не оп и не смотрел твой код, но проблема статических статических методов заключается - сюрприз - они статические. По сути, хардкод.
Прочитай про инъекцию зависимостей.
Предположим, тебе нужно написать функцию отправки определённого письма через Mailer.
Это будет или
function SendFoo($address) {
Mailer::send("foo", $address)
}
или
function SendFoo(MailerInterface $mailer, $address) {
$mailer->send("foo", $address)
}

Во втором случае ты можешь заранее сконфигурировать $mailer перед передачей его в функцию. Передать туда не Mailer, а DebugMailer, StubMailer, ProxyMailer или что-то такое.
Вызвать функцию один раз с одним mailer-ом, а второй раз с другим, по необходимости.

Всего этого ты тупо заложился на конкретный класс, максимально негибко.
Снимок2.PNG5 Кб, 467x161
709 1498564
Пытаюсь отправить данные через post, а он только id создаёт. В чём проблема ?
710 1498567
>>498503
Понял
711 1498594
>>498538
Для дева все роутеры выглядят примерно одинаково, паттерн в стиле МЕТОД РУТ ХАНДЛЕР сохраняется везде, оборачивается еще разным доп. функционалом вроде неймспейсов, группировки рутов и т.д. Единственное что функция обработчик это не обязательно анонимная функция, туда можно написать название класса и метода, и фреймворк вызовет то что ты туда напишешь, попутно создав и передав все аргументы в функцию. Вообще лучше создавать для контроллеров отдельные классы.
В ларавел дефолтно руты все в одном файлике лежат, хотя там есть еще своя группировка на веб, апи, бродкастинг и т.п.
В симфони вариантов больше, дефолтно вроде вообще аннотации используются, типа как в джаве, еще есть йамл, хмл и обычный пхп.
712 1498605
>>498594
Я не совсем про то.
Я о том можно ли использовать только отдельно роутер из ларавел? И уже вокруг роутера построить свое приожение с набором библиотек которые сам хочешь исспользовать.
713 1498608
>>498605
п.с. что бы получить что то типа slim, ток я так полагаю без контейнеризации
714 1498621
>>498608
Ну и возьми lumen, это как раз и есть laravel, переработанный в slim.
715 1498629
>>498621
люмен лютая гавнина,уж лучше сразу лару
716 1498640
>>498629
lumen - это облегчённый laravel, на этом всё. Просто выбирай инструмент под задачу.
718 1498655
>>475112 (OP)
>>498651
Ой забыл описание

В общем сделал задание на палиндром , но не понимаю зачем использовать половину длины строки(заюзал полную)

помогите улучшить говнокод, ну или пример какой-нибудь на пыхе бы
719 1498660
Есть файл на диске, с которым нужно работать. Для этого в корне каталога есть отдельный класс, в котором есть, допустим метод getFile(). Он берёт файл ./log/log.txt и возвращает его.

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

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

Как это можно разрулить?
720 1498715
>>498660
../log/log.txt

Няш, каждая папка содержит
ссылку на саму себя: .
ссылку на родительский каталог: ..
и уже дальше ссылки на файлы, если они есть.

./ Эта папка
../ Выйти из папки в мамку наверх
721 1498719
>>498715
Ты неверно понял вопрос. Речь не об это.

Вот более подробно нагугленная проблема:
Сообщение №20 в
https://php.ru/forum/threads/kak-pravilno-rabotat-s-include.66156/

Тут рекомендуют __DIR__, вроде это решает мою проблему, но меня напрягают абсолютные пути.
722 1498727
Аноны, хелпаните пожалуйста. С чем это может быть связано? До недавнего времени все было ок, сиды и тесты запускались. Вчера попробовал - фейкер начал файлы с размером 0 генерировать. Пик 3 - getid3 инфа о файле с размером 0, пик 4 - инфа о нормальном файле. До недавнего времени все было ок пару недель, вообще понять не могу в чем проблема
724 1498767
>>498605
В теории можно, не уверен что можно с ларавел роутером, но на гитхабе и так тысячи есть разных. Тут дело в том что одним роутером ты не ограничишься, должен быть какой-то компонент который будет создавать объект запроса, чтобы не приходилось работать с голыми $_REQUEST, $_GET и т.п., тебе нужно как-то сервисы свои инитить и передавать в контроллеры, это можно сделать с помощью контейнера. В итоге на выходе получается тот же слим или симфони 4, ну и вопрос становится как бы зачем придумывать свой велосипед если другие разрабы за тебя уже придумали хотябы базовую структуру проекта чтобы ты время на это не тратил? Это не оправдано ни по скорости разработки, ни по скорости выполнения программы

>>498318
Я бы еще понял этот прикол если бы у пыхи была удобная стандартная библиотека, а то получается что 60% функционала микрофреймворков занимаются просто тем, что и так есть в других языках по дефолту
725 1498784
>>498739
Прошу попробовать у себя на локалке, у кого возможность есть. Ибо я сделал git checkout на много коммитов назад (когда это еще работало), а результат все тот же - генератор дает файлы с size 0
726 1498809
>>498727

Место закончилось?
727 1498868
>>498767

>> итоге на выходе получается тот же слим или симфони 4


Да я не спорю, по работе делаю свой проект на slim + разные библиотеки.
Но велосопедо-ведение это спец олимпиада в которой тоже нужно для себя участвовать.
728 1498870
>>498809
Место есть. Да и на пик1 видно, что ломаный файл может создаться в любой момент. От чего это зависит я 2 день понять не могу. В гугле даже примерно таких вопросов не нашел, Прочитал что если у файла размер 0, то скорее всего он бы загружен с ошибками. Так что у меня пока что единственный вариант - я что то сделал с апачем. Хотя максимум что я делал так это рестартил и смотрял какая версия стоит.
upload_file_size и max_post_size стоят около 100М, да и вручную большие файлы нормально загружаются
729 1498878
как реализовать чат без сокетов?
730 1498924
>>498878
Разве что ажакс каждые n секунд?
731 1498926
>>498924
ну допустим раз в 1-2 сек,это не критическая задержка
это нормально так делать?
732 1499090
>>498926
Смотря что считать "нормальным".
Можно сделать на чём угодно, но качество очевидно будет хуже, по объективным причинам (задержки, поддержка большого количества юзеров).
Если нужен именно ajax, то читай про longPolling, это позволит сгладить некоторые из недостатков (но это сложнее накодить, проще уж с сокетами).
733 1499126
>>498727

> $tmpFile = $faker->image($dir = null,$width = 640, $height = 480, $category = null, $fullPath = false);



> $file = new UploadedFile("/tmp/{$tmpFile}", $tmpFile);



Непонятно, почему ты во второй строке предполагаешь, что файл располагается в "/tmp". Так как в первой строке этот каталог явно не указан.

Дальше предлагаю расковырять метод из Faker https://github.com/fzaninotto/Faker/blob/master/src/Faker/Provider/Image.php и изучить, все ли в нем правильно работает. Метод довольно мутный, так как полагается на работоспособность удаленного сервера. Предлагаю тебе поискать в нем ошибки и если они есть, можно сделать пулл реквест с исправлениями.

Ну и сам механизм создания App\File выглядит мутно, есть ли гарантия, что там будет создан правдоподобный объект? Как мне кажется, логично было бы для тестов создавать временный файл и вызывать метод в приложении, который его сохраняет как надо и создает такой же App\File, как и в случае реальной загрузки файла.
734 1499136
>>498655
Возможно я сам говноед (говнокодер), но вот держи https://ideone.com/PUpD1t

str_replace в твоем случае удаляет пробелы, т.е. пробелы заменяются на ничего.
Половина нужна чтобы пройтись слева и справа, так ведь палиндром проверяется.
preg_split создает массив, который разделяет на каждый символ, например был "test", стал массив ['t', 'e', 's', 't']
735 1499285
>>498155
Выше верно пишут - есть бегет, там 1 месяц бесплатно, просто регистрируешься. Самый минимальный тариф на бегете - это 5.5 рублей в день. Можно даже домен не покупать, сайт будет доступен по адресу мойлогиню.beget.tech
736 1499291
Посоветуйте лучший учебник, который работает по принципу "прочитал, запомнил, закрепил задачами".

Желательно на русском, т.к. хочу понимать других русскоговорящих.
737 1499295
>>499291
Зандстра М. - PHP. Объекты, шаблоны и методики программирования, 4-е издание (Expert's Voice) - 2015.pdf

Я вот это читаю. Но он без минимальной базы сложный, там сразу объектно-ориентированное идет, элементарные вещи не разжовывает. Лучше основы из опова учебника/уроков, а потом Зандстру. Может кто еще хорошее подскажет
1011125111.jpg58 Кб, 463x650
738 1499299
>>499295
Спасибо, запишу.

Я начал с этого, но с самого начала там не было заданий для закрепления знаний, только вопросы.
В итоге на моменте, когда повалились классы, объекты, подклассы, статические хуические приавтные публичные хуичные - я в край охуел. И всё это на примерах, которые никак не объясняются построчно.
С одной стороны понятно после нескольких прочтений кода, а с другой стороны сложно воспринимать в таком виде и без практической части запомнить будет всё это ещё сложнее.
739 1499312
Кстати, есть идеи, почему phpstorm иногда выдаёт 502 bad gateway в браузере, после чего не грузит страницу с кодом вообще, а потом через минут 10 начинает нормально работать?
Снимок.PNG21 Кб, 649x543
740 1499615
В чём проблема ?
741 1499657
>>499615
Ты указал это как параметры (как для get) а должен был как поля формы (formfields)
742 1499678
>>499657
Ничего не понял
image.png1 Кб, 194x34
743 1499691
>>499678
Это какая то хромовская тулза?
В строке у тебя параметры передаются, смотри пик
744 1499698
ОП, как понимать теги для тестов в TestHub задании? Любой человек может указать любы теги? Или брать из уже существующих/одобреных администратором? Какие параметры валидации можно делать, если пользователи указывают сколько хотят и какие хотят теги? Ведь ту же "Математику" можно написать по разному, на разных языках. Правильно ли будет поставить ограничение на теги? Например, максимум 5 тегов для одного теста?
Заранее спасибо за ответ.
745 1499737
>>499698
И как правильней те самые теги хранить? У меня есть пару вариантов. Можно хранить их в основной таблице теста(json формте), где указывается время, автор, заголовок теста.
Или создать еще 2 таблицы. В tags и tests_tags. Где tags это спиок всех существующих на данный момент тегов, а tests_tags - список тегов, принадлежащих конкретному тесту, вида tag_id,test_id.

И еще вопрос по поводу перестаскивания вопрос на этапе создания. Должна ли быть эта функция в режиме редактирования теста?
268 - 430, 693 - 745 746 1499774
>>498564

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

>>498605

Вряд ли, если только он не сделан как отдельный независимый компонент.

>>498651

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

> ПОНЯТИЯ НЕ ИМЕЮ КАК ЭТО РАБОТАЕТ, НО ГЛАВНОЕ ЧТО РАБОТАЕТ



Что тут непонятного? str_replace находит в строке все пробелы и заменяет их на пустую строку, то есть удаляет.

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

У тебя в коде есть ошибки (выводятся внизу):

> PHP Notice: Undefined offset: 21 in /home/rqG3wJ/prog.php on line 20


> PHP Notice: Undefined offset: -1 in /home/rqG3wJ/prog.php on line 20



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

> $bufhalf



Плохое название, непонятно что оно значит. Надо было назвать левый/правый индексы $left/$right, например.

Твоя программа всегда пишет, что слово палиндром. Это надо исправить: https://ideone.com/8XbSvF

Код надо оформить лучше, сейчас он выглядит очень неряшливо. Длинные комментарии надо писать над строкой, а не справа от нее. Вокруг знака равно ставить пробелы, а не как у тебя, где-то они стоят, а где-то нет. В for/if сделать правильные отступы. Например, можно пропустить код через http://www.phpformatter.com/ и большинство проблем исправится.
268 - 430, 693 - 745 746 1499774
>>498564

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

>>498605

Вряд ли, если только он не сделан как отдельный независимый компонент.

>>498651

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

> ПОНЯТИЯ НЕ ИМЕЮ КАК ЭТО РАБОТАЕТ, НО ГЛАВНОЕ ЧТО РАБОТАЕТ



Что тут непонятного? str_replace находит в строке все пробелы и заменяет их на пустую строку, то есть удаляет.

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

У тебя в коде есть ошибки (выводятся внизу):

> PHP Notice: Undefined offset: 21 in /home/rqG3wJ/prog.php on line 20


> PHP Notice: Undefined offset: -1 in /home/rqG3wJ/prog.php on line 20



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

> $bufhalf



Плохое название, непонятно что оно значит. Надо было назвать левый/правый индексы $left/$right, например.

Твоя программа всегда пишет, что слово палиндром. Это надо исправить: https://ideone.com/8XbSvF

Код надо оформить лучше, сейчас он выглядит очень неряшливо. Длинные комментарии надо писать над строкой, а не справа от нее. Вокруг знака равно ставить пробелы, а не как у тебя, где-то они стоят, а где-то нет. В for/if сделать правильные отступы. Например, можно пропустить код через http://www.phpformatter.com/ и большинство проблем исправится.
747 1499775
>>498660

Глупо использовать относительные имена, так как они зависят от "текущего каталога" (смотри chdir() ), который может быть равен вообще чему угодно.

Тебе надо использовать абс. имена на основе константы __DIR__.

>>498767

> Я бы еще понял этот прикол если бы у пыхи была удобная стандартная библиотека, а то получается что 60% функционала микрофреймворков занимаются просто тем, что и так есть в других языках по дефолту



Ничего в других языках нету, не рассказывай сказки. Ну-ка, расскажи мне про "стандартную" функцию для сопоставления с регуляркой в Си? Про "стандартный" объект Request в JS? Ничего там нету. Стандартные библиотеки плохие везде, по моему опыту.

>>498926

Лучше раз в 30-60 секунд, а то ты устроишь ДДОС своему серверу.

>>499090

В стандартной конфигурации PHP long polling будет здорово кушать память и процессы при большом числе пользователей (~5/10 Мб на висящий процесс), так как PHP на такое использование не рассчитан. long polling реализуется специальным демоном на стороне сервера, и он предназначен для случаев, когда вебсокеты не доступны (злой корпоративный фаерволл, старый браузер).
748 1499776
>>498155

Поищи, бесплатные PHP хостинги существуют.

>>499299

Решал бы нашу задачу про ООО Вектор или ООП-Гостиницу для закрепления.

>>499312

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

>>499678

Изучи протокол HTTP получше, как работают методы GET и POST. Можешь попробовать глянуть этот урок: https://github.com/codedokode/pasta/blob/master/network/http.md - он не оченть полный, но более хорошие вообще трудно найти.

Как ты собрался использовать HTTP, не понимая отличия между параметрами в строке запроса и в теле запроса?
749 1499777
>>499698

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

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

> И еще вопрос по поводу перестаскивания вопрос на этапе создания. Должна ли быть эта функция в режиме редактирования теста?



Думаю, что да.

>>491368

Может, это боты заходят, которые не выполняют яваскрипт? Проверил бы их IP и User-Agent по логам на сервере.

>>491218

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

Если действительно большой проект, то наверно его разбивают на отдельные (x.example.com, y.example.com и тд.), и делают кросс-доменную авторизацию.

>>491185

Ты можешь отметить, но вопрос, не переоцениваешь ли ты свои знания? Если ты действительно хитрые запросы умеешь оптимизировать и знаешь наизусть отличия MySQL от Postgres, то да, стоит это отметить.
750 1499778
>>490932

А ты документацию читал? http://www.slimframework.com/docs/v3/concepts/middleware.html

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

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

Обычно middleware делает что-то на уровне протокола HTTP: сжатие данных, шифрование, логгирование, ограничение доступа, ограничение частоты запросов.

>>490821

Такие классы не помещаются в DI контейнер. Контейнер предназначен для создания объектов с учетом зависимостей.
https://github.com/medbrat13/jesus-saves-your-file 751 1499779
>>490764

> https://github.com/medbrat13/jesus-saves-your-file/blob/master/sphinx.conf#L42


> html_strip = 1



Не очень понятно, зачем это и где ты там нашел HTML в именах файлов.

> https://github.com/medbrat13/jesus-saves-your-file/blob/master/jsyf.sql#L31


> size character varying(255) NOT NULL,



Размер - это же число байт? А не строка.

> require ROOT . '/vendor/gigablah/sphinxphp/src/Sphinx/SphinxClient.php';



Вообще, этот require можно указать в конфиге composer в пункте autoload.

> $minifier = new MatthiasMullie\Minify\CSS(ROOT . '/public/css/style.css');


> $minifier->minify('css/style.min.css');



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

> устанавливаем куки, если не установлены, создаем аватар



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

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

> $filesData = $this->FilesController->indexAction($userId, $sortByParam, $limit, $offset)



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

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

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

Контроллер - это тот, кто принимает запрос от пользователя и формирует ответ. Сервисы - это классы, содержащие бизнес-логику и выполняющие какие-то действия или возвращающие какие-то данные, но они не работают с Request/Response.

Автосоздание аватарки можно было вынести в какую-то функцию. Она не относится к M, V или C, а просто является вспомогательной.

Далее, UserController это по сути сервис для генерации аватарок, и надо его называть AvatarGeneratorService.

Смысл создания сервис-провайдеров не очень понятен, почему нельзя было сделать один провайдер, который бы все регистрировал? Или несколько? Или просто засунуть регистрацию сервисов в bootstrap.php. Можно, конечно, и как у тебя, но это выглядит немного пререусложненно. Не очень понятно, ради чего это сделано так, по классу на каждый сервис.

FilesController надо переделать в сервис.

Форматирование размера ("100 Кб") стоит сделать отдельной функцией и вызывать ее из шаблона, а в шаблон передавать просто размер в байтах. Ты же занимаешься извращением: ты прямо в модели файла подменяешь цифру на строку, в итоге у тебя там половину времени одно, а половину другое, и как работать с такой моделью, непонятно. Как понять, в каком именно виде сейчас там хранится размер? Не делай так.

То же касается обрезки имени файла - это надо сделать функцией или статическим методом с использованием паттерна Utility Class. И для обрезки имени не нужен цикл, достаточно mb_substr или нет?

> $response = $response->write(is_file(ROOT . '/public' . $request->getParams()['icon']));



Тут я не очень понимаю, is_file же возвращает true/false? А надо передать строку в write. Странный код.

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

> } else {


> $response->write(0);



Что за странный метод сигнализировать об ошибке? Если ты используешь JSON, то можно возвращать объект с ошибкой вроде

{ "error": "Причина" }

Если не используешь - можно использовать какой-то HTTP-код, сигнализирующий об ошибке, а в теле ответа писать ее причину.

Естественно, на стороне клиента надо проверять ответ на ошибки. Спроектируй нормальное API для загрузки файла и определи все возможные варианты ответа, которые оно может отдавать. Если есть время и желание, можешь задокументировать все свои аяксовые API с помощью Swagger/OpenAPI и положить swagger-файл в репозиторий, если нет, можешь просто описать это в комментарии.

Название prepareFile плохое, так как непонятно, что делает метод.

> @param string|null $userId



От этого комментария нет никакой новой информации, это есть в тайп-хинте, так что стоит его удалить.

> https://github.com/medbrat13/jesus-saves-your-file/blob/master/app/controllers/FilesController.php#L101


> $fullPath = "$this->filesDir/$fileOwner$filePath";



Та же ошибка. У тебя алгоритм определения пути к файлу не оформлен в виде метода, а просто копипастится по всему коду.

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

Не имеет смысла писать в одной функции throw и тут же catch для этого исключения, их надо заменить на if/else.

> $urlEncodedFileName = urlencode($file->getName());


> ->withHeader('Content-Disposition', "attachment; filename=$finalFileName");



В каком стандарте написано, что в заголовках можно кодировать спецсимволы с помощью urlencode? В заголовках можно использовать только ASCII, в случае пробелов по моему требуются кавычки, хотя я не уверен. Для передачи символов вне ASCII есть относительно новый стандарт: https://dzone.com/articles/utf-8-in-http-headers

Самый надежный и работающий с незапамятных времен способ - это оканчивать URL на требуемое имя, /download/123/название.jpg . Хотя ты можешь использовать и вариант с utf в загловках.

> $this->response = $this->response->withHeader('X-Accel-Redirect', "/errors/file-404.html")



Я думаю, тут логичнее отдавать стандартную ошибку 404, а не делать особую страницу ошибки для отсутствующего файла.

> $this->getid3->encoding = 'UTF-8';



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

> $uId = $this->userMapper->insert($userObject);


> $userObject->setId($uId);



Маппер мог бы сам проставлять id.

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

> private function makeImgPreview



Эта функция может вернуть false, но ты не проверяешь результат ее вызова. Почему? Либо проверяй, либо переделывай на использование исключений.

> src="/images/userpics/{{ file.user }}.png"



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

> <a class="col-12" href="/show/{{ file.user }}/{{ file.path }}">


> src="/show/{{ file.user }}/{{ file.previewPath }}"



Тот же вопрос про генерацию URL.
https://github.com/medbrat13/jesus-saves-your-file 751 1499779
>>490764

> https://github.com/medbrat13/jesus-saves-your-file/blob/master/sphinx.conf#L42


> html_strip = 1



Не очень понятно, зачем это и где ты там нашел HTML в именах файлов.

> https://github.com/medbrat13/jesus-saves-your-file/blob/master/jsyf.sql#L31


> size character varying(255) NOT NULL,



Размер - это же число байт? А не строка.

> require ROOT . '/vendor/gigablah/sphinxphp/src/Sphinx/SphinxClient.php';



Вообще, этот require можно указать в конфиге composer в пункте autoload.

> $minifier = new MatthiasMullie\Minify\CSS(ROOT . '/public/css/style.css');


> $minifier->minify('css/style.min.css');



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

> устанавливаем куки, если не установлены, создаем аватар



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

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

> $filesData = $this->FilesController->indexAction($userId, $sortByParam, $limit, $offset)



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

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

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

Контроллер - это тот, кто принимает запрос от пользователя и формирует ответ. Сервисы - это классы, содержащие бизнес-логику и выполняющие какие-то действия или возвращающие какие-то данные, но они не работают с Request/Response.

Автосоздание аватарки можно было вынести в какую-то функцию. Она не относится к M, V или C, а просто является вспомогательной.

Далее, UserController это по сути сервис для генерации аватарок, и надо его называть AvatarGeneratorService.

Смысл создания сервис-провайдеров не очень понятен, почему нельзя было сделать один провайдер, который бы все регистрировал? Или несколько? Или просто засунуть регистрацию сервисов в bootstrap.php. Можно, конечно, и как у тебя, но это выглядит немного пререусложненно. Не очень понятно, ради чего это сделано так, по классу на каждый сервис.

FilesController надо переделать в сервис.

Форматирование размера ("100 Кб") стоит сделать отдельной функцией и вызывать ее из шаблона, а в шаблон передавать просто размер в байтах. Ты же занимаешься извращением: ты прямо в модели файла подменяешь цифру на строку, в итоге у тебя там половину времени одно, а половину другое, и как работать с такой моделью, непонятно. Как понять, в каком именно виде сейчас там хранится размер? Не делай так.

То же касается обрезки имени файла - это надо сделать функцией или статическим методом с использованием паттерна Utility Class. И для обрезки имени не нужен цикл, достаточно mb_substr или нет?

> $response = $response->write(is_file(ROOT . '/public' . $request->getParams()['icon']));



Тут я не очень понимаю, is_file же возвращает true/false? А надо передать строку в write. Странный код.

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

> } else {


> $response->write(0);



Что за странный метод сигнализировать об ошибке? Если ты используешь JSON, то можно возвращать объект с ошибкой вроде

{ "error": "Причина" }

Если не используешь - можно использовать какой-то HTTP-код, сигнализирующий об ошибке, а в теле ответа писать ее причину.

Естественно, на стороне клиента надо проверять ответ на ошибки. Спроектируй нормальное API для загрузки файла и определи все возможные варианты ответа, которые оно может отдавать. Если есть время и желание, можешь задокументировать все свои аяксовые API с помощью Swagger/OpenAPI и положить swagger-файл в репозиторий, если нет, можешь просто описать это в комментарии.

Название prepareFile плохое, так как непонятно, что делает метод.

> @param string|null $userId



От этого комментария нет никакой новой информации, это есть в тайп-хинте, так что стоит его удалить.

> https://github.com/medbrat13/jesus-saves-your-file/blob/master/app/controllers/FilesController.php#L101


> $fullPath = "$this->filesDir/$fileOwner$filePath";



Та же ошибка. У тебя алгоритм определения пути к файлу не оформлен в виде метода, а просто копипастится по всему коду.

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

Не имеет смысла писать в одной функции throw и тут же catch для этого исключения, их надо заменить на if/else.

> $urlEncodedFileName = urlencode($file->getName());


> ->withHeader('Content-Disposition', "attachment; filename=$finalFileName");



В каком стандарте написано, что в заголовках можно кодировать спецсимволы с помощью urlencode? В заголовках можно использовать только ASCII, в случае пробелов по моему требуются кавычки, хотя я не уверен. Для передачи символов вне ASCII есть относительно новый стандарт: https://dzone.com/articles/utf-8-in-http-headers

Самый надежный и работающий с незапамятных времен способ - это оканчивать URL на требуемое имя, /download/123/название.jpg . Хотя ты можешь использовать и вариант с utf в загловках.

> $this->response = $this->response->withHeader('X-Accel-Redirect', "/errors/file-404.html")



Я думаю, тут логичнее отдавать стандартную ошибку 404, а не делать особую страницу ошибки для отсутствующего файла.

> $this->getid3->encoding = 'UTF-8';



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

> $uId = $this->userMapper->insert($userObject);


> $userObject->setId($uId);



Маппер мог бы сам проставлять id.

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

> private function makeImgPreview



Эта функция может вернуть false, но ты не проверяешь результат ее вызова. Почему? Либо проверяй, либо переделывай на использование исключений.

> src="/images/userpics/{{ file.user }}.png"



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

> <a class="col-12" href="/show/{{ file.user }}/{{ file.path }}">


> src="/show/{{ file.user }}/{{ file.previewPath }}"



Тот же вопрос про генерацию URL.
https://github.com/medbrat13/jesus-saves-your-file 752 1499780
>>490764

Про HTML5 аудио/видео, изучи-ка мануал по поддержке форматов в брузерах:

- https://developer.mozilla.org/ru/docs/Web/HTML/Поддерживаемые_медиа_форматы
- https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers
- https://developer.mozilla.org/en-US/docs/Web/Media/Formats

> if ($request->hasHeader('HTTP_X_REQUESTED_WITH')



Это плохая идея, ориентироваться на такие нестандартные заголовки, лучше было бы явно передавать параметр ajax=1 в строке запроса. Так как очень сложно догадаться, что от какого-то заголовка меняется поведение кода. И опять же, надо было это вынести на отдельные роуты, а не пихать все в /files. Отдельное действие - отдельный роут.

В JS ты используешь ES6, это значит, что все браузеры, не поддерживающие его, не будут выполнять JS код. Обычно используют транспайлеры вроде Babel для преобразования кода в ES5.

> const showNHideFilters = () => {



Это наверно дело вкуса, но я не понимаю, чем это лучше чем слово function которое явно говорит, что перед нами функция. Но если тебе так больше нравится, то ок.

В JS коде у тебя есть простыни вроде viewDetails(), в которой отправку аякс-запроса надо было сделать отдельной функцией, а не вписывать прямо в текст.

Также, плохо что у тебя куски HTML вставлены в JS. Надо либо отдавать с сервера HTML, либо поместить в HTML шаблоны и использовать их из JS. А так, лапша какая-то получается. Для больших строк можно использовать строки в косых кавычках, раз уж ты используешь ES6.

> const classToggler



Логичнее же toggleClass? Почему имя функции - это существительное?

> const prepareName = name => {



Копипаста кода из PHP. Не логичнее с сервера передавать уже отформатированное имя?

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

> dropBox.setAttribute('style', 'background-color: #ff3546; transition: .15s linear; font-size: 0;');



Это должно быть в CSS коде, а не в JS.

Функции в JS надо не писать длинной простыней, а выделять из них части в отдельные функции.

> * {


> font-family: sans-serif;



По моему, так неудачное решение. Шрифт наследуется и его задают на html.

> &__wrapper {



Это неудачное решение. Ты разбил селектор на куски и теперь он не ищется поиском по коду при рефакторинге.

У тебя используется что-то похожее на БЭМ, но не настоящий БЭМ, так как в БЭМ нет вложенности элементов и никто не пишет main-nav__nav__item, если ты хочешь использовать БЭМ, то почитай про его концепцию. Если не используешь БЭМ, то почитай, и может начнешь использовать, это будет лучше, чем изобретать какие-то свои подходы.

У тебя в SCSS идут огромные блоки, и это неудобно, так как когда ты находишься в середине блока, не видно верхний селектор в основании блока.

У тебя слишком большая вложенность блоков в SCSS для такой простой верстки - 5 уровней. Это на мой взгляд ошибка, переносить структуру (вложенность) блоков из HTML в SCSS один-в-один. Почему они должны соответствовать друг другу? Если опираться на БЭМ, то там ровно 2 уровня - блок и элемент, и с ними код получается гораздо чище.
https://github.com/medbrat13/jesus-saves-your-file 752 1499780
>>490764

Про HTML5 аудио/видео, изучи-ка мануал по поддержке форматов в брузерах:

- https://developer.mozilla.org/ru/docs/Web/HTML/Поддерживаемые_медиа_форматы
- https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers
- https://developer.mozilla.org/en-US/docs/Web/Media/Formats

> if ($request->hasHeader('HTTP_X_REQUESTED_WITH')



Это плохая идея, ориентироваться на такие нестандартные заголовки, лучше было бы явно передавать параметр ajax=1 в строке запроса. Так как очень сложно догадаться, что от какого-то заголовка меняется поведение кода. И опять же, надо было это вынести на отдельные роуты, а не пихать все в /files. Отдельное действие - отдельный роут.

В JS ты используешь ES6, это значит, что все браузеры, не поддерживающие его, не будут выполнять JS код. Обычно используют транспайлеры вроде Babel для преобразования кода в ES5.

> const showNHideFilters = () => {



Это наверно дело вкуса, но я не понимаю, чем это лучше чем слово function которое явно говорит, что перед нами функция. Но если тебе так больше нравится, то ок.

В JS коде у тебя есть простыни вроде viewDetails(), в которой отправку аякс-запроса надо было сделать отдельной функцией, а не вписывать прямо в текст.

Также, плохо что у тебя куски HTML вставлены в JS. Надо либо отдавать с сервера HTML, либо поместить в HTML шаблоны и использовать их из JS. А так, лапша какая-то получается. Для больших строк можно использовать строки в косых кавычках, раз уж ты используешь ES6.

> const classToggler



Логичнее же toggleClass? Почему имя функции - это существительное?

> const prepareName = name => {



Копипаста кода из PHP. Не логичнее с сервера передавать уже отформатированное имя?

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

> dropBox.setAttribute('style', 'background-color: #ff3546; transition: .15s linear; font-size: 0;');



Это должно быть в CSS коде, а не в JS.

Функции в JS надо не писать длинной простыней, а выделять из них части в отдельные функции.

> * {


> font-family: sans-serif;



По моему, так неудачное решение. Шрифт наследуется и его задают на html.

> &__wrapper {



Это неудачное решение. Ты разбил селектор на куски и теперь он не ищется поиском по коду при рефакторинге.

У тебя используется что-то похожее на БЭМ, но не настоящий БЭМ, так как в БЭМ нет вложенности элементов и никто не пишет main-nav__nav__item, если ты хочешь использовать БЭМ, то почитай про его концепцию. Если не используешь БЭМ, то почитай, и может начнешь использовать, это будет лучше, чем изобретать какие-то свои подходы.

У тебя в SCSS идут огромные блоки, и это неудобно, так как когда ты находишься в середине блока, не видно верхний селектор в основании блока.

У тебя слишком большая вложенность блоков в SCSS для такой простой верстки - 5 уровней. Это на мой взгляд ошибка, переносить структуру (вложенность) блоков из HTML в SCSS один-в-один. Почему они должны соответствовать друг другу? Если опираться на БЭМ, то там ровно 2 уровня - блок и элемент, и с ними код получается гораздо чище.
753 1499781
>>488272

Жесть, вы серьезно хотите грузить в браузер гигантскую многомегабайтную картинку (20k x 20k x 4 байта = 1600 Мб на буфер для хранения в разжатом виде, браузер упадет на дохлом ПК или на телефоне) только ради того, чтобы показать крошечную превьюшку?

Плюс, я не понял, как вы при сохранении пропорций получили из картинки 20kx20k картинку 200x134.

>>488654

Какой-то базовой информации, думаю, хватит.

>>488582

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

>>487645

По моему мнению идентичны. Более того, во многих БД есть оптимизатор запросов, который умеет их переписывать и, например, бывает такое, что подзапрос (SELECT x FROM table WHERE x = (SELECT ...)) переписывается на джойн ради оптимизации. Но это зависит от СУБД.

Если вас интересует оптимизация, то надо использовать EXPLAIN, смотреть, как понимает запрос СУБД и оптимизировать. Теоретически рассуждать тут нет смысла, если только ты не один из разработчиков СУБД, который сам пишет эти оптимизаторы и помнит наизусть все их особенности. Ты с ходу не угадаешь, что будет лучше или хуже работать.
754 1499783
>>487704

Интересно, но я не со всем согласен. Например:

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



> Этот странный менталитет в основном встречается среди веб-разработчиков PHP сообщества, и он говорит о недостатке профессионализма и опыта.



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

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

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

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



По моему, так тут ошибка. Объекты появились не как "области видимости" (они были и ранее, например, в Си можно скрывать глобальную переменную или функцию от доступа из других файлов словом static), а как отражение реально существующих объектов из предметной области. Разница очевидна: мы можем создать много независимых объектов одного класса, в то время как "модуль" один и все переменные в нем в одном экземпляре.

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



Тут согласен.

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



Опять же, нет аргументации, как PSR для логгирования, форматирования кода, HTTP messages или автозагрузки мешает создавать "эффективные" программы. Опять, одни общие слова без конкретных примеров.

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



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

> В мире Python и Ruby создание веб-сайтов с нуля утомительно, потому что ни Python, ни Ruby изначально не были созданы для этого. В итоге фреймворки, такие как Django и Ruby on Rails, быстро стали популярными и широко используемыми для создания веб-сайтов на этих языках



Тут нет логики. Если бы дело было только в отсутствии встроенного веб-сервера (который есть в PHP), то разработчики Руби/Питон написали бы что-то легкое наподобие библиотеки, открывающей порт 80 и принимающей HTTP-запросы, и писали бы велосипеды поверх нее. Но они используют фреймворки.

> По существу PHP сам по себе был и остается фреймворком.



Который до сих пор не умеет отдавать код 503 и заглушку при ошибке, если мне не изменяет память.
754 1499783
>>487704

Интересно, но я не со всем согласен. Например:

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



> Этот странный менталитет в основном встречается среди веб-разработчиков PHP сообщества, и он говорит о недостатке профессионализма и опыта.



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

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

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

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



По моему, так тут ошибка. Объекты появились не как "области видимости" (они были и ранее, например, в Си можно скрывать глобальную переменную или функцию от доступа из других файлов словом static), а как отражение реально существующих объектов из предметной области. Разница очевидна: мы можем создать много независимых объектов одного класса, в то время как "модуль" один и все переменные в нем в одном экземпляре.

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



Тут согласен.

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



Опять же, нет аргументации, как PSR для логгирования, форматирования кода, HTTP messages или автозагрузки мешает создавать "эффективные" программы. Опять, одни общие слова без конкретных примеров.

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



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

> В мире Python и Ruby создание веб-сайтов с нуля утомительно, потому что ни Python, ни Ruby изначально не были созданы для этого. В итоге фреймворки, такие как Django и Ruby on Rails, быстро стали популярными и широко используемыми для создания веб-сайтов на этих языках



Тут нет логики. Если бы дело было только в отсутствии встроенного веб-сервера (который есть в PHP), то разработчики Руби/Питон написали бы что-то легкое наподобие библиотеки, открывающей порт 80 и принимающей HTTP-запросы, и писали бы велосипеды поверх нее. Но они используют фреймворки.

> По существу PHP сам по себе был и остается фреймворком.



Который до сих пор не умеет отдавать код 503 и заглушку при ошибке, если мне не изменяет память.
755 1499784
>>487634

Можно сгруппировать методы в один контроллер.

>>487318

Если у тебя обработка картинки занимает долгое время, то ее надо делать из CLI или из очереди задач, а не из браузера. Если же быстро, то специально заморачиваться не требуется, как мне кажется.
756 1499793
Пиши во вкладке body раз ты используешь post запрос
757 1499794
Помогите макаке запустить виртуальный хост на апаче. блядь.

Создал папочку в /home/blyat/www/phplearn

Добавил в apache2.conf:

>ServerName loclhost:80



><Directory /home/blyat/www/phplearn>


>Options Indexes FollowSymLinks


>AllowOverride None


>Require all granted


></Directory>



Запилил .conf в /etc/apache2/sites-avalible/phplearn.conf

>ServerAdmin webmaster@localhost


>DocumentRoot /home/leaple/www/phplearn


>ServerName phplearn.com


>ServerAlias phplearn.com


>ErrorLog ${APACHE_LOG_DIR}/error.log


>CustomLog ${APACHE_LOG_DIR}/access.log combined



><Directory '/home/leaple/www/phplearn'>


>Options Indexes FollowSymLinks MultiViews


>AllowOverride None


>Order allow,deny


>allow from all


>Require all granted


всё что можно было туда воткнуть - воткнул, ага

></Directory>



Линканул в /etc/apache2/sites-enabled/

Добавил в хостс 127.0.0.1 phplearn.com

Перезапустил это говно, в ответ получаю:
Forbidden мамку ебал
You don't have permission to access / on this server.
757 1499794
Помогите макаке запустить виртуальный хост на апаче. блядь.

Создал папочку в /home/blyat/www/phplearn

Добавил в apache2.conf:

>ServerName loclhost:80



><Directory /home/blyat/www/phplearn>


>Options Indexes FollowSymLinks


>AllowOverride None


>Require all granted


></Directory>



Запилил .conf в /etc/apache2/sites-avalible/phplearn.conf

>ServerAdmin webmaster@localhost


>DocumentRoot /home/leaple/www/phplearn


>ServerName phplearn.com


>ServerAlias phplearn.com


>ErrorLog ${APACHE_LOG_DIR}/error.log


>CustomLog ${APACHE_LOG_DIR}/access.log combined



><Directory '/home/leaple/www/phplearn'>


>Options Indexes FollowSymLinks MultiViews


>AllowOverride None


>Order allow,deny


>allow from all


>Require all granted


всё что можно было туда воткнуть - воткнул, ага

></Directory>



Линканул в /etc/apache2/sites-enabled/

Добавил в хостс 127.0.0.1 phplearn.com

Перезапустил это говно, в ответ получаю:
Forbidden мамку ебал
You don't have permission to access / on this server.
758 1499795
>>499776

> ООО Вектор


это мем какой то?
759 1499800
>>499794
Ёбаный стыд, надо было через судо запускать. Сука
760 1499802
>>499794

По моему, для создания вирт. хоста директивы вроде DocumentRoot надо класть внутрь VirtualHost, а так ты добавил не виртуальный хост, а поменял глобальные настройки.
761 1499817
>>499691
Получается я не могу передать параметры через post в адресную строку ?
Screenshot2.png14 Кб, 629x1007
762 1499872
Посаны, я нихуя не понимаю как всё это говно ебаное работает. :(
Я просто хочу использовать phpstorm и чтоб он всё открывал в браузере, как делал это раньше. Или через xampp как-то открывать, я хуй знает. Хуй знает. Хуй знает.

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

В данный момент - при нажатии кнопочки в phpstorm 'открыть в браузере' - у меня попросту высвечивается белый лист, без кода и т.д.

Всё началось с того, что браузер начал выдавать 502 bad gateway, когда я переходил по ссылке из phpstorm'а. Потом он перешёл в вечную загрузку. Я переставил всё и теперь вот такая вот залупа ебаная, потому что как оказалось у меня ещё и Php7.3 слетел к хуям. Просто пропал.

Алсо, я не понимаю, нахуя я по учебнику xampp ставил. Какой от него толк? Он вообще что-то делает в данной ситуации или он для будущего сервера на локалхосте ставился?

Аосо, зачем ебучий phpstorm в локалхост постоянно порт вставляет? (63342). Даже если я захочу запустить из папки index.php (который localhost/index.php - запускает страничку xampp'а) - он туда порт вставит и нихуя не откроется.

Пиздос, почему у меня одного всегда какие-то проблемы с настройках базового говна...
Screenshot3.png14 Кб, 689x88
763 1499905
Охуенно. Проблема с 2017 года и они её так и не пофиксили.
>>499872

Тогда такой вопрос - как я могу использовать xampp, чтобы можно было через phpstorm открывать файл созданный в папке xampp'а?
764 1499909
Ебать! Я настроил это говно!
765 1499917
>>499872
Нахуй хамппы хуямпы. Тыж на винде? Лучше ставить докер/вагрант. Но есть ещё ospanel (open server). Ставишь его В папке domains создаёшь папку с проектом (test.loc например). Запускаешь ospanel (в трее значок). Открываешь папку в шторме. Пишешь что надо. В браузере открываешь test.loc. Профит.
В нем и пэхэпэ последний версии и мускул. И куча утилит. Его конечно говнят за то что он для блондинок. Но если нужно написать самый обычный проект - очень удобная штука.
766 1499921
>>499817
Можешь но внутри ты их забираешь сейчас из post по этому тебе говорит что поле не заподнено. Если хочешь то забирай внутри из параметров но это довольно таки извращение обычно так не делают
767 1499922
>>499917

>Но есть ещё ospanel (open server).


Который всё за тебя делает.
А потом проблемы начинаются, потому, что ты не понимаешь как это сочетается и где отвалилось. Зовёшь синьора, а он тебя нахуй посылает с такими проблемами.
768 1499992
>>499872
Чем не устраивает встроенный пхпшный веб сервер? И никакие ксампы и остальная поебота не нужна
image.png36 Кб, 839x195
769 1500016
>>499992

>И никакие ксампы и остальная поебота не нужна


Как пишут в доках - оказывается, что нужна.
770 1500025
>>499992
Для тестирования скрипта он подходит неплохо.
А вот локальный проект на нём поднимать бессмысленно, потому что оно может включать в себя хитрые конфигурации виртуальных хостов, кэширования и тому подобное. Очевидно, их лучше тестировать локально, прежде чем деплоить куда-то.

Но я бы всё-таки рекомендовал во-первых, выбрать nginx, а не апач (nginx уже по факту стандарт), а во-вторых делать это всё на линуксе.
Разработка на винде - это моветон почти во всех случаях, за исключением asp.net
Screenshot4.png22 Кб, 1079x300
771 1500114
Посаны, почему там одинарная кавычка появилась?
772 1500135
>>500016
Имеется ввиду что на проде не нужно юзать встроенный сервер
773 1500211
>>499802
Ниче не знаю, говнина запускается из папки текущего пользователя на phplearn.com и ладно, еще другой тестовый добавил, тоже работает
774 1500238
Как указать обращение к... ключу?
Например я хочу приминить к массиву функцию array_rand, но array_rand($arr1) выдаёт 1/2/3, а не 11/22/33.
775 1500254
>>500238
Перечитай документацию. array_rand возвращает ключи. Потом обращайся в этот массив по ключам, достанешь значения.
776 1500259
>>499922
Чоблять. Какой блять сеньер? Что отвалилось?
777 1500268
>>500259
сеньор - помидор
отвалилась - сёга
778 1500269
>>500259
Анон тебе сказал, что лучше разбираться и конфигурировать всё руками, чем ставить некий комбайн, который магическим образом сделает всё сам. Сам настроив веб-сервер - ты поймёшь, как всё работает и многому научишься, сможешь сам решать возникающие проблемы. А пользуясь какой-то хернёй из интернетов типа денвера или вот этой твоей панели ты научишься только писать код в блокнотике, оказавшись беззащитным перед целой кучей возможных инфраструктурных проблем (а они возникнут, всегда возникают).
779 1500271
>>500254
Я прочитал пару раз.
Мне сказали, что правильно

$name[array_rand($name)]; хотя в примере совсем другое написано.
780 1500274
Как лучше реализовать создание тестов, вопросов в TestHub? Не могу понять что использовать, обойтись jquery, или подключить vuejs?
781 1500289
>>500271
array_rand возвращает массив ВСЕХ ключей исходного массива в случайном порядке.
Соответственно "$name[array_rand($name)]" - это неверно. Верно так, как в примере:
$people = ['molodec' => 'Jenya', 'dibil' => 'Petya', 'mraz' => 'Vasya', 'hz' => 'Kolya'];
$randomizedKeys = array_rand($people); // будет ['hz', 'dibil', 'molodec', 'mraz']
print $people[$randomizedKeys[0]]; // запринтит 'Kolya'
782 1500307
>>500269
Он пукнул про какого то сеньора и отваливание в вакууме. Учитывая что анон с проблемой сейчас мало понимает что у него происходит и как это работает, ему начинать нужно с чего то простого. Если он хиккует дом, то пускай идет стажором в местную студию работать за еду начнет с опенсервера. Ибо скачать поставить и понять что БЛЯ РАБОТАЕТ Я НЕ ТАКОЙ УЖ И ТУПОЙ уже неплохо. Мозгу нужны маленькие радости.
С таким же успехом ему можно сказать нахуй те на винде хамп? На винде не кодют. Ставь бубунту.
Но нахуя это всё тому, кто только вкатывается?
783 1500318
>>500289
Только вот твой вариант
$randomizedKeys = array_rand($people);
отображает 1/2/3/4/5

а этот вариант:$name[array_rand($name)]
784 1500319
работает и отображает hz/dibil/molodec/mraz
>>500318
785 1500320
>>500307
Не знаю, кто там и чего пукнул.. Имхо, для новичка самый правильный вариант - это накатить убунту, поставить phpstorm, найти новичкой мануал в стиле "установить lamp в ubuntu" и проделать всё самому, разбираясь, что он делает, и зачем. Потратит день максимум, пользы будет на порядок больше, как и системных знаний в голове.
786 1500326
>>500319
Ну и вот тебе копипаст из документации:

> Если вы выбираете только одно значение, функция array_rand() возвращает ключ, соответствующий этому значению. В обратном случае, она возвращает массив ключей, соответствующих случайным значениям. Это сделано для того, чтобы дать возможность выбрать из массива как случайные значения, так и случайные ключи. Попытка выбрать больше элементов, чем есть в массиве, сгенерирует ошибку уровня E_WARNING и вернет NULL.



array_rand($people) вернёт 1 ключ
array_rand($people, 2) вернёт массив ключей

Обычное говно для php-шной стандартной библиотеки, когда функция может вернуть то одно, то другое.
15701848714300.jpg76 Кб, 472x314
787 1500327
>>500320

>накатить убунту


>установить lamp в ubuntu


>для новичка


>потратит день

788 1500345
>>500274
О, анон, я тоже только начал тестхаб делать. В планах делать все на vue. Много где читал, мол jquery уже не очень любят использовать. Мол есть куча отличных фреймворков, а сабж порядком устарел.
На vue должно быть не очень тяжело, тем более я как то видел уже готовые библиотеки "пересаскиваний" блоков

Кстати, заметил привычку использовать хоткеи с ide в браузерах (которые работают совсем не так). Пока писал - 2 раза на ctrl+w вкладку закрыл. Эта хуйня пройдет со временем?

>>499817
Зачем тебе это? Если нужно передать параметры в адресной строке - используй метод get.

>>500327
По твоему это мало? Установка всего делается по гайду не особо долго. Большую часть времени человек будет ебаться с тем, как конфиг апача через рут открыть, чтобы там что то поменять, и так далее
789 1500350
>>500345
Все на Vue? То есть будешь использовать Laravel к примеру как api?
790 1500362
>>500350
Ну, Ларку на бэке, Vue на фронте. Например, с той же страницей создания теста. Сделаю vue компонент для создания/редактирования теста. Подключу его в view, который контроллер возвращает, если нужно передам туда данные (или аджаксом запрошу).
791 1500364
>>500345

>По твоему это мало? Установка всего делается по гайду не особо долго.


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

>Начиная от того, что у тебя какой-то драйвер не так работает, где-то нет прав на папку, где-то что то не так поставилось и прочее.


Если ручками не лезть туда - куда не стоит, то все будет работать. А если ты от нехуй делать решил в системе "ковыряться", копируя все команды что в гугле найдешь в консоль - да, быть беде. Но даже из этого можно извлечь урок. Я, например, извлек. Вдоволь наебался с убунтой, потом поставил Минт и чувствую себя человеком.
А права на папку поставить ты через 1.5 раза запомнишь как
793 1500397
>>500364

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

Что касается драйверов, увы, надо перед покупкой проверять железо на совместимость с линуксом.
794 1500420
>>500367

>права на папку


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


Ну че вы ну
795 1500436
>>481649
А че перекатываешься? я тоже оттуда
123.jpg368 Кб, 1920x1080
796 1500440
>>481661
27, вкатываюсь с 25. Джва года пинал хуи и решал глупые задачки из оппоста время от времени. Потом произошла какая то хуйня и в конце августа этого года на меня снизошло вдохновение нормальная пекарня поломалась и теперь я не могу катать даже дотан - за месяц прочитал пару книжек по пистрону и наговнокодил пару говнопроектов на джанге для меня это много, после чего благополучно успокоился и уже месяц-полтора саморазвиваюсь в сериалах.

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

Молодой? Не бросай учебу, дебил малолетний, блядь, подумой.
797 1500473
>>500440
попробуй 10мг амфетамина каждое утро. (в воде разбавь)
изображение.png538 Кб, 420x410
798 1500481
>>500367

>Если ручками не лезть туда - куда не стоит, то все будет работать


В линупсе не получится лол.

> А если ты от нехуй делать решил в системе "ковыряться"


Если всё, что находится вне /home - система. То рано или поздно придется там ковыряться.

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


ой мде

>с убунтой, потом поставил Минт


Одни яйца ток с нескучными обоями

>А права на папку поставить ты через 1.5 раза запомнишь как


Ясно
>>500420
))
799 1500532
>>500364
Ты с линуксом лет 20 назад в последний раз работал в таком случае.
Убунта ставится также, как и винда, в два клика, интерфейс почти такой же, в консоль новичку вообще лезть не обязательно.
С правами проблем минимум, да и выучить 2 команды несложно.
(да и в принципе линукс выучивается на необходимо-новичковом уровне очень быстро, дело нескольких статей с того же хабра)

Отдельный момент, что на сервере скорее всего будет тот же линукс (ну не убунта, но какая разница?) и лучше заранее уметь его готовить, чем оказаться в один прекрасный момент с голой жопой.
800 1500586
>>500532

> Ты с линуксом лет 20 назад в последний раз работал в таком случае.


))

> С правами проблем минимум, да и выучить 2 команды несложно.


Да. Да. Как скажешь)

> (да и в принципе линукс выучивается на необходимо-новичковом уровне очень быстро, дело нескольких статей с того же хабра)


Ох уж эти хабротеоретики)

> в консоль новичку вообще лезть не обязательно.


> Отдельный момент, что на сервере скорее всего будет тот же линукс (ну не убунта, но какая разница?) и лучше заранее уметь его готовить, чем оказаться в один прекрасный момент с голой жопой.


Ищем противоречия)
801 1500650
>>500327
Если ты этого не можешь, то рановато тебе ещё в вебдев двигать. Владение линухом на уровне, минимум, пользователя - обязательное требование в вебе.
802 1500655
>>500481
>>500586
Ох уж ети криворукие дауны)))
shot190811025828.png83 Кб, 214x209
803 1500666
>>500650
Закнчивался 2019 вместо средств актуализации советуют ставить линх
>>500655
ох уж эти за ручку не держащиеся линупсойды
804 1500667
>>500666
*виртуализации
быстрофикс
805 1500670
Нахуй вы срётесь из-за какого-то говна. Очевидно, что виндовс.
806 1500700
>>500670
Очевидно, виндовс что? Для чего, куда зачем?
Вам обьяснили что уметь в пердолинг с консолью это что то сродни уметь в минимальную верстку. Просто нужно. Никто вас не заставляет, и не говорит что вы будете сервера настраивать и заниматься подобными вещами. Новичек потратит на этот пердолинг день-два от силы, но хоть какие то азы у него будут.
Не уметь хотя бы по папкам переходить и права переназначить - себя не уважать
15712653000890.png120 Кб, 720x303
sage 807 1500786
>>500650
Типичный линуксойд. Ууу ставьте линух уууу азы ууу атлищная система. Плюс в глаза долбишься. Все с тобой ясно.
Abe-Yoshitoshi-Anime-Art-artist-5507401.jpeg487 Кб, 811x1148
808 1500789
>>500700
Двачую адеквата.
809 1500818
>>500700
Очевидно, что виндовс.
810 1500839
>>500786
Охренеть, сколько мамкиных виндузятников понавылезло. Сначала такие "зачем нам осваивать линукс, можно же как и раньше под виндой сидеть", а потом "кококо, у нас нет нормальной работы, сижу на своих 60к в месяц, наврали всё про этих программистов, буду и дальше таксистом".
Линукс - это блять стандарт для веб-приложений. Всё, тут ничего уже не поделаешь. Если винда - то это ASP.net или какие-то нищенские пехапе-колхозы, что ещё хуже.
15523069858050.jpg53 Кб, 640x480
sage 811 1500856
>>500839
Чтобы писать нормальное приложение надо блять докер юзать. На худой конец вагрант. Они блять прекрасно работают на винде. У тебя изолированное окружение с линуксом на котором можно делать все что угодно без всяких рисков для основной системы. Смысла блять ставить себе на пеку твой линух нет.
Я блять раз 20 уже про виртуализацию написал. Походу ты тупой совсем.
812 1500857
Чтоб писать нормальные приложения, надо быть нормальным программистом. А вы какой-то срач ебланский развели. :)
813 1500859
>>500856

>делать все что угодно без всяких рисков для основной системы


Проиграл с этой макаки
814 1500876
>>500856
Докер-это инструмент. Вчера вагрант, сегодня докер, завтра хуёкер. Не важно, как именно тебе нужно запускать линукс (хотя вот для новичка знакомство с докером отложил бы, это ему совсем мозг взорвёт), я писал о том, что в принципе "хочешь быть веб-разработчиком - учись мастерить линукс на начальном уровне". Это блять начальный девопсовый уровень, линукс, докер, баш, веб-сервер, супервизор и так далее.
Виртуалка с линуксом тоже норм решение, почему нет.
815 1500881
>>500856
А, ну и да, не ебите новичкам мозг с докером, они совсем с ума сойдут, почему они внутри контейнера пишут 127.0.0.1:80 и у них одни результаты, а в браузере - другие.
Не говоря уж про нёхи с правами, когда докер из-под суперюзера создаёт папки.
Не нравится идея ставить на домашнюю систему линукс (хотя там блять 30 гигабайт за глаза и на систему и на рабочие файлы) - советуйте хоть виртуалбокс или сраный вагрант.
Понаслушались своих хайпожоров, докер у них универсальное решение, рисков для системы он блять не несёт. Почитай хоть про докер и его ишью с безопасностью, чем херню нести.
sage 816 1500888
817 1501010
>>500856
Неистово плюсую этого. Не переходите на линукс как на полноценную ОС для вашего ПК. Юзайте виртуалочки ребят, оно вам не надо, если не знаете зачем. А перед переходом на линукс нужно хорошенечко подумать.
818 1501058
>>501010
Давно уже сижу на убунте как на основной ос, никаких проблем не возникает, а если и случается что-то, все решается с помощью Гугла за 5 минут. Шиндоус хорош как основная ос только если ты часто играешь в игры или пользуешься специфическим софтом, которого нет на линупсах. Как система для обычного пользователя, который после кодинга хочет посмотреть сериальчик или потупить на Ютубе я не вижу никакой разницы в используемой ос.
819 1501195
>>500786
По вакансиям смотрел, в большинстве случаев просят базовые знания прыщей. Подумой.
820 1501252
>>501058
Вот этот дело говорит.
Я считаю так, что для (веб)разработки надо сидеть на линуксе во время этой самой разработки. Потому что баш, пайплайны, мейкфайлы и тому подобное, потому что права и нативный докер (в той же винде он вообще-то поднимает полноценную виртуалку с линуксом).
На всех проектах и у всех сеньоров, которых я видел, на рабочих системах стоял именно линукс (а дома для игор - это уже другой разговор).
15713311698560.jpg1,2 Мб, 900x900
821 1501289
Не понимат:
Я хочу выдернуть все значения по регулярке :
\:[a-z]\:
Например из строки:
rrrr:aaaa:bbb:yyty
У меня выдернется только aaaa , но мне надо чтоб и bbb выдернулось тоже как сделать?(
822 1501311
>>501289
У тебя очень странная регулярка. Бэкслеш экранирует двоеточие?
Регулярка ищет один символ между двоеточиями?
Если нужно найти эту ':aaaa:bbb:' подстроку то
то #:[a-z]+?:[a-z]+:#
823 1501312
>>501311
Упс, налажал
#:[a-z]+:?[a-z]+:#
824 1501327
>>501311
Нет нужно найти подстроки
:aaaa:
:bbb:
Проблема в том что они пересекаются как видишь
825 1501352
>>501289

Твоя регулярка при совпадении поглощает идущее в конце двоеточие и поиск продолжается с буквы. Почитай про утверждения, которые не поглощают символы: https://www.php.net/manual/ru/regexp.reference.assertions.php

Также, другой вариант это explode'ить строку по двоеточию и делать поиск в полученном массиве.
826 1501380
>>501352
Мен, я знаю причину, почему они не работает я выше уже написал мол они пересекаются. Я спрашивал - как сделать чтоб работало
827 1501384
Посаны, опять проблема с массивами. (всё та же)
Не могу понять, как ключи выводить правильно с другими видами функций.
Исходный код - 1-ый пик, как попытался сделать и не сработало - 2-ой. ( https://ideone.com/BZ8Y7g )

(да, знаю что по заданию проверку не пройдёт из-за пробелов, но мне главное с массивами сейчас разобраться)

ЧЯДНТ? Как этой суке указать, что я хочу имплоуд сделать слов, а не индекса (или что это там такое), чтобы потом вывести именно слова, а не индекс
Screenshot7.png4 Кб, 788x135
828 1501397
Пока что ещё вопрос: я же добавил строку с кодировкой в utf-8, почему произошёл ОП-ПИК?
829 1501405

>Ах да, еще один совет. В интернете тебе могут посоветовать решать задачу через strrev() (которая не работает с многобайтными кодировками и русскими буквами и про которую я советую сразу забыть). Вот как надо поступать с такими «советчиками»:


Понял.
Screenshot11.png4 Кб, 638x93
831 1501434
Пардон, шо сру. Добавил точку перед ровно. Шо не так с этой ебаной кодировкой? чяднт

>>501429
832 1501465
>>501429

Платиновый вопрос наверно, доступ через квадратные скобки дает доступ к байтам, а не символам: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
Screenshot12.png7 Кб, 1383x118
833 1501471
>>501465
Так я же ничего такого не использую в коде.
А если заменить квадратные на обычные, то выдаёт это.

Алсо, что там по массивам? Куда какие скобки надо вставить, чтобы всё заработало?
834 1501525
>>500700

>Новичек потратит на этот пердолинг день-два


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

>Не уметь хотя бы по папкам переходить и права переназначить


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

OpenServer великолепен для вкатывания, и уже потом имеет смысл перекатываться на Докер.
Знать азы красноглазия безусловно полезно, но надо отдавать себе отчет в том, сколько времени на изучение займут эти "азы".
835 1501542
>>501525
Чего? Какой месяц? У какого дауна это займёт месяц и что он будет делать всё это время?
Линукс при 0 опыте работы с ним ставится за 2 часа, ещё 6 ты потратишь на то, чтобы пройти по мануалу и установить веб-сервер, пхп и так далее. Проверено на себе, когда я вкатывался (лет 7 назад, тогда всё было менее стабильно причём), где-то столько оно и занимает.
Любую проблему на этом обсосаном тысячи раз пути ты гуглишь через "ubuntu <текст ошибки>" и моментально находишь решение.

И да, как правильно замечали выше, давать докер новичкам - ещё сильнее их путать.
836 1501559
сук, лучше бы на вопросы отвечали тупые, чем срались.
837 1501572
>>501542

>У какого дауна это займёт месяц и что он будет делать всё это время?


.... Изучать, как же работает веб говно, может быть? Или ты предлагаешь без малейшего понимания идти по гайдам и копипастить в командную строку говно из интернетов?
838 1501601
>>501572
Изучать можно до бесконечности, надо решать задачи. Поставить сервер - задача. Сконфигурировать сервер - задача. Написать helloworld - задача. И так далее. Только так что-то и выучивается.
В противном случае ты изучаешь что-то в пустоту, без цели и без применения. Имхо, конечно же - но мой жизненный опыт показывает, что оно как-то так и есть.
839 1501608
>>501525

>Этот пердолинг, лживое ты мудило, у новичка займет около месяца


Как же приятно наблюдать потуги этого неосилятора доказать что земля - плоская
840 1501618
>>501601

>Изучать можно до бесконечности, надо решать задачи.


До тебя начинает доходить. Скушай конфетку.
Но вместо того, что бы взять готовое решение (OS), которое установится в 2 клика и позволит посмотреть, как же работает полностью настроенный сервак, ты предлагаешь уйти в линукс и делать всё по готовым пошаговым гайдам. Это ничем не лучше работы в OS в плане обучения, но только больше абсолютно бессмысленного пердолинга.
К тому моменту, как вкатывальщик столкнется с ограничениями винды и ОпенСервера (если столкнется, прошу заметить), он либо
вкатится в докер (который действительно чутка уёбищен, но увы стандарт сегодня), либо сможет значительно быстрее перейти на красноглазую ось, зная что именно и как ему нужно настроить.

>>501471
Используй mb_strlen для подсчета длины и preg_split для перегона в массив. К массиву обращаются квадратными скобками.
Screenshot2.png38 Кб, 666x538
841 1501619
842 1501620
>>501608
Ну видно вы гении какие то, я вот так и не смог перейти на красноглазоси. Ставить на второй ЖД ее? Да в рот ее ебать не хотеть, для ДАННОГО ТРЕДА мне хватает божественной семерочки, больше тебе скажу (выпей волокордину) - у меня апач неконфигурированный 2.4, с одним корнем в котором все свалено в кучу, и похуй, я - новичок, я сюда зашёл PHP покорить, идите нахуй со своим линуксом, лучше помогите вот с этим >>501471
815.png39 Кб, 300x300
843 1501621
>>501620
Спасибо за поддержку!
image.png11 Кб, 285x152
844 1501634
>>501620
Посмотри внимательно что ты делаешь с результирующей переменной. Ты в цикле ее постоянно переопределяешь. И лучше использовать var_dump для отладки
845 1501636
>>501634
Абракадабра получается.
846 1501638
>>501620
Так, то есть ты - новичок, не осилил линуксы и начинаешь спорить с умными опытными людьми, которые пытаются забесплатно научить тебя чему-то и объяснить, что и как нужно сделать?
Вся суть двачей в одном посте.
"Я не разбираюсь, но считаю, что вот так вот лучше и идите вы нахуй со своими мнениями, я лучше знаю"

>>501618

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


Таки не согласен. Понятно, что с линуксом новичок потратит чуть больше времени ДО, собственно, программирования, но решая задачи установки сервера, конфигурирования виртуального хоста и так далее он поймёт, ЧТО он собственно делает, потому что будет делать это своими руками, вместо того, чтобы ставить какое-то говно, которое волшебным образом сделает всё за него. Понятно, что он не будет разбираться в тонкостях, но он хотя бы запомнит, что он поставил апач, написал конфиг для вот такого вот виртуального хоста, это связало вот такой вот урл с вот такой вот папочкой и так далее.
Не буду спорить, можно и как ты сказал. Но по моим наблюдениям, намного менее эффективно.
847 1501645
>>501638
Это вообще другой чел пост написал, а не я(с проблемой). Как и этот >>501636

>>501634
Это другой чел, а не я. С какой переменной? У меня точно такой же код как и в твоём примере >>501429
и он точно так же не работает на русском языке и выдаёт одну и ту же ошибку про оффсет на английском.
848 1501646
Повторю, что не так, если кто запутался

1. Один код не работает, тот, который с массивами, потому что я не знаю, как правильно обращаться к ним - я пробовал по разному но так и не вышло получить результат в виде букв, а не индексов. >>501384 Такая проблема у меня возникала вчера и пофиксил её с помощью $name[array_rand($name)] - тогда он выдал НЕ индекс. В данном случае я пробовал такую же конструкцию пихать, но у меня ничего не вышло.

2. Второй код >>501429 работает отлично, за исключением того, что он не поддерживает кириллицу, хотя я использовал mb_strlen и строку mb_internal_encoding('utf-8'); Пример этого анона >>501634 ничем не помог, потому что ошибка остаётся (и код ничем не отличается от моего(кроме того, что я точку до ровно забыл поставить) )
849 1501647
>>501645
У меня в песочницах все работает с латиницей. С кириллицей тебе выше кинули ссылку
850 1501649
>>501645
Длина строки на 1 больше индекса крайнего символа.
стрлен("Линукс") = 6
"Линукс"[5] = "с"
"Линукс"[6] = хуевый оффсет
851 1501651
>>501647
Так я ж использую mb_strlen за место strlen. Или ошибка с кириллицей возникает из-за обращения строки как к массиву? $textrep[$i]

А как тогда мне тогда сделать эту задачу с кириллицей? Писать код под массивы?
852 1501653
>>501651
Разбей на символы через preg_split!
image.png6 Кб, 547x33
853 1501655
>>501651
У меня все работает, пробуй
854 1501672
>>501651
Тебе анон уже подсказал решение >>501653
Через preg split с /u флагом разбей строку на массив символов, тебе нужно поменять символы местами а не байты, пока что ты берешь мультибайтовый символ например [ху, й] и меняешь его на [й, ху], как видишь смысл теряется. И кстати еще задачка, перепиши цикл перебора чтобы он работал в два раза быстрее, подскажу что можно использовать несколько переменных в цикле, например первая будет отмечать начало строки, а вторая конец, удачи :)
1235.png10 Кб, 642x187
855 1501698
>>501672

>preg split с /u флагом


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

Я честно не понимаю. Кто-то говорил про ебучие квадратные скобочки, но с ними вообще ничего не хочет работать. Вот пример кода, этот мудила вечно мне цифры показывает. https://ideone.com/HeQQyr
На каком этапе и как именно я должен поменять код, чтобы он начал отображать буквы, а не индекс?(если это вообще индекс. Ебал рот массивов этих блядских)
856 1501700
БЛЯДЬ. Я ПОНЯЛ. Я ПОНЯЛ
857 1501702
Нет, не понял. Ебал рот этих даунских массивов.
Я читаю php.net - у них в примере нормально слова через строку отображаются, когда у меня же блядские цифры. сука, ненавижу цифры.
858 1501703
>>501698
Ты блядь вафлер ебаный, жопой читаешь? Тебе скинули ссылку >>501465 , потом вырезали абзац с нужным текстом >>501647, потом вырезали и скинули конкретное предложение с решением проблемы >>501655
Там где у тебя выше было $resultText .= $text[$i] сделай $resultText .= mb_substr($text, $i,1). Уже бы сделал и некст заданию перешел
859 1501706
>>501703
ДА Я БЛЯДЬ НЕ ОБ ЭТОМ СУКА ТЫ ЁБАНАЯ. Я ВООБЩЕ ПРО ДРУГОЕ. С ТОЙ ЗАЛУПОЙ Я РАЗОБРАЛСЯ УЖЕ.
860 1501708
>>501703
Алсо, я все следующие задания выполнил нахуй. Я ебусь только с блядскими массивами, потому что не понимаю, как выводить из них информацию на ебаный экран.
861 1501713
>>501708
Ты хоть прочитал что функции делают? Прочитал что такое массивы? Понимаешь что ТЫ хочешь сделать? На все эти 3 вопроса сейчас напиши мне ответ, пока будешь писать - разберешься и вопросов у тебя больше не возникнет
862 1501719
>>501713
Иди на хуй, долбоёб ебаный. Я со всем разобрался, кроме того, как работают уебанские массивы, на php.net одно написано, а на деле выходит какого-то хуя другого.

Вот где, сука, на php.net пишут, что надо писать $name(array_rand[$name])? Нигде там нахуй это не написано. Всё что там есть, это array_rand ( array $array [, int $num = 1 ] ) Чё нахуй за int $num = 1 и нахуй он нужен и почему перед int стоит запятая - хуй поймёшь, потому что там этого, сука, не написано.

Лично у меня выходит сделать только array_rand($name), никакие квадратные скобочки он видеть вообще в этом примере не хочет и не воспринимает их(показывает он в этом случае только ключ).

И даже если я сделаю так, то по итогу на выходе я получаю КЛЮЧ (цифру), а не ЗНАЧЕНИЕ ключа. Т.е. мне надо было делать $name(array_rand[$name]), только вот как это работает и ГДЕ ЭТО ВООБЩЕ написано? Где нахуй?
Вот тебе один вопрос, хуесос, ответь на него. И представь, что ты первый раз открыл книжку/сайт ещё какой-то гайд и тебе надо высрать откуда-то эту функцию. Давай нахуй, хуило.
863 1501720
>>501719
Ты просто идиот малолетний, пошел нахуй отсюда. Тебе никто ничего не должен, но при этом оказывают помощь. А ты вместо того чтобы эту помощь обдумать ждешь, что тебе по полочкам все разложат и обьяснят(да еще и ведешь себя как свинья ебаная). В статьях ОПа есть информация о том, как работают массивы.

>Вот где, сука, на php.net пишут, что надо писать $name(array_rand[$name])?


А нахуя там это писать, умолишенный
Если ты заше на страницу функции array_rand, то там будет написано об этой функции. Что принимает и что возвращает. И даже примеры есть.
А что ты с этой функцией будешь делать - никого не ебет, это твоя проблема и задача
864 1501727
>>501720
Я нормально отношусь к людям, которые помогают. Ты же высираешь и снобишь тут как хуесос последний. Небось и сам ещё нихуя не разбираешься.
Пиздуй дальше срачики разводить по поводу линукс-виндовс говнины.

Алсо, единственный чел, который тут написал ебанутое сообщение с намёками - это был не я, а кто-то другой.
865 1501728
>>501727
Ты уебан, даже сформулировать вопрос не можешь. Еще и кидаешься на тех кто тебе отвечает. Я тебе четко и ясно сказал, что если ты сможешь себе ответить на 3 этих >>501713 вопроса, то у тебя проблем не возникнет. В ответ я получил сказ о том, какой я хуевый, что тебе на блюдечке все не принес
866 1501734
>>501728
Я в курсе, что такое функции и что такое массивы. Я читал об этом в книге, так же читал и факе анона. Я так же перекатился с JS, на котором удачно выполнял задачки среднего лвла. Но понять, что за уебанская нелогичная хуйня с массивами в пхп для меня за гранью.

Кидаюсь я на тебя, потому что ты как сноб пишешь и уверяешь меня, что я что-то не выкупаю. Я это не выкупаю, потому что НЕ ОЧЕВИДНО нихуя. Прошу объяснить, а в ответ получаю 'сделай мне конспект и тогда я может тебе что-то отвечу("не отвечу, буду лишь сраться и дальше заниматься снобизмом, потому что это первое, что я сделал")'
867 1501739
>>501734
В ОП-посте есть отличный веб-учебник для новичков, я точно помню что там описано как работают массивы. Что они представляют из себя что то на подобии хэш-тиблц, что в массиве хранятся пары ключ => значение, что "ключ" может быть символьной строкой, что доступ к элементу массива можно получить по ключу, так же как ты это делал строкой. Если ты это все знаешь, я не понимаю какие у тебя могут возникнуть проблемы, это же база. Тем более если ты перекатился с JS, то основы аля циклы, ифы ты уже знаешь. Но языки друг от друга отличаются, поэтому возьми да пролистай учебник с шапки
https://phpbooktest2.ga/
868 1501758
>>501739
Хорошо, почитаю.

Мне вот сейчас нормально пояснил знакомый:
$name(array_rand[$name])
array_rand выбирает рандомное число из массива [$name]. Вот это мне было очевидно и понятно с самого начала.
Я не понимал, нахуй там нужно $name в начале. Мне сказали, что потом функция применяет выбранное значение к массиву, который указывается вне скобок(вначале).

Это логично и понятно после такого разъяснения, да. Но даже если я сейчас прочитаю фак функции на php.net я НЕ СМОГУ прийти от array_rand ( array $array [, int $num = 1 ] ) : mixed к $name(array_rand[$name]) , без знания того, как оно работает. Точнее я даже с знанием работы функции не понимаю, как из A оно превращается в Б. Это нихуя не очевидная функция и работает она нихуя не очевидно, потому что для выбора ЗНАЧЕНИЙ за место КЛЮЧА, мне надо писать какую-то хуйню, которая создаёт путаницу. В JS такого нет, вроде как. Там он сразу выдаёт и ключ и значение и в зависимости от других функций ты работаешь либо со значением, либо с ключом и можешь указать, нужен ли тебе индекс или же значение.
869 1501759
>>501739
да блядь, заебись почитал. Это тот самый, что я сейчас и прохожу. Я выполнил его до конца кроме более сложных задач, потому что не справился с массивами.
870 1501760
>>501739
блядь, я же ведь даже примеры из него кидал. Ты троллишь что ли?
871 1501764
>>501739
Иди на хуй короче
image.png48 Кб, 994x589
872 1501768
>>501760
В чем твоя проблема тогда? В том что ты не понимаешь, почему чтобы извлечь из массива элемент нужно его ключ указать? Мне кажется это ты троллишь. Но, раз уж ты такое особенный, то давай тебе на пальцах все обьяснят, конечно
873 1501773
>>501768
Спасибо! Очень вовремя, как раз, когда я понял, долбоёб.
1571688454564.jpeg90 Кб, 442x604
sage 874 1501905
>>501618

> К тому моменту, как вкатывальщик столкнется с ограничениями винды и ОпенСервера (если столкнется, прошу заметить), он либо


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


Неистово двачаю адеквата
875 1502027
>>501734
В ходе вашего срача я так и не понял, че у тебя с массивами в ПХП не логично?
Все вполне логично и достаточно просто.
876 1502028
Котаны, у меня трабла. У меня есть запросы PDO в БД.
Вот что произошло - в БД у меня (не суть почему) проебалась половина таблиц, и соответственно в момент когда я запустил выполнение запроса - браузер повис намертво.
Вопрос таков - в данной ситуации PDO сразу выбрасывает ошибку? Или он какое то время (какое?) крутит жопой?
На мой взгляд ошибка должна была сразу выпасть, и отловиться моим обработчиком. Однако все просо повисло.
877 1502039
>>502028
п.с.
Нужно отслеживать время выполнения запроса в базу и обрывать его, если допустим больше 5 секунд
878 1502040
>>502028

Если таблицы нет, то MySQL или Postgres сразу вернет ошибку. PDO должен выбросить исключение, если ты его настроил на выброс, или проигнорирует ошибку, если не настроил. Ни то ни другое не должно приводить к зависанию, если ты только не сделал в коде цикл.
879 1502053
>>502027
Это либо зелень, либо тру-шизоид. Зачем вы ему объясняете что-то когда он вас хуями кроет через слово? Персонаж неадекват очевидно.
880 1502065
>>502040
Спасибо, я уже разобрался.
>>502053
Да я ему и не овтечал.
Вообще пхп тред на удивление приятен. В JS тредах - там вообще содом и гоморра.
881 1502068
>>502053
Это ты припёзднутый в край. Отказался помочь, проявил снобизм, после чего решил помочь, когда я уже разобрался.
882 1502069
>>502053

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

А всякие токсичные типы с "ты что прочесть не можешь что я написал" только портят ситуацию.
883 1502074
>>501734

В JS та же ерунда с обращением к строке как к якобы массиву символов. Там строки в формате UTF-16, то есть состоят из 2-байтных юнитов. Когда Юникод только-только появлялся, думали, что 65536 символов хватит всем, и сделали кодировку по ровно 2 байта на символ. Это кодировку взяли за основу Java, Javascript и новая версия Windows.

Позже Юникод расширили, и 2 байтов стало не хватать, и символы с большими кодами в UTF-16 пришлось кодировать в виде "суррогатных пар", то есть как 2 2-байтовых юнита.

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

Вот тут есть примеры: https://stackoverflow.com/questions/52526719/javascript-substring-without-splitting-emoji

В PHP в этом плане все честнее - тут косяки видны сразу, а не в редких случаях, как в JS.

И, кстати, даже если ты решишь проблему разрезания строки на массив символов (codepoints в терминологии Юникода), это не значит, что переворот строки будет работать корректно. В юникоде есть составные символы, когда символы собирается из нескольких codepoints, например, невидимый символ, добавляющий точечки сверху, и сама буква. Если ты их поменяешь местами при повороте строки, то естественно, буква с точечками распадется на букву и точечки отдельно.
884 1502077
Прислали тестовое с удаленки, сделать круд без фрейморков. Синьеры и лиды итт, насколько далеко нужно заходить в написании инфраструктурного кода, например стоит ли мне писать роутер с одной точкой входа или просто по папкам раскидать индекс.пхп и готово? Не указано можно ли использовать композер, но я думаю что лучше тогда свой автозагрузчик написать базовый. Стоит ли писать свой маленький контейнер с фабриками объектов? Хотя щас сам думаю что стоит потому что я устану руками постоянно что-то создавать. В общем хочу угадать с балансом чтобы и сильно не выебываться и не писать одноразовое полотно
885 1502087
>>502077
От тебя не требуют упарываться и делать прослойки под все операционные системы, движки баз данных и так далее.
С моей точки зрения, "сделай без фремворков" проверяет у новичка навыки именно софтварной архитектуры, а не знания фреймворков Хотя сам я такое задание не выдаю, когда у меня такое в последний раз попросили (лет пять назад) - написал сам модели, контроллеры, вьюхи, свой мини-фреймворк. Не так важно, что оно было деревянным и слабо конфигурируемым, видно было, что я понимаю, что нужны такие-то слои и всё такое.
Соответственно, свой контейнер - да, желательно (благо, пишется на час, если просто на лямбдах писать, без усложнений). Автозагрузчик тоже стоит написать, просто заложившись не на все PSR'ы, а на какой-то конкретный паттерн.
Роутер простенький, на регулярках.
Модели БД можно сделать обычными классами, просто объявить отдельные методы CRUD и отдельно to/fromArray для перегона между PDO'шными структурами и, собственно, моделями.
Миграции тоже можно написать, максимально просто (отдельная табличка migrations и там строки-айдишники)
886 1502089
>>502087
Отдельно можешь написать там в каждом слое комментарии вида "вообще я бы использовал packagename (eloquent), но в качестве демонстрации сделал это руками вот так вот потому-то".
887 1502105
>>502065

>В JS тредах - там вообще содом и гоморра.


Как-то не замечал такого. Тред как тред, ну может несколько эмоциональнее чем тут.

>>502068
Дружок, ты как собака тут на всех кидаешься. Я просто почитал ветку и твои посты - тебе голову лечить надо, какое программирование, если ты нормально общаться с людьми не можешь?
Твои претензии к непонятной логике работы рандомайзера массивов это только твои проблемы - остальным всё понятно.
Более того, ты ещё и с документацией работать не умеешь, но мнение о ней какое-то завёл и высказываешь тут всем на потеху.
888 1502153
>>502077
БиДжы?
889 1502196
>>502068
Тебе как минимум 5 анонов уже сказали что ты себя ведешь как свинья. Или ты реально считаешь что это я такой токсичный семеню сижу?
890 1502197
>>502196
Только один, семён-семёныч.
891 1502199
ПИШЕШЬ РАБОЧИЙ КОД И СПРАШИВАЕШЬ, КАК ПОДКЛЮЧИТЬ КИРИЛЛИЦУ
@
АНОН ГОВОРИТ, ЧТО ТЫ ЕБЛАН, ОН НЕ ПРАВИЛЬНЫЙ И КИДАЕТ СВОЙ КОД
@
ЕГО КОД ОДИН В ОДИН ТАКОЙ ЖЕ КАК У ТЕБЯ И БЕЗ ПОДДЕРЖКИ КИРИЛЛИЦЫ
892 1502201
СПРАШИВАЕШЬ, КАК ПОФИКСИТЬ МАССИВ
@
АНОН ГОВОРИТ, ЧТО ТЫ ВАФЛЁР И ЖОПОЙ ЧИТАЕШЬ И ТЕБЕ УЖЕ ВСЁ СКИНУЛИ
@
МНЕ НИХУЯ НЕ СКИНУЛИ ПО ПОВОДУ МАССИВОВ
@
ТОТ ЖЕ АНОН ПРЕДЛАГАЕТ РЕШЕНИЕ ДРУГОЙ ПРОБЛЕМЫ, КОТОРУЮ УЖЕ РЕШИЛИ
@
ТЫ ГОВОРИШЬ, ЧТО ТЕБЕ ЭТО НЕ НУЖНО, ТЕБЕ НУЖНО РЕШЕНИЕ ПРОБЛЕМЫ С МАССИВАМИ
@
АНОН НАЧИНАЕТ АГРИТЬСЯ НА СВОЙ ЖЕ ВЫСРАННЫЙ БРЕД НЕ ПО ТЕМЕ


Гениально! Алсо, никто за сообщений 50 так и не сказал, в чём самая первая проблема была с массивами. И ес чё мне уже не надо, я сам разобрался.
893 1502202
>>502199
@
ДУРАЧКУ 3 СКИНУЛИ ОТВЕТ НА ЕГО ВОПРОС
@
Я НИПАНИМАТ, РАСПИШИ НА ПАЛЬЦАХ
@
НУ ПРОЧИТАЙ ЖЕ ТЫ ЧТО ТЕБЕ СКИНУЛИ
@
ПИЗДЕЦ ТЫ СНОБ И ВООБШЕ ГАДОСТЬ
894 1502204
>>502202
покажи где ответ про массивы. И я говорю не про работу уебанской функции array_rand, а самый первый вопрос про массивы, которые я спрашивал за тред раз 5 уже, в ответ я получал ответ по другой проблеме, а не массивам.
И кто после этого жопой читает? LUL
895 1502208
>>502068
Тебе ОП-треда подает пример как себя вести, даже если тот у кого ты спрашиваешь отвечает токсично.
Ты же закатил истерику.
896 1502209
>>502199
>>502201
>>502204
Мод, потри этого мудака, плис и забань нахрен.
1212.jpg76 Кб, 1000x1000
897 1502213
>>502208
>>502209

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

898 1502217
inb4: ща опять прочитает жопой и отправить меня к этому посту
>>501768
899 1502220
>>502077
Слушай, если будешь писать, то скинь на отдельный гитхаб, если незатруднит.Меня сильно интересует вот это:

>>Стоит ли писать свой маленький контейнер с фабриками объектов?


Как это должно выглядеть в приложении?

>>502087

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


Скинь будь добр какую нибудь ссылку на не сложный пример реализации.
Для чего контейнер нужен? Где его место?

Я дорос уже до архитектурных вопросов. Меня это очень интересует.
900 1502222
>>502213
Я думаю тебе край. Молвероятно что тебе ответят по делу.
901 1502224
>>502222

>всё ещё не способен нормально читать


>>502201

>И ес чё мне уже не надо, я сам разобрался.

902 1502225
>>502220
Читай про dependency injection сначала, потом про dependency injection container, потом смотри, как контейнер используется в laravel либо symfony (у них есть примеры приложений, там всё есть)
903 1502226
>>502220

> Скинь будь добр какую нибудь ссылку на не сложный пример реализации.


https://pimple.symfony.com/
904 1502245
вчера запустил сайт,пришло 40 чел
905 1502254
>>502204
Покажи мне вопрос про массивы. А ответ на твои невнятные простыни нытья тебе давали. И писалали что, где, как искать, как подойти к этому вопросу, даже ссылку на статью опа кидали (но ты их, конечно же, не чекал. ибо нахуй надо, когда тред рабов за тебя все найдет, пережует, обьяснит). В частные репетиторы тебе никто не нанимался, так что пора отвыкать от кормежки с ложечки и становиться взрослей.
Еще проиграл когда ты перданул, что с JS перекатился. Ох уж эти перекатыши, которые не могут элемент с массива извлечь.
Я уже представляю как ты себя на собесе ведешь:
"Гряяя, ну пачиму вы меня валите!!! (начинаешь плакать и биться в истерике)"

Хотя я со вчера не заходил, а ты до сих пор думаешь что с тобой один и тот же анон беседует - вот она, тупость. И я действительно начинаю думать что мы не правы, вдруг ты больной на голову. Мне даже стыдно сечас стало
906 1502256
>>502254

>Покажи мне вопрос


q.e.d.
907 1502257
есть ли какая простая ORM?
908 1502258
>>502256
Ты покажи вопрос, который задавал. Я тебе скину на него ответ. Ты весь тред нытьем засрал, мне угадывать нужно?
909 1502276
>>502258

>Гениально! Алсо, никто за сообщений 50 так и не сказал, в чём самая первая проблема была с массивами. И ес чё мне уже не надо, я сам разобрался.



>И ес чё мне уже не надо, я сам разобрался.



Вас тут либо толпа тормознутых, либо ты один конченный такой. Надеюсь, что это всё один семён-семёныч.
910 1502279
>>502276
Да нет, это просто ты больной на голову.
Разобраться в этой теме с массивами - дело 10-15 минут размышлений и попыток. Ты же сопли свои на сотню постов размазал, как школьница.
А что ты будешь с паттернами и архитектурой делать, где по десятку статей в одно рыло надо употребить в процессе обучения? Да не выйдет у тебя ничего. Пей свои таблетки и не трогай веб - тебе не светит работать там с таким подходом.
911 1502287
>>502279

>тебе не светит работать там с таким подходом.


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

Да-да, ничего у меня не выйдет и подход у меня неправильный. :)
912 1502292
>>502287

>покажи где ответ про массивы. И я говорю не про работу уебанской функции array_rand >>502204


Ты сам то понимаешь что тебе нужно?
913 1502307
>>481589

>говори что все это время работал неофициально\без оформления у знакомого


когда последние 5 лет только так и работалпотому что тупой и собесы регулярно заваливал
914 1502311
>>481810

>знакомая устроилась js джуном в 29 лет


А можно поподробнее? Сам недавно разменял 30, тоже пытаюсь в жс-ждуна.
915 1502312
>>502287

>array_rand пояснил мне друг


Бэкенд за тебя тоже друг писать будет, да? Ты же опять не сам допёр, а подождал няньку, которая всё разжевала.
916 1502316
>>491109

>курс по битриксу


я бы тебе сказал бежать оттуда как можно быстрее, но, видимо, уже поздно
917 1502317
>>502312

>опять не сам допёр


>опять


Это первый вопрос, который я спросил и на который мне дал ответ друг.

Алсо, как выше сказали и как сказал друг - работа функции нихуя не очевидна. И как я говорил - в js такой хуйни не было. Разобравшись с одними этим примером я понял как это в целом работает в php.
918 1502319
>>502317
Ну ты и лолка.
919 1502368
>>502311
Ну что рассказывать. Не имела даже трудовой, работала колл центрах, продажником и т.д. Решила, что надо менять что-то в жизни, ведь 30 уже скоро, где-то 3-4 месяца учила верстку, точнее не скажу, потом пошла на какие-то курсы на 1 месяц, и в результате ушла джуном где-то за 500 бачей. Правда у нее график 6\1, но ей норм. На собесе, когда спросили где работала, и где трудовая, ответила, что работала продажником на холодных звонках, продавала виагру. Такие дела.
920 1502385
>>502316
В мире php есть два стула, битрикс и yii. На обоих лучше не сидеть, что казалось бы очевидно, но многие почему-то всё равно радостно запрыгивают.
921 1502415
Сап аноны, нужна помощь.
Я с помощью формы и метода POST отправляю данные в бд, но проблема в том, что при обновлении страницы в бд передаются пустые поля, как фиксить?
922 1502419
>>502415
Сделай var_dump того что передаешь в post запросе.
923 1502423
>>502419
Я пытался сделать if($_POST['text'] != NULL), но это не сработало, данные всё равно отправлялись.
924 1502441
>>502423
Я разобрался.
925 1502446
>>502423
Обычно делают
if( isset($_POST['text']) ){
$text = $_POST['text'];
} если ты проверяешь отдельное поле или if (!empty($_POST)) аналогично, если проверяешь весь массив post.
926 1502459
>>502446
Спасибо, возьму на заметку.
927 1502465
>>502368
Оче странные вещи. Тут джуны для вката чуть ли не фрейм пишут. А у тебя js-джун, девка в 30 ,на 500 баксов в месяц. В принципе все возможно, но прям повезло ей. Что можно в js понять за месяц?
928 1502491
>>502465
4 месяца сама учила + 1 месяц курсы.
500 баксов в месяц - это 6 рабочих дней в неделю с 9 утра до 9 вечера. Так что не так уж странно.
929 1502514
>>502491
Ну хз, я с JS начинал, и чет вообще нихуя не пошло. Ходил на собес - умел на реакте что то уровня тудухи запилить. Это было не релевантно.
Но в общих чертах нихуя не понимал. Поэтому начял вкат в пхп и ноду

>>это 6 рабочих дней в неделю с 9 утра до 9 вечера. Так что не так уж странно.



Я просто не очень представляю что она может полезного сделать. Не, верстать то конечно вполне реально научиться. Но блядь в нативный JS + какой-нить фремворк, ну это не очень правдоподобно.
Но опять же, и чудеса случаются.
YdGoOH1nIUI.jpg32 Кб, 584x404
930 1502520
Как же меня этот неосилятор Js-ер веселит последние 2 дня. Спасибо что ты есть, дружище
931 1502521
>>502514
Ну такое себе чудо конечно, я тебе таких чудес среди своих знакомых могу еще с десяток припомнить.
- парень за месяц выучил верстку - взяли джуном за 200$, сейчас, спустя 2 года уже имеет 800$
- другой 2 месяца учил, получил тестовое, которое ему прошел друг - помидор, успешно попал на работу и уже год там работает.
- тян 3 месяца изучала сисярп, взяли в контрку на какойто говнопроект, уже год там работает, никто ее не попер
- знакомый сделал какойто говнолендинг за 2 недели, написал резюмеху, что он пиздец какой спец, в результате взяли на джуна, уже машину себе купил
- еще один поучил месяц жабу, прошел на датасаенс, спустя год уже мидл с 1.5к
- знакомый работал до 32 продаваном, заебало, поучил 2 месяца ликус, уже сисадмином за 300, спустя пол года уже 500
- а вот другой знакомый уже год верстает + работает фрилансером, но так и ни в какую никуда не берут
- еще один бывший олимпиадник, уже второй год на С++ ищет работу, работая преподавателем
- еще один 2 года учит жабу, тоже никуда не может попасть

Я бы скорее сказал, что это не чудеса, это ебаная лотерея, ты можешь быть дохуя задротом с тудулистом, но счастливый билет может вытащить васян с 2 неделямы верстки и получать даллары, потому что ему знакомый синьер сделал тестовое.
932 1502544
>>502521

>>- знакомый работал до 32 продаваном, заебало, поучил 2 месяца ликус, уже сисадмином за 300, спустя пол года уже 500



Не дохуя ли?
933 1502545
>>502544
или это 300-500 доларов?
934 1502549
>>502545
В фантиках, в чем же еще
935 1502784
Анон, объясни, для чего в коде самых разных фреймворков имплементируются интерфейсы?
Если есть объект user, то обязательно будет объект userinterface, какой смысл ?
936 1502788
>>502196

>Или ты реально считаешь что это я такой токсичный семеню сижу?


Тут выше в треде был хуепутел, который вместо помощи всех критиковал. Если он это ты, то иди нахуй, тред для помощи новичкам, а не для того, чтобы ты самореализовался, унижая других
мимо-другой-анон
937 1502793
>>502788
Я этому особо упоротому ещё в самом начале пытался помочь с массивом, но он, похоже, вообще не в адеквате и не способен даже документацию прочитать нормально.
мимо-ещё-анон

>>502784
Ты можешь подменить метод создания юзеров, чтобы он возвращал не User, а, скажем, YourDebugUser, который реализует те же интерфейсы но при этом при вызове каждого метода логает это в консоль. Как раз это и является причиной, зачем вообще нужны интерфейсы - вместо того, чтобы закладываться на конкретный объект, ты закладываешься на ожидаемое от него поведение (то есть что он может, к примеру, сохраняться и загружаться, Save и Load).
Но при этом сам по себе юзер - это просто структура данных, наделять его ещё и каким-то поведением выглядит ошибкой на уровне архитектуры. Если мы говорим об интерфейсе, который описывает поведение работы с базой данных (тот самый Save/Load/Delete), то в упомянутых тобой "самых разных фреймворках" используется паттер ActiveRecord, который считается "не очень" по этой самой причине, что у структур данных появляется дополнительная ответственность. Мне больше нравится паттерн DataMapper (на его основе делают Repository), когда у тебя отдельно есть структура User и отдельно UserRepositoryInterface с теми самыми методами работы с базой.
938 1502800
>>502793

>мимо-ещё-анон



В треде человек 30 сидит, судя по всему. (нет)
939 1502840
>>502793
Вобщем цель внедрения интерфейса - скажем так логистическая. Максимум понятности.
Спасибо.
940 1502948
>>502226
>>502225

Бля, я не догоняю. Нашел в комментах нахабре такой код:
https://ideone.com/JXUmbM
код понятен. И общий смысл самой идее кое -как тоже. Но что то в стройную систему не укладывается.
Тоесть я говрю себе - хочу написать свой контейнер зависимостей, и не знаю с чего начать. Какие методы, куда, чего.

Зато я похоже познал дзен необходимости интерфейсов, лол.
941 1503011
>>502948
Про инверсию контроля почитай. Собственно, через контейнеры и реализуется эта инверсия.
942 1503039
>>502948
Это нормально, DI - это как правило самая неочевидная для понимания новичками штука (но очень простая, если разобраться).
В первую очередь, смущает название, оно поначалу слышится противоречивым.

Поэтому, для начала, предлагаю тебе осознать и разобраться концепцию "зависимостей". Кусок кода может зависеть от другого куска кода, как пример:
function greetUser($user) {
print("Hello, $user->name!");
}
В данном примере у тебя функция greetUser зависит от функции print. То есть, на самом деле, задача функции greetUser - приветствовать пользователя. Что значит, приветствовать? Показывать ему сообщение "Hello, {username}!". Но вместо этого, функция greetUser наследует логику функции print, печати в консоль. То есть, казалось бы, мы писали абстрактную функцию "приветствуй юзера", а в итоге написали "приветствуй юзера в консоли".
Это и называется зависимостью, функции и классы, напрямую вызывающие другие функции либо классы, наследуют особенности реализации этих вызываемых классов.

Теперь давай это исправим:
function greetUser($user, MessengerInterface $messender) {
$messender->show("Hello, $user->name!");
}

Теперь greetUser выполняет свою задачу, показывает юзеру сообщение, не важно, каким путём. За это пусть отвечает кто-то другой, кто передаст нужный $messender.
В этом и заключается инверсия контроля.

Теперь про инъекции. Каждый раз передавать $messender в эту функцию звучит неудобно, нам бы хотелось сказать "используй вот такой вот MessengerInterface".
Соответственно, мы делаем следующее:

class Greeter {
protected $messenger;

function __construct(MessengerInterface $messender) {
$this->messenger = $messenger;
}

function greetUser($user) {
$this->messender->show("Hello, $user->name!");
}
}

Обрати внимание на конструктор и поле messenger у класса greeter. Я встроил отдельный messenger в greeter, чтобы greeter не зависел от конкретного мессенджера. Как я это сделал? Я вставил (сделал инъекцию) messenger'а в greeter через конструктор.

Как-то так.
942 1503039
>>502948
Это нормально, DI - это как правило самая неочевидная для понимания новичками штука (но очень простая, если разобраться).
В первую очередь, смущает название, оно поначалу слышится противоречивым.

Поэтому, для начала, предлагаю тебе осознать и разобраться концепцию "зависимостей". Кусок кода может зависеть от другого куска кода, как пример:
function greetUser($user) {
print("Hello, $user->name!");
}
В данном примере у тебя функция greetUser зависит от функции print. То есть, на самом деле, задача функции greetUser - приветствовать пользователя. Что значит, приветствовать? Показывать ему сообщение "Hello, {username}!". Но вместо этого, функция greetUser наследует логику функции print, печати в консоль. То есть, казалось бы, мы писали абстрактную функцию "приветствуй юзера", а в итоге написали "приветствуй юзера в консоли".
Это и называется зависимостью, функции и классы, напрямую вызывающие другие функции либо классы, наследуют особенности реализации этих вызываемых классов.

Теперь давай это исправим:
function greetUser($user, MessengerInterface $messender) {
$messender->show("Hello, $user->name!");
}

Теперь greetUser выполняет свою задачу, показывает юзеру сообщение, не важно, каким путём. За это пусть отвечает кто-то другой, кто передаст нужный $messender.
В этом и заключается инверсия контроля.

Теперь про инъекции. Каждый раз передавать $messender в эту функцию звучит неудобно, нам бы хотелось сказать "используй вот такой вот MessengerInterface".
Соответственно, мы делаем следующее:

class Greeter {
protected $messenger;

function __construct(MessengerInterface $messender) {
$this->messenger = $messenger;
}

function greetUser($user) {
$this->messender->show("Hello, $user->name!");
}
}

Обрати внимание на конструктор и поле messenger у класса greeter. Я встроил отдельный messenger в greeter, чтобы greeter не зависел от конкретного мессенджера. Как я это сделал? Я вставил (сделал инъекцию) messenger'а в greeter через конструктор.

Как-то так.
SAGE 943 1503076
>>502788

>Тут выше в треде был хуепутел, который вместо помощи всех критиковал.


Ни одного не увидел.
Если я сейчас начну ныть что у меня якобы не получается что то (присвоить значение переменной, например). То я буду рад, даже если мне скинут где почитать об этом (но при этом первая же ссылка в гугле дает мне правильный ответ) . Ведь это элементарный синтаксис языка, по которому есть огромнейшее кол-во уроков/книг/статей/мануалов. Даже в гайде ОПа есть, нормально обьяснено, даже стрелочки вроде нарисованы (есть и примеры). А хуесос этот местный, который якобы откуда то еще и "перекатился", не то что загуглить не способен, так еще и права качает когда ему ссылки на информацию кидают, мол обьясните мне все на пальцах, я же дохуя важный. С каких пор тред помощи новичкам стал тредом обсасывания идиотов? Я уважаю опа за его подход и помощь, но когда люди на шею садятся, свешивают ножки, да еще и ведут себя по свински - это перебор. Одно дело когда человек чего то не понимает, а другое дело когда считает что ему все должны, и даже пальцем не пошевелит чтобы свою проблему решить.
Мразь эта весь тред засрала своей кодировкой, хотя ему в самом же начале скинули ссылку на статью из 3 абзацев, где эта проблема полностью расписывается в первом же. Но мы ее даже смотреть не будем, нахуя? Мы лучше продолжим ныть и обижаться на всех, пока нам код готовый не принесут.
Решилась одна проблема - появилась еще более элементарная, извлечь сука элемент из массива. Ну ахуеть блядь). Ему и тут ссылку на статью скинули, расписали как размышлять в случае этой проблемы. Но нет, нахуй. Нам опять готовый код подавай,
Не удивлюсь, если в скором времени появятся вопросы "парни обьясните на пальцах как ифы работают, я просто с JS перекатился, ах да, и ну и циклы тоже, пожалуйста. Но если не сложно, распишите еще что там по переменным у вас?"
944 1503101
А есть что-нибудь почитать для не совсем ньюфагов? Нюансы какие-нибудь, хорошие практики, вот такое всё.
945 1503127
>>503076
Зачем ты ответил, сейчас этот шизик снова вылезет.
946 1503151
>>503076

>появилась еще более элементарная, извлечь сука элемент из массива.


Ток шо придумал? Тоже тред жопой читаешь?

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


Я эту ссылку открыл из книги опа и прочитал её ещё до того, как её скинули тут. Всё что в ссылке было - это пояснение за то, что strlen не работает и надо использовать mb_strlen. я каждую ссылку с книги опа открывал

Какова тебе моя сперма на вкус, анусоглазый?
947 1503162
>>503127
Удвою. Он уже вылез.
Просто игнорьте инфантила - он тред скатывает в срач.
948 1503174
>>503162

>скатывает


Я отвечаю, это вы скатываете.
SAGE 949 1503182
>>503151
Проиграл чет.
Таблетки принять забыл? Как примешь - пролистай тред вверх колесиком мышки, либо скроллбаром справа заранее расписал как, чтобы вопросов не возникало и посмотри что ты высирал и спрашивал. А то выходит что все хуесосы, а я Дартаньян

>>501384
>>501397
>>501429
>>501434
4 вопроса "почему же так происходит" за 4 часа. Видимо после 1 вопроса ты подумал "ХУЛИ МНЕ НЕ ОТВЕЧАЮТ ТО ЕПТА???" и принялся ебашить до талого, пока не ответят

>>501465 - ОТВЕТ, ССЫЛКА НА ПАСТУ

>>501471
>>501619
>>501636
>>501645
>>501646
(еще ноем и флудим)

>>501647 - дали код с латиницей, подчеркнув что для решения на кирилице нужно использовать подход с пасты которую кинули 6 постов твоего нытья выше. И даже скинули абзац с той пасты.

>>501651 - ты до сих пор не прочитал что тебе кидают

>>501655 - тебе уже кинули конекретное предложение из пасты

Ура, первый вопрос решен. Итого ты засрал тред ~10 постами нытья, вместо того чтобы прочитать то что тебе кидали

Дальше с вопросом про массив уже пошло полнейшее свинство и тупизм. Того что я выше расписал - вполне достаточно чтобы носом тебя в твои ссаки тыкнуть
SAGE 949 1503182
>>503151
Проиграл чет.
Таблетки принять забыл? Как примешь - пролистай тред вверх колесиком мышки, либо скроллбаром справа заранее расписал как, чтобы вопросов не возникало и посмотри что ты высирал и спрашивал. А то выходит что все хуесосы, а я Дартаньян

>>501384
>>501397
>>501429
>>501434
4 вопроса "почему же так происходит" за 4 часа. Видимо после 1 вопроса ты подумал "ХУЛИ МНЕ НЕ ОТВЕЧАЮТ ТО ЕПТА???" и принялся ебашить до талого, пока не ответят

>>501465 - ОТВЕТ, ССЫЛКА НА ПАСТУ

>>501471
>>501619
>>501636
>>501645
>>501646
(еще ноем и флудим)

>>501647 - дали код с латиницей, подчеркнув что для решения на кирилице нужно использовать подход с пасты которую кинули 6 постов твоего нытья выше. И даже скинули абзац с той пасты.

>>501651 - ты до сих пор не прочитал что тебе кидают

>>501655 - тебе уже кинули конекретное предложение из пасты

Ура, первый вопрос решен. Итого ты засрал тред ~10 постами нытья, вместо того чтобы прочитать то что тебе кидали

Дальше с вопросом про массив уже пошло полнейшее свинство и тупизм. Того что я выше расписал - вполне достаточно чтобы носом тебя в твои ссаки тыкнуть
950 1503313
театр одного семена я смотрю тут у нас
951 1503320
>>503182

>4 вопроса "почему же так происходит" за 4 часа. Видимо после 1 вопроса ты подумал "ХУЛИ МНЕ НЕ ОТВЕЧАЮТ ТО ЕПТА???" и принялся ебашить до талого, пока не ответят


Я сам додумывался до чего-то и апдейтил свой вопрос в связи с этим.

>>501465
И этот ответ не подходил к моей проблемы и я уже говорил, что читал это по ссылке из пхпбука >>503151

>(еще ноем и флудим)


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

>>>1501647 - дали код с латиницей, подчеркнув что для решения на кирилице нужно использовать подход с пасты которую кинули 6 постов твоего нытья выше. И даже скинули абзац с той пасты.


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

>>>1501655 - тебе уже кинули конекретное предложение из пасты


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

Ну и кто теперь в ссаках?
Продолжишь дальше срачь или с тебя хватит, петушок косоглазый?
952 1503322
Алсо, захочу - ещё одно сообщение напишу. Ну шо, порвалась жопа?
953 1503340
>>503320
Мы перезвоним когда вам исполнится 16.
954 1503415
дайте плиз ссылку на урок по DI
955 1503418
>>503039
Стало яснее, спасибо.
Ну а контейнер зависимостей это в твоем случае все тот же Greeter ,
только с свойством в котором в массиве хранятся разные инекцированные классы, ну методы get/set и так далее?
956 1503519
>>503418
Не чувак, Greeter это обычный класс, с одной зависимостью в конструкторе. В нём показан принцип внедрения зависимостей, хотя ты можешь руками в конструкторе сам написать $this->messenger = new ConcreteMessenger(); но через интерфейс ты можешь подменять имплементации.
Контейнер это тоже просто класс, он обычно так и называется Container, он умеет создавать объекты и хранит ссылки на них, создавать их он может или тупо как ты ему скажешь, или сам будет думать через рефлексию. Конечно, если зависимость это просто например $somevar без тайпхинта и дефолтного значения, то он не сможет её создать, если ему не сказать что туда запихать. Разные реализации контейнеров позволяют биндить к конкретным сервисам конкретные данные, позволяют биндить конкретные имплементации интерфейсов, самая удобная фича это конечно автовайринг, ты просишь у контейнера создать какой-то сервис, и он его сам создает, при этом ты можешь не говорить ему как это сделать. Если что-то сложное прям ваще нужно создать, то это обычно реализуется через анонимную функцию, которая аргументом принимает контейнер(для того чтобы ты мог получить нужные зависимости, если они есть), и возвращает новый объект. Контейнер эту функцию сам вызовет когда ему понадобится этот сервис создать.

Если сейчас что-то не понятно мол зачем это нужно или зачем переусложнять, то это только из-за того что тебе пока такое не понадобилось для решения твоих проблем, со временем всё станет ясно.
957 1503599
>>503418
Как тебе написал анон в соседнем посте, Greeter - это просто класс с зависимостью, он ничего про контейнеры не знает.
Собственно, контейнеры - не обязательны, ты можешь руками строить дерево зависимостей при запуске программы (в том же go так и делают):
function RunApp($config) {
$db = new Database($config->db);
$serviceA = new ServiceA($db);
$serviceB = new ServiceB($db);
$endpointFoo = new EndpointFoo($serviceA, $serviceB);
// и так далее;
return new App($endpointFoo, ..., ..., ...);
}

Контейнер просто облегчает это дело, самостоятельно подсовывая одни объекты в другие по необходимости.
Ты описываешь условно $container->register('serviceA', function($container) {
return new ServiceA($container->get('db'));
});
для каждого сервиса и потом просто по ключу можешь получать уже инициализированные зависимости.
958 1503645
>>502368
Мне кажется продажником больший интерес и профит быть, конечно если развиваться, а не смазки для пинусов по телефону продавать.
959 1503690
Аноны, поясните тупому где для eloquent illuminate/database": "^6.1", документация по редактированнию таблиц (добавить/удалить поле, менять названия полей).
Короче как эта ORM куфлизует sql DDL?
Где почитать, в англ. доке я фигу вижу.
960 1503693
>>503690

>>Короче как эта ORM куфлизует sql DDL?


реализует
самофикс.

>>503645
Личность > навыка. А "вкат в ойти" это последняя надежда неудачничков. Типа вот я выучу, и добрый дядя возмет меня джуном на 100к в сек, и всему научит. Но так как человек до начала вката жил овощем, то и вкатывается он годами.
961 1503705
>>503690
Чет не могу понять, в ранних версиях eloquent был Schema Builder.
В последних в документаци он не упоминается.
И что вместо него?
963 1503752
какие недостатки у ларки?
964 1503803
>>503717
Подскажи такую вещь, если сможешь.
роутер у меня slim.
Я тут сплетаюсь в объятьях братских с cartalyst/sentinel и eloquent соответственно. побочная задача - чуть подредактировать стандартную в cartalyst/sentinel таблицу user.
А основная - ебать себе мозг.
Вот ссылка на ideone
https://ideone.com/fdGXy8

Я буквально первый день с этим всем ковыряюсь. Так что вопрос возможно совсем нубский.
965 1503846
>>503803
п.с.
поидее я подклчюение как то из capsule вернуть могу, но пока не ясно как
966 1503853
>>503803
Никогда под ларавел не писал, но подозреваю, что Schema получится дернуть только из консольных методов. Почитай внимательней про миграции.
По поводу "что еще за foo" вот из доки:
The name passed to the connection method should correspond to one of the connections listed in your config/database.php configuration file
967 1503863
>>503853
Я читал доку. И поэтому и закис, потому что у меня slim приложение, и eloquent установлен отдельно т.е. "config/database.php" у меня не существует. Так еще и сам конфиг какой то мозговыносящий.
Соединение устанавливает capsule, и я хз как это под капотом. Пока что я туповат понять.
755 - 967 968 1504307
На всякий случай обновил урок про строки в utf-8: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

Напишите, если что-то непонятно.

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

>>503863

Исходники можно попробовать почитать. ORM вообще обычно предназначен для загрузки/изменения данных, а структуру таблиц создают через миграции, а не через ORM. Хотя, например, та же Доктрина умеет по коду сущностей генерировать миграцю для создания таблицы с ними, может и тут так же можно?

>>503418

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

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

https://github.com/codedokode/pasta/blob/master/arch/di.md

>>502257

Совсем простых нет, сложные можно поискать поиском по словам PHP ORM.

>>501758

В JS нет встроенной функции, аналогичной array_rand.

Также, там почему-то в нескольких постах подряд пишут $name($key), но надо писать $name[$key].

В JS та же проблема со строками, хоть и менее явная, строки там в utf-16 (вместо utf-8 в PHP) и 1 символ эмодзи считается яваскриптом как "два" символа из суррогатной пары.

>>501384

Наверно поздно писать, но array_flip меняет местами ключи и значения, а тебе нужен array_reverse.
970 1504313
>>501380

Перечитай пожалуйста пост >>501352 внимательно. Там дано два варианта решения: утверждения (не захватывать двоеточия), либо разбить строку на массив по двоеточию. Опять же, если тебе при разбиении хочется сохранить двоеточия, можно использовать preg_split с регуляркой из утвреждений или же дописать их как-то вручную после разбиения или написать свою функцию разбиения.

>>500881

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

>>500274

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

Там достаточно простейшего JS:

- добавление вопроса - добавление блока в форму
- добавление варианта ответа - то же самое
- смена типа вопроса - просто меняем на блоке класс и часть полей в нем меняет видимость с помощью CSS
- упорядочивание вопросов - делаем в вопросе скрытое поле с порядковым номером и обновляем номера при перетаскивании

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

jQuery хватит с головой.
bug-9.png197 Кб, 363x557
971 1504314
Кто тут может решить гуглокапчу на пике? Не могу запостить ответ.

>>500114

У тебя после закрывающего тега ?> ничего нету? Если есть, то можно убрать это вместе с закрывающим тегом.

>>499817

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

>>499795

Это задача из учебника в ОП-посте, в разделе про ООП. ООП-гостиница тут: https://phpclub.tech/pr/res/1082507.html#1097078
972 1504693
>>503101
Удвою вопрос.
973 1504791
>>504693
Гитхаб любимых библиотек.
974 1504872
Насколько сложно сделать облачное хранилище на php ? Да и вообще насколько это сложно
975 1505000
Если мы обновляем какие то данные, то как будет правильней. Сначала проверить, изменены ли эти данные - которые изменены обновить, или тупо все инпуты обновить не парясь, даже если они не были изменены? Стоит ли беспокоиться о производительности и секундах/нагрузка на сервер, или чаще всего делать просто как будет быстрее? И правильно ли я понимаю, что выгодней хранить как можно больше данных в БД, чем вычислять их? И что дисковое пространство вообще не так ценно?

Сейчас подумал, ведь для того чтобы проверить изменялись ли данные - их нужно сначала с БД извлвечь, думаю быстрее будет просто обновить. Вопрос оказался тупым. Но на счет производительности вопрос еще остался.
Снимок (9).png14 Кб, 567x317
976 1505124
Мне кинули вот такое т/з. КРУД с использованием GraphQL, данные хранить в MySQL. CRUD реализовать через Синглтон. Причём на это выделен типа один час.
То есть задание очевидно абсурдно.

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

> Тогда возвращаемся к GraphQL. GraphQL это язык запроса данных. Я только что специально проверил, что в MySQL нет этого языка как альтернативы SQL'ю. Так что у меня вопрос: между чем и чем должен стоять GraphQL, если схема там Web-морда <-> PHP <-> MySQL? Я бы в теории мог предположить, что между мордой и PHP, но это не имеет смысла, потому что морда будет общаться с PHP через POST-запросы, так как SPA в задании не оговорено вообще.


>


> Дальше: Синглтон это паттерн (на самом деле антипаттерн) на состояние объекта. CRUD это описание таска: create-read-update-delete. Сказать "сделать CRUD через Синглтон" это тоже самое как "поменять дверь в прихожей через красиво написанное эссе".


>


> Дальше, даже если убрать всю эту ерунду, то это задание минимум часа на 4. Никакого "одного часа" здесь нет в принципе. Я не против теста на 4 часа, но сроки — абсурд.


> Возможно, задание на смекалку — найти в нём абсурд. Ну тогда считайте что я его только что сдал: GraphQL как ненужный элемент, Синглтон как какая-то ересь, и один час на задание как доведение сроков таска до абсурда



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

Теперь вопрос: что это за задание такое, и как они видят его выполнение? Сразу говорю, компания очень большая и старая, давно и успешно функционирует, о ней только хорошие отзывы работников. Я потому и подумал, что здесь надо двуслойную выкупить, потому что это большая компания, у них цена ошибки огромная, и они явно не хотят набрать какое-то говно.
977 1505145
>>505124

Такие вопросы надо задавать тому, кто поставил задачу. Ты же хочешь, чтобы мы прочли его/её мысли и ответили тебе.

Если задача неясно сформулирована, то. конечно, можно попросить уточнения. Вот, например, что мне кажется неясным:

- "создать CRUD" - что имеется в виду? Что будет результатом выполнения задания? Класс, реализующий методы для работы с данными, или веб-приложение с интерфейсом, авторизацией итд? Или сервер с API?

- "с использованием GraphQL" - где должен использоваться этот язык запросов? В API между клиентом и сервером? Или внутри в коде? Если почитать определение GraphQL, то это просто язык запросов:

> GraphQL is a query language for your API, and a server-side runtime for executing queries by using a type system you define for your data. GraphQL isn't tied to any specific database or storage engine and is instead backed by your existing code and data.



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

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

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

Также, стиль твоего ответа не очень соответствует нормам деловой переписки. Не надо гадать о том, чего ты точно не знаешь, не надо лишних эмоций, не надо обвинительного тона. Лучше было бы писать в стиле "К сожалению, на мой взгляд, задание сформулировано недостаточно ясно... ".
978 1505154
>>505145
Ну то есть это не я умом тронулся. Окей, благодарю
979 1505259
>>505124
Просто вакансия не твоего уровня, ищи другие
скринн.JPG100 Кб, 554x919
980 1505377
>>475112 (OP)
Пытаюсь задеплоить Laravel app на ec2 (амазоновская виртуалка Ubuntu, доступ через SSH)

Делаю по гайду https://www.interserver.net/tips/kb/deploy-laravel-project-apache-ubuntu/

Вместо рабочего сайта вылетает пикрил. Исходный пример apache работал.

На своём компе всё работает как надо (просто копирую в папку xammp/htdocs и запускаю Apache)

Уже заливал таким же образом нодовское приложение, так что проблема либо в php, либо в пакетах, которые цепляются через composer
981 1505458
>>505000
Допустим, я хочу редактировать Тест с задачи ОПа про тестхаб. Как это правильней сделать? Сначала хотел их именно что обновалять. Но сейчас прише к варианту просто обновить сам тест и его теги. А вопросы с ответами все удалить и добавить по новой. Какие подводные в этом?
982 1505526
>>505458

Поменяются id вопросов и все старые решения теста сломаются.
983 1505561
>>505526
Выходит нужно весь тест по новой создавать? И каким нибудь ключем связывать все версии тестов? ибо если перезапишу текущие вопросы, то после их обновления какие то могут быть удалены, какие то добавлены. В таком случае старые результаты как показывать?
984 1505844
>>505561
Что то я совсем запутался и не знаю что делать. Как мне сохранять результаты тестов (список всех вопросов и ответов), если эти самые вопросы и ответы могут меняться? Пока что есть вариант при изменении теста, юзерам которые его прошли будет приходить уведомление, мол "тест был изменен, вы можете пройти его снова". А в результатах выводить только кол-во набраных баллов и правильных ответов.
Стикер512x512
985 1506010
972 - 985, 235 - 267, 84 - 189 986 1506925
>>505844

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

Вот какие есть варианты:

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

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

Организовать хранение версий стоит с учетом принципов нормализации. Например, сделать связанные таблицы "тесты" и "версии тестов".

>>505000

> Стоит ли беспокоиться о производительности и секундах/нагрузка на сервер, или чаще всего делать просто как будет быстрее?



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

> Если мы обновляем какие то данные, то как будет правильней. Сначала проверить, изменены ли эти данные - которые изменены обновить, или тупо все инпуты обновить не парясь, даже если они не были изменены?



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

> И правильно ли я понимаю, что выгодней хранить как можно больше данных в БД, чем вычислять их?



Не всегда. Это зависит от того, насколько сложно вычислить недостающие данные и насколько часто они нужны.

> И что дисковое пространство вообще не так ценно?



Не так ценно.

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



Там скорее всего не такие объемы данных, чтобы была заметная разница. Можешь сделать микробенчмарк и проверить.
972 - 985, 235 - 267, 84 - 189 986 1506925
>>505844

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

Вот какие есть варианты:

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

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

Организовать хранение версий стоит с учетом принципов нормализации. Например, сделать связанные таблицы "тесты" и "версии тестов".

>>505000

> Стоит ли беспокоиться о производительности и секундах/нагрузка на сервер, или чаще всего делать просто как будет быстрее?



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

> Если мы обновляем какие то данные, то как будет правильней. Сначала проверить, изменены ли эти данные - которые изменены обновить, или тупо все инпуты обновить не парясь, даже если они не были изменены?



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

> И правильно ли я понимаю, что выгодней хранить как можно больше данных в БД, чем вычислять их?



Не всегда. Это зависит от того, насколько сложно вычислить недостающие данные и насколько часто они нужны.

> И что дисковое пространство вообще не так ценно?



Не так ценно.

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



Там скорее всего не такие объемы данных, чтобы была заметная разница. Можешь сделать микробенчмарк и проверить.
987 1506927
>>505377

Если у тебя выводится исходный текст PHP-файла, значит Апач не "понимает", что PHP файлы надо выполнять с помощью интерпретатора PHP и ты что-то забыл настроить. Должен быть модуль Апача mod_php (или модуль для FCGI, если ты используешь php-fpm), и должны быть директивы для его использования в конфиге Апача.

>>504872

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

>>503101

- phptherightway
- еженедельный PHP-дайджест на Хабре
- изучай linux
- изучай другие языки

Обычно нет смысла просто учить все подряд. Если тебе интересна какая-то вещь, или если тебе дают новую задачу, то ты гуглишь, узнаешь что-то новое.
988 1506928
>>487334
>>487333

Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить

header("Content-Type: text/plain; charset=utf-8");

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

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

>>487190

В простом варианте решения ты просто копипастишь код:

сгенерировать первое слово из первого массива;
сгенерировать второе слово из второго массива;
....

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

шаблон = [
[массив вариантов для первого слова],
[варианты для второго слова],
....
];

Для (каждого списка из шаблона) {
слово = выбрать одно слово из списка;
вывести слово;
}

Логика понятна? Там потом надо будет еще добавить переводы строк и пробелы, но это уже не так сложно.
988 1506928
>>487334
>>487333

Чтобы переносы строк нормально работали и в браузере и в ideone (и в консоли), можно использовать для этого \n, а в начале программы поставить

header("Content-Type: text/plain; charset=utf-8");

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

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

>>487190

В простом варианте решения ты просто копипастишь код:

сгенерировать первое слово из первого массива;
сгенерировать второе слово из второго массива;
....

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

шаблон = [
[массив вариантов для первого слова],
[варианты для второго слова],
....
];

Для (каждого списка из шаблона) {
слово = выбрать одно слово из списка;
вывести слово;
}

Логика понятна? Там потом надо будет еще добавить переводы строк и пробелы, но это уже не так сложно.
989 1506929
>>486879

Ищи по словам wysiwyg editor, они обычно на JS и не привязаны к какому-то серверному языку.

>>482808

Надо разбираться. Начать можно с изучения логов php-fpm или Апача, смотря что ты используешь.

>>480499

Можно сделать проверку кода возврата после exec, так как может произойти ошибка, может нет такой программы итд. Ну и работает это в пределах одной подсети.

>>482633

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

>>481649

Функция с очевидным названием: https://www.php.net/manual/en/function.iterator-to-array.php

>>479893

Она наверно делается в виде вызова openoffice, или какой-то другой линуксовой утилиты? Тогда это не очень сложно.
990 1506930
>>478771

Поставить на страницу невидимый тег audio и яваскриптом запускать проигрывание.

>>475161

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

>>1461363


>>475571

> А как составлять URL на основе идентификатора?


> Изначально я хотел чтобы URL хранил в себе относительную ссылку от сервера, а в клиенте (то есть в html версии где строится ссылка), если меняется адрес хранилища, просто менять адрес хранилища в ссылках.



Да, это один из вариантов, хранить в БД относительный путь вроде '2019-06-01/file123.jpg' и из него формировать полную ссылку.

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



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

> Лучше сразу на будущее делать таблицу, или можно оставить просто?



Не надо делать то, что сейчас не требуется.

> А если пользователей миллионы, это не будет времяёмкой задачей? Как обычно поступают в таких ситуациях?



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

> В случае conference_reference:


> "user" - это пользователь которому принадлежит ссылка на конференцию


> В случае с participant:


> "user" - это конкретный получатель в конференции


> То есть, пользователь может удалить свою ссылку на конференцию, но всё равно оставаться получателем и получать уведомления.



Это выглядит как-то запутанно. Видимо, тут речь о том, что пользователь может вступить в конференцию, отправить в нее сообщение, выйти из нее, удалить conference_reference, а сообщение и его автор должны остаться? Не проще ли в таком случае вместо удаления записи просто сделать soft delete (флаг, показывающий, что запись удалена и конференция невидима в списке контактов)?

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

> Таблица собеседников нужна для хранения всех собеседников в той или иной конференции.



А список участников нельзя получить из conference_reference по id конференции?
990 1506930
>>478771

Поставить на страницу невидимый тег audio и яваскриптом запускать проигрывание.

>>475161

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

>>1461363


>>475571

> А как составлять URL на основе идентификатора?


> Изначально я хотел чтобы URL хранил в себе относительную ссылку от сервера, а в клиенте (то есть в html версии где строится ссылка), если меняется адрес хранилища, просто менять адрес хранилища в ссылках.



Да, это один из вариантов, хранить в БД относительный путь вроде '2019-06-01/file123.jpg' и из него формировать полную ссылку.

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



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

> Лучше сразу на будущее делать таблицу, или можно оставить просто?



Не надо делать то, что сейчас не требуется.

> А если пользователей миллионы, это не будет времяёмкой задачей? Как обычно поступают в таких ситуациях?



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

> В случае conference_reference:


> "user" - это пользователь которому принадлежит ссылка на конференцию


> В случае с participant:


> "user" - это конкретный получатель в конференции


> То есть, пользователь может удалить свою ссылку на конференцию, но всё равно оставаться получателем и получать уведомления.



Это выглядит как-то запутанно. Видимо, тут речь о том, что пользователь может вступить в конференцию, отправить в нее сообщение, выйти из нее, удалить conference_reference, а сообщение и его автор должны остаться? Не проще ли в таком случае вместо удаления записи просто сделать soft delete (флаг, показывающий, что запись удалена и конференция невидима в списке контактов)?

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

> Таблица собеседников нужна для хранения всех собеседников в той или иной конференции.



А список участников нельзя получить из conference_reference по id конференции?
991 1506937
ОП, что можешь о JQuery сказать? Много читал что это устаревающая либа, и это все уже реализовано в фреймворках. Есть ли смысл углубляться или же лучше использовать вышеупомянутые фреймворки?

И еще волнует вопрос о отличия СУБД. Вот есть MySQL, PgSQL, sqlite. Они ведь все похожи, заметил лишь что у MySQL и PgSQL есть некие различия в типах данных (например, в pgsql нет unsigned integer и т.д). Это ли их основная разница? Или я ее не почувствую, пока не буду участвовать в разработке крупного проекта?
992 1506988
>>506937
Я не оп, но:

> что можешь о JQuery сказать?


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

> И еще волнует вопрос о отличия СУБД. Вот есть MySQL, PgSQL, sqlite.


У них немного разный синтаксис, разный набор внутренних инструментов и подсистем, разные архитектуры и разные экосистемы.
По сути, это три разные программы, авторы которых договорились о том, что будут поддерживать ряд общих вещей более или менее одинаковыми (типа основ синтаксиса).
Соответственно, умея работать хотя бы на уровне основ с одной из них, ты довольно быстро сможешь повторить то же самое на других. Понятно, что чем глубже в лес, тем толще партизаны, начинают проявляться особенности и всё такое - но за мою практику даже крупным проектам очень редко требовалась вся специфика.
Я бы рекомендовал взять одну из них (постгрес вроде самый популярный сейчас) и делать всё на ней. Ну и почитать потом статьи про разницу между движками, чтобы иметь общее представление о возможностях и +/-.
993 1507014
>>506988

>Имеет смысл потыкать, чтобы иметь представление, о чём это.


Ну я статью на хабре пролистал...
А так еще с задачи про файлообменник учу vue.js который с ларавелем идет. Пока что полет нормальный, хотя мне пока не требовалось делать js анимации аля "выпад окошечка справа". Просто не вижу необходимости, vue мне только для создания динамических компонентов нужен и работой с сервером. Даже от форм отказался - почти все ajax запросами отсылаю. Я на верном пути или лезу не туда? А за jquery спросил потому что во многих вакансиях указан именно он. Не могу понять почему. Вообще у меня страх, что даже если возьмут на работу - то придется работать на старых технологиях и я к этому привыкну.

>У них немного разный синтаксис, разный набор внутренних инструментов и подсистем, разные архитектуры и разные экосистемы.


Я просто решил попробовать PostgreSQL, и все что мне потребовалось это только по другому подключить его в конфиге проекта, ну и про основные типа данных чуть чуть загуглить. И все работает так же, как и в MySQL
994 1507046
>>483535
во сколько лет начал и сколько сейчас?
995 1507116
>>475112 (OP)
Как принято заливать на сервак пароли от БД и SSL (.key и .crt)? Удобнее всего вместе со всем проектом через git, но только если сайт лежит в приватном репозитории.

Хостинг на ec2 (Ubuntu). Доступ через терминал.
996 1507189
>>507014

> А за jquery спросил потому что во многих вакансиях указан именно он.


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

> И все работает так же, как и в MySQL


Как только столкнёшься с constraint'ами, то тут же начнётся разница (в mysql их по сути нет).
Ну и да, если речь про продакшен-проект, то там с postgres всё немного сложнее, нужно уметь его конфигурировать. Тогда как mysql можно поставить и он, в-принципе, нормально работает.
997 1507190
>>507116
Пароли и сертификаты - это секреты, их нельзя держать под гитом, потому что иначе все разработчики будут иметь к ним доступ (а на проектах сложнее сайта-визитки обычных разработчиков в потроха продакшен-серверов не пускают, чтобы не утянули базу пользователей, их кредитки и всё такое).
Для этого или подкладываются руками (на проектах поменьше) или используется хранилище секретов типа vault (на проектах побольше).
998 1507225
Господа, я негодую.
Ну почему в стандарте анонимные функции называются замыканием, а не как везде нормально - лямбдаэто такой крик в небеса.
Я читал почему это так произошло, но блин, какая же это печаль
999 1507242
>>507225
Тащемта лямбды и замыкания - это разные вещи, не смешивай их. Всё правильно называется.
1000 1507258
>>507242
Ты уверен что ты правильно понял то что я написал?
1001 1507260
>>507258
Всё правильно тебе написали - лямбда и замыкание это разные вещи.
1002 1507264
>>507258
Ну, с точки зрения внутренностей php, анонимная функция - это замыкание с нулевым контекстом, то есть каждая анонимная функция является замыканием (экземпляром класса "замыкание"). Что тебе не нравится?
1003 1507324
>>507264
То что замыкание - это скажем так особенность работы анонимной функции, эффект. Анонимные функции обычно называются Лямбда-функциями.
На мой взгляд лямбда логичне, но в принципе ни твое ни мое мнеие по этому вопросу не важно.

Собственно думаю смысла тему развивать нет.
1004 1507338
>>507324
Нет никаких лямбда-функций, есть лямбда-выражения. Анонимные функции, замыкания и лямбда-выражения три разные вещи, что там логичнее на твой взгляд никого не интересует, можешь хоть самолет трамваем звать.
https://tkacz.pro/php-anonymous-functions-lambdas-and-closures/
1005 1507462
>>507338
Какие же люди аутисты блин.
Это я уже вообще не касаясь вопроса озвученного выше. Думаю тебе остается ток забить.
1006 1507599
Подскажите почему выдает ошибку. https://ideone.com/0Bfp6J
1007 1507633
>>507599

>Call to undefined function padRight()


Функции где?
1008 1507756
>>475112 (OP)

Сап, двач, помоги пожалуйста.

делаю штуку, которая возвращает пути ко всем файлам в заданной папке и подпапках. В процессе нужно заменить слэш на какой-то общий символ, который будет читаться в unix-системах как \, а в окнах как /. Это возможно?
1009 1507825
нахера нужна фактория в ларе?
1010 1507841
>>507825
Гугли паттерн "фабрика"
1011 1507845
>>507756
Ты удивишься, но тебе нужен DIRECTORY_SEPARATOR
1012 1507867
>>507845
Давно уже заметил, что чем меньше загогулина, тем длиннее называется. Что в пхп, что в жс.
1013 1507872
В регулярке есть символ, который бы обозначал обязательное отсутствие символа? Не могу нагуглить
1014 1507903
>>507872
Юзай "{0}", очевидно же
1015 1507908
>>507903
Спасибо!
1016 1507916
Товарищи, ононимусы.

Есть задачка (вернее, ее часть): с помощью кукисов-печенек, мне необходимо запомнить три последник посещенные странички, и вывести их в определенной части сайтика.

Проблема: не могу написать функцию, которая бы добавляла странички в историю посещений, а не переписывала бы ее. Я думал, условно, сделать массив $_COOCKIES['history'], в котором и хранить наименования трех последний посещенных, и при каждом посещении их переписывать, но ничего не получается. Как такие штуки правильно делать?
1017 1508052
>>475112 (OP)
Привет, подскажите как вызвать php функцию при нажатии на кнопку
И так , есть 2 кнопки - googlePlay и appStore, при нажатии на одну из них в бд должна записываться единица, но я не могу понять как вызвать функцию записи без POST или GET запроса, а кнопки как я понял вообще ничего не передают в запрос, кроме его отправки, можно ли как то разрулить без Ajax?
1018 1508110
>>507916
Ну всё правильно, при посещении вычитываешь из куки json, раскодируешь, дописываешь в массив ещё один адрес, кодируешь опять, обновляешь куку. Ну и в случае, если нет куки, то ты этот массив создаешь сам, понятное дело.
Скорее всего ты ошибся на уровне кода.
1019 1508112
>>508052
Внимательнее читай про то, как работает интернет и веб-серверы. Они обмениваются http-запросами, то есть, что кнопка на форме, что js-овый код - они всё равно будут отправлять post/get/put/patch/delete/head/тд-запрос. Вся разница - будет ли перезагружаться страница в браузере или нет (для php-шного кода особенно нет разница, ajax или не ajax, это особенность скорее js-а).

На самом деле, есть ещё способы, можно открыть вебсокет или http2-канал и слать js-ом сообщения, но это сложнее и php это практически не поддерживает, так что пока что считай, что так нельзя.
1020 1508117
>>507916
Попробуй записывать в бд начало сессии >>508112
Благодарствую
1021 1508184
Аноны, подскажите.

Я залил свое приложение на гитхаб, потом склонировал на другой комп.
Выполнил composer install - и все зависимости загрузились.
Но однако мое приложение не заработало - автозагрузчик классов не находил мои классы. Находил отдельные классы типа \Slim\App и некоторых других и все.

Секция autoload в composer.json у меня отсутствовала, я добавил такой код
"autoload":{
"psr-4":{
"": ""
}
}
потому что мне достаточно полного соответствия каталогов с моими классами.
факт это это играло роль

и выполнил composer update и все заработало.

И тут я не понял, вот что делает composer update:

Обновляет ваши зависимости до последних версий и обновляет composer.lock.
Команда update резолвит зависимости чтобы получить самые последние версии зависящих друг от друга пакетов.

Так почему мне эта комманда помогла? И я если четсно не очень понял что делает update.
Если у меня slim 3.9 - то update подтянет все требуемые для моей версии slim , но не выше?
Т.е. если требуется liba1.9 то после install она будет установлена. Но допустим разработчик slim для версии 3.9 посчитает нужным использовать уже liba2.0 , то после update моего приложения - подтянется уже liba2.0, я правильно понял?
1022 1508189
>>508184
п.с.
С проблемой незагрузки классов разобрался, без

"autoload":{
"psr-4":{
"": ""
}
}

автозагрузка не работает. Все изменнеия в compoesr.json нужно "подтверждать" коммандой composer dump-autoload, ну или composer update.

А вот по update подскажите, она обновляет зависимости до максимально nребуемых версий для моих пакетов, или вообще до максимальных версий?
1023 1508192
>>508189
п.с.
И с update я понял уже что к чему
null.png13 Кб, 358x358
1024 1508374
Можете объяснить, что я не так делаю?
Пробовал по разному, но во всех случаях выдаёт NULL, не знаю, где ошибся: https://ideone.com/5mlfK1
1025 1508381
>>508374
Попробую заменить текст на английский и скажи, что изменилось.
1026 1508383
>>508381
Нулл всё равно выдаёт. Проблема не в языке. Я просто чё-т очевидное пропустил и в итоге ничего не работает.
1027 1508392
>>508383
Я сам в пхп только начал вкатываться, но разве там где $add не надо использовать $strlen-1 ?
1028 1508434
>>508392
Нужно, да, но ошибку это не исправит.
1029 1508452
>>508374
Вернуть что-нибудь из функции попробуй для разнообразия.
1030 1508459
>>508452
Я уже пробовал. По отдельности функция внутри работает. Я рил не знаю, шо я нет так делаю. Может я к функции как-то неправильно обращаюсь или ещё что?
1031 1508478
>>508459
А зачем ты используешь var_dump.
1032 1508480
>>508478
Забейте парни.

Я пиздец затупок.
Надо было просто return Добавить, чтоб он значение выводил...
1033 1508482
>>508459
https://ideone.com/dZ7ccA теперь ищи ошибку, из-за которой у тебя не та буква.
1034 1508484
>>508482
Да, уже допердолил сам >>508480
Спасибо!
image.png35 Кб, 1080x458
1035 1508524
Двач, надеюсь на твою помощь. Опыт погромирования - 2 месяца, дальше обучающих задач пока не ушел.

Есть сайт: http://app.echr.coe.int/SOP/

Он по предположительно post-запросу вида "10599/19" выдает информацию о рассмотрении жалобы.

Я курил видео на YouTube, как написать парсер, скачал нужную библиотеку для работы с curl. Направляю post запрос с текстом - в виде ответа получаю код, который ну очень похож на изначальный сайт, а таблицы с информации о движении дела - не получаю. Пробовал делать через сервис https://reqbin.com - результат тот же.

При этом я открыл исходник - вот предположительное место, которые могут принимать текст с формы:
<form name="form1" method="post" action="./index.aspx?lg=en" id="form1">

Как мне оптом отправить 99999 запросов в виде массива значений ["1/99".."99999/19"] и получить ответ в виде текстового или еще лучше excel файла. Капчи нет.
1036 1508548
Пришло интересное задание тестовое , одно из задание было написать стек LIFO без использования массивов или функций работы с массивами соответственно вопрос это возможно ? я так полагаю класс DS\Stack тоже подпадает под запрет
1037 1508551
>>505124
В общем клещами я еле-еле вытащил из них что "c использованием GraphQL". На самом деле это означало: "Создать CRUD для товара в виде GraphQL API (сервера с программным интерфейсом на GraphQL)." И типа вот пример такого решения: https://habr.com/ru/post/328122/
Написал, покрыл тестами (94% строк), отправил. В ответ: "Yii зачем подключили? Задание было сделать на чистом РНР". При этом в тексте задания одна из стёртых строк была "По использованию инструментов ограничений нет".

Как они дефинируют "чистый PHP", и почему использование фреймворка вместо велосипеда это плохо для меня — загадка. Я просто в ахуе. Мне даже страшно предположить что же у них в программном коде происходит, когда у них такое в тестовом задании
1038 1508565
>>508548
https://ideone.com/qLiq5w черезжопное решение за пару минут на коленке.
image.png40 Кб, 850x471
NoLaifer 1039 1508642
правильно ли я понял, что в пыхе нет одномерных массивов?
просто при выводе массива вроде echo "{$matches}";
из :
preg_match_all($regexp,$text,$matches)

компилятор выводит просто array

а вот echo "{$matches[0][0]}"; или "{$matches[1][0]}";вполне то что я и ожидал
1040 1508655
>>508642
Нет, не правильно, нужно писать echo $matches[0] чтобы вывести первый элемент одномерного массива
NoLaifer 1041 1508676
>>508655
>>508655
выводит Array
только что проверил
1043 1508717
Оп, у тебя нет урока о том как написать простенький мидделлвейр? Про DI мне понравился, все по своим местам расставило
1044 1508906
>>508717
Я не оп, но это же паттерн, простая реализация пишется за 5 минут. В том же слиме в документации можно посмотреть, зачем оно надо - а потом заглянуть в код и посмотреть, как сделано.
1045 1508955
>>508906
У меня в slim3 проблема, хлчу сделать следующий мидллвейр - перед всеми обработчиками он проверяет аутентификацию, и если true - то дает доступ к main-страничке приложения, если false - то отправляет на страницу с предложением регистрации/аутентификации.
Пробую поразному, пока что получается какая то хуита.
1046 1508991
>>508955
п.с.
Если конкретнее - в slim мне нужно сделть такой мидлвэйр,
в котором без аутентификации был доступ к нескольким определенным роутам, а к основному функционалу доступ был запрещен.
А если пользователь аутентифицирован - до доступ к риложению у него есть
1047 1509008
>>508991
Ну норм, делай. Только цепляй его не глобально, а к конкретным роутам. В чём конкретно у тебя проблема?
1048 1509085
Ананасы, дело такое.
Есть строка с текста. По ходу текста встречаются ссылки. Мне нужно найти где ссылка начинается и заканчивается, т.е. индексы в тексте.
Как это сделать?
Делаю для себя просмотр в телеге постов вк через telegra.ph для него работает мобильный просмотр, но автоформатирование ссылок там не работает поэтому хочу добавлять их вручную.
1049 1509092
>>509008
У меня какая то залупа получается, я не понимаю как организовать мидлывейр как хочу
Вот ссылка:
https://ideone.com/1JHHIz

Если разбираешься - подскажи как сделать будь добр.

Я полагаю что проще сделать как ты сказал - на каждый роут отдельно вешать мидлвэйр проверки на авторизацию.
Изначально я хочу все в одном мидлвэйре сделать.
Если авторизовано - то пускает везде, а если не авторизован - то только по определенным роутам, их допустим штук пять. Но как так сделать я не догоняю.
1050 1509257
>>508642
одномерные есть
$a = ['a', 'b', 'c', 'd'];

Если сделаешь echo $a[1] - то тебе выведет 'a'
Все дело в том что первый элемент этого массива - строка, и её как раз можно "эхать"

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

Если ты пытаешься сделать echo на переменную сложного типа (объект или массив) то вместо значения ты получишь лишь тип.

>выводит Array



Если хочешь посмотреть что внутри массива то используй var_dump($array);
1051 1509394
>>508565
спасибо анончик совсем забыл про переменные в переменных так как их не использую.
1052 1509408
>>509257
не знаю принято ли здесь это, но
спасибо, анон
2.jpg33 Кб, 531x257
1053 1509443
я разбирал код другого анона, все понял все разобрал, осталось только два вопроса:

что дают собачки в регулярке? $startEndError = ['@^/@', '@/u@'];
то есть я понимаю что это начало и конец, но что делают собачки?без них не работает, это все что я знаю https://ideone.com/OW5uJV

второй вопрос с картинки, [а-я-], как я понимаю черточка здесь вместо буквы ё, а что означает \A и \Z , не нашел их в мануале по пхп

спасибо ОП, я переделал то задание
спасибо, аноны
я вас люблю
1054 1509497
>>509408
Не за что, и там кстати echo $a[1] выведет тебе "b", заметил ошибку только когда постил, но поправляться было лень, странно что за сутки никто не заметил ничего.
1055 1509592
>>509497
да тут в сутки 2,5 человека, хех ну по крайней мере тех кто постит
сам вспоминаю,что массив начинается с нуля, только когда код пишу
а так из головы вылетает
1056 1509626
>>509092
UPD
Очень странная ёдичь у меня возникает. На самом деле тот мидллвейр работает, но если в коде:
$middleware_access_all =
function ($request, $response, $next){
$authorized = true;
......

тут изменить "$authorized = true" на false - то будет все как нужно - со всех страниц кидает на страничку авторизации , но если потом "$authorized = false" снова изментить на true - то происходит хуй, эти изменения не применяются, со всех страничек все так же продолжает бросать на страничку авторизации, хотя по идее должно пускать всюду. И так продолжается до тех пор пока либо историю не очистишь в браузере, или, внезапно, не откроешь консоль разрабочтика в браузере - так сделаешь и все отлично открывается, как нужно.
Браузер берет старую страничку из кэша?
Я изменил, поставил заголовок в шаблоне <meta http-equiv="Cache-Control" content="private">, похоже не помогло
Что за дичь то?
1057 1509879
Я вот перевёл строку 'ya lublu hui' в массив из 3 ключей.
Как мне перевести массив из N ключей в отдельные строки? Например $1 = "ya"; $2 ="lublu"; $2="hui"

Есть ли какая-то встроенная функция для этого?
1058 1509896
Котаны, а как ограничить возможность заходить под одной учеткой с разных компов и браузеров?
У меня так организовано -> пользователь вводит логин/пароль, создается ему сессия, и отправляется кука с айдишником, создается объект юзера.
Проблема в том, что я с другого компа/брузера я могу зайти под той же учеткой, естественно сессия будет уже другая и кука тоже другая.
Как такое фиксить и где почитать?
Добавить в сессию данные юзера, его айпишник и если не совпадает - выкидывать сообщение о том что пользователь уже в системе?
1060 1509908
>>509905
Спасибо, ща гляну!
1061 1509910
>>509896
Разумеется. Сессии должны храниться в бд, вместе с айдишниками юзеров и прочим фаршем. Так можно ограничивать число сессий и всё такое.
Обычно пользователя только не ограничивают, а разлогинивают на всех прочих устройствах (трут все сессии кроме новой). И даже это стоит делать осторожно, потому что нет ничего плохого в одновременных сессиях.
1062 1509915
>>509910
Я юзаю для аутентификации cartalyst/sentinel.
Он как раз id сессии хранит в БД.
Сейчас буду думать как к нему приделать этот функционал.
5.png8 Кб, 428x189
1063 1510015
Как мне добавлять каждый массив в созданной мною массив до этого в конструкции foeach?

Я знаю как это сделать, если бы это была строка - просто использовал бы '.='.

В данный момент у меня 3 ключа в массиве делятся на 3 массива с множеством ключей. Т.е. в первом массиве ключ 'привет как дела ' превращается в массив с ключами 'привет', 'как' и 'дела'.
После чего он ревёрсится и получается 'дела как ,привет'. И так с тремя массивами.
Я хочу, чтобы он после этого заносил три этих ключа в один массив, чтоб в итоге получился снова массив с тремя массивами и в каждом ревёрснутые ключи.

array_merge работает как надо, но я хз, как именно записать каждое действие аррей мёрджа, чтобы в итоге это вышло три массива в одном.
1064 1510016
Бля, я тупой. Аррей.пуш ведь подойдёт для этого?..
>>510015
1065 1510024
Пардон, у меня вообще в другом проблема.И мне сложно её описать.

Короче, есть три массива
$array = [
[ [0]=>"privet", [1]=> "kak", [2]=>"dela"],
[ [0]=>"vse", [1]=> "horosho", [2]=>""],
[ [0]=>"spasibo", [1]=> "chto", [2]=>"sprosil"],
];
Если я использую имлоуд с символом '?' , то выйдет: privet?kak?dela?vse?horosh?spasibo?chto?sprosil
А мне нужно: privet kak dela?vse horosho?spasibo chto sprosil?

Что мне нужно для этого сделать?
1066 1510034
>>510024
<?php
foreach($array as &$item) {
$item = implode(' ', $item);
}

echo implode('?', $array);

Что то типа этого. За 100% работоспособность кода говорить не могу. Но логика примерно такая. Сначала имплодишь элементы массива ведь каждый элемент - массив а потом и сам массив
1067 1510039
>>510034
Да! Это оно! Спасибо тебе огромное.
Сейчас начал эксперементировать с имплоудом и уже почти вышло. Твой вариант точно должен сработать. Спасибо.
1068 1510281
>>510016
$massivMassivov[] = $oneMoreMassiv;
$massivMassivov[] = $oneMoreMassiv2;
$massivMassivov[] = $oneMoreMassiv3;
1069 1510600
>>509443
буква а и z это регулярное утверждение
собаки не знаю
1070 1510612
Аноны, подскажите пожалуйста.
Я сделал авторизацию, id сессии хранится в базе данных.
Заходит человек - в базу пишется id пользователя, его сессия и время.
Выходит - в базе удаляется запись о сессии пользователя.
Но если человек не выйдет, а просто закроет браузер - сессия автоматически удалится, а вот запись в бд останется.
И возник вопрос - а как php автоматизирует внутренние свои процессы?
Как переодически запускать скрипт для очистки например логов, или какого нибудь старого кэша?
Что бы не я руками запускал скрипт, а он запусклся сам, переодически.
1071 1510617
1072 1510620
>>508374
А что оно тебе должно отобразить?
return-то сделай в конце
1073 1510624
>>508374
https://ideone.com/z8TznE
Дальше сам ебись.
1074 1510695
Ненависть.
Нахуй вообще придуманы эти ORM, eloquent трахает меня в мозг.
Никогда до я так не любил sql
1075 1510747
в чем разница между (?!foo)bar и (?<!foo)bar ?
https://www.php.net/manual/ru/regexp.reference.assertions.php
1076 1510762
Сап аноны. Вообщем то я подошёл к тому, что бы начать изучать фреймворки, и вот вопрос, что же выбрать?В ОП посте указанны yi/symfony, но говорят из за документаций лучше laravel. Так что же выбрать то тогда?
1077 1510765
>>510762
upd:
И стоит ли забыть о open server'e и устанавливать вручную php\mysql\apache и прочее. Я бы не проч пощупать всё вручную, поиграться с настройками и т.д.. Но думаю лучше уж пока учусь посидеть на опен сервере, а потом уже смотреть в сторону "ручной установки"/
1078 1510766
>>510747

! значит "не должно совпадать". < значит lookbehind assertion, проверка справа налево.

Утверждения проверяются так: проверяется, что перед/после текущей позицией есть/нету указанных в них символов.

x (?!foo) bar обозначает: после x не должно идти foo и должно идти bar (утверждение тут излишне и можно было написать просто xbar).

(?<!foo)bar значит перед bar не должно быть foo.

(?<=foo)bar значит перед bar должно быть foo, то есть нужно слово foobar, из которого будет поглощено только bar, так как утверждения не поглощают символы.

Так как утверждения не поглощают символы, их можно писать подряд:

x(?!0)(?!1)(?=\d) - после x не должен быть 0, 1, и должна быть любая цифра (кроме 0 и 1 естественно)

(?<!foo)(?<!bar)(?<=[a-z])x - перед x не должно идти foo или bar (то есть barx не пройдет проверку), но должна идти любая латинская буква.
Снимок.PNG154 Кб, 1904x677
1079 1510811
>>475112 (OP)
Снова вопрос по хостингу на AWS EC2.

На локальной машине нормально работает соединение с БД (mongo).

На хостинге вылетает пикрил (зачем-то обращается к mysql).

В database.php в качестве "дб по умолчанию" прописал mongodb, но не помогло (на локалке всё работало с неверной настройкой!).
1080 1510838
>>510765
бамп вопросу

как-то хотел установить пэхапэ , вместе с опенсервером, но при установке снес PATH, решил на всякий случай вернуть настройки через точку восстановления , так и не решил надо оно или нет
1081 1510841
>>510766
спасибо, Бог Регуляторных Выражений
1082 1510847
>>510838
В треде было обсуждение, почитай где-то выше. Если вкратце, то лично для меня апач с виртуальными хостами на линупсе намного проще перегруженного опенсервера. Но первый раз придётся заморочиться на 1-2 дня, от тебя зависит.
1083 1510958
>>510765
Нет ничего такого в настройке апач+пхп+mysql.
Стоит заморочиться что бы понимать как это работает в общем. Делов на один вечер.

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

Котаны, какие варианты в моем случае? Виртуалкой обойтись? Докер ставить?
1084 1510985
>>510958
Я вагрант использую, это полноценная виртуалка без гуи, то есть запускается первый раз долго(на моем некроноуте до 2 минут может доходить), доступ к виртуалке через ssh, удобно то что есть куча разных готовых боксов (типа как образы в докере), в этих боксах уже всё нужное по установлено. Например, если юзать laravel homestead то там сразу несколько разных версий пхп, все дефолтные sql/nosql бд, даже го есть, удобно свапать версии пхп для разных проектов. Из минусов конкретно у меня нода постоянно срет какие-то ошибки про лок файлов когда делаю npm install, приходиться инсталить из под винды, но т.к. папки на винде и в виртуалке полностью миррорятся то проблем пока что нет. Еще нужно скачать озу, иногда даже 8 бывает маловато.
1085 1511033
>>510958
попробуй и докер и вагрант. А потом уже выбери что тебе ближе. Как по мне вагрант прост в плане понимания, а докер - настройки. Советую начать ковырять последний. Ибо мода сейчас на него.
Минус докера - его только на вин10 про можно поставить. Ну и у меня что дома что на работе он иногда может внезапно перестать работать иногда даже перезапуск его не воскрешает лол. Особенно если комп переходит в ждущий режим / винда останавливает жестский диск.
1086 1511107
Ребят в чем может быть проблема? Собираю свой велосипед фреймворк из симфони компонентов. Но когда дошел до верстки - свервер на запрос text/css (например бутстрап стили) возвращает text/html.
1087 1511112
>>511107
Часа 4 ебался. Решил этот вопрос. Развернул локалку на апаче. До этого сидел на встроеном php сервере (решил попробовать на свою голову). Пробовал менять на нем заголовки респонсов при запросе text/css, но все равно не выходило. Видимо это задача сервера, раз symfony реализация не справлялась.
985-1087 1088 1511157
Переходите в новый тред >>1511146 (OP) . Если ваш вопрос пропустили, можете напомнить о себе в новом треде.

>>511112

Скорее всего там до PHP-кода запрос и не доходит. Веб-сервер в PHP сам отдает файл.

>>510985

По моему вагрант управляет VirtualBox. Долго - потому что она там грузится с нуля.

>>510811

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

>>508374

Если ты берешь все до конца строки, то можно просто писать mb_substr($str, 1) без третьего аргумента. Это описано в мануале.

Символы нумеруются не с 1, а с 0. Чтобы влять первый, надо писать mb_substr($s, 0, 1).

"$firstToUpper" это то же самое, что $firstToUpper и кавычки не нужны тут.
1089 1511158
>>510612

PHP под Линуксом запускает скрипт очистки старых файлов сессий по крону. В винде - случайно, раз в N вызовов session_start().

>>509443

Собачки - это ограничители. Регулярное выражение заключается в ограничители, которыми может быть традиционный слеш: /abc/i или другой символ: @abc@i.

> второй вопрос с картинки, [а-я-], как я понимаю черточка здесь вместо буквы ё



Черточка здесь значит знак минус. Можно ее экранировать для надежности. "Ё" автор забыл добавить по ошибке. Получается, правильнее [а-яё\-].

> а что означает \A и \Z , не нашел их в мануале по пхп



Посмотри тут: https://www.php.net/manual/ru/regexp.reference.escape.php

Код по ссылке слишком сложный (регулярка преобразует регулярку).

>>509896

Вообще, можно даже без сессий. Хранишь в БД для каждого пользователя 1 длинный уникальный токен. При логине выдаешь токен и сохраняешь в куки, при проверке ищешь токен в БД.
1090 1511159
>>508955

Достаточно глобального middleware:

function($req, $resp, $next) {

если (текущий URL требует авторизации) {
проверить наличие авторизации;
если её нет - создаем и возвращаем редирект на страницу логина;
если есть - сохраняем куда-то пользователя, например, в атрибуты запроса;
}

вызываем next();
возвращаем результат;
}

> Браузер берет старую страничку из кэша?



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

HTTP-заголовки лучше выдавать функцией header() в чистом PHP, или добавлять их в response в Slim.

>>509085

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



Можешь попробовать preg_match_all с опцией PREG_OFFSET_CAPTURE. Обрати внимание, отступ возвращается в байтах, а не в символах и для взятия подстроки с ним надо использовать substr, а не mb_substr.
1090 1511159
>>508955

Достаточно глобального middleware:

function($req, $resp, $next) {

если (текущий URL требует авторизации) {
проверить наличие авторизации;
если её нет - создаем и возвращаем редирект на страницу логина;
если есть - сохраняем куда-то пользователя, например, в атрибуты запроса;
}

вызываем next();
возвращаем результат;
}

> Браузер берет старую страничку из кэша?



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

HTTP-заголовки лучше выдавать функцией header() в чистом PHP, или добавлять их в response в Slim.

>>509085

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



Можешь попробовать preg_match_all с опцией PREG_OFFSET_CAPTURE. Обрати внимание, отступ возвращается в байтах, а не в символах и для взятия подстроки с ним надо использовать substr, а не mb_substr.
1091 1511160
>>508642

Они есть, просто preg_match_all возвращает "двухмерный" (массив из массивов).

И вообще, в PHP "двухмерный" массив - это на самом деле массив из массивов, а не единый двухмерный массив (поэтому, например, длина вложенных массивов может быть разной).

>>508184

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

Твои коллеги качают его и запускают composer install. Она ставит те версии, которые записаны в composer.lock и протестированы тобой. Если вдруг composer.lock нет, то install будет эквивалентен update.

Если вдруг ты захочешь обновить библиотеки, или обновить версии в composer.json, то снова запускаешь update.

> Так почему мне эта комманда помогла?



Она сгенерировала файл vendor/autoload.php. Это же делает команда dump-autoload.

> Но допустим разработчик slim для версии 3.9 посчитает нужным использовать уже liba2.0 , то после update моего приложения - подтянется уже liba2.0, я правильно понял?



Да.

> А вот по update подскажите, она обновляет зависимости до максимально nребуемых версий для моих пакетов, или вообще до максимальных версий?



Максимальная с учетом ограничений в composer.json. Про способы указывать ограничения: https://getcomposer.org/doc/articles/versions.md
1092 1511161
>>508052

При отправке формы в $_GET или $_POST передается имя (атрибут name="xxx") нажатой кнопки. Вижу, ты это и используешь.

Также, в твоем случае проще использовать ссылки вида goto.php?appstore вместо формы с кнопками.

try/catch не нужен, читай урок по исключениям: https://github.com/codedokode/pasta/blob/master/php/exceptions.md и не копируй бездумно код из мануала.

> можно ли как то разрулить без Ajax?



Как? Либо ты делаешь отправку формы, либо переход по ссылке, либо аякс-запрос.

>>507916

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

>>507756

Я бы советовал использовать слеш / , так как он работает везде, и не требует никаких констант.

>>507825

О какой именно фабрике речь? Там их несколько, судя по мануалу и гуглу.

Фабрика - это объект, который создает другие объекты.
1093 1511162
Переходите в новый тред >>1511146 (OP)

>>506988

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


> jquery можно сравнить с перочинным ножом, а ангуляр или реакт - с операционной,



По моему, так заблуждение. Фронтенд в стиле "сгенерированная на сервере страница с набором JS-функций" никак не потерял своей актуальности. Незачем везде делать SPA и переусложнять код на ровном месте.

>>506937

Недостаток jQuery - большой размер и отсутствие возможности подключить часть функций. Часть функций в ней не очень актуальна - вроде анимаций на JS. Плюс - она поддерживает кучу браузеров и содержит множество полезных функций.

СУБД все поддерживают стандарт SQL в разной степени, и с добавлением своих фич. Погугли, есть сайты, где есть целые таблицы с отличиями. 70-90% функционала у них из стандарта и 10-30% своего.
Тред утонул или удален.
Это копия, сохраненная 3 ноября 2019 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски