Это копия, сохраненная 20 сентября 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
ОП довольно занят, но постарается ответить на все вопросы. Также, ответы и решения задач можно поискать в архиве тредов phpclub.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>2241613 (OP) . Все старые треды есть в архиве: https://phpclub.tech/ (впрочем, иногда он не работает).
С чего начать
Наши уроки по PHP собраны по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не запоминайте его, он временный). Это учебник для изучающих с нуля. Там есть задачи, их нужно решать. Но если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.
Если не знаешь как решать, запости код и попроси подсказку или поищи задачу в архиве тредов.
Ты прошел весь учебник? Молодец, но это были лишь основы языка 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
- Еще более сложная и долгая задача на Laravel/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony или Laravel
- Почитать про паттерны 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 - это что-то вроде их хабра.
Вот неофициальный роадмап (карта того, что желательно изучить): https://miro.com/app/board/o9J_lbUUBBQ=/
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания 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? Потому что вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а зайди на https://github.com/codedokode/phpbook, нажми зеленую кнопку Clone or Download -> Download ZIP, распакуй на рабочий стол и получи личную копию сайта, не требующую интернетов.
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу (ищи в архиве по слову "устроился").
- Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Для этого достаточно вставить код на http://beta.phpformatter.com/ и нажать «format». Робот оформит все как надо. Если ты используешь IDE, то там есть горячая клавиша для этого. Список клавиш для IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть рекомендации PSR-1 и PSR-12. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
- ставим тайп-хинты на аргументы функций, результат функций и поля классов
Вот ссылка на рекомендации PSR, где все это описано подробнее и даны примеры оформления:
PSR-1 (рус.): https://svyatoslav.biz/misc/psr_translation/#_PSR-1
PSR-12 (англ.): https://www.php-fig.org/psr/psr-12/
>любой год
>упоминать в качестве мёртвого языка что-либо кроме того, что действительно мертво, а не занимает охуиллиард процентов рынка
>что-то кроме кобола, иными словами
кто шарит, объясните ,пожалуйста, как это все работает
>работал эникеем и сталкивался с хуйней под названием битрикс
>решил стать веб макакой
>именно в этот момент западные компании сьебнули с России
>теперь все бэкенд вакансии для джунов/трейни это ебучее битрикс болото
Ну и хули делать то? Копаться в этой параше с надеждой на то что через год-два перекачусь в что-то нормальное?
Битрикс на пхп сделан?
4 года назад я увидел этот тред, меня завлек анимешный и ламповый гайд и я решил стать web разрабом.
Какая же это была ошибка.
Поработал только 4 месяца версталой
обновлять постоянно страницу - плохая идея. предполагаю, что бота делаешь через getUpdates, такой бот в бесконечном цикле получает и обрабатывает новые сообщения. запускать надо через php cli, а не обновлять постоянно страницу.
если хочешь хостить на хостинге для сайтов - только webhook. через апи указываешь ссылку на скрипт, телега сама будет слать туда новые события то ли в php://input, то ли в $_POST, не помню
Неясно.
Для несведущих: пыха это про бекенд, а вёрстка - про фронтенд.
Я понимаю если бы он в фуллстеки вкатился, но нет же.
ВЕРСТАЛОЙ НА WORDPRESS, ПОПРОШУ!!!!
А если серьезно, увидел задание с таблицей и студентами, охренел, подумал, что лучше стану Frontend... ну и понеслось. А если бы не этот анимешный тред, к web разработке может бы не притронулся.
Справедливости ради, сложным для меня в задании со студентами являлась именно верстка
Бамп вопросу. Из проектов есть ту ду лист, список студентов из шапки треда,что-то вроде галереи, сайт с отображением погоды (юзал API)и расписание для разных групп универа. Могу ли я перейти к изучению ларавеля?
Ты задал дебильный вопрос и получил соответствующий ответ.
Иди изучай.
Получится у тебя или нет - не знаю. Я видел вчерашних студентов, которые на своей первой работе писали просто охрененные решения и схватывали все на лету. И, в то же время, видел людей, что в профессии по 3-4 года сидят. И они ничего не понимают, могут заниматься только копипастой с форумов.
Я вот лично разрешаю тебе перейти к изучению Ларавеля. Или Симфони. Или любой другой херни.
Хочешь - сейчас, хочешь через месяц, хочешь - вчера.
Получится - красавчик. Не получится - вернись через месяц и попробуй еще раз.
А дибильных вопросов задавать не нужно.
Ты меня не обидел. Не волнуйся.
Через две-три недели вернись в тред и расскажи, как идут дела. Сделаешь хорошее дело для других растущих ребят.
Bootstrap или другой CSS-фреймворк. Изучается быстро, даёт вполне невырвиглазный результат, если соблюдать основные правила дизайна (вроде "не более 3-х цветов на странице"), классно не получится, но для нетребовательного заказчика сойдёт.
А если нужно что-то красивое и "вкусное", есть бесплатные template'ы, но вот если потом придётся что-то серьёзно поменять на странице, будет беда...
установить сам composer.
инициализировать проект (composer init)
вызвать composer require author/package
А затем пойти читать в доках, как работает сам композер, какие у него есть команды, что такое /vendor/autoload.php, стандарт PSR-4 и так далее
в ispmanager есть shell-клиент, через него можно запустить composer.phar
Можешь перейти к поиску работы
Давно пора. Только если ты хочешь познакомиться с чуть более правильным использованием ООП и готов к x10 сложности, то попробуй Симфони.
Поддерживаю
Как отправить курл запрос с джейсоном с серв1 на серв2 и принять джейсон? Надеюсь, понятно обьяснил
PHP это
1) 75% веба
2) Легкий вкат на начале, но такие же возможности роста, а вакансий больше.
3) Базовая база веба, а его понимание для фуллкека это хлеб
И подумал таки изучать PHP
This is right way?
Фуллкеку должно быть поебать на язык: PHP, JS/TS, Python, Ruby, Go, Java/Scala, C#. Я рекомендую начинать с сишки, чтобы ты понимал как оно всё работает. Как напишешь свой первый веб-сервер поверх epoll и первое расширение для sqlite, то можешь браться за свою скриптопарашу.
И в пыхе.
кайфану от смены стека или не?
Это долго и сложно
отправлять код на сервер, запускать новую копию интерпретатора в изолированном окружении, возвращать ответ
Не приходят обновления через getWebhookUpdates (). С чем это может быть связано? Setwebhook сделал, все норм.
телеграм присылает события только по https, гугли letsencrypt, там бесплатные сертификаты
Лучше nginx в режиме reverse proxy + certbot сразу нагуглить.
гугл
>nestJS
Хуйня перехайпленная. Там нет ничё такова, чего не было бы в express.js. Так, чисто синтаксическим сахарком посыпали, добавили декораторов, которые вообще нихуя не делают. Серьёзно, ты почитай их документацию, они прямо говорят типа "ну да, мы знаем, что всё это одной строчкой обычным express / fastify делается". И сами же приводят список аналогичного кода. Там есть ноль целых хрен десятых полезного функционала: роли, валидации, orm. Но я не думаю, что ради валидаций стоит ставить такого слона на сервер. В остальном, проще поставить обычный express-generator, он плюс-минус mvc тебе сгенерирует.
По крайней мере там typescript и DI из коробки. Уверен что на проекте
1) для чужого дяди
2) когда нет времени вылизывать код
3) на рынке куча интересных вакансий, я на проекте долго не задержусь...
ты непременно будешь ковырять вилкой говнокод, в котором
4) нет тестов, потому что говнокод не реально протестировать
Так выглядит рядовой проект на express
И чё DI? Они дополнительную сложность добавили в проект. Там, где можно было обычной функцией/классом обойтись, придётся заводить ебучие сервисы, контроллеры, фабрики, хуябрики. А что толку? Ничего же принципиально нового они не дают. Это дрочка ради самой дрочки. Синтаксический сахар.
В твоем репозитории скорее всего нету пакета с данной версией. Надо сделать так:
- сначала обновить информацию о доступных пакетах их репозиториев:
sudo apt-get update
- сделать поиск по слову php и отсортировать результаты:
apt-cache search php
- затем установить выбранный пакет:
sudo apt-get install название пакета
Ты, по моему, просто не понимаешь, что такое DI. Смысл DI не в том, чтобы городить лишние фабрики, а чтобы решить проблему получения зависимостей для функции или класса.
Прекрашай тролить тупостью.
Все не надо, разобрался
я бы уже образ быстрее ручками собрал припердолив нжинксу чем разбираться почему что и где не дает установить нужные зависимости
да хоть на HH
быстрофикс
Контейнер докера чем-то напоминает виртуальную машину. Внутри него есть свои виртуальные сетевые карты.
Когда ты на реальной машине коннектишься к 127.0.0.1, ты можешь подсоединиться к программе, запущенной на том же компьютере. Тут 127.0.0.1 обозначает "этот компьютер".
Но в контейнере 127.0.0.1 обозначает не "эта машина", а "этот контейнер". И соответственно, ты не можешь из одного контейнера подсоединиться к другому, используя 127.0.0.1. Ты должен использовать адрес другого контейнера, как будто бы ты подоединяешься к удаленному серверу.
А если ты хочешь со своего компьютера подсоединиться к сервису внутри контейнера (например, к БД), ты тоже должен использовать IP-адрес контейнера или DNS-имя, а не 127.0.0.1
То есть, представляй себе, что каждый контейнер это как отдельный компьютер со своим адресом.
Ты даешь неправильный совет. Если анон сейчас начнет читать документацию Докера, он половину не поймет.
В данном случае сначала надо изучить основы сетевых технологий: что такое сетевой интерфейс, сокеты Беркли (не вебсокеты), протоколы IP, UDP, TCP, что такое маршрутизация и пакеты, система DNS, файл hosts, команды ifconfig, ss, ping.
Далее прочесть в общих чертах про неймспейсы в линукс, не вдаваясь сильно в подробности.
И после этого можно читать документацию Докера.
Докер это не инструмент для новичков-вкатышей. Это для тех, кто знает Линукс и сетевые технологии и свободно ориентируется в командной строке.
То, что ты перечислил, в моем понимании для вкатуна в бек подразумевается, иначе всё как магия выглядит.
Объяснение слоев в Dockerfile, маппинг портов и т.д. все есть вкратце. Для начала хватит.
mt_rand это генератор, основанный на последовательности чисел. Есть очень-очень длинная последовательность чисел, и генератор каждый раз берет из нее следующее число. Если он доходит до конца последовательности, то он возвращается в ее начало.
То есть, там есть формула, по которой из предыдущего числа получается следующее. И он каждый раз применяет эту формулу.
Приведу упрощенный пример, как можно генерировать псевдослучайные числа (mt_rand устроен во много раз сложнее, я же специально упростил логику для понимания). Пусть у нас формула для генерации следующего числа (y) из предыдущего (x) такая:
y = (11 * x + 7) % 10
%10 значит "остаток от деления числа на 10", то есть, последняя цифра из числа.
Если мы возьмем начальное значение x = 1 и подставим в формулу, то получим новое случайное число y = (11 * 1 + 7) % 10 = 18 % 10 = 8. Если мы подставим в формулу 8, то получим 5. И так далее.
Последовательность чисел, которые сгенерирует генератор, состоит из 10 цифр и выглядит так:
1 8 5 2 9 6 3 0 7 4 1 8 5 2 9 ....
Эта последовательность бесконечно повторяется. Как только мы дойдем до числа 1, мы начнем получать те же числа, что и раньше.
(если тебе интересно, откуда я знаю эту формулу и числа в ней, то читай википедию: https://ru.wikipedia.org/wiki/Линейный_конгруэнтный_метод )
Такие генераторы могут выдавать числа с большой скоростью, но они предсказуемы. Получив несколько чисел, ты можешь угадать, в каком месте последовательности находится генератор, и предсказать, какие числа он сгенерирует дальше.
Для генератора выше, если ты получил числа 8 и 5, то ты знаешь, что дальше он выдаст число 2.
Такой генератор не подойдет, например, для шифрования. Или для организации казино. Вроде бы был случай, когда кто-то разгадал алгоритм работы генератора случайных чисел в игровом автомате и невозбранно обогащался, пока владельцы казино не почувствовали подозрение и не запретили ему посещение их заведения.
Вот еще пример, где нельзя использовать такой генератор. Допустим, у тебя на сайте сделан вход через код в СМС. То есть, ты вводишь номер телефона, сайт генерирует случайный код и высылает его в СМС. Злоумышленник, зная, что ты используешь mt_rand(), несколько раз вводит свой номер и получает несколько кодов подряд. Имея эти коды, он рассчитывает, в каком месте последовательности находится генератор и предсказывает, какие следующие коды будут сгенерированы. После этого он вводит номер телефона жертвы и угаданный код, и получает доступ к его аккаунту.
То есть, mt_rand подходит для ситуаций, где не критично, если кто-то угадает числа.
Для случаев, когда нужна безопасность, предусмотрен random_int. Это криптографически надежный генератор. Он генерирует непредсказуемые числа, но его скорость работы ниже и он не может их генерировать быстро и много.
Если тебе нужно генерировать много криптографически надежных чисел с большой скоростью, то придется раскошелиться на аппаратный генератор случайных чисел. Или использовать современный процессор, в который такие генератор часто встроен (если ты конечно доверяешь Intel или AMD и веришь, что американское правительство не встроило закладки в этот генератор, чтобы обчистить твое казино, прочитать твои сообщения и взломать СМС-коды на твоем сайте).
mt_rand это генератор, основанный на последовательности чисел. Есть очень-очень длинная последовательность чисел, и генератор каждый раз берет из нее следующее число. Если он доходит до конца последовательности, то он возвращается в ее начало.
То есть, там есть формула, по которой из предыдущего числа получается следующее. И он каждый раз применяет эту формулу.
Приведу упрощенный пример, как можно генерировать псевдослучайные числа (mt_rand устроен во много раз сложнее, я же специально упростил логику для понимания). Пусть у нас формула для генерации следующего числа (y) из предыдущего (x) такая:
y = (11 * x + 7) % 10
%10 значит "остаток от деления числа на 10", то есть, последняя цифра из числа.
Если мы возьмем начальное значение x = 1 и подставим в формулу, то получим новое случайное число y = (11 * 1 + 7) % 10 = 18 % 10 = 8. Если мы подставим в формулу 8, то получим 5. И так далее.
Последовательность чисел, которые сгенерирует генератор, состоит из 10 цифр и выглядит так:
1 8 5 2 9 6 3 0 7 4 1 8 5 2 9 ....
Эта последовательность бесконечно повторяется. Как только мы дойдем до числа 1, мы начнем получать те же числа, что и раньше.
(если тебе интересно, откуда я знаю эту формулу и числа в ней, то читай википедию: https://ru.wikipedia.org/wiki/Линейный_конгруэнтный_метод )
Такие генераторы могут выдавать числа с большой скоростью, но они предсказуемы. Получив несколько чисел, ты можешь угадать, в каком месте последовательности находится генератор, и предсказать, какие числа он сгенерирует дальше.
Для генератора выше, если ты получил числа 8 и 5, то ты знаешь, что дальше он выдаст число 2.
Такой генератор не подойдет, например, для шифрования. Или для организации казино. Вроде бы был случай, когда кто-то разгадал алгоритм работы генератора случайных чисел в игровом автомате и невозбранно обогащался, пока владельцы казино не почувствовали подозрение и не запретили ему посещение их заведения.
Вот еще пример, где нельзя использовать такой генератор. Допустим, у тебя на сайте сделан вход через код в СМС. То есть, ты вводишь номер телефона, сайт генерирует случайный код и высылает его в СМС. Злоумышленник, зная, что ты используешь mt_rand(), несколько раз вводит свой номер и получает несколько кодов подряд. Имея эти коды, он рассчитывает, в каком месте последовательности находится генератор и предсказывает, какие следующие коды будут сгенерированы. После этого он вводит номер телефона жертвы и угаданный код, и получает доступ к его аккаунту.
То есть, mt_rand подходит для ситуаций, где не критично, если кто-то угадает числа.
Для случаев, когда нужна безопасность, предусмотрен random_int. Это криптографически надежный генератор. Он генерирует непредсказуемые числа, но его скорость работы ниже и он не может их генерировать быстро и много.
Если тебе нужно генерировать много криптографически надежных чисел с большой скоростью, то придется раскошелиться на аппаратный генератор случайных чисел. Или использовать современный процессор, в который такие генератор часто встроен (если ты конечно доверяешь Intel или AMD и веришь, что американское правительство не встроило закладки в этот генератор, чтобы обчистить твое казино, прочитать твои сообщения и взломать СМС-коды на твоем сайте).
А почему отступ должен быть? Отступы надо делать либо с помощью margin/padding, либо сделав ширину элементов меньше, чтобы осталось свободное место.
То есть, если у тебя 2 колонки и ширина элемента равна 50%, то отступа не будет. А если ты сделаешь ее 45%, то оставшиеся 10% превратятся в отступ между колонками.
Если ты не задаешь ширину элемента в флексбоксе явно, то она рассчитывается автоматически по алгоритму shrink-to-fit, про который я написал урок: https://github.com/codedokode/pasta/blob/master/html/shrink-to-fit.md#алгоритм-shrink-to-fit
Спасибо за информацию. К сожалению, продление предыдущего домена стоит 10 долларов, а смена домена бесплатная, потому мы переехали.
Ссылка на учебник: https://codedokode.github.io/phpbook
Если кому-то захочется скачать учебник на компьютер, то заходите на https://github.com/codedokode/phpbook и нажмите зеленую кнопку Code, там выберите Download ZIP.
Спасибо за труд. Подскажи пожалуйста хороший курсик по ларе, на примере блога там например, еще раз спасибо.
https://leetcode.com/playground/mnKTdZCE
В цикле ты обращаешься только к тому, который отправляешь в функцию.
Обращайся к тому, который ты переопределяешь
Вместо $l->val, используй $c->val
Спасибо.
Алсо, торжественно клянусь впредь использовать нормальные имена переменных, даже когда печатаю с тапка телефона.
А эти структуры данных вообще нужны в разработке веб-сайтов? Тем более с нуля, а не основе библиотек?
Есть страничка на пхп, нужно не дожидаясь загрузки контента (хтмл) отправлять get request на определенный урл. Отправлять не блокируя остальной код. На респонс плевать, главное очень быстро и не дожидаясь респонса и не блокируя рендер контента кидать реквест на определенный урл.
fetch js?
Если я правильно понял (если вообще реально понять хуйню, у которой даже название есть - xy problem), можно открыть tcp соединение через сокет, сформировать get запрос (это несложно - там всего лишь текст), отправить и.. всё, response можно не считывать.
Затем запрос на на домен/challenge
Опять запрос на то же url - успешно, код 200
Так работает этот сайт двача при первом заходе, то есть если нет сохранённых кук.
Что это за 2ch.hk/challenge? Для чего это? Каким образом это защищает сайт?
Спасибо :3
Добавлю, что частично response сосчитать всё-таки нужно, чтобы убедиться, что реквест дошёл. Например, status-line. Но сделать это можно в самом конце.
Разобрался, это Cloudflare, защита от ддос атак.
Пиздец вы твари, сложно было 2 слова написать. Теперь я понимаю, почему этот тред мертвый.
Что не так, школьник? yii2 уже ~8-9 лет и все работает
Любой фреймворк это набор компонентов
роутер
контроллер с коллбеками и работа с данными и отображение.
Ну и рюшечки типа проверка почты, отправка и все такое.
Поридж в ярости))
Когда то я был как вы, в 2019м году открыл ПХП, установил линукс и начал писать коды эти ваши. А теперь я сижу в тепле и наслаждаюсь весной, пока быдло на заводах за копейки пашет, может на обеде поеду покатаюсь по дорожкам в лесу.
мимо symfony/react developer
Идут два данмера по Алинору и видят волшебную лавку, на прилавке сидит альфик и лукаво размахивая хвостом, говорит данмерам:
- За 99 септимов превращу в имперца
Уримал покопался у себя в карманах и нашел 98 септимов, а Азарат у себя 100 септимов. Азарат говорит другу
- Давай испытаем заклинание на мне. Если все пройдет успешно, то я отдам тебе лишний септим и ты тоже станешь имперцем.
- Давай! - обрадовался Уримал.
Зашел Азарат вместе с альфиком в лавку и через пять минут из лавки выходит статный имперец.
- Скорее же давай мне септим. обрадовался Уримал.
- Найди себе работу чумазый попрошайка!
Какой линукс установил?
Анектодды двумя блоками ниже.
Да нормально, все - по совету местного анона вкатился по подписке на хекслет, в итоге за 3 месяца освоил больше чем за весь прошлый год.
По поводу на рыка труда, мне с дивана кажется, что на пыхе все более менее норм, по сравнению с тем же фронтом и питоном, если говорить про офисные джуновские ваки.
Как нашел удаленку на западного барина? Или ты галеру РАБотаешь? Скок платят? Че молодым-задорным посоветуешь?
Да конечно на пыхе збс, конкуренции мало, а работы валом.
Я в офисах не работал, сразу удалёнку нашёл на галере(но нормальной, с долгими продуктами без легаси), там 1,5 года проработал. Сейчас удалёнка на продукт на западного барина.
Молодым дам важный совет как найти работу:
- Сделать хотя бы один проект нормальный на гитхабе и задеплоить на хост куда-нибудь.
- Самому искать МАЛЕНЬКИЕ компании, где НЕТ ЭЙЧАРОВ. Там ты вероятность оффера будет 95% и сразу со старта платят.
Кто поопытнее и ищет вторую работу:
Сделать полезную-интересную composer-либу и залить на packagist.
Мне просто интересно, причём здесь на себя натягивать
Сообщения с Deprecated можно игнорировать — это лишь предупреждения. Важная информация в конце:
composer не нашел файл composer.json в текущей директории (PhpStormProjects).
Скорее всего ты запустил команду не из той папки. Нужно сначала перейти в папку с проектом, а потом запускать композер. Перейти можно командой
cd имя-директории
Я тоже не очень понимаю, в чем смысл этого кода. Есть такой подход, когда функции-сеттеры (которые задают какой-то параметр) заканчиваются строкой return $this; и это позволяет вызывать их по цепочке:
$someObject->setA(1)->setB(2)->setC(3);
Но зачем возвращать $this->messenger, я не очень понимаю. Может, это какая-то ошибка?
Вообще, мне не нравится этот паттерн. Я считаю, вместо того, чтобы писать однотипный код, сам язык должен поддерживать какой-то синтаксис для вызова методов по цепочке.
Также, мне не нравится здесь дублирование кода. У функции указан тип возврата MessengerInterface и зачем-то в комментариях это указано второй раз:
@return MessengerInterface
Так не нужно делать. Если ты уже указал тип возвращаемого значения, не не надо его писать второй раз.
>У функции указан тип возврата MessengerInterface и зачем-то в комментариях это указано второй раз:
>@return MessengerInterface
1) PHPStorm считает по-другому
2) Документация инструментами генерится из PHPDoc а не тайпхинтов
мимо
>Да конечно на пыхе збс, конкуренции мало, а работы валом.
Это такой троллинг? Или ты про западный рынок. В этой стране уже с опытом 10 лет за еду работы в айти не найти, тем более на пыхе
а что не так?
>В этой стране уже с опытом 10 лет за еду работы в айти не найти
А что случилось? Почему же никто не хочет с нами работать?
PHPStorm это не стандарт, это всего лишь IDE. Я знаю, что PHPStorm любит генерировать бесполезные комментарии, но это не значит, что это правильно. Я думаю, это отключается где-то в настройках.
При этом, PHPStorm умеет парсить тайп-хинты и использовать их для анализа и подсказок. Также и другие анализаторы вроде phpstan умеют читать тайп-хинты.
Что касается PHPDoc, то я не вижу упоминания в документации, что он не умеет парсить тайп-хинты.
Вообще да. PHPDocumentor из
class App
{
public function test(): array
{
return [];
}
}
сгенерил
public test() : array<string|int, mixed>
Но все же я не могу в тайпхинте указать дженерик, так что я могу его указать в phpdoc, а тайпхинт array оставить для проверок в рантайме.
Headhunter?
Хочу понять, какая структура должна быть у шаблонов.
Вот есть базовый шаблон с повторяющимся хедером, футером, посередине вставляется @yield content, назовем его app.blade.php. Дальше я создаю дочернюю страничку, пусть будет about, которая наследуется от базового шаблона app, описываю секцию, хуе-мое, блять. И таких страничек будет штук 5. Потом я осознаю, что в эти 5 страничек нужно вставить абсолютно одинаковый кусочек кода, не слишком маленький, но и не на 100 строк. Как бы мне это сделать красиво и без копипаста?
Я не написал, что я против PhpDoc. Я против таких PhpDoc, которые просто дублируют тайп-хинты и не несут никакой новой информации. Они бесполезны и лишь увеличивают время на чтение и модификацию кода.
>>360900
В твиге есть макросы для этого, наверно и в блейде что-то есть.Гугление показывает, что есть директива include: https://laravel.com/docs/9.x/blade#including-subviews
Также, там есть компоненты: https://laravel.com/docs/9.x/blade#components
Ой да не пизди ты
Вопрос такой: Что, если я напишу "самописный" движок сайта или сайт(сервис) на PHP, он раскрутится и кто нибудь(кабанчик подсуетится) отожмёт его у меня или возьмёт исходный код немного подправит, изменит "шаблон" и запустит свой аналогичный сайт? Что мне в этом случае делать? Какие методы защиты кода на PHP существуют: бэкдор для своего человека, супер пользователь вшитый в код, обфускация кода? Как защищаете Вы(Ваша контора) свой проект, как защищают крупные компании использующие PHP(Производители коммерческих CMS например)?
Ты в курсе, что пыха серверный язык? Как кабанчик у тебя его отожмет, если он на хостинге крутится, а не в браузере? Ты по сути даже не его видишь, а результат его работы.
В курсе конечно, но в "некоторой" стране можно доступ получить за деньги практически к любым данным. Например к SMS переписке или детализации звонков. Я не знаю как в остальных странах, но предполагаю не сильно лучше. Тем более в некоторых странах требуют, что бы "хостился" именно на их территории, если хочу их домен. Представь какой нибудь "Губер" или "Сенатор" в стране третьего мира захочет получить данные с сервака - думаю ничто ему не помешает или я не прав?
zend encoder
Чел, когда на тебя покусятся кабаны с такими возможностями у тебя будет своя СБ, а тебя самого будут интересовать больше яхты, а не твой пионерский говнокод.
Спасибо за мечты, но в успех я не очень верю. Возможно я пессимист.По теме: Есть знакомый - относительно взрослый дядя, Program Engineer (надеюсь правильно написал должность) который работает на иностранцев. Он тоже пишет, что, если идея которую ты реализуешь годная, то бабки появятся и уже потом будешь думать о безопасности, производительности, оптимизации кода и тд.
Работы валом, что на местных, что на западных. Тем более на пыхе.
Я как только год опыта получил - просто игнорил местных, зачем, если есть западные продукты с западной зар.платой и западными условиями.
Если где-то есть повторяющиеся элементы, выносишь их в отдельный файл .blade.php и импортируешь в те, которые нужно. Если есть необходимость его чуток видоизменять (текст, картинки, что-то показывать/убирать и т.д.), то blade шаблоны умеют принимать переменные и с их помощью можно колдовать над шаблонами как хочешь.
Давно занят, да и сам по себе он маленький
Там же еще подмена ойпи нужна, так что еще про мультипрокси не забудь.
Сука, ну как искать работу? Мрази требуют пхп, ооп, хуяпе, вью, джс, тесты. Коммерческого полгода, а по сути ничему не научился толком. С каждой вакансии в ахуе
>ооп
>джс
>тесты
Это все баззворды, которыми на собесе в голову срут и используют, чтобы непонравившегося кандидата зарубить. В реальности у тебя будет код-лапша без всяких там солид, просто раздробленный по куче классов/методов, и ajax запросы/таблички на жквиери на фронте.
>вью
Тебя наебать хотят, будешь макакой фулстеком.
Фронтофреймворк, который будешь выдрачивать дольше, чем пхп до уровня мидла.
А что тогда надо знать чтобы устроиться?
>простые морды, если я бэкендер
ПРостые морды для бэкендера это jquery + bootstrap, как показывает моя личная практика, лучше уж так чем говнокод на SPA.
Почему обязательно говнокод с vue? Пишу чисто, функционально на vue 3 как на реакте. С jquery у тебя в 99% случаев на проектах встретится говнокод. На жиквери можно компоненты писать в виде плагинов, но все любители жиквери предпочитают лапшу.
мимо
>функционально на vue 3
>как на реакте
Ты насрал в штаны, дружище. Во vue нет функциональных компонентов, а те, что там называются "функциональными" представляют из себя ничего более, чем статичную рендер-функцию без ветвлений внутри.
>С jquery у тебя в 99% случаев на проектах встретится говнокод.
У тебя и с реактом/вью 99% встретится говнокод, но в отличии от жиквары - он еще и будет с горой бойлерплейта, который без траты огромного количества времени не разберешь.
Извини, но я в твои в штаны не срал. Это ты сам наделал. cоmposition api позволяет функциональный код писать насколько это возможно в жс и даже использовать this не дает.
>cоmposition api
>функциональный код
Хватит позорится уже. Твой composition api это буквально конактенация стрех строк: "export default { setup(){" . <Текст твоего компонента> . "}}". Где ты тут функциональное программирование увидел?
Потому что код полностью на функциях, без использования контекста. Тебе никто не мешает его использовать вместе с какой-нибудь ramdajs
Немного пыхи, лару, апи писал, постман, докер, гит. Вот сейчас учу вью, но сука, не хочется распыляться
И не распыляйся. Сам себе какаху в карьере сделаешь. Учи БД, куберы, рабиты и так дале. И английский язык
В JS даже контекст можно реализовать на замыканиях. Отсутствие контекста и преобладание функций - не гарантирует использования парадигмы ФП. Тот же composition api функционален только в момент инициализации, потом у тебя все равно появляется тобой ненавистный контекст, в отличии от реакта - где весь жизненный цикл компонента выполнен в виде функций. Исключение в виде ErrorBoundary не рассматриваем
И шо? Я против реакта ничего не говорил. Я же не шизик чтобы искать чистые идеальные формы, в практических приземленных вещах как веб фреймверки
Кстати раз ты такой спец покажи мне где этот контекст появляется?
setup() {
const = reactive({test: 'hello world'});
provide('HEHE', () => {
//
})
onMounted(() => {
//...
})
watchEffect(() => {
...
})
}
Кстати в вуе 3 не принято писать defineComponent({setup() {
а принято вообще чисто на функциях и макросах
<script lang="ts" setup>
defineProps({
propName: {
...
}
})
watchEffect(() => {
//})
</script>
Прямиком после выполнения метода setup, когда неожиданно все, что возвращалось из него становится полями объекта внутри прокси, доступ к которым из метода render осуществляется через with(this){}
А разве если в реакте мы залезем в метод render или shouldComponentUpdate нам this не нужен будет?
render() {
...
this.props
...
}
не писал не когда?
В реакте в 2022 методы используются только в единичных случаях, все остальное уже на функциях.
function Example(props){
return <div>{props.value}</div>
}
Ну так вуе заставляет тебя в метод render лезть в 2022? Кстате необходимость shouldComponentUpdate тебя сейчас может заставить класс написать
>вуе заставляет тебя в метод render лезть в 2022?
Не заставляет, если ты используешь вуй для генерации статичного HTML. Во всех остальных случаях - заставляет, просто через костыль with, потому что иначе код на вуе побил бы все рекорды по размеру бойлерплейта.
> необходимость shouldComponentUpdate тебя сейчас может заставить класс написать
Не заставит. useMemo и useCallback
расшифруй пожалуйста. я писал разные многоуровневые меню и, таблицы с динамически подгужаемым контентом в ячейках и всякую другую SPA муру и нигде не использовал render
>я писал разные многоуровневые меню и, таблицы с динамически подгужаемым контентом в ячейках и всякую другую SPA муру и нигде не использовал render
<template> в твоем вуй файле это ничто иное, как render()
Гешефт в том, как туда данные попадают. В рякте - через область видимости, а в вуе/классовом рякте - через контекст.
Уже фиксанул, появилось когда изменил сервер на апач
Расскажи как вкатывался. Что на собесах спрашивали?
Задачки с литкода давали? Лайвкодингом заставляли заниматься? Про пет-проекты узнавали?
И как ты вообще пробился, если сейчас на одну вакуху 10000 курсовичков и вкатышей?
Дайте мне пример языка/фрейма/платформы, где можно так же легко и непринужденно за пару вечеров сделать работоспособный набросок проекта, где было бы такое живое комьюнити, что ответы на все твои вопросы уже есть на форумах, а если произошел экстраслучай, то пыха настолько простая, то можно методом тыка и экспериментов решить проблему самому и даже не понять, как это получилось.
>Меня удивляют завидки, которые говорят, что пыха давно мертва
Это из той же серии что и про мёртвые рельсы. Эти дауны, чванливо заявляющие о мёртвых языках только и могут что словоблудить почём зря.
Студенты тупые-зелёные такое говорят, которые с проектами не сталкивались даже. У PHP один минус - нет крупных проектов вроде амазона. Пыха это джава, только для мелких-средних проектов.
Работы валом, зар.платы как у всех, вкатиться легче, поднять проект легко, сервера копейки стоят, скорость отменная у пыхи.
Оно и хорошо что хейтят с другой стороны - меньше вкатунов, меньше конкуренции у новичков.
>>362759
Ты полностью проект развернул? Базы должны быть полностью заполнены данными, все пароли предоставлены, все зависимости и утилиты установлены. Документации нет там? Главное проект полностью разверни, плюс в проектах всегда есть костыли, о которых ты можешь не знать.
Ну может, но я не знаю всм берут ли туда на работу или там и так бородатых дядек хватает.
Т.е. при релокейте мне кажется сложно на пыхе найти работу уровня айти-гиганта. Ну это и так, на любителя, может кому важно и мечтает попасть в корпорацию какую.
> может кому важно и мечтает попасть в корпорацию какую.
Да нахуй они нужны. Я там не работал, но слышал в этих корпорациях платят меньше рынка. И это не только IT компании касается. Зато представляю какой там дрочь, субординация и прочая корпоративная шиза, которую я блять просто терпеть ненавижу.
Аналогично. Мне маленькие ламповые продукты-компании больше нравятся, где контроля нет, пишешь себе код когда вздумается и не паришь голову.
Позвольте вмешаться. Не могу пройти мимо.
Вы почему-то ограничиваете выбор "хорошим" SPA на Vue и "ужасным" древним jQuery. Как будто нет других вариантов.
Но, на мой взгляд, реализация произвольного проекта как SPA имеет множество недостатков:
- очень медленная начальная загрузка, требующая передачи огромного объема данных
- при этом у разработчиков почему-то не хватает ума впечь нужные данные прямо в страницу, и они делают ajax-запросы
- разработчики не умеют правильно проектировать API, чтобы при переходах между страницами отправлялся бы единственный запрос, а не много
- страница не отображается при единственной ошибке в любом компоненте, в то время как при использовании HTML ошибка загрузки одного CSS/JS файла или картинки не препятствует отображению страницы
- с реактивным стилем написания кода легко сделать так, что приложение будет потреблять много CPU
- написание SPA требует по сути написать два приложения: серверное и клиентское. Значительно увеличивается объем работы.
- мне не нравится идея делать каждую кнопку отдельным файлом. Это выглядит красиво в концепции, но с таким кодом тяжело работать, прыгая по файлам на 10 строчек. Вы в коде тоже каждую функцию в отдельный файл выносите?
- необходимость возиться со сборщиками и упаковщиками кода. На большом проекте, конечно, они все равно понадобятся, но на маленьком можно обойтись и без них.
- проблемы с поисковой оптимизацией
Наконец, вы предполагаете, что использование реактивных фреймворков обеспечивает лучшую архитектуру. Но я открываю случайный блог и вижу, как автор пишет fetch() прямо в компоненте. Для тех, кто не понимает - это как если бы в PHP вы писали SQL-запросы и всю логику в HTML-шаблоне. Это вы называете лучшей архитектурой? Это же даже протестировать нормально не получится.
Или возьмите тот же Redux. Они предлагают сделать гигантский switch на 100 опций и на нажатие любой кнопки клонировать все состояние.
То есть, не надо все писать как SPA. Если вы пишете интернет-магазин или развлекательный ресурс с постами и лайками, вам даром не нужен SPA. Если вы хотите отправлять и валидировать форму аяксом, то вам не нужен SPA. Если вы хотите сделать переход между страницами сайта без перезагрузки, то вам не нужен SPA. Если же вы пишете высокоинтерактивное приложение, например, редактор электрических схем или мобильную версию Инстаграма, то вам пригодится SPA.
Лично мне из клиентских библиотек понравился preact (это не реакт). Его идея в том, что у него мало возможностей, но зато он весит всего несколько килобайт и позволяет при желании писать компоненты без компиляции и сборщиков. Если у вас есть простая интерактивная форма, то вполне возможно, что реализация одной формы на preact подойдет гораздо лучше, чем переделка всего приложения на SPA на популярном фреймворке, с весом бандлов под мегабайт и сложным процессом сборки.
Позвольте вмешаться. Не могу пройти мимо.
Вы почему-то ограничиваете выбор "хорошим" SPA на Vue и "ужасным" древним jQuery. Как будто нет других вариантов.
Но, на мой взгляд, реализация произвольного проекта как SPA имеет множество недостатков:
- очень медленная начальная загрузка, требующая передачи огромного объема данных
- при этом у разработчиков почему-то не хватает ума впечь нужные данные прямо в страницу, и они делают ajax-запросы
- разработчики не умеют правильно проектировать API, чтобы при переходах между страницами отправлялся бы единственный запрос, а не много
- страница не отображается при единственной ошибке в любом компоненте, в то время как при использовании HTML ошибка загрузки одного CSS/JS файла или картинки не препятствует отображению страницы
- с реактивным стилем написания кода легко сделать так, что приложение будет потреблять много CPU
- написание SPA требует по сути написать два приложения: серверное и клиентское. Значительно увеличивается объем работы.
- мне не нравится идея делать каждую кнопку отдельным файлом. Это выглядит красиво в концепции, но с таким кодом тяжело работать, прыгая по файлам на 10 строчек. Вы в коде тоже каждую функцию в отдельный файл выносите?
- необходимость возиться со сборщиками и упаковщиками кода. На большом проекте, конечно, они все равно понадобятся, но на маленьком можно обойтись и без них.
- проблемы с поисковой оптимизацией
Наконец, вы предполагаете, что использование реактивных фреймворков обеспечивает лучшую архитектуру. Но я открываю случайный блог и вижу, как автор пишет fetch() прямо в компоненте. Для тех, кто не понимает - это как если бы в PHP вы писали SQL-запросы и всю логику в HTML-шаблоне. Это вы называете лучшей архитектурой? Это же даже протестировать нормально не получится.
Или возьмите тот же Redux. Они предлагают сделать гигантский switch на 100 опций и на нажатие любой кнопки клонировать все состояние.
То есть, не надо все писать как SPA. Если вы пишете интернет-магазин или развлекательный ресурс с постами и лайками, вам даром не нужен SPA. Если вы хотите отправлять и валидировать форму аяксом, то вам не нужен SPA. Если вы хотите сделать переход между страницами сайта без перезагрузки, то вам не нужен SPA. Если же вы пишете высокоинтерактивное приложение, например, редактор электрических схем или мобильную версию Инстаграма, то вам пригодится SPA.
Лично мне из клиентских библиотек понравился preact (это не реакт). Его идея в том, что у него мало возможностей, но зато он весит всего несколько килобайт и позволяет при желании писать компоненты без компиляции и сборщиков. Если у вас есть простая интерактивная форма, то вполне возможно, что реализация одной формы на preact подойдет гораздо лучше, чем переделка всего приложения на SPA на популярном фреймворке, с весом бандлов под мегабайт и сложным процессом сборки.
> В JS даже контекст можно реализовать на замыканиях.
Можно, и я даже когда-то так делал, когда в JS не было классов, но это плохая идея в сравнении с классами, так как получается код в стиле "функция возвращает функцию", который тяжело читать. Классы читать гораздо проще.
> в отличии от реакта - где весь жизненный цикл компонента выполнен в виде функций.
Ты случайно не намекаешь на использование хуков вроде useState()? Я видел много хвалебных постов про эти хуки, но когда решил прочесть документацию и разобраться, то ужаснулся. То, что подают как лучшее решение, на самом деле превращает код в лапшу в стиле "функция возвращает функцию, которая возвращает функцию".
Вот, например, кусочек из Реакта (отсюда https://reactjs.org/docs/hooks-intro.html ):
function Example() {
[count, setCount] = useState(0);
...
А вот, как это выглядит с использованием ООП:
class Example {
counter = new Counter();
render() {
...
Плюсы кода с ООП:
- объект счетчика создается один раз при создании компонента. С хуками же мы пытаемся создать счетчик при каждом рендеринге. Это просто нелогично.
- с ООП класс устроен просто и понятно: есть состояние и есть методы для его изменения. С хуками же у нас функции возвращают функции и это просто сложно читать и, как следствие, легко сломать при редактировании.
- функции вроде useState используют костыли (порядковый номер вызова), чтобы понять, к какой переменной мы обращаемся. В ООП таких костылей нету.
Такое ощущение, что люди готовы усложнять код, лишь бы не использовать ненавистные классы. То, что делается на хуках, ,можно сделать аналогично на ООП, только без костылей.
> В JS даже контекст можно реализовать на замыканиях.
Можно, и я даже когда-то так делал, когда в JS не было классов, но это плохая идея в сравнении с классами, так как получается код в стиле "функция возвращает функцию", который тяжело читать. Классы читать гораздо проще.
> в отличии от реакта - где весь жизненный цикл компонента выполнен в виде функций.
Ты случайно не намекаешь на использование хуков вроде useState()? Я видел много хвалебных постов про эти хуки, но когда решил прочесть документацию и разобраться, то ужаснулся. То, что подают как лучшее решение, на самом деле превращает код в лапшу в стиле "функция возвращает функцию, которая возвращает функцию".
Вот, например, кусочек из Реакта (отсюда https://reactjs.org/docs/hooks-intro.html ):
function Example() {
[count, setCount] = useState(0);
...
А вот, как это выглядит с использованием ООП:
class Example {
counter = new Counter();
render() {
...
Плюсы кода с ООП:
- объект счетчика создается один раз при создании компонента. С хуками же мы пытаемся создать счетчик при каждом рендеринге. Это просто нелогично.
- с ООП класс устроен просто и понятно: есть состояние и есть методы для его изменения. С хуками же у нас функции возвращают функции и это просто сложно читать и, как следствие, легко сломать при редактировании.
- функции вроде useState используют костыли (порядковый номер вызова), чтобы понять, к какой переменной мы обращаемся. В ООП таких костылей нету.
Такое ощущение, что люди готовы усложнять код, лишь бы не использовать ненавистные классы. То, что делается на хуках, ,можно сделать аналогично на ООП, только без костылей.
Ой, там в примере кода наверно надо писать
counter = new Counter(this);
а то counter не сможет пнуть компонент, чтобы он обновился.
>- очень медленная начальная загрузка, требующая передачи огромного объема данных
Решается SSR
>- при этом у разработчиков почему-то не хватает ума впечь нужные данные прямо в страницу, и они делают ajax-запросы
Решается фреймворками вроде next и nuxt
>разработчики не умеют правильно проектировать API, чтобы при переходах между страницами отправлялся бы единственный запрос, а не много
Решается http/2
>- страница не отображается при единственной ошибке в любом компоненте, в то время как при использовании HTML ошибка загрузки одного CSS/JS файла или картинки не препятствует отображению страницы
Во первых, нужно писать код таким образом, что бы он не выкидывал ошибки. Во вторых, в любом фреймворке есть возможность отлавливать ошибки аналогично try/catch и выводить юзеру соответствующую инфу/производить другое действие/etc.
>- написание SPA требует по сути написать два приложения: серверное и клиентское. Значительно увеличивается объем работы.
Не согласен. Ты в любом случае будешь писать клиентское приложение (html + js+css) и бэк (любой язык на твой выбор).
>- мне не нравится идея делать каждую кнопку отдельным файлом. Это выглядит красиво в концепции, но с таким кодом тяжело работать, прыгая по файлам на 10 строчек. Вы в коде тоже каждую функцию в отдельный файл выносите?
Ну так не делай, сделай в одном файле 20 кнопок и экспортируй. Кто тебе запрещает?
>- необходимость возиться со сборщиками и упаковщиками кода. На большом проекте, конечно, они все равно понадобятся, но на маленьком можно обойтись и без них.
Тут согласен, да. Я так с cmake не заморачивался как с вебпаком.
>- проблемы с поисковой оптимизацией
Решается SSR
>Это вы называете лучшей архитектурой?
Нет, выводить отдельную функцию для AJAX запроса и передавать данные из неё в компонент через контекст/провайдИнжекты накмного практичнее.
> Это же даже протестировать нормально не получится.
То, что fetch можно мокать ты не слышал?
>Они предлагают сделать гигантский switch на 100 опций и на нажатие любой кнопки клонировать все состояние.
Что ты понимаешь под "всем состоянием"? Тебе никто не мешает вывести в отдельное хранилище логику работы с кнопкой и мутировать только его.
>Если вы хотите сделать переход между страницами сайта без перезагрузки, то вам не нужен SPA.
Проиграл. Если вы хотите сделать Single Page Application вам не нужен SPA. Сам свои высеры читаешь?
> Если вы пишете интернет-магазин или развлекательный ресурс с постами и лайками, вам даром не нужен SPA
>Если же вы пишете высокоинтерактивное приложение, например, редактор электрических схем или мобильную версию Инстаграма, то вам пригодится SPA.
Тут даже без комментариев.
>- очень медленная начальная загрузка, требующая передачи огромного объема данных
Решается SSR
>- при этом у разработчиков почему-то не хватает ума впечь нужные данные прямо в страницу, и они делают ajax-запросы
Решается фреймворками вроде next и nuxt
>разработчики не умеют правильно проектировать API, чтобы при переходах между страницами отправлялся бы единственный запрос, а не много
Решается http/2
>- страница не отображается при единственной ошибке в любом компоненте, в то время как при использовании HTML ошибка загрузки одного CSS/JS файла или картинки не препятствует отображению страницы
Во первых, нужно писать код таким образом, что бы он не выкидывал ошибки. Во вторых, в любом фреймворке есть возможность отлавливать ошибки аналогично try/catch и выводить юзеру соответствующую инфу/производить другое действие/etc.
>- написание SPA требует по сути написать два приложения: серверное и клиентское. Значительно увеличивается объем работы.
Не согласен. Ты в любом случае будешь писать клиентское приложение (html + js+css) и бэк (любой язык на твой выбор).
>- мне не нравится идея делать каждую кнопку отдельным файлом. Это выглядит красиво в концепции, но с таким кодом тяжело работать, прыгая по файлам на 10 строчек. Вы в коде тоже каждую функцию в отдельный файл выносите?
Ну так не делай, сделай в одном файле 20 кнопок и экспортируй. Кто тебе запрещает?
>- необходимость возиться со сборщиками и упаковщиками кода. На большом проекте, конечно, они все равно понадобятся, но на маленьком можно обойтись и без них.
Тут согласен, да. Я так с cmake не заморачивался как с вебпаком.
>- проблемы с поисковой оптимизацией
Решается SSR
>Это вы называете лучшей архитектурой?
Нет, выводить отдельную функцию для AJAX запроса и передавать данные из неё в компонент через контекст/провайдИнжекты накмного практичнее.
> Это же даже протестировать нормально не получится.
То, что fetch можно мокать ты не слышал?
>Они предлагают сделать гигантский switch на 100 опций и на нажатие любой кнопки клонировать все состояние.
Что ты понимаешь под "всем состоянием"? Тебе никто не мешает вывести в отдельное хранилище логику работы с кнопкой и мутировать только его.
>Если вы хотите сделать переход между страницами сайта без перезагрузки, то вам не нужен SPA.
Проиграл. Если вы хотите сделать Single Page Application вам не нужен SPA. Сам свои высеры читаешь?
> Если вы пишете интернет-магазин или развлекательный ресурс с постами и лайками, вам даром не нужен SPA
>Если же вы пишете высокоинтерактивное приложение, например, редактор электрических схем или мобильную версию Инстаграма, то вам пригодится SPA.
Тут даже без комментариев.
>Классы читать гораздо проще.
Когда у тебя в классе есть конструктор и пара методов - несомненно. А вот когда у тебя компонент переваливает за сотню строк все значительно хуже. В функциональщине в таких случаях ты точно знаешь что у тебя за состояние и что за метод его мутировал, а вот в классах...
Когда у тебя в состоянии больше одного поля код превращается в лапшу. Попробуй сделать компонент с 3 считчиками и 3 кнопками, которые увеличивают соответствующий ей счетчик и потом посмотри на количество бойлерплейта. Аналогичная проблема происходит, когда ты пытаешься расширить логику компонента, в функциональном компоненте тебе просто надо один раз написать useState, в классовом тебе надо менять единственное состояние компонента, возможно далеко не в одном месте. Аналогичная проблема в компонентах вуя, которые не используют композишн.
Ну и на последок: классы из-за своей специфики в JS работают медленно.
На собесе спрашивали по синтаксису, фишки ларавела, солид, рест. Никаких задач и кода. Правда было условие, что для отклика нужно приложить свой пет-проект. У меня был простой файлообменник на ларе. Как отправил пет проект, через пол часа уже договорились о собесе, там не ответил на примерно 15% вопросов (по фичам лары в основном), сам собес где-то минут 20 длился, на след день написали с оффером. Было 20 откликов на эту вакансию, но уверен что большинство не посмотрели что нужен петпроект или надеялись без него договориться. Вопросы совсем простые были, я хз в чем сложность у предыдущих кандидатов была, я даже не готовился, это был первый собес, планировал просто узнать какие вообще требования и вопросы, резюме за 15 минут нарисовал
> Я так с cmake не заморачивался как с вебпаком.
Почему бы не использовать cmake вместо вебпака? Нахуя все жрут кактус?
мимо
Потому что в таком случае cmake будет использовать webpack. cmake - это замена gulp или grunt, а не вебпака.
С SSR у него отлично, даже получше чем у рякта с вуем. А вот с изоморфным роутингом дела обстоят не очень...
У вебпака лучше интеграция со всякими фронтовыми штуками, вроде SCSS, JSX/Vue, SVG, транспиляции под старые браузеры.
сколько времени прошло с момента вката до работки?
Доброго времени суток, форумчане. Просветите в вопросе о микросервисах.
Знаю что есть разные протоколы для связи между сервисами, типа http, amqp. И так вот: допустим есть микросервис-шлюз на него делает запрос пользователь(хочет что-то получить). Шлюз в свою очередь дергает нужный микросервис путём помещения job'a в очередь rabbitmq. В итоге обмен данными между сервисами происходит асинхронно, каким тогда образом шлюз должен дождаться ответа от сервиса, чтобы вернуть пользователю?
Я подозреваю что в таких случая общение между сервисами реализуется по другому, например http.
А такой синхронный тип общения между сервисами самый частный получается rabbitmq редко юзается?
Так если ты работаешь, зачем делать какие-то проекты? Просто расскажешь про свой опыт работы, что делал там.
Делаю всего по немногу прост. Так сказать подавашка. Хотелось бы гит заполнить чем-то полноценным. К тому же, в резюме то надо что-нибудь показать. А то на собес и не позовут
А на удалённую работу вкатиться получится?
Ну если ты хочешь заполнить гит, сделай то, что тебе действительно нужно.
По типу - была такая проблема, я решил её так-то. Может ты используешь какую-то либу, можешь написать поверх свой плагин, можешь пул реквестить в неё.
Но если тебе нужен проект ради проекта, можешь просто взять из шапки.
двачую вопрос
В туториале ошибка валидации отображается красным цветом. Почему у меня черный? Как сделать красным?
На stackoverflow есть только один топик с такой проблемой. Решения предлагаются такие
1. В лоб прописать css.
2. Залезть в vendor и нахимичить с ассетом бутстрапа.
Я правильно понимаю, что вторым лучше не заниматься?
Есть ли другие способы кроме прописывания css?
Учусь использовать фреймворки на простых примерах, затем хочу перейти на лару или симфонию.
Ты хоть что нибудь выучи для начала, тебе не о работе надо думать. Первую работу ты найдешь минимум через год обучения. Выдержишь?
Как фрейм вообще можно учить? Это ж не анатомия тебе и не французский язык. Его надо понять и применять. Попробуй-ка выучи для меня набор гаечных ключей, их форму, размерный шаг, допуск до микрона. Ты спросишь, нахуя? Да просто так. Ты скажешь, нет, пошел отсюда нахуй, когда они понадобятся, я просто откручу гайку или болт и все. Так же и тут.
Учить надо пыху или французский, потому что его применение в чистом виде нихуя тебе не даст. Что в разговоре, что в кодировании. Его нужно применять с какой-то целью. Считай, что язык это отдельные слова. А фреймворк это грамматика, словарный запас, пунктуация, и все в одном флаконе. Найди себе француженку и пизди с ней на ларавеле.
Анон, меня ведь не обманывают глаза при поиске вакансий на hh?
Laravel действительно самый популярный фреймоворк в рф на данный момент с которым будет проще всего устроиться?
Без понятия, я никогда в жизни не работал программистом. Более того, я не знаю, что сейчас популярно на галерах. Но твой месседж звучит логично.
С ларавелем иногда возникает ощущение, что в нем ничего нет по сути, как на голой пыхе пишешь.
Самое ценное кверибилдер, некоторые мидлвары по умолчанию, очереди, простенькое DI, как раз такое какое нужно для мелко средних проектов (не в пример симфони). Коллекции - обычно спорят о их нужности, но пользоваться ими легко.
Научился пользоваться моделями и кверибилдером, который возвращает коллекцию моделей - понял 50% ларки. Главное разобраться как модели устроены и работают с данными из запросов с помощью магических методов (все данные в модели хранятся в массиве атрибутов).
полезные утилиты config, env, app_path, storage_path и др.
Миграции
Все остальное вторично. Всякие там форм реквесты.
Гуглил плохо. Но авторизацию на jwt делать плохо. jwt хорош кода имеет короткий срок гидности и тебе не нужно рефреш токены всякие выдумывать.
Аутентификации и авторизации точнее. Для авторизации однократных действий жвт подходит. Например схема с жвт авторизацией
1) Фронтенд проходит обычную сессионную аутентификацию на ларке. У фронтенда есть кукисы что пользователь залогинен.
2) Есть микросервис, который тоже торчит в интернет. Например отправка сообщений в телегу. Микросервис не должен позволять отправлять сообщения кому попало. Но микросервис сам не занимается авторизацией пользователя на отправку.
3) Фронтенд говорит ларке дай жвт на отправку сообщения. Поскольку фронт аутентифицирован в ларкиной сессии, он получает жвт
4) Фронтенд посылает команду микросервису отправить сообщение и дает ему этот жвт.
5) Микросервис делает запрос ларке на проверку жвт. Если все ок то микросервис отправляет сообщение в телегу.
6) Все этот жвт больше не нужен.
Урлы
Человека, который не написал ни одного крупного проекта на чистой пыхе видно издалека.
Шито поделать, издалека мы, нехрамотные.
При большом желании да, но советую все же потратить некоторое время на изучение css.
Что там изучать? Просто смотришь какие стили тебе надо и копипастишь.
Гайд по вкату в шапке треда актуален?
Планирую вкатываться, но по php как то мало гайдов. В основном все дрочат фронтенд, там каждый пук обсосан до мелочей
Озон таки стал челочником
Популярный - да, насчет проще устроится только если 10 лет опыта
Yii-шник с полугодовалым стажем, планирую сваливать на ларку. Взяли на первую работу после курсов от webformyself (есть на ютуб), когда предоставил в качестве резюме магаз оттуда. Yii для старта конечно подойдёт, но вот потом начинаешь задумываться о более вкусных штуках, особенно когда скроллишь hh. Так что советую подумать, оно тебе надо?
Сколько учился до первой работы, если не секрет?
https://www.chitai-gorod.ru/catalog/book/1095225/
Если нет, что можете посоветовать?
Сорри за копи-пост с ньюфаг-треда, надо уже к завтрашнему дню подобрать книгу в подарок.
По пхп нет хороших книг практически нет хороших книг. Но если выбирать я бы взял эту
https://www.ozon.ru/product/sovremennyy-php-novye-vozmozhnosti-i-peredovoy-opyt-lokhart-dzhosh-217051423/?asb=jvSXlR5ILLtXWpqyMn1bYJPNwxETYOg%2BMq8Aukm2sTs%3D&asb2=vNEMnokii4cxfw2ScATHSC90pRDaBiX9LsTM4cMoeCi9AhM0qvDzkaPVcQNFGvRd&keywords=php&sh=31JBDBcJsA
>>369065
>cli
НИ В КОЕМ СЛУЧАЕ НЕ ИСПОЛЬЗУЙ!
Используй официальный тулинг в виде vite, который разрабатывается самим автором vue. Он, кстати, поддерживает не только vue.
https://vitejs.dev/guide/
Главное не используй cli. Это не просто мусор весом в несколько сотен мегабайт, туда еще и периодически всякие трояны попадают. гугли node-ipc
addEventListener('click', ()=>{вызываешь vue компонент })
Насколько сильно с 2018 года laravel изменился? Будут ли у меня в 2к22 году тонны ошибок из-за того, что я пытаюсь запустить старый код 2018 года?
Посмотри какая версия laravel в курсе и устанавливай ту же
Главное - насколько ты сильно изменился с 2018 года.
vue, который был в 2018 уже не котируется
Ларка-то 5 от 9 не прям особо сильно отличается отличается, конечно, в дохуя местах, но основа та же самая по сути своей и синтаксис не менялся, а вот вуй...
Создаю кастомное правило валидации что запись существует в бд можно было бы конечно дефолтный exists сделать но там бы спагетти получлось и прикол в том что первичный ключ это uuid. И если формат неверный, то мое правило все равно пытается отработать и закономерно 500 ошибка что uuid имеет неверный формат. Как правильно поправить?
Сначала проверять, что пришёл валидный uuid https://laravel.com/docs/9.x/validation#rule-uuid, и уже потом искать в бд?
https://laravel.com/docs/9.x/validation#stopping-on-first-validation-failure
Можно сделать, чтобы валидация выбрасывала ошибку на первом же сработавшем правиле, по дефолту все правила прогоняются.
Не совсем подходит. Я короче заимплиментил какой то там интерфейс и у меня в правило валидатор записывается. И там я уже проверяю есть ли ошибка или нет.
В любом случае спасибо за отклики.
SSR не предлагать, слишком жирно получится для моего небольшого сайтика.
Тавтология получилась. В общем, тебе надо при загрузке страницы сразу запускать полный её рендер, без ожидания асинхронных запросов и подобного
>Сроков как таковых нет
Сроки ставят либо на типовые задачи, либо отбитые долбоёбы с фриланс-бирж всем подряд. Если пишешь кастомный функционал, то никакие сроки тебе ставить не будут - как их считать то? Ну скажут тебе неделю на какую-то таску, а там неучтены костыли будут, и выйдет 2. И хули толку от этих сроков тогда? Пальцем в небо. Обычно смотрят чтобы ты коммиты делал, а не волынил по неделе.
>мне кажется что если я продолжу вот так писать в среднем 15 строк в день меня уволят нахуй.
Классика, лол.
>Наверное мерить работу в строках неправильно
В закрытых тасках меряют обычно. Таски закрываются значит всё правильно идёт. Остальное от лукавого.
Нахуй ты ссылки пытаешься завернуть не в <a>? Совсем больной?
ответ на твой вопрос буквально на первой ссылке в гугле
>подводные?
no hire с подтвержденным попытом 5 лет, работающими в проде приложухами. Даже не отказывают, а просто собесят и съябывают в закат.
Подводные в том, что все эти знания нужно применять в проекте. Сами по себе они бессмысленны. На собеседовании вопросы задают так: "С вставить нужное работал? А с вставить нужное?"
И только самые отбросы (которые хотят ставку тебе понизить) будут гонять по вопросом пыхи, ларавел джс и т.д.
Все моя субьективщина и опыт, на истину не претендую. Но у меня было так.
>>373582 (Del)
Украина не европа.
Ну слушай, так то и на senior вакансии требования на бумажке совсем не сложные. Такое же знание пхп, ларавел, вью, гит. Но вот опыт работы с этим, вот что важно. Я первую работу нашел спустя примерно 4 месяца, с учетом того, что меня устроил друг. Только через год работы я начал немного понимать, что к чему.
Знания из курсов и роадмапов вообще не пригодились по сути. Советую как можно скорее искать работу, там научишься.
Пройдя парочку курсов на ютубе и изучив основные термины ты тоже нихуя знать не будешь. Порочный круг.
Я и не спорю, сам что-то читаю-смотрю всякую фигню а практики нет толком, и воз и ныне там. Просто говорю, без знакомства вряд ли возьмут.
Ты всегда можешь сделать собственный проект для практики. Или посмотреть чьи-то готовые проекты, чтобы увидеть, как это делают другие.
Естественно, что для изучения программирования и развития навыков надо писать код. А чтобы знать, как его писать, надо читать документацию.
Если у тебя нет идей для своего проекта (что маловероятно), можно попросить помощи у анонов.
>>373598
Senior по определению предполагает наличие опыта. Не имея опыта, ты никак не можешь стать Senior, только стажером или джуниором.
Ты можешь применять знания в личных проектах. Вот, для примера, блог одного человека, который решил каждые пару месяцев делать по маленькому и в идеале прибыльному проекту (правда, у него уровень не джуниора и он делал проекты не для поиска работы, но блог сам по себе довольно вдохновляющий): https://tinyprojects.dev/
> будут гонять по вопросом пыхи, ларавел джс и т.д.
Это приходится делать, потому что в резюме все Львы Толстые, а по факту нет.
Личные проекты это не прод. Я хз какой у тебя уровень, раз ты можешь такое сравнивать.
>Это приходится делать
Ну делай, мне с такими не по пути
У меня ощущение, что помеченные синим блоки (nice-to-have) это тоже обязательно. Знать только красные блоки будет маловато. Как это так - знать SELECT, но не знать JOIN. Никуда не годится.
С другой стороны, знать Yii и Wordpress не требуется, если вы с ними не планируете работать.
Не хватает основ линукса и командной строки. Не хватает шаблонизаторов. Не хватает ORM и связанных с ними паттернов: ленивая загрузка, identity map, unit of work.
Насчет паттернов: много бесполезных паттернов вроде registry или service locator, абстрактная фабрика, и мало полезных вроде паттернов для ORM или паттернов для работы с БД (TableGateway, Data Mapper).
Насчет ООП. Тут, увы, материалов по ООП мало (вообще, во многих учебниках и туториалах с ООП беда). В Роадмапе я вижу ООП рассматривается всего лишь с двух сторон:
- синтаксис классов и объектов со ссылкой на документацию
- паттерны проектирования со ссылкой на сайты или книги
Посередине между этими двумя направлениями не хватает важной вещи: самой концепции ООП, понимания, зачем оно нужно, какие плюсы дает, где и как его использовать (без паттернов) и где его использовать не надо, и как его использовать правильно.
Мне это хорошо знакомо, так как я сам, когда начал свою карьеру не знал ООП, а знал только синтаксис. То есть, я знал, что такое класс и объект, как их описывать, создавать, как вызвать методы, но не понимал, зачем они нужны и, подозреваю, успел налепить много кода сомнительного качества. Например, я не понимал, зачем в нашем приложении использовались классы, если можно обойтись без них. Или, если уж мы решили использовать классы, то почему бы не сделать все на статических методах, чтобы не надо было создавать объекты.
Вот этой информации вы не найдете в документации по PHP. Она описывает только синтаксис. И не найдете в книгах по паттернам, так как они рассчитаны на тех, кто уже знает ООП. А если вы полезете в паттерны, не зная ООП, то толком ничего не поймете.
И мне кажется, по этой причине, то есть из-за непонимания, у людей "ООП" ассоциируется с чем-то излишне переусложненным. Хотя это очень полезная и важная идея, улучшающая качество кода.
По ООП роадмап дает ссылку на oodesign, а там по сути рекламируются две книги:
1) Head First OO Analysis & Design. Я пролистал книгу, и она не объясняет что такое ООП, а предполагает, что читатель это уже знает. Примеры кода на Java (она довольно похожа на PHP). В первой же главе есть сеттеры и геттеры, и никто не объясняет, чем они лучше, чем публичные свойства. Опять же, предполагается, что читатель знает про инкапсуляцию.
Также, мне не понравилось, что до начала полезной информации идет более 30 страниц бесполезных вступлений и мотивирующих страниц.
Из нее можно научиться полезным вещам, но решения там не всегда удачные. Например, в первой главе рассматривают пример кода для базы данных гитар с поиском по ним. Идея объединить характеристики гитары и фильтр для поиска к классе GuitarSpec неудачная, так как это не позволяет нам делать поиск по цене, поиск с несколькими значениями одного параметра, и тд. Нужно сделать отдельный объект GuitarFilter.
Пример про магазин гитар хороший, но примеры с дверью для собак очень оторваны от реальности и ООП там не особо и нужен.
У меня ощущение, что помеченные синим блоки (nice-to-have) это тоже обязательно. Знать только красные блоки будет маловато. Как это так - знать SELECT, но не знать JOIN. Никуда не годится.
С другой стороны, знать Yii и Wordpress не требуется, если вы с ними не планируете работать.
Не хватает основ линукса и командной строки. Не хватает шаблонизаторов. Не хватает ORM и связанных с ними паттернов: ленивая загрузка, identity map, unit of work.
Насчет паттернов: много бесполезных паттернов вроде registry или service locator, абстрактная фабрика, и мало полезных вроде паттернов для ORM или паттернов для работы с БД (TableGateway, Data Mapper).
Насчет ООП. Тут, увы, материалов по ООП мало (вообще, во многих учебниках и туториалах с ООП беда). В Роадмапе я вижу ООП рассматривается всего лишь с двух сторон:
- синтаксис классов и объектов со ссылкой на документацию
- паттерны проектирования со ссылкой на сайты или книги
Посередине между этими двумя направлениями не хватает важной вещи: самой концепции ООП, понимания, зачем оно нужно, какие плюсы дает, где и как его использовать (без паттернов) и где его использовать не надо, и как его использовать правильно.
Мне это хорошо знакомо, так как я сам, когда начал свою карьеру не знал ООП, а знал только синтаксис. То есть, я знал, что такое класс и объект, как их описывать, создавать, как вызвать методы, но не понимал, зачем они нужны и, подозреваю, успел налепить много кода сомнительного качества. Например, я не понимал, зачем в нашем приложении использовались классы, если можно обойтись без них. Или, если уж мы решили использовать классы, то почему бы не сделать все на статических методах, чтобы не надо было создавать объекты.
Вот этой информации вы не найдете в документации по PHP. Она описывает только синтаксис. И не найдете в книгах по паттернам, так как они рассчитаны на тех, кто уже знает ООП. А если вы полезете в паттерны, не зная ООП, то толком ничего не поймете.
И мне кажется, по этой причине, то есть из-за непонимания, у людей "ООП" ассоциируется с чем-то излишне переусложненным. Хотя это очень полезная и важная идея, улучшающая качество кода.
По ООП роадмап дает ссылку на oodesign, а там по сути рекламируются две книги:
1) Head First OO Analysis & Design. Я пролистал книгу, и она не объясняет что такое ООП, а предполагает, что читатель это уже знает. Примеры кода на Java (она довольно похожа на PHP). В первой же главе есть сеттеры и геттеры, и никто не объясняет, чем они лучше, чем публичные свойства. Опять же, предполагается, что читатель знает про инкапсуляцию.
Также, мне не понравилось, что до начала полезной информации идет более 30 страниц бесполезных вступлений и мотивирующих страниц.
Из нее можно научиться полезным вещам, но решения там не всегда удачные. Например, в первой главе рассматривают пример кода для базы данных гитар с поиском по ним. Идея объединить характеристики гитары и фильтр для поиска к классе GuitarSpec неудачная, так как это не позволяет нам делать поиск по цене, поиск с несколькими значениями одного параметра, и тд. Нужно сделать отдельный объект GuitarFilter.
Пример про магазин гитар хороший, но примеры с дверью для собак очень оторваны от реальности и ООП там не особо и нужен.
>Посередине между этими двумя направлениями не хватает важной вещи: самой концепции ООП, понимания, зачем оно нужно, какие плюсы дает, где и как его использовать (без паттернов) и где его использовать не надо, и как его использовать правильно.
>Вот этой информации вы не найдете в документации по PHP. Она описывает только синтаксис. И не найдете в книгах по паттернам, так как они рассчитаны на тех, кто уже знает ООП. А если вы полезете в паттерны, не зная ООП, то толком ничего не поймете.
Меткое наблюдение, и где вот этот промежуточный слой добывать, методом собственных проб и ошибок?
От 50 до 200-400 за 8 часов. 50, если ты значительную часть времени занимался проектированием или реверс-инжинирингом.
>>371457
Что у тебя за сайт, что тебе понадобился клиентский рендеринг? Блог? Интернет-магазин? Корпоративный сайт? Там выгоднее рендерить все на сервере. SPA там не нужен, он только ухудшит скорость загрузки и удобство пользования сайтом. И поисковую оптимизацию.
SPA это не только плюсы, но и минусы, и надо их взвешивать, прежде чем использовать.
Если же ты делаешь не сайт, а какое-то приложение, например, редактор смешных картинок или генератор цветовых схем, то конечно, выгодно реализовать приложение на клиенте. Но опять же, может быть не надо весь сайт заворачивать в SPA, а только блок с генератором цветовых схем.
Для продвижения в поисковых системах ты делаешь рендерящиеся на сервере текстовые страницы с описанием твоего чудо-приложения, или например, страницы с популярными цветовыми схемами. А сам редактор индексировать и оптимизировать не надо. Ты же не думаешь, что Гуглобот зайдет к тебе и будет там двигать рычажки для подбора цветов? Гуглобот будет индексировать лишь страницы популярных цветовых схем.
То есть, у меня ощущение, что SSR мало когда нужен. Для классических сайтов с текстом и картинками мы рендерим все на сервере и отдаем HTML. А для приложений не нужна индексация интерактивной части приложения в поисковике, достаточно индексировать текстовые страницы и сгенерированный контент.
Или в том же интернет-магазине ты можешь сделать каталог и страницы товаров на серверных технологиях, а блок оформления заказа на интерактивных технологиях. И этот блок как раз индексировать не требуется. То есть, SSR тут тоже не нужен.
Если у тебя что-то промежуточное, например, аналог Инстаграма, то тут придется извернуться, чтобы картинки и индексировались гуглом, и просматривались через SPA. Инстаграм, как я понимаю, генерирует для Гугла отдельную страницу для каждого пользователя. То есть, он отдает Гуглу только контент (картинки), но не приложение с лентой, лайками, комментариями, подписками.
От 50 до 200-400 за 8 часов. 50, если ты значительную часть времени занимался проектированием или реверс-инжинирингом.
>>371457
Что у тебя за сайт, что тебе понадобился клиентский рендеринг? Блог? Интернет-магазин? Корпоративный сайт? Там выгоднее рендерить все на сервере. SPA там не нужен, он только ухудшит скорость загрузки и удобство пользования сайтом. И поисковую оптимизацию.
SPA это не только плюсы, но и минусы, и надо их взвешивать, прежде чем использовать.
Если же ты делаешь не сайт, а какое-то приложение, например, редактор смешных картинок или генератор цветовых схем, то конечно, выгодно реализовать приложение на клиенте. Но опять же, может быть не надо весь сайт заворачивать в SPA, а только блок с генератором цветовых схем.
Для продвижения в поисковых системах ты делаешь рендерящиеся на сервере текстовые страницы с описанием твоего чудо-приложения, или например, страницы с популярными цветовыми схемами. А сам редактор индексировать и оптимизировать не надо. Ты же не думаешь, что Гуглобот зайдет к тебе и будет там двигать рычажки для подбора цветов? Гуглобот будет индексировать лишь страницы популярных цветовых схем.
То есть, у меня ощущение, что SSR мало когда нужен. Для классических сайтов с текстом и картинками мы рендерим все на сервере и отдаем HTML. А для приложений не нужна индексация интерактивной части приложения в поисковике, достаточно индексировать текстовые страницы и сгенерированный контент.
Или в том же интернет-магазине ты можешь сделать каталог и страницы товаров на серверных технологиях, а блок оформления заказа на интерактивных технологиях. И этот блок как раз индексировать не требуется. То есть, SSR тут тоже не нужен.
Если у тебя что-то промежуточное, например, аналог Инстаграма, то тут придется извернуться, чтобы картинки и индексировались гуглом, и просматривались через SPA. Инстаграм, как я понимаю, генерирует для Гугла отдельную страницу для каждого пользователя. То есть, он отдает Гуглу только контент (картинки), но не приложение с лентой, лайками, комментариями, подписками.
Документация по bootstrap чем плоха? Там как раз готовые примеры кода, которые можно копировать.
Что касается колонок, то что там копировать? Ты просто на глаз смотришь, сколько на сайте колонок, и делаешь столько же.
>>369673
Без ООП и паттернов работы с БД за Ларавель браться нельзя. Это не фроеймворк для не знающих ООП или ORM.
>>366756
Честно говоря, выглядит как антипример для микросервисов. Вместо того, чтобы слать все запросы на один и тот же бекенд, мы делаем несколько бекендов и количество запросов от этого увеличивается, а как и увеличивается шаткость и оверинжиниренность такой конструкции.
Я думаю, что твой пример больше бы подошел для случая, когда один сайт дает другому разрешение что-то сделать. Иначе описанная тобой схема просто не имеет смысла.
Насчет разеделения на фронтенд-бекенд: это зависит от того, какой у тебя сайт. Если ты сам не понимаешь, зачем нужно разделять, то наверно в твоем случае это не нужно.
То есть, никто не начинает писать фронтенд на вью потому, что это модно. Обычно для этого есть какая-то важная причина.
Например, ты пишешь приложение для подбора цветовых схем и без использования вью получается куча лапши, которую ты хотел бы упростить за счет грамотного применения архитектуры MVC и data-binding. Даже в этом случае, возможно, что ты сделаешь не все приложение на SPA, а лишь интерактивный блок с редактором схем.
> Как мне сделать jwt авторизацию в данном случае?
При логине фронтенд отправляет на бекенд запрос на авторизацию. В запросе содержится логин и пароль. В ответе от сервера приходит JWT токен с содержимым вроде { "id": id пользователя, "issued": время выдачи }.
После этого фронтенд добавляет этот токен во все запросы, которые требуют авторизации.
Никакого рефреша не нужно. Если ты хочешь, чтобы пользователь никогда не перелогинивался, то разрешаешь использовать токен вечно. Если хочешь чтобы он логинился заново каждый месяц, то ставишь соответствующее ограничение и отказываешься принимать слишком старый токен.
Набор гаечных ключей "учить" не надо. А набор сверл или фрез? А станок с ЧПУ? Или ты предлагаешь взять первую попавшуюся фрезу (не зная, для каких материалов она подходит) и нажимать случайные кнопки на станке?
Ты долго на работе не задержишься с таким подходом.
То, что в папке vendor это сторонние библиотеки и править там что-то просто глупо. Так как при обновлении библиотеки все твои правки будут перезаписаны.
В твоем случае, скорее всего эту надпись выводит какой-то виджет, который отвечает за вывод полей формы. Тебе надо посмотреть, какие классы и правила CSS применены к этой надписи, узнать, как можно заменить стили форм на свои, и в своих стилях прописать нужные тебе правила.
>>364965
А зачем в твоем примере rabbit? Его добавление выглядит как лишнее усложнение. Проще отправлять запросы напрямую.
Очереди событий, однако, имеет смысл использовать для надежного сохранения каких-то данных, если сами сервисы ненадежные. Например, ты пишешь госуслуги и у тебя есть сервис обработки заявлений на смену налогообложения. Сервис кривой и ненадежный, и если ты передаешь заявление пользователя в него, то он легко может его потерять.
Здесь мы используем очередь. Мы кладем заявление пользователя в очередь, а сервис налогообложения берет его из очереди и, если заявление успешно обработано, помечает заявление выполненным. А если сервис не смог обработать и упал, то заявление остается в очереди. Теперь заявление не потеряется.
Заметь, что если твой сервис надежный, то очередь становится не нужна. Но скорее всего сервис надежный как раз потому, что внутри него уже организована очередь - может не на основе rabbitmq, а например, в базе данных, но это все равно очередь с точки зрения архитектуры. И потому вторая очередь тут не нужна.
Другой пример использования очередей - фоновая обработка задач. Пользователь загружает на сайт видео, и тебе надо его конвертировать, но это медленно. Ты добавляешь задачу на конвертацию в очередь, и фоновый скрипт рано или поздно дойдет до нее и выполнит. А если не выполнит, то задача останется в очереди. Опять же, вместо rabbit ты можешь использовать очередь на основе БД.
То есть, попробуй при проектировании подумать, зачем тебе нужна очередь и что она дает. Никто не проектирует архитектуру наугад, каждое решение на чем-то основывается, есть причина, почему делают так, а не иначе.
То, что в папке vendor это сторонние библиотеки и править там что-то просто глупо. Так как при обновлении библиотеки все твои правки будут перезаписаны.
В твоем случае, скорее всего эту надпись выводит какой-то виджет, который отвечает за вывод полей формы. Тебе надо посмотреть, какие классы и правила CSS применены к этой надписи, узнать, как можно заменить стили форм на свои, и в своих стилях прописать нужные тебе правила.
>>364965
А зачем в твоем примере rabbit? Его добавление выглядит как лишнее усложнение. Проще отправлять запросы напрямую.
Очереди событий, однако, имеет смысл использовать для надежного сохранения каких-то данных, если сами сервисы ненадежные. Например, ты пишешь госуслуги и у тебя есть сервис обработки заявлений на смену налогообложения. Сервис кривой и ненадежный, и если ты передаешь заявление пользователя в него, то он легко может его потерять.
Здесь мы используем очередь. Мы кладем заявление пользователя в очередь, а сервис налогообложения берет его из очереди и, если заявление успешно обработано, помечает заявление выполненным. А если сервис не смог обработать и упал, то заявление остается в очереди. Теперь заявление не потеряется.
Заметь, что если твой сервис надежный, то очередь становится не нужна. Но скорее всего сервис надежный как раз потому, что внутри него уже организована очередь - может не на основе rabbitmq, а например, в базе данных, но это все равно очередь с точки зрения архитектуры. И потому вторая очередь тут не нужна.
Другой пример использования очередей - фоновая обработка задач. Пользователь загружает на сайт видео, и тебе надо его конвертировать, но это медленно. Ты добавляешь задачу на конвертацию в очередь, и фоновый скрипт рано или поздно дойдет до нее и выполнит. А если не выполнит, то задача останется в очереди. Опять же, вместо rabbit ты можешь использовать очередь на основе БД.
То есть, попробуй при проектировании подумать, зачем тебе нужна очередь и что она дает. Никто не проектирует архитектуру наугад, каждое решение на чем-то основывается, есть причина, почему делают так, а не иначе.
>>Классы читать гораздо проще.
> Когда у тебя в классе есть конструктор и пара методов - несомненно. А вот когда у тебя компонент переваливает за сотню строк все значительно хуже. В функциональщине в таких случаях ты точно знаешь что у тебя за состояние и что за метод его мутировал, а вот в классах...
Я ничего не понял. Если ты напишешь компонент на 1000 строк, используя useState, он вряд ли будет легче для понимания, чем ООП-компонент на 1000 строк. Решение тут состоит в том, чтобы не писать слишком большие компоненты, а не заменить ООП на его имитацию через костыли.
> Попробуй сделать компонент с 3 считчиками и 3 кнопками, которые увеличивают соответствующий ей счетчик и потом посмотри на количество бойлерплейта
В ООП мы можем вынести логику подсчета в класс Counter и создать три экземпляра класса:
class DemoComponent {
#counter1 = new Counter(this);
#counter2 = new Counter(this);
#counter3 = new Counter(this);
render() {
...
}
}
Не вижу, чтобы этот код был бы сложнее чем код с использованием useEffect/useState. По моему, он даже проще.
Про расширение компонента я не очень понял, где это надо и как тут хуки могут помочь.
> классы из-за своей специфики в JS работают медленно.
Это же просто неправда. Я буквально вчера читал вот это вот описание, как работа с объектами оптимизируется в вебките: https://webkit.org/blog/10308/speculation-in-javascriptcore/
Классы и объекты в JS очень хорошо оптимизируются, если ты не пытаешься на лету создавать или удалять свойства и методы, а определяешь их один раз заранее.
ООП наоборот логичнее, так как ты в нем создаешь все поля и методы один раз при создании объекта, а с хуками ты объявляешь поля заново при каждом вызове функции рендеринга. Это просто противоречит здравому смыслу.
>>Классы читать гораздо проще.
> Когда у тебя в классе есть конструктор и пара методов - несомненно. А вот когда у тебя компонент переваливает за сотню строк все значительно хуже. В функциональщине в таких случаях ты точно знаешь что у тебя за состояние и что за метод его мутировал, а вот в классах...
Я ничего не понял. Если ты напишешь компонент на 1000 строк, используя useState, он вряд ли будет легче для понимания, чем ООП-компонент на 1000 строк. Решение тут состоит в том, чтобы не писать слишком большие компоненты, а не заменить ООП на его имитацию через костыли.
> Попробуй сделать компонент с 3 считчиками и 3 кнопками, которые увеличивают соответствующий ей счетчик и потом посмотри на количество бойлерплейта
В ООП мы можем вынести логику подсчета в класс Counter и создать три экземпляра класса:
class DemoComponent {
#counter1 = new Counter(this);
#counter2 = new Counter(this);
#counter3 = new Counter(this);
render() {
...
}
}
Не вижу, чтобы этот код был бы сложнее чем код с использованием useEffect/useState. По моему, он даже проще.
Про расширение компонента я не очень понял, где это надо и как тут хуки могут помочь.
> классы из-за своей специфики в JS работают медленно.
Это же просто неправда. Я буквально вчера читал вот это вот описание, как работа с объектами оптимизируется в вебките: https://webkit.org/blog/10308/speculation-in-javascriptcore/
Классы и объекты в JS очень хорошо оптимизируются, если ты не пытаешься на лету создавать или удалять свойства и методы, а определяешь их один раз заранее.
ООП наоборот логичнее, так как ты в нем создаешь все поля и методы один раз при создании объекта, а с хуками ты объявляешь поля заново при каждом вызове функции рендеринга. Это просто противоречит здравому смыслу.
>>Если вы хотите сделать переход между страницами сайта без перезагрузки, то вам не нужен SPA.
> Проиграл. Если вы хотите сделать Single Page Application вам не нужен SPA. Сам свои высеры читаешь?
Для перехода между страницами без перезагрузки достаточно добавить известную библиотеку на десяток килобайт, которая перехватывает клики по ссылкам и грузит страницы аяксом. Мы получаем переходы без перезагрузки, отличную поисковую оптимизацию, не написав ни строчки клиентского кода.
Вконтакте, если мне не изменяет память, когда-то работал по такой схеме.
А ты, судя по ответу, думал, что навигацию без перезагрузки без многомегабайтного SPA и API не реализовать? Можно только пожалеть тех, кто тратит деньги и время там, где это не требуется.
>>- очень медленная начальная загрузка, требующая передачи огромного объема данных
>Решается SSR
Мы придумали себе проблему и героически ее решаем.
>>разработчики не умеют правильно проектировать API, чтобы при переходах между страницами отправлялся бы единственный запрос, а не много
> Решается http/2
Это не поможет, если следующий запрос зависит от предыдущего.
> Не согласен. Ты в любом случае будешь писать клиентское приложение (html + js+css) и бэк (любой язык на твой выбор).
Да, только вывод данных на стороне сервера проще, так как нам не надо делать никаких аякс-запросов, нам не нужно никакое хранилище, не нужно поддерживать его в корректном состоянии ит.д. То есть, вывести профиль пользователя на сервере в разы проще, чем на клиенте.
Личные проекты вместе с изучением документации и туториалов дадут достаточный для джуниора уровень.
>>Это приходится делать
> Ну делай, мне с такими не по пути
Тебе не по пути с компаниями, которые хотят отбирать только компетентных специалистов и отказывают тем, у кого нет достаточных знаний? Которые нанимают только лучших из имеющихся на рынке? (задумчиво чешущий подбородок смайлик)
>>374409
Не знаю. Попробуй читать разные уроки, книги и туториалы и может быть в сумме ты наскребешь что-нибудь.
По многим темам нет хороших уроков, например по HTTP на русском я как-то искал информацию и ничего толком не нашел. По концепциям ORM тоже нету ничего.
А если тебе нужно вывести профиль пользователя, чат и проводки из бухучета, а на другой странице чат, баланс и интерактивные видоуроки по системе, а если нажимаешь на кружочек сверху, то чат уезжает в угол и счезает , а вместо чата открывается профиль пользователя, а если в проводках нажмешь на символ человечка, то открывается модальное окно с исхдящим звонком к коллеге, а если коллега начнет редактировать провоки у себя, то ты будешь видеть у себя изменения... абырвалг ... абырвалг ...
>навигацию без перезагрузки без многомегабайтного SPA и API не реализовать?
SPA это и есть навигация без перезагркузки.
Как связаны отбор компетентных специалистов и вопросы по пхп, ларе? Если человек имеет опыт, проекты, нахуя ему знать в чем там отличие =, == и === (как пример).
Я не беру в расчет такие компании как вк, яндекс и подобные. Где кандидатов куча и они отсеивают их алгоритмами, которые в работе не применяешь
бери и пиши (при наличии знаний должно занять пару часов), что тебе ннада?
нахуя что?
Могу предположить несколько вариантов:
1. Попробуй использовать App без первого слэша.
2. Сначала require, потом всё остальное.
путь то покажи слева. неправильный роут указал, нет там контроллера
В чем там дело-то было? Я этих композиторов даже не касался пока, тут просто бы разобраться с базой.
А зачем это вообще делать?
Небось в композер.жсон забыл корень автолоада указать, да?
Я так понимаю самое сложное это доказать что ты не верблюд и пройти собес?
Неплохая идея. Если ты опубликуешь код на Гитхабе или где-нибудь еще, то я могу раскритиковать его и указать, что можно исправить.
Для более глубокого понимания разработки я бы советовал так же покрывать код тестами. Они тебе помогут убедиться, что код написан правильно и помогут обнаружить проблему, если ты вдруг при рефакторинге что-то сломаешь.
Вкатунам тесты кажутся чем-то нереально сложным, обычно. Вряд ли он это будет делать.
Хотя ничё вообще сложного в этом нет. Достаточно видосиков посмотреть немного.
ну естественно то над чем ты сейчас работаешь ты будешь тестировать (дебажить) через дебаг или вручную. тесты не для этого - тесты для поддержания кода. чтобы последующие правки ничего не поломали. к тому же они документируют код, по тесту можно понять чего ждет (и не ждет) метод. плюс в системах со сложными связями это может помочь, т.к. иногда при правках одного места ломается другое, а заметить сразу не выходит. а тут поправили че надо, запустили юнит тесты и убедились в том, что вероятно все нормально
но то что нерабочий тест бесполезен это правда, и на поддержание тестов тоже нужны ресурсы и время, которое иногда выделить сложно..
Это 1 хай проект
Насчет неймспейсов, можешь почитать урок https://github.com/codedokode/pasta/blob/master/php/autoload.md если остались какие-то непонятные моменты.
Насчет фреймворка, то вот на что стоит обратить внимание:
Ты в composer.json использовал и auto-load, и autoload и require. Чтобы не сомневаться, открой документацию по composer https://getcomposer.org/doc/04-schema.md и проверь, какие ключи там можно использовать в конфиге. Удали некорректные ключи.
> class Request{
> public function getPath(){
> $path = $_SERVER['REQUEST_URI'] ?? '/';
Это не очень правильно, точнее совсем не правильно. У тебя класс Request всегда берет данные из глобальных переменных. Это значит, что ты к примеру не можешь создать Request с какими-то вручную заданными данными. Более того, непонятно вообще в чем тогда смысл создавать объект Request, если можно было просто сделать функции вроде getPath(), которые делают то же самое.
Лучше будет, если в Request данные будут храниться в полях и будет можно создать его как с вручную заданными параметрами, так и на основе глобальных переменных. Ты можешь посмотреть на класс Request из Симфони: https://github.com/symfony/symfony/blob/6.2/src/Symfony/Component/HttpFoundation/Request.php#L290
Также, советую ставить тайп-хинты у функций, указывать типы аргументов и возвращаемых значений. Это повысит читабельность кода и позволит быстрее обнаруживать ошибки.
> $path = substr($path, 0, $possition);
Для этого есть стандартная функция parse_url().
> if($callback === false){
> echo "404";
При ошибке 404 надо не выводить на экран число 404, а отдавать правильные заголовки с кодом 404. Но в любом случае, это не задача роутера что-то выводить. Логичнее было бы вызвать какой-то заранее определенный обработчик.
Вообще, роутер ничего не выводит. Он лишь определяет, какой обработчик надо вызвать. Если твой роутер не только разбирает URL, но и вызывает обработчик, то это правильнее называть Front Controller.
Насчет Yii, ты можешь изучить его для начала как относительно простой фреймворк, но если ты захочешь взять что-то посовременнее, то есть микрофреймворк Slim и Symfony.
Насчет неймспейсов, можешь почитать урок https://github.com/codedokode/pasta/blob/master/php/autoload.md если остались какие-то непонятные моменты.
Насчет фреймворка, то вот на что стоит обратить внимание:
Ты в composer.json использовал и auto-load, и autoload и require. Чтобы не сомневаться, открой документацию по composer https://getcomposer.org/doc/04-schema.md и проверь, какие ключи там можно использовать в конфиге. Удали некорректные ключи.
> class Request{
> public function getPath(){
> $path = $_SERVER['REQUEST_URI'] ?? '/';
Это не очень правильно, точнее совсем не правильно. У тебя класс Request всегда берет данные из глобальных переменных. Это значит, что ты к примеру не можешь создать Request с какими-то вручную заданными данными. Более того, непонятно вообще в чем тогда смысл создавать объект Request, если можно было просто сделать функции вроде getPath(), которые делают то же самое.
Лучше будет, если в Request данные будут храниться в полях и будет можно создать его как с вручную заданными параметрами, так и на основе глобальных переменных. Ты можешь посмотреть на класс Request из Симфони: https://github.com/symfony/symfony/blob/6.2/src/Symfony/Component/HttpFoundation/Request.php#L290
Также, советую ставить тайп-хинты у функций, указывать типы аргументов и возвращаемых значений. Это повысит читабельность кода и позволит быстрее обнаруживать ошибки.
> $path = substr($path, 0, $possition);
Для этого есть стандартная функция parse_url().
> if($callback === false){
> echo "404";
При ошибке 404 надо не выводить на экран число 404, а отдавать правильные заголовки с кодом 404. Но в любом случае, это не задача роутера что-то выводить. Логичнее было бы вызвать какой-то заранее определенный обработчик.
Вообще, роутер ничего не выводит. Он лишь определяет, какой обработчик надо вызвать. Если твой роутер не только разбирает URL, но и вызывает обработчик, то это правильнее называть Front Controller.
Насчет Yii, ты можешь изучить его для начала как относительно простой фреймворк, но если ты захочешь взять что-то посовременнее, то есть микрофреймворк Slim и Symfony.
Без тестов очень неудобно. Например, ты поменял класс, который используется в нескольких местах и теперь должен протестировать вручную кучу функционала.
А если ты захочешь сделать большой рефакторинг, то может понадобиться перетестировать вообще все приложение.
Или ты захочешь обновиться с PHP7 на PHP8, опять же, надо все вручную перепроверять.
Или ты написал модуль, и хочешь, чтобы его кто-то другой не сломал. Опять же, тесты тут помогут.
Отсутствие тестов приводит к тому, что разработчики боятся делать какие-то большие изменения, а просто дописывают свой код, не заботясь об архитектуре.
хех, ты исправил папку где я уже не работал, я на время отложил разработку мвс фреймврка из за того что мало что пока знаю, уже сегодня-завтра перепишу по новой всё, что бы выглядело нормально
>Насчет неймспейсов
да с этим я уже разобрался не беда
>Также, советую ставить тайп-хинты у функций
да я хотел колегу спросить про это, просто не знал как они зовуться, теперь знаю, уже нашёл статью на хабре и буду изучать
>При ошибке 404 надо не выводить на экран число 404, а отдавать правильные заголовки с кодом 404. Но в любом случае, это не задача роутера что-то выводить. Логичнее было бы вызвать какой-то заранее определенный обработчик.
ну, для себя для теста я пока сделал так, что бы было ясно, на продакшене я конечно же делаю иначе
>Насчет Yii, ты можешь изучить его для начала как относительно простой фреймворк
да я уже заметил, я уже на 6 уроке, тобишь почти прошёл, буду ещё доку читать и разбираться более глубоко, в yii2 прям досконально хорошо реализована модель мвс
>то есть микрофреймворк Slim и Symfony
да, их я тоже буду изучать, я впринцыпе не так давно изучаю пыху, а точнее две недели, потому не так много знаю, времени у меня до сетября, думаю за это время освоюсь
Я впринцыпе довольно сильно зайнтересован в изучений пыхи потмоу планирую много времени изучать
Не знаю как правельнее выразиться, но скажу как есть
дай свои контакты телеги/слаки/матрикс/что угодно, я буду переодичестки писать и спрашивать всякую интеерсную хуйню, я вижу ты кое что да знаешь. будет интересно попиздеть, если что заранее модешь написать мне в телегу @suityan
function emailExists($email)
{
$conn = new mysqli('localhost', 'root', 'somePass', 'Students');
return $conn->query("Select case when exists(select * from students where email='$email')
then cast(1 as bit)
else cast(0 as bit) end ;");
}
Однако выдает ошибку синтаксиса sql near 'bit) else cast(0 as bit) end' at line 2.
В чем собственно ошибка и как ее можно исправить?
А как в таком случае определить зависимость от запроса в бд?
То есть мне нужно, чтобы функция возвращала true при наличии записи с указанной почтой, и соответственно false при ее отсутствии.
Сделал так в итоге, сяп за помощь)
$search=$conn->query("select * from students where email='$email';");
return$search->num_rows;
Ты можешь просто посчитать, сколько записей в базе есть с такой почтой. Если 0, то email не занят. Если 1 или больше, то занят.
То есть не надо писать сложную логику в запросе, когда проще получить количество и проверить его средствами PHP.
Прочитай урок про SQL инъекции: https://github.com/codedokode/pasta/blob/master/security/sql-injection.md
Вы понимаете что сейчас рыночек схлопнулся, и если вы не мид+ от 3х лет, то конкуренция очень большая.
Требуются знающие кадры чтобы сходу делать упругие вещи, там задачи реально не тривиальны.
https://spb.hh.ru/employer?hhtmFrom=main
с подобным уровнем самостоятельности тебе непросто будет не то что даже найти роботу, а элементарно жизненные вопросы какие-то решать
Я написал резюме, лежит на hh и ждёт пока его прочтут, просто мне кажется что оно хуевое
а ваще мне настолько похуй стало на поиск стажировок на пыхомакакена, что я просто уже f# дрочить стал фор фан. именно фарш, который вообще не выстрелит
дотнет говно для пидоров.
Да у меня вообще старая пыха там, 7я.
здоровья котику :3(перевод получил?)
Если ты не наживаешься на доверчивых людях, то сделай себе кредитку (в Тинькофф например тебе просто на следующий день после заполнения формы на сайте привезут домой и можно уже пользоваться) или подключи овердрафт на дебетовой карте и возьми эти жалкие 1300 рублей, за займ на 6 дней даже проценты платить не придётся, сколько взял столько вернёшь.
Смотри офисные вакансии за прелелами ДСов - там конкуренции как не было так и нет.
Подскажите, пожалуйста, самую простую SQL инъекцию для тестирования поля
Чет не слишком ли радикально базу удалять? Хотя почти просто, согласен
точно,спасибо
https://www.php.net/manual/ru/function.mysql-query
RTFM
Все PDO юзают сейчас, насколько я знаю.
Так расчёты верны.
На торрентах - дмитрий лаврик php и альберт степанцев profit
Там как раз mvc пилят с нуля по типу yii2. ORM которая возвращает объекты, view на основе буферизации с $this->render('main', ['model' => $model])
На пике Visual studio? Если на пиратку поставить оно мне винду не заблокирует проверкой?
Это полу-опенсорсный VSvode, ничего не заблокирует
>На нем никто уже не пишет
Пишут. Глупо отказываться от такого простового фреймворка у которого все есть без пердолинга.
>Изучи html
Кстати есть какой-нибудь хороший сжатый справочник-памятка? Я как-то по верхам нахватался и часто путаю/забываю вещи. inb4 htmlbook
Вообще без разницы, это просто инструмент, который будешь использовать. Важно понимание как оно работает просто. А по фреймворку базовые вещи за вечер освоить можно.
Если фанбой какой-то то можно так достаточно долго в скорлупе просидеть, но это ваше дело
И css тоже?
>vs code
Целый день пытался включить там дебаггер для пыхи, в конце концов настроил, но как им пользоваться так и не научился.
В этой задаче в учебнике под спойлером есть правильная цифра - 61270 р.
В твоей программе явно ошибка. У тебя в предпоследний месяц после уплаты остается долг 4138 р. В следующем месяце ты выплачиваешь его одним платежом, хотя к нему еще должны добавиться процент и комиссия и получится больше 5000.
Попробуй поменять сумму кредита на 4 000 и проверить расчеты вручную. Должно получиться 6123 р.
VS Code бесплатный, но с телеметрией. Заметь, что есть еще VSCodium, в котором вырезана телеметрия, но какие-то расширения могут отсутствовать.
Если ты хочешь писать PHP код в нем, то стоит поставить дополнительные расширения для автодополнения и проверок кода.
.PHP_EOL
Я видел эти гайды, во-первых, у меня open server, а во-вторых, все равно не работало по ним пока я не добавил php.debug.executablePath в settings.json
Он у меня есть. Я так понял, они чисто в конфиге дружатся?
Короче это нужно практике, если приспичит хедер где-то в середине файла вывести?
Во-первых, ты можешь захотеть как-то преобразовать контент перед отдачей. Например, если браузер поддерживает сжатие, то сжать его. Для этого ты накапливаешь контент в буфере и сжимаешь его перед отдачей.
Или может быть, у тебя какой-нибудь древний сайт и ты таким образом редактируешь контент на нем, не трогая его код. Или может быть ты вырезаешь лишние пробелы из HTML.
Во-вторых, представь, что у тебя посередине вывода страницы произошла ошибка. Ты не можешь ничего сделать - ни вывести сообщение об ошибке (так как оно перемешается с кодом страницы), ни вывести страницу целиком. В случае буферизации ты при ошибке можешь показать страницу ошибки, так как ничего еще не отдано, а содержимое буфера просто отбросить.
Но есть и минусы. Без буферизации ты можешь начать отдавать контент гораздо раньше, а с полной буферизацией ты должен сначала сгенерировать страницу целиком, и только потом отдавать. Использование полной буферизации увеличивает время до получения первого байта ответа и замедляет загрузку страницы на время, в течение которого она генерируется.
То есть, без буферизации ты можешь хоть с первой строчки скрипта начинать отдавать данные в браузер, а с буферизацией скрипт должен выполниться до конца, прежде чем что-то будет отдано.
Анон >>381287 (Del) упомянул, что буферизация может ускорить отдачу контента. Такое возможно, но маловероятно. Такое бывает, если ты не используешь буферизацию и твой сервер отдает контент очень медленному клиенту, до которого долго идут данные. То есть, ты в PHP делаешь
echo "<html>";
И PHP стоит и ждет, пока клиент примет и подтвердит получение данных. Но сейчас обычно PHP отдает контент не клиенту напрямую, а в nginx, а nginx принимает данные быстро и охотно, потому такая ситуация маловероятна (и кстати по этой причине nginx способен улучшить производительность сервера).
Что касается кук и заголовков, то обычно во фреймворках их напрямую никто не ставит, а используют объект Response, потому проблемы с их отправкой нету. Буферизация для этого не нужна.
Во-первых, ты можешь захотеть как-то преобразовать контент перед отдачей. Например, если браузер поддерживает сжатие, то сжать его. Для этого ты накапливаешь контент в буфере и сжимаешь его перед отдачей.
Или может быть, у тебя какой-нибудь древний сайт и ты таким образом редактируешь контент на нем, не трогая его код. Или может быть ты вырезаешь лишние пробелы из HTML.
Во-вторых, представь, что у тебя посередине вывода страницы произошла ошибка. Ты не можешь ничего сделать - ни вывести сообщение об ошибке (так как оно перемешается с кодом страницы), ни вывести страницу целиком. В случае буферизации ты при ошибке можешь показать страницу ошибки, так как ничего еще не отдано, а содержимое буфера просто отбросить.
Но есть и минусы. Без буферизации ты можешь начать отдавать контент гораздо раньше, а с полной буферизацией ты должен сначала сгенерировать страницу целиком, и только потом отдавать. Использование полной буферизации увеличивает время до получения первого байта ответа и замедляет загрузку страницы на время, в течение которого она генерируется.
То есть, без буферизации ты можешь хоть с первой строчки скрипта начинать отдавать данные в браузер, а с буферизацией скрипт должен выполниться до конца, прежде чем что-то будет отдано.
Анон >>381287 (Del) упомянул, что буферизация может ускорить отдачу контента. Такое возможно, но маловероятно. Такое бывает, если ты не используешь буферизацию и твой сервер отдает контент очень медленному клиенту, до которого долго идут данные. То есть, ты в PHP делаешь
echo "<html>";
И PHP стоит и ждет, пока клиент примет и подтвердит получение данных. Но сейчас обычно PHP отдает контент не клиенту напрямую, а в nginx, а nginx принимает данные быстро и охотно, потому такая ситуация маловероятна (и кстати по этой причине nginx способен улучшить производительность сервера).
Что касается кук и заголовков, то обычно во фреймворках их напрямую никто не ставит, а используют объект Response, потому проблемы с их отправкой нету. Буферизация для этого не нужна.
Мне надо было сделать <a href='../index.php'>Ссылка</a> чтобы вернуться к корректному файлу скрипта в одной из подпапок, так вот не хотелось бы экспериментировать, а знать правила построения пути к файлам.
https://puzzleweb.ru/en/html/8_links2.php
Все, нашел. Теперь только небольшой вопрос чем отличается просто 'index.php' от './index.php', по идее оба одинаково вызовут из текущей директории файл.
1. Сильно ли порушился внутренний рынок вакансий внутри страны после 24-го? Уменьшились ли зарплаты? Если да, то насколько в среднем?
2. Насколько я понял, php не востребован в Европе/США, но при этом востребован в России и странах СНГ. Действительно ли расклад такой, или я ошибся в своих наблюдениях?
3. Реально ли выйти на вакансию джуниора? Слышал краем уха, что php-джуниоры не нужны, и работодатели в РФ ищут как минимум миддлов.
И я-то в принципе мог бы поработать годик на фрилансе, и соврать, что у меня был коммерческий опыт.
Если бы не одно но: крупные фриланс-биржи уходят из России, а финансовой подушки хватит мне месяцев на 10, не больше.
Если буду пахать часов 9-10 в день без выходных, то смогу ли выйти на позицию джуниора через 10 месяцев, или лучше вкатываться в какой-нибудь другой язык?
Заранее спасибо за ответы и информацию.
мимо просто любитель
По твоей ссылке приведены не все возможные формы относительных URL. Общее правило такое, что мы можем откинуть один или несколько компонентов URL слева и получится относительный URL, например:
http://example.com/page.html?a=1#target - это полный URL
//example.com/page.html?a=1#target - без схемы
/page.html?a=1#target - без authority (хост, порт и авторизация)
?a=1#target
#target - тут остался только последний кусочек от URL
Это расписано тут: https://github.com/codedokode/pasta/blob/master/network/urls.md
Странно, у меня обычно идеи появляются каждый день, но некогда их реализовывать. Правда не идеи коммерческих проектов, а всяких свободных программ и библиотек, или идеи по улучшению существующих программ. Я очень хорошо научился замечать всякие недоработки в программах и интерфейсах и у меня обычно всегда есть идеи, что можно улучшить.
Впрочем, иногда их удается реализовать. Например, я недавно задался вопросом: какие слова и сочетания слов мы чаще всего используем в коде? Проанализировал код большого проекта, выбрал самые часто встречающиеся сочетания и добавил их как сниппеты в редактор. На все это ушло несколько часов.
Например, напечатав prifqi я получаю
private function |(): ?int {
}
pri значит private, f - function, q = ?, i = int
Кстати, самые часто употребляемые слова это $this-> и return. Я сделал для них сниппеты с буквами t и r. Ну и дополнительные сочетания вроде rn для return null.
Тут конечно анон может возразить, что в профессиональных IDE уже встроены хорошие подсказки, Нужно всего лишь купить такую IDE, но их проблема в том, что они очень общие и там есть куча ненужных функций, так что если ты начнешь писать rn, то тебе скорее всего вывалился куча нерелевантных подсказок вроде редко используемых PHP-функций.
Я даже поймал себя на мысли, что может быть имеет смысл это как-то автоматизировать, чтобы IDE анализировала проект и автоматически выдавала самые вероятные подсказки (используя теорию вероятности) вместо редко используемых функций или классов.
Ну и может тебе будет интересно почитать блог, человек создает всякие простые проекты и даже с некоторых пытается заработать какую-то копеечку: https://tinyprojects.dev/projects
> Насколько я понял, php не востребован в Европе/США, но при этом востребован в России и странах СНГ. Действительно ли расклад такой, или я ошибся в своих наблюдениях?
Не ошибся.
Если хочешь перекот в Европу, то паралельно изучай Golang.
Сап, php'ач!
Аноны, как настроение? Можно, я для поддержания общения буду иногда задавать тупые вопросы, на которые мог бы найти ответы в гугле или в документации, сюда? Здесь ведь все мои друзья, и мне интересно мнение анонов!
Заранее благодарен.
Чем отличается echo от print_r? Что лучше использовать?
Мимо вкатун, хех. Желаю всем отличного дня, а себе - удачи.
П.С. И почему если из 100 извлечь квадратный корень, записать в переменную, то var_dump выводит - float? А если же озвести в квадрат, то var_dump выводит - int? Вроде ведь и 10 и 10000 - целые числа? Или это - вопрос высшей математики уже?
П.С. Или так происходит потому, что в данном случае 10 - это результат как бы деления, поэтому результат в итоге считается дробным?
> Слышал краем уха, что php-джуниоры не нужны, и работодатели в РФ ищут как минимум миддлов.
Правда. Но если IRL вакансию и можно найти(в крупных городах, естественно), то на удалёнке скорее всего лососнёшь тунца. Никому не нужен джуниор на удалёнку. Даже хороший и толковый.
Я это написал же.
Вопрос в другом - Почему это значение именно float, а не int? Получается, потому что квадратный корень можно извлекать и из дробных чисел, поэтому для удобства приняли, что даже если результат от извлечения корня будет целым, то просто везде будем писать float, чтобы не делать лишних движений?
Но дробное число при возведении в квадрат тоже может быть дробным, а целое - будет целым, но после возведения 100 в квадрат возвращается int.
Это хороший и довольно интересный вопрос.
Возможно, ты подумал, что целые числа всегда имеют тип int. Это не так.
Тип int позволяет представлять целые числа от примерно -9×10¹⁸ до 9×10¹⁸ (в 64-битной версии PHP, в 32-битной предел около 2 миллиардов). Числа этого типа представлены точно, то есть каждая цифра в таком числе правильная. Мануал: https://www.php.net/manual/ru/language.types.integer.php
Тип float позволяет хранить и дробные, и целые числа примерно от -10³⁰⁸ до 10³⁰⁸ (в 64-битной версии). Этот тип неточный и сохраняет только первые 14-16 цифр числа, а остальные цифры теряются (но их количество не теряется). Хуже того, многие дробные числа вроде 0.1 нельзя точно представить в формате float. Также этот тип интересен тем, что в нем есть отрицательный ноль -0, минус и плюс бесконечность и NaN, "не число". NaN можно получить, если вычислить sqrt(-4). Мануал: https://www.php.net/manual/ru/language.types.float.php
Как видишь, целое число может быть и типа int, и типа float. Обычно целые числа представлены типом int, но они могут превратиться в float если выйдут за допустимые пределы или если станут дробными. Например, если ты поделишь int(5) на int(2), то получишь float(2.5).
Функция вычисления корня возвращает тип float. Так сделано, потому что корни чаще получаются дробными, чем целыми и функция, которая всегда возвращает int, была бы бесполезна.
Тут можно спросить: а почему, когда результат целый, он не преобразуется обратно в int?
Перечитай написанное выше: float это приближенный тип. Если после извлечения корня из 10 000 ты получил float(100), то ты не можешь быть уверен: это точно 100 или это на самом деле 100,000 000 000 000 000 1 и последняя цифра просто не сохранилась. Так как мы не можем гарантировать, что там ровно 100, мы не хотим преобразовать число в int. Обычно, если число превратилось во float, в int оно само уже не вернется.
Конечно, эту проблему можно решить: можно преобразовать результат в int, возвести в квадрат и сравнить с исходным числом. Если они совпадут, значит, результат действительно целый. Но это надо заморачиваться и писать дополнительный код, и наверно просто никому это не нужно (но ты можешь написать свою функцию, которая будет это делать, если есть желание).
Это хороший и довольно интересный вопрос.
Возможно, ты подумал, что целые числа всегда имеют тип int. Это не так.
Тип int позволяет представлять целые числа от примерно -9×10¹⁸ до 9×10¹⁸ (в 64-битной версии PHP, в 32-битной предел около 2 миллиардов). Числа этого типа представлены точно, то есть каждая цифра в таком числе правильная. Мануал: https://www.php.net/manual/ru/language.types.integer.php
Тип float позволяет хранить и дробные, и целые числа примерно от -10³⁰⁸ до 10³⁰⁸ (в 64-битной версии). Этот тип неточный и сохраняет только первые 14-16 цифр числа, а остальные цифры теряются (но их количество не теряется). Хуже того, многие дробные числа вроде 0.1 нельзя точно представить в формате float. Также этот тип интересен тем, что в нем есть отрицательный ноль -0, минус и плюс бесконечность и NaN, "не число". NaN можно получить, если вычислить sqrt(-4). Мануал: https://www.php.net/manual/ru/language.types.float.php
Как видишь, целое число может быть и типа int, и типа float. Обычно целые числа представлены типом int, но они могут превратиться в float если выйдут за допустимые пределы или если станут дробными. Например, если ты поделишь int(5) на int(2), то получишь float(2.5).
Функция вычисления корня возвращает тип float. Так сделано, потому что корни чаще получаются дробными, чем целыми и функция, которая всегда возвращает int, была бы бесполезна.
Тут можно спросить: а почему, когда результат целый, он не преобразуется обратно в int?
Перечитай написанное выше: float это приближенный тип. Если после извлечения корня из 10 000 ты получил float(100), то ты не можешь быть уверен: это точно 100 или это на самом деле 100,000 000 000 000 000 1 и последняя цифра просто не сохранилась. Так как мы не можем гарантировать, что там ровно 100, мы не хотим преобразовать число в int. Обычно, если число превратилось во float, в int оно само уже не вернется.
Конечно, эту проблему можно решить: можно преобразовать результат в int, возвести в квадрат и сравнить с исходным числом. Если они совпадут, значит, результат действительно целый. Но это надо заморачиваться и писать дополнительный код, и наверно просто никому это не нужно (но ты можешь написать свою функцию, которая будет это делать, если есть желание).
echo может выводить только строки и числа. print_r и var_dump выводят данные любых типов, например, массивы. print_r и var_dump предназначены больше для отладки, чем для использования в реальном коде. Выбирай, что использовать, в зависимости от ситуации.
Заливаю проект на прод сервер. Проект laravel + vue. Сервер работает, но фронт выдает ошибку 404 (redirected you too many times.).
Нода установлена. В чем проебался? На локальном работает все заебок. Видимо, вью установлен как-то неправильно. Может, делал кто-нибудь подобное?
Нет :(
>1. Сильно ли порушился внутренний рынок вакансий внутри страны после 24-го? Уменьшились ли зарплаты? Если да, то насколько в среднем?
Сильно - вакансий в разы меньше стало.
>2. Насколько я понял, php не востребован в Европе/США, но при этом востребован в России и странах СНГ. Действительно ли расклад такой, или я ошибся в своих наблюдениях?
В РФ тоже почти не востребован - все на ноде делают. Или питоне.
>3. Реально ли выйти на вакансию джуниора? Слышал краем уха, что php-джуниоры не нужны, и работодатели в РФ ищут как минимум миддлов.
Да. На позицию джунов ищут миддлов, на позицию миддлов - синьёров. Без опыта делать там нечего, тем более сегодня.
>Если буду пахать часов 9-10 в день без выходных, то смогу ли выйти на позицию джуниора через 10 месяцев, или лучше вкатываться в какой-нибудь другой язык?
Лучше в питон тогда - там легче учиться. Или в жс.
> В РФ тоже почти не востребован - все на ноде делают.
Нода - не лучший выбор. Например, ты можешь обратиться к несуществующему полю объекта и не будет выдано никакой ошибки. Куча легаси. Нет тайп-хинтов, то есть невозможно делать большие проекты. Асинхронность, что доставляет много неудобства при написании обычной бизнес-логики.
Ну и твое утверждение не проходит проверку на hh:
разработчик php, вся Россия - 3432 вакансии
разработчик node, вся Россия - 1311 вакансий
разработчик python, вся Россия - 4315 вакансий
Ты бы потратил минуту, прежде чем выдавать свои фантазии за реальность.
Что касается Питона, он мне нравится и я его использую (numpy, sympy, sqlalchemy, плюс в нем есть библиотеки для нейросетей), он дает высокую скорость написания кода, но в нем нет проверки типов в рантайме, mypy выдает очень много левых предупреждений, и его производительность, как я понимаю, ниже, чем у PHP, так как в Питоне больше ценят простоту кода, чем оптимизацию.
Погугли вопросы к собеседованию. Новичков без опыта спрашивают по теории, то есть, то, что описано в официальном мануале PHP, ООП, реляционные СУБД, джойны, транзакции, блокировки, внешние ключи. Какие фреймворки/библиотеки знаешь.
Да не пишут бек на ноде без тайпскрипта уже. Инкрементальную компиляцию почти не замечаешь. Типизация в общем лучше чем в пхп 8, но в пыхе добавляют фичи в язык"шоб было как у шарпе с жавой", а в js мало кардинальных улучшений.
Есть спецы по вордпрессу? Есть один сайт. Залез в базу, а там в поле post_content таблицы wp_posts текст поста хранится с html тегами. Это нормально? Пробовал гуглить, но ничего не нашел.
Сейчас вроде Go становится популярным.
>разработчик php, вся Россия - 3432 вакансии
80% - параша уровня завода по заёбистости и зарплате. Что смыс циферками мерятся если на пыхе 90% это сайтики на вп и битриксе, а у остальных нормальная разработка?
Для ВП это норма. С другой стороны как ты пост с разметкой сохранишь? Правда в норме это не норма нихуя и БД там полный ад.
вакансии по питону по разным областям, не только по вебу. Плюс преподавателей курсов ищут )
сори неправильно посчитал. По России 826 получается.
>Лучше в питон тогда - там легче учиться. Или в жс.
Мда блат. Если ищешь полегче - курьером.
Нужно учить то что востребовано и на что есть спрос там где живешь/собираешься работать.
По пайтону при поиске будешь конкурировать со студентами/выпускниками которых плотно штрунделировали по алгоритмам на этом самом пайтоне не один год.
> Нужно учить то что востребовано и на что есть спрос там где живешь/собираешься работать.
И что же востребовано в России? PHP? Кулстори, Боб. Кулстори. Расскажи ещё.
Дык, открой вакансии и посмотри... Symfony/Laravel, как везде. Плюс вордпресс для школоты.
Бозе, ну вороти нос, ага))
На пьиЭйчьПьи работает ~80% всех сайтов. Это нужно дорабатывать и обслуживать. На рыночке в целом спрос есть.
Это просто инструмент, кому-то может нравиться или нет технология, но свои функции она выполняет. Если дахуя фанбой можешь дрочить голанг и попробовать устроиться)) или хз чего ты там фанбой, зарабатываешь уже? будь честен для начала хотя бы с собой
конечно,
просто напиши cli-утилиту/скрипт на php,
можно даже с параметрами,
и вызывай с помощью интерпретатора, а-ля /bin/php
Не, я просто думал он типа echo работает, в крайнем случае фигурными скобками выделить как значения.
что-то такое есть https://stackoverflow.com/questions/104516/calling-php-functions-within-heredoc-strings , если очень ннада, но я бы вынес в отдельный файл-скриптик на РНР
Ну вот я выбираю записи из бд, мне их надо на страницу все отобразить, а там у каждой записи timestamp вместо времени человеческого, как поступить лучше?
тут вообще РНР не нужен, достаточно преобразовать timestamp в нужный формат на уровне запроса к БД, например для мускуль:
select date_format(column_name, '%Y-%m-%d') as human_date
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format
Не знал про такое, спасибо. Читаю эти книги по пхп и как рыба об лед бьюсь, в жизни все равно вещи по-другому делают. Хз как устраиваться куда-то вообще.
если освоишь ООП, MVC и Solid -- иди пили Symfony/Laravel, за них платят по-человечески
А что ты уже умеешь, и где обитаешь?
Все уснули. Готовьте перекат!
- C:\php\php.ini
Что это означает и что делать?
У тебя не установлены (или установлены, но не включены в php.ini) какие-то расширения PHP, которые требуются для Laravel. Какие именно, должно быть написано в сообщении об ошибке.
Почему через GET/POST не получается вытащить данные с инпута? Битрикс их куда-то в другое место сохраняет или как?
Я пробовал и вручную указывать метод и пост и гет, но толку ноль.
Всё пацаны, разобрался. Сейчас у меня что-то данные с чекбокса не хотят устанавливаться. Думаю туплю где-то как обычно.
А, это эксклюзивно к битриксу относится, я так и думал. Кстати как ты его начал изучать? У меня в регионе вроде пользуется спросом, в вакансиях зачастую идет вместе с пхп.
спасибо.
Начинал в 2019 в июне вкатываться. Начал с фронта как и большинство вкатунов. Потом забросил, даже не осилив жс. Потом через 3 месяца снова начал пытаться, у меня случилось горе, и я снова сдался. Потом через полгода начал изучать C# по метаниту, прошел где-то до делегатов, охуел от сложности всего и снова сдался.
Потом я наконец пришел в пхп, его уже довольно основательно изучил по разным ресурсам, уже и задачи на кодварсе решал, правда несложные, максимум 5кую. Параллельно немного изучил sql и фронт. Ну и тоже периодически бросал, возвращался и так вот до начала этого года. С начала года начал пытаться в Битрикс, т.к. подумал, что это изи вкат во ВСЕХ планах. Но оказалось изи вкат только в плане количества вакансий и меньшей конкуренции.
Я думал, что Битрикс это хуяк-хуяк и готово, что не надо тут много думать и шарить, не надо долго изучать и т.д. Это вообще неправда. Тут много надо всего тоже знать, много раз случается такое, что чего-то нет в доке, каких-то микропроблем велик шанс вообще не суметь загуглить, потому что большинство их решает на изи, а кто нет... Тот я. Благо есть телеграм-канал по битриксу для разработчиков, где почти всегда находится добрый человек, который ответит на твой пустяковый вопрос. Уже раз 5 мне там помогли. Плюс можно через поиск сообщений нагуглить в этом канале свою проблему, тоже бывало находил решения.
Щяс вот на обучении был в компании одной с середины мая, все задания сдавал вовремя, жду результатов. Могу и на стажировку попасть. Хотя все мне на дваче говорили, что это плохая компания, раз она набирает на стажировку не сразу, а после какого-то обучения. Типа это неправильно. Как по мне, а как еще отсечь полных аутов и незаинтересованных людей? Если только набирать сразу джунов, но они почему-то не делают этого. Нас из 50 человек вкатунов осталось меньше 10-ти. Обучение ес что бесплатное было.
В общем, за всё время вкатунства, это первый раз, когда мне удалось зайти так далеко, да еще и заинтересоваться всей этой темой. Я седня сдал ласт задание и был нереально рад, что смог его сделать. Завтра уже продолжу учиться с радостью. Щяс позволю себе посмотреть аниме перед сном.
Начинал в 2019 в июне вкатываться. Начал с фронта как и большинство вкатунов. Потом забросил, даже не осилив жс. Потом через 3 месяца снова начал пытаться, у меня случилось горе, и я снова сдался. Потом через полгода начал изучать C# по метаниту, прошел где-то до делегатов, охуел от сложности всего и снова сдался.
Потом я наконец пришел в пхп, его уже довольно основательно изучил по разным ресурсам, уже и задачи на кодварсе решал, правда несложные, максимум 5кую. Параллельно немного изучил sql и фронт. Ну и тоже периодически бросал, возвращался и так вот до начала этого года. С начала года начал пытаться в Битрикс, т.к. подумал, что это изи вкат во ВСЕХ планах. Но оказалось изи вкат только в плане количества вакансий и меньшей конкуренции.
Я думал, что Битрикс это хуяк-хуяк и готово, что не надо тут много думать и шарить, не надо долго изучать и т.д. Это вообще неправда. Тут много надо всего тоже знать, много раз случается такое, что чего-то нет в доке, каких-то микропроблем велик шанс вообще не суметь загуглить, потому что большинство их решает на изи, а кто нет... Тот я. Благо есть телеграм-канал по битриксу для разработчиков, где почти всегда находится добрый человек, который ответит на твой пустяковый вопрос. Уже раз 5 мне там помогли. Плюс можно через поиск сообщений нагуглить в этом канале свою проблему, тоже бывало находил решения.
Щяс вот на обучении был в компании одной с середины мая, все задания сдавал вовремя, жду результатов. Могу и на стажировку попасть. Хотя все мне на дваче говорили, что это плохая компания, раз она набирает на стажировку не сразу, а после какого-то обучения. Типа это неправильно. Как по мне, а как еще отсечь полных аутов и незаинтересованных людей? Если только набирать сразу джунов, но они почему-то не делают этого. Нас из 50 человек вкатунов осталось меньше 10-ти. Обучение ес что бесплатное было.
В общем, за всё время вкатунства, это первый раз, когда мне удалось зайти так далеко, да еще и заинтересоваться всей этой темой. Я седня сдал ласт задание и был нереально рад, что смог его сделать. Завтра уже продолжу учиться с радостью. Щяс позволю себе посмотреть аниме перед сном.
Я вообще конкретно про битрикс интересовался, может хорошие курсы или книги, но твоя история тоже интересна. У меня тоже уже несколько раз руки опускались и сам я очень медленно все делаю в плане обучения. Там наверное надо бац-бац кабанчикам быстро все.
О, спасибо. Все подробно и понятно.
Ну хорошие курсы только от самого битрикса, еще можно посмотреть Михаила Базарова. Остальное только по крупицам собирается с опытом и гуглением.
>должен
кому и почему? есть же документация https://www.php.net/manual/en/language.oop5.properties.php
Ну вот написано же
>Свойства класса могут быть определены как public, private или protected. Свойства, объявленные без явного ключевого слова области видимости, определяются как общедоступные (public)
Я делаю вывод что можно объявлять без указания области видимости и будет назначено public. Так вот я не могу просто написать свойство класса $x без всего, пишет ошибку.
>можно объявлять без указания области видимости и будет назначено public
Схуяли? И зачем вкатышу вообще об этом думать?
> Определять константу почти всегда лучше с помощью define(), потому что тут больше возможностей и меньше вариантов «поймать» ошибку.
Это неправильный вывод. Объявлять лучше с помощью const, так как это более чистый синтаксис и он (наверно) лучше понятен статическим анализаторам кода. define можно использовать только если const не работает.
Да, такая рекомендация есть в стандартах. Я думаю, это ради читаемости, чтобы было видно, что поле публичное, а не то, что ты пока не решил, каким его сделать.
Просто мне показалось странным, что методы пропускает без указания, а свойства нет. Там похоже ноги растут из старых версий пыхи где надо было var писать.
Так полно вакансий где нужен опытный разраб пхп, чтоб переписывать код на го.
>достаточно добавить известную библиотеку на десяток килобайт, которая перехватывает клики по ссылкам и грузит страницы аяксом. Мы получаем переходы без перезагрузки, отличную поисковую оптимизацию, не написав ни строчки клиентского кода.
что за библиотека?
что за цветовая схема?
как обычно, вакансий полно -- открой сам и посмотри
Сижу обновляю приложение на РНР, которое я написал на заказ в одно лицо на
plain PHP + MariaDB + Bootstrap +JS/jQuery + SCSS + Gulp + RabbitMQ + Java.
Бизнес, основанный на этом приложении, принёс владельцам около 1 млрд рублей за 5 лет. Я получил за это время свои скромные 2-3 М, параллельно работая над другими подобными проектами.
Работать буду до утра, и могу ответить на вопросы по программированию и фрилансу.
хуи не сосу, бочку не делаю
В вопросе тебе стоило бы указать версию РНР и тип БД.
Попробуй так:
$statement->execute();
$statement->setFetchMode(PDO::FETCH_ASSOC);
while($row = $statement->fetch()) {
print_r( $row );
}
Не по теме конечно, но писал бы ты лучше альтернативным синтаксисом, а то выглядит как блевота, честно говоря.
вкатиться на первые копейки -- пара месяцев после курсов (в сертифицированном обучающем центре, очно)
на +- норм деньги -- стандартные 10 000 часов коммерческого опыта
открой код страницы и посмотри, что там на месте изображений
>>386923
А сейчас как вкатываются вообще тогда?
> А сейчас как вкатываются вообще тогда?
Никак, джуны не нужны, сделаешь пару пет проектов, 18 летний тимлид обоссет на собесе и пойдешь с лицом лягушки на завод
>18 летний тимлид
Нах в такие уебанские конторы ходить, лол.
Я стал отказываться от таких цирковых собеседований (могу себе позволить)
Define "что-то". Могу из формы значения в базу писать и потом выводить их через echo. Но так никто не делает ведь да, там какие-то шаблонизаторы нужны и т.д.
Тебе браузер пишет - слишком много редиректов. Скорее всего твой сайт редиректит сам на себя.
Открой инструменты разработчика в браузере (F12) на вкладке Network, перезагрузи страницу и посмотри, что там выведется.
>>386389
Пиджакс, на vanilla js, 6 Кб в сжатом виде. https://github.com/MoOx/pjax
Меня удивляет, что люди не знают про такую библиотеку и начинают изобретать велосипеды на реакте.
Это PDO? Тогда в нем есть fetchAll(). Однако, в него не надо передавать текст SQL запроса. Ты ведь уже указал текст запроса при вызове prepare(). Вот мануал (и там есть примеры кода с fetchAll): https://www.php.net/manual/ru/pdostatement.fetchall.php
Кто выдает ошибку? Твоя IDE или при выполнении кода реально возникает ошибка?
Не надо писать цикл с fetch, если тебе нужны все записи, то лучше использовать fetchAll().
Также, при выводе данных на странице нужно использовать htmlspecialchars, чтобы не было уязвимости XSS и чтобы все символы корректно вставлялись в HTML, как описано тут: https://github.com/codedokode/pasta/blob/master/security/xss.md
Это <?= htmlspecialchars($x) ?> вместо <?php echo $x; ?> и if через двоеточие. Мануал: https://www.php.net/manual/ru/control-structures.alternative-syntax.php
Не знаю, нужно ли тебе это, но у нас есть урок про шаблонизаторы: https://github.com/codedokode/pasta/blob/master/php/templates.md
А так да, тебе надо учить ООП и фреймворки, а не писать кривые скрипты на чистом PHP.
Я читал урок и в принципе понимаю как поделить обработку формы и "шаблон", который вызывает через action этот обработчик, но вот этих сторонних шаблонизаторов не касался.
Сейчас на чистом не пишут, только фреймворки и CMS? И предполагается что джун уже знает это все чтобы с 1го дня с этим работать?
От тебя жду ответ - какой вариант предпочтешь и почему.
Код: 3v4l.org/sJMke
Есть еще вариант с array_reduce, по моему, в плане читаемости вариант с циклом лучше и короче, только скобку лучше перенести:
foreach ($enjoyers as $e) {
$sum += $e->getSomething();
}
Также, в коде с array_map желательно закрывающую скобку ставить в начале строки
echo array_sum(array_map(
....fn($e) => $e->getSomething(),
....$enjoyers
));
array_map выгодно использовать, когда вызов функции умещается в одну строку:
$ids = array_map('intval', $iids);
https://stackoverflow.com/questions/36864206/sqlstatehy000-1698-access-denied-for-user-rootlocalhost
Похоже на какие-то пердолепроблемы.
Ну да, вышло короче на одну функцию.
Надо еще покопаться в стандартных функциях, может что найду на другие случаи жизни)
Спасибо.
В такой ситуации ты можешь попробовать проверить, правильные ли имя пользователя и пароль, подключившись вручную из командной строки:
mysql -uroot users
Если происходит такая же ошибка, то придется немного заморочиться.
Тут https://askubuntu.com/a/763359 пишут, что теперь подсоединиться к mysql как root можно только если ты залогинен в систему как root. Работать из-под root это очень плохая идея, потому нужно создать в MySQL нового пользователя и дать ему права на все базы данных. Для этого коннектимся к БД, используя sudo:
sudo mysql -uroot
Далее, создаем нового пользователя БД:
CREATE USER 'имя пользователя'@'localhost' IDENTIFIED BY 'пароль';
Обрати внимание на @localhost - это значит, что пользователь сможет подключаться только с твоего компьютера, снаружи под ним нельзя зайти.
Далее, даем новому пользователю все виды доступа ко всем таблицам всех баз данных:
GRANT ALL PRIVILEGES ON звездочка.звездочка TO 'имя пользователя'@'localhost' WITH GRANT OPTION;
И применяем изменения:
FLUSH PRIVILEGES;
Если ты хочешь дать доступ не ко всем базам данных, а только к одной, то пиши ... PRIVILEGES ON базаданных.звездочка ...
После этого проверь, что логин работает:
mysql -uпользователь -pпароль
Если все ок, то впиши данные в свой скрипт.
Мануал:
CREATE USER https://dev.mysql.com/doc/refman/8.0/en/create-user.html
GRANT https://dev.mysql.com/doc/refman/8.0/en/grant.html
Чтобы увидеть всех пользователей, выполни запрос
В такой ситуации ты можешь попробовать проверить, правильные ли имя пользователя и пароль, подключившись вручную из командной строки:
mysql -uroot users
Если происходит такая же ошибка, то придется немного заморочиться.
Тут https://askubuntu.com/a/763359 пишут, что теперь подсоединиться к mysql как root можно только если ты залогинен в систему как root. Работать из-под root это очень плохая идея, потому нужно создать в MySQL нового пользователя и дать ему права на все базы данных. Для этого коннектимся к БД, используя sudo:
sudo mysql -uroot
Далее, создаем нового пользователя БД:
CREATE USER 'имя пользователя'@'localhost' IDENTIFIED BY 'пароль';
Обрати внимание на @localhost - это значит, что пользователь сможет подключаться только с твоего компьютера, снаружи под ним нельзя зайти.
Далее, даем новому пользователю все виды доступа ко всем таблицам всех баз данных:
GRANT ALL PRIVILEGES ON звездочка.звездочка TO 'имя пользователя'@'localhost' WITH GRANT OPTION;
И применяем изменения:
FLUSH PRIVILEGES;
Если ты хочешь дать доступ не ко всем базам данных, а только к одной, то пиши ... PRIVILEGES ON базаданных.звездочка ...
После этого проверь, что логин работает:
mysql -uпользователь -pпароль
Если все ок, то впиши данные в свой скрипт.
Мануал:
CREATE USER https://dev.mysql.com/doc/refman/8.0/en/create-user.html
GRANT https://dev.mysql.com/doc/refman/8.0/en/grant.html
Чтобы увидеть всех пользователей, выполни запрос
Ну где-то и на яве пишут, джун сейчас во-первых никому не нужен, во-вторых да, должен знать все и больше
Ну охуенно, а где нужны джуны тогда? Сейчас вроде "дефицит айти специалистов".
бездушно это, не лежит действительно к этому душа так сказать.
Держи в курсе.
>>388400
Ну в битрикс вкатывайся. Там не нужны алгоритмы, надо просто разбираться в самом битриксе, в ООП, в MVC, которое у битры немного другое, немного скуль, немного фронт. Хотя где-то много фронта, т.к. нет отдельного, по-разному короче.
Я к тому, что тут проще вкатиться, конкуренция меньше, знаний надо меньше. Надо лишь разобраться в устройстве всего битрикс фреймворка и всё.
Действительно дефицит, только как ты написал СПЕЦИАЛИСТОВ. А джун нахуй нужен? Чтобы его учить? Ты хоть 2 года учи дома за проектами свой ларавел, разработка это совсем другое. В компании будешь учиться с нуля, это никому не нужно
Обучать есть смысл, если работа узкопрофильная. А на пхп у кабана всегда найдется работник с подходящим опытом. Даже если поиск будет долгим это профитнее чем учить новичка с нуля.
Да им поебать, придет человек хорошо, не придет итак деньги капают, вакансия есть не просит
Ты не прав. Джун, если он дома тщательно изучил HTML, CSS, PHP, ООП, фреймворк, СУБД, алгоритмы, проектирование интерфейсов, очень полезен.
Во-первых, ему можно давать всякие простые рутинные задачи. Вроде пройтись по сайту и поменять везде синие кнопки на зеленые. Это не требует больших умственных усилий, и дешевле отдать это джуну за пачку лапши, чем платить гору золота миддлу или сениору. Плюс джун со знанием интерфейсов заодно красиво выровняет съехавшие кнопки.
Во-вторых, правка всяких мелких багов вроде того, что при вводе номера телефона длиннее 15 символов база выдает ошибку. Джун, конечно, потратит много времени, но зато в процессе хорошо разберется в коде.
Джуну можно поручать и разработку. Например, сениор написал гениальный алгоритм поиска. А джун сделает для него страничку с формой и показом результатов. Или сениор сделал красивую форму, а джун добавит в нее ссылки на политику приватности и условия использования.
Естественно, везде речь идет о сообразительном джуне, готовом разбираться в коде и любящем читать англоязычную многостраничную документацию. Если это какой-нибудь выпускник курсов по информатике, которого учили только числа Фибоначчи считать, или вкатыш, не понимающий ООП и не желающий читать мануалы, но считающий, что он заслуживает средней зарплаты по отрасли, то конечно, толку от него 0.
Откуда вы это берете пздц. Тут одни диваны-вкатыши сидят? Какие-то абстракции в голове придумываете, как можно джуна занять и за что ему все таки заплатить. Такое может написать только тот, кто в компании никогда не работал
Рассказываю, джунов никто не берет, нигде, хантят одних и тех же людей туда сюда, делают проектики, потихоньку зарабатывают
Открываем hh, выбираем "без опыта", получаем вакансии: https://hh.ru/search/vacancy?area=1&area=113&experience=noExperience&search_field=name&search_field=company_name&search_field=description&text=разработчик+php&from=suggest_post
Ну и может быть, как опытный, ты расскажешь никогда не работавшему в компании человеку, кто у вас занимается прикручиванием форм обратной связи, перекрашиванием кнопок и правкой текста условий использования сайта? Исключительно сениоры с 10 годами стажа?
Принтер почини мне, компьютерщик
Я умею подключаться к mysql, делать запросы, еще могу решать задачки на кодварсе, еще задачки с ОП книги, еще... Синтаксис ООП знаю, но применять пока не умею, только собираюсь писать свой фреймворк по гайду. Потом мб свой целиком зделаю, хотя зачем, тут ведь главное понять внутренности плюс-минус, а потом уже переходить к популярным фреймворкам типа битрикса или ларавель или симфони. Оттуда уже делать какой-то проектик, хотя это сложно когда нет поставленной задачи, за которую тебе заплатят. Но один проект заставить себя можно сделать. Правда до конца не получилось пока ни разу.
Держу в курсе.
Читаю спецификацию языка. Возник вопрос. Что за нотация используется, с помощью которой описывают синтаксис? Она мне не совсем понятна.
https://phplang.org/spec/13-functions.html#function-definitions
Ну степ бай степ гайд только. Но есть и статья просто с подсказками. Загуглиш сам.
Такой синтаксис называют "грамматика". Грамматика - это набор правил, который определяет, как можно составлять конструкции (вроде выражения или оператора if) из элементов. Имея грамматику, мы можем разобрать (распарсить) программу на отдельные части.
Элементы делят на два вида: терминалы и не-терминалы. Терминалы это элементы, которые нельзя разделить на части, а не-терминалы - это составные элементы, которые собраны из других терминалов или не-терминалов.
Например, мы можем сказать, что выражение 2 + 2 это не-терминал, так как оно составлено из трех терминалов: ЧИСЛО 2, +, ЧИСЛО 2.
Если мы хотим описать грамматику, то мы начинаем с того, что описываем все терминалы, а затем описываем, как из них можно составлять не-терминалы, и в итоге получаем финальное правило, которое определяет, как составляется программа.
Небольшая сложность заключается в том, что в PHP, как и во многих языках, две грамматики: первая (лексическая) грамматика определяет, как из символов (терминалов) составляются токены (не-терминалы). Вторая грамматика (синтаксическая) определяет, как из токенов (которые теперь являются терминалами) составляются более сложные конструкции и в итоге сама программа.
Например, лексическая грамматика может выглядеть так:
ЦИФРА (не-терминал) - это '0', '1', ... '9'
БУКВА это 'a'...'z'
ПОДЧЕРКИВАНИЕ это '_'
ЦЕЛОЕ_ЧИСЛО - это одна или более ЦИФР
ИМЯ_ПЕРЕМЕННОЙ - это '$', затем (БУКВА или ПОДЧЕРКИВАНИЕ), затем 0 или более (ЦИФР, БУКВ или ПОДЧЕРКИВАНИЙ)
Здесь ЦИФРА - это не-терминал. Но в синтаксической грамматике ЦИФРА и ИМЯ_ПЕРЕМЕННОЙ будут уже терминалами, и они могут использоваться так:
ПРИСВАИВАНИЕ - это ИМЯ_ПЕРЕМЕННОЙ, '=', ВЫРАЖЕНИЕ
Правила грамматики по-английски почему-то называют productions.
Для описания правил грамматики есть стандартные синтаксисы вроде BNF (очень старый и неудобный), ABNF, EBNF.
В спецификации используют свой стандарт, которые расплывчато описан тут https://phplang.org/spec/09-lexical-structure.html#grammars
Такой синтаксис называют "грамматика". Грамматика - это набор правил, который определяет, как можно составлять конструкции (вроде выражения или оператора if) из элементов. Имея грамматику, мы можем разобрать (распарсить) программу на отдельные части.
Элементы делят на два вида: терминалы и не-терминалы. Терминалы это элементы, которые нельзя разделить на части, а не-терминалы - это составные элементы, которые собраны из других терминалов или не-терминалов.
Например, мы можем сказать, что выражение 2 + 2 это не-терминал, так как оно составлено из трех терминалов: ЧИСЛО 2, +, ЧИСЛО 2.
Если мы хотим описать грамматику, то мы начинаем с того, что описываем все терминалы, а затем описываем, как из них можно составлять не-терминалы, и в итоге получаем финальное правило, которое определяет, как составляется программа.
Небольшая сложность заключается в том, что в PHP, как и во многих языках, две грамматики: первая (лексическая) грамматика определяет, как из символов (терминалов) составляются токены (не-терминалы). Вторая грамматика (синтаксическая) определяет, как из токенов (которые теперь являются терминалами) составляются более сложные конструкции и в итоге сама программа.
Например, лексическая грамматика может выглядеть так:
ЦИФРА (не-терминал) - это '0', '1', ... '9'
БУКВА это 'a'...'z'
ПОДЧЕРКИВАНИЕ это '_'
ЦЕЛОЕ_ЧИСЛО - это одна или более ЦИФР
ИМЯ_ПЕРЕМЕННОЙ - это '$', затем (БУКВА или ПОДЧЕРКИВАНИЕ), затем 0 или более (ЦИФР, БУКВ или ПОДЧЕРКИВАНИЙ)
Здесь ЦИФРА - это не-терминал. Но в синтаксической грамматике ЦИФРА и ИМЯ_ПЕРЕМЕННОЙ будут уже терминалами, и они могут использоваться так:
ПРИСВАИВАНИЕ - это ИМЯ_ПЕРЕМЕННОЙ, '=', ВЫРАЖЕНИЕ
Правила грамматики по-английски почему-то называют productions.
Для описания правил грамматики есть стандартные синтаксисы вроде BNF (очень старый и неудобный), ABNF, EBNF.
В спецификации используют свой стандарт, которые расплывчато описан тут https://phplang.org/spec/09-lexical-structure.html#grammars
>в общем спустя какое-то время подумал - нафиг это программирование, вот это всякое айти там да.
бездушно это, не лежит действительно к этому душа так сказать.
>>388464
у меня вопрос вообще не в том что не осилил, это не проблема в чем-то разобраться.
просто залипать в кампуктер значительное время для меня не очень хорошо, а занимаясь разработкой это так есть по факту, считай работаешь + в свободное время учишь либы/фреймворки.
Ну раз тебе тяжело ссылку на гайд дать, то я не скажу в какой книге разрабатывается фреймворк на PHP.
https://habr.com/ru/post/654983/
https://stackoverflow.com/questions/1831610/how-to-develop-a-mvc-framework-from-scratch - тут рекомендуют сначала хорошо разобраться в MVC на уже существующих фреймворках. Хотя на других ресурсах рекомендуют сделать свой по гайдам, чтоб разобраться в нутре MVC фреймворков.
Трудно сказать, что лучше. Выбери свой путь. Я решил изучать уже существующие. Сначала один, потом другой для сравнения. Потом мб напишу свой для развития.
https://www.youtube.com/watch?v=6ERdu4k62wI - классика, очередное видео FreeCodeCamp.
Сам я ничего из этого не пробовал, просто погуглил за тебя, чтоб ты сказал мне книгу.
<> является стандартом SQL. Наверное оттуда.
Разницы нет. Обычно юзают !=
По примеру с постгрес, он потом сам конвертирует != в <>
Я после шараги 2 месяца чилил, потом за 2 нашел)
Был на двух собесах, на первом сначала отказали, потом через неделю написали на почту "вы ещё не трудоустроились?"
Ну а я уже был на другом месте. Как-то легко меня берут.
Хихихм, привет. Лару учил откровенно говоря мало, так как учёба и другие обстоятельства. Дописал файлообменник до вида более менее, решал задачи, структуры данных какие-то реализовывал, сейчас пишу сайт с новостями, на чистой пыхе. С июля (закончится сессия как раз) буду дрочить лару и жс, проектом на ларе будет форум (имидж борда, кто как хочет). В общем-то, все неплохо, хотя могло быть намного лучше
А, по поиску работы. Разослал в компании 4 наверное. В одной посмотрели резюме но ответа не было, в другой отказали (я решил мало ли меня удалённо могут взять, написали что возможно вернутся к моей кандидатуре, но это пиздеж очевидный ) и в других нашли разработчика до того как даже глянули резюме. Как-то так
Это не очень нормальная цифра. Обычно запросы занимают миллисекунды или меньше.
Во-первых, дело может быть не в запросе, а в чем-то другом. Попробуй запустить консоль MySQL (если ты используешь MySQL) и выполнить запрос напрямую с параметром SQL_NO_CACHE:
SELECT SQL_NO_CACHE x FROM y WHERE ... ;
MySQL напишет, сколько времени выполнялся запрос. Если там не 2 секунды, а 2 миллисекунды, то очевидно дело не в базе.
Если запрос выполняется медленно, то можно поискать причины. Для начала сделать EXPLAIN, то есть добавить в начало запроса EXPLAIN и выполнить:
EXPLAIN SELECT x FROM y ...;
Документация (может быть сложновата для начинающего): https://dev.mysql.com/doc/refman/8.0/en/explain.html
Ты увидишь план выполнения запроса и можешь посмотреть, оптимально ли он выполняется. Ищутся ли данные по индексу быстро или же без использования индекса идет полный перебор таблицы с миллионом записей. Если полный перебор миллиона записей - то надо оптимизировать запрос или доабвлять индексы.
Наконец, даже если индексы настроены правильно, но у тебя очень много данных, а базе ты выделил очень мало памяти, то данные будут постоянно читаться с диска, а это небыстро.
Если твой проект не секретный, то ты можешь запостить тут запрос, вывод EXPLAIN и сколько у тебя всего записей в таблицах и может кто-то увидит причину проблем.
да просто ссылку на гит скинь, я фронт не хочу смотреть, чисто как ты на бэке писал
Чего ты боиьшся?)
на гитхабе только? а как искать? пишу в поиск laravel, а там одни package (либо вообще элементарные проэкты вроде блогов), а мне проекты интересно посмотреть
Учти только, что MVC это минимальная база для джуна. По-хорошему ещё надо микросервисную архитектуру понимать, а там уже SOLID, юнит-тесты, обязательный ООП, полезно знать структуры данных хотя бы базовые и прочее такое. Хотя если собираешься на вордпрессе говнокодить, то необязательно. Но учти, что это именно программерская база, а не только веб-макаки.
Я бы попробовал так. Вбиваем в Гугл "laravel based projects" и видим разные сайты вроде
https://www.dunebook.com/5-best-open-source-project-built-using-laravel/
Берем оттуда случайный проект, и идем на гитхаб смотреть код.
ООП и юнит-тесты никак не связаны с микросервисами. Наоборот, монолит, скорее всего окажется лучше и удобнее, чем гора микросервисов. Монолитная архитектура самая лучшая для большинства компаний. Микросервисы, впрочем, имеют смысл, когда у тебя масштабные проекты уровня Яндекса.
Например, у Яндекса есть сервис, который рассчитывает оптимальный способ добраться из точки в точку, и этот сервис используется и Яндекс-Картами, и Яндекс-доставкой, и где-то еще. Без микросервисов тебе бы пришлось дублировать код. Это пример случая, когда микросервисы действительно помогают. Яндекс использует микросервисы не потому что они прочитали про них в блоге, а потому что они разбираются в архитектуре. А компания анона использует микросервисы, потому что прочитали про них в блоге. Возможно, поэтому эта компания не Яндекс.
Но если у тебя небольшой или среднего размера продукт, то заводить микросервисы это лишняя головная боль на ровном месте. Особенно глупо заводить микросервисы в надежде, что повысится качество кода. Если у тебя плохой код, то надо учиться писать хороший код, а не надеяться, что микросервисы тут чем-то помогут (не помогут).
Также, можно услышать, что микросервисы позволяют использовать разные языки программирования. Согласен, если у тебя высоконагруженный сервис, то можно, как Вконтакте, писать свои хранилища на Си или на Расте, или Го. Но если ты не способен осилить эти языки, то наверно микросервисы тебе не очень-то и нужны.
>ООП и юнит-тесты никак не связаны с микросервисами
Связаны напрямую.
>Наоборот, монолит, скорее всего окажется лучше и удобнее, чем гора микросервисов
Для чего окажется? Для какого проекта? Приведи примеры.
>Монолитная архитектура самая лучшая для большинства компаний.
Тыскозал, опятьже?
>А компания анона использует микросервисы, потому что прочитали про них в блоге.
Какая компания? Можно конкретику?
Ананас, подскажи что лучше начинать учить вместе с php, сервер apache или ngnix на linux?
Установил на второй ноут ubuntu, никогда им не пользовался но вроде весело все идет, сейчас думаю какой сервер поставить. О apache двойственные впечатления, пердолинг с htaccess заебал для статичных сайтов (учился), и говорят он устарел вообще и тормозит быстродействие.PHP разработчики пользуются же VDS а не виртуальными серверами как я понял?(git там,laravel) я же по сути любой сервер(ngnix или apache) на этот VDS могу поставить, и панель управления типа ispManager? Правильно мыслю или лучше все учить для рынка?
Можешь позже изучить пердолинг серверов, мне за полгода работы один раз пришлось менять конфиг нжинкса, я про него на тот момент нихуя не знал, но за пару часов нагуглил и пофиксил, больше ни разу его не приходилось трогать
Сап, аноны. Убедительная просьба не кидаться говном, мб есть тут люди шарящие за битрикс.
Как отсортировать элементы в catalog.section по конкретному значению множественного свойства типа список?
Т.е. есть свойство "Тэги", значения "Популярное", "Рекомендуемое" и т.д. У элемента могут быть выбраны хоть все сразу. Мне же нужно отсортировать каталог по этому свойству, чтоб сначала шли элементы у которых проставлено значение "Популярное"
А нахрен тебе апачи и энжникс? Это не задачи разработчика, а ебаться тебе придется с тем что будет. Тут уже все от звезд на небе зависит
Хули ты тут высрал? Анон прав, монолит в подавляющем большинстве выигрывает, хотя бы тем что его разрабатывать проще.
На кой хуй ебаться с кучей сервисов маленькой команде разработчиков, когда речь идет о небольшом интернет магазине? Или у тебя все разрабатывают огромные проекты по типу какого-нибудь контакта?
>python/django
Абсолютно бесполезная хуйня без задач, которая умерла не успев достичь популярности. Node во всем лучше.
На году вакансий почти нет. Либо для мидлов минимум. Мне интересно в плане поиска работы в первую очередь.
Я устраиваюсь в некоторую контору, не на программерскую должность, и тестовое задание получил в виде требования написать модуль с использованием связки ZF1+extJS3.4.
Сразу говорю, работать мне с этим точно не придется, как и с всем остальным, я там вообще на совершенно другую должность, но задание именно такое.
Как вы понимаете - это древнеебучие копролиты, и из коробочки оно нихера не работает, композер давится, ZF тулза от первого фреймворка давится зависимостями, а древние проекты с гита не разворачиваются по разным причинам, в основном связанным так же с тем что это древнее ебучее говно слона.
Можете порекомендовать как и откуда вообще начать с этим работать?
Повторюсь, я из совершенно другой сферы микроконтроллеры/асм/си, и для меня всё это вот ПИЗДЕЦ как сложно.
Потому что у них другого нет, это госконтора. Потому что так вышло, что начальник хочет этого, независимо от того чем я буду заниматься.
"Микро"сервисы это когда проект состоит из нескольких отдельных компонентов, которые связаны между собой по сети. У каждого компонента обычно своя база данных.
Данные можно пересылать и через SOAP, но сейчас обычно используются более современные технологии вроде HTTP+JSON, JSON-RPC, ProtocolBuffers, Thrift, очереди сообщений и тд.
>>390867
Пример: я хочу получить какие-то данные из БД. В монолите я просто захожу в консоль MySQL, пишу запрос с 8 джойнами (а я хорошо умею использовать джойны) и получаю нужные данные. В микросервисном проекте я должен потратить во много раз больше времени, писать какие-то кастомные скрипты, чтобы добиться того же. Хотя, может есть какая-то компания, которая за большие деньги дает возможность делать поиск в распределенных базах данных?
Пример 2: у меня монолитный проект. Он написан на одном языке и я могу прочесть и исправить любое место в коде. А у микросервисников каждый проект написан на своем языке, потому что его автор считает что это самый лучший язык в мире. В итоге разработчик микросервисов большую часть времени занимается изучением языков и фреймворков вместо полезной работы.
Пример 3: есть много функций, которые нужны в разных частях проекта. В монолите это не проблема, а что делать в проекте на микросервисах? А если сервисы на разных языках?
Я кстати, когда-то давно решал похожую проблему, генерировал классы для JS кода из PHP-классов (только поля и константы, без методов), чтобы иметь возможность работать с моделью и на сервере и на клиенте и не заниматься копипастой.
Пример 4: в монолите я жму на название функции и перехожу к ее определению. А в микросервисе я попадаю на функцию отправки запроса в другой сервис и не могу перейти к определению в один клик.
И, кстати, часто микросервисы пишут без документации на API. То есть, разбирайся, какие там параметры и что они значат.
По моему, микросервисы от хорошей жизни не пишут. Если у тебя данные вмещаются в пару дорогих серверов и команда менее 20 человек, то тебе это все просто не нужно.
И еще плюс монолиты: его обычно можно развернуть на компьютере, в то время как микросервисы отъедают память гигабайтами и часто вообще систему нельзя у себя развернуть целиком.
А что, что ты пишешь про тесты, я вообще не понял. Тесты без проблем используются в монолитных проектах.
"Микро"сервисы это когда проект состоит из нескольких отдельных компонентов, которые связаны между собой по сети. У каждого компонента обычно своя база данных.
Данные можно пересылать и через SOAP, но сейчас обычно используются более современные технологии вроде HTTP+JSON, JSON-RPC, ProtocolBuffers, Thrift, очереди сообщений и тд.
>>390867
Пример: я хочу получить какие-то данные из БД. В монолите я просто захожу в консоль MySQL, пишу запрос с 8 джойнами (а я хорошо умею использовать джойны) и получаю нужные данные. В микросервисном проекте я должен потратить во много раз больше времени, писать какие-то кастомные скрипты, чтобы добиться того же. Хотя, может есть какая-то компания, которая за большие деньги дает возможность делать поиск в распределенных базах данных?
Пример 2: у меня монолитный проект. Он написан на одном языке и я могу прочесть и исправить любое место в коде. А у микросервисников каждый проект написан на своем языке, потому что его автор считает что это самый лучший язык в мире. В итоге разработчик микросервисов большую часть времени занимается изучением языков и фреймворков вместо полезной работы.
Пример 3: есть много функций, которые нужны в разных частях проекта. В монолите это не проблема, а что делать в проекте на микросервисах? А если сервисы на разных языках?
Я кстати, когда-то давно решал похожую проблему, генерировал классы для JS кода из PHP-классов (только поля и константы, без методов), чтобы иметь возможность работать с моделью и на сервере и на клиенте и не заниматься копипастой.
Пример 4: в монолите я жму на название функции и перехожу к ее определению. А в микросервисе я попадаю на функцию отправки запроса в другой сервис и не могу перейти к определению в один клик.
И, кстати, часто микросервисы пишут без документации на API. То есть, разбирайся, какие там параметры и что они значат.
По моему, микросервисы от хорошей жизни не пишут. Если у тебя данные вмещаются в пару дорогих серверов и команда менее 20 человек, то тебе это все просто не нужно.
И еще плюс монолиты: его обычно можно развернуть на компьютере, в то время как микросервисы отъедают память гигабайтами и часто вообще систему нельзя у себя развернуть целиком.
А что, что ты пишешь про тесты, я вообще не понял. Тесты без проблем используются в монолитных проектах.
Не согласен. Во-первых, Нода асинхронная, а бизнес-логика в большинстве случаев синхронная. Во-вторых, Питон имеет гораздо больше возможностей и обеспечивает более высокую скорость разработки.
Нода вообще сейчас занимает странное место. Если ты хочешь удобный язык, пожертвовав скоростью выполнения, то есть Питон. Если ты хочешь высокую скорость, то есть Раст, если ты хочешь удобную асинхронность и высокую скорость, то есть Го. А какие плюсы у Ноды?
Подсказка: ты можешь устанавливать пакеты без использования композера, путем скачивания их и распаковки архивов.
https://github.com/zendframework/zf1/blob/master/INSTALL.md
> Zend Framework requires no special installation steps. Simply download the framework, extract it to the folder you would like to keep it in, and add the library directory to your PHP include_path
Ну и ты бы написал, что за ошибки пишет композер, может у тебя просто чего-то не установлено?
Я из любопытства посмотрел страницу zf1 на packagist, и там из зависимостей только PHP >= 5.2.11. Я также из любопытства сделал composer.phar require zendframework/zendframework1 и он установился без ошибок на моем Линуксе.
Установить линукс и LAMP
Open server позволяет выбирать версию пыхи, апача/нгинкса, субд без переустановок, просто меняя в настройках ospanel.
https://github.com/npm/cli/blob/latest/workspaces/arborist/lib/arborist/build-ideal-tree.js
const _applyUserRequestsToNode = Symbol('applyUserRequestsToNode')
...
await this[_applyUserRequestsToNode](tree, options)
...
async [_applyUserRequestsToNode] (tree, options) {
Какие костыли им приходится изобретать из-за отсутствия приватных свойств. Хотя, если подумать, константы экспортируются, потому эти свойства не такие уж и приватные. Я надеюсь, что они хотя бы не руками это пишут, а какая-то волшебная кнопка в редакторе это генерирует.
Также, в Ноде очень неудачно выбрали слово const для однократно присваиваемых переменных. Константа это неизменное значение, и имена констант обычно пишутся большими буками:
const GRAVITY = 9.81;
const MONTHS = ['Jan', 'Feb', ...];
А они используют const для обычных переменных, это запутывает при чтении кода. Хуже того, "константы" в Ноде не такие уж и постоянные:
const cant_change_this = [];
cant_change_this.push(1); // никаких ошибок
Как было бы сделать правильно: использовать другое слово, например, val, и запретить изменение содержимого однократно присваиваемой переменной. Хотя, последнее может быть сложно реализовать. Но константами это точно назвать нельзя.
И еще, почему-то разработчики на Ноде не любят называть вещи своими именами и объявляют функции как константы, то есть вместо:
function some_name(some_arg1 = 5, some_arg2 = 6) { return some_arg1 == some_arg2; }
Пишут
const some_name = (some_arg1 = 5, some_arg2 = 6) => some_arg1 == some_arg2;
Очевидно, что первый вариант намного лучше: прочитав первое слово, уже понятно, что перед нами функция. А во втором варианте нужно прочесть всю строку, и найти в ней стрелку, спрятанную среди знаков равенства, прежде чем поймешь, что у нас функция, замаскированная под константу.
https://github.com/npm/cli/blob/latest/workspaces/arborist/lib/arborist/build-ideal-tree.js
const _applyUserRequestsToNode = Symbol('applyUserRequestsToNode')
...
await this[_applyUserRequestsToNode](tree, options)
...
async [_applyUserRequestsToNode] (tree, options) {
Какие костыли им приходится изобретать из-за отсутствия приватных свойств. Хотя, если подумать, константы экспортируются, потому эти свойства не такие уж и приватные. Я надеюсь, что они хотя бы не руками это пишут, а какая-то волшебная кнопка в редакторе это генерирует.
Также, в Ноде очень неудачно выбрали слово const для однократно присваиваемых переменных. Константа это неизменное значение, и имена констант обычно пишутся большими буками:
const GRAVITY = 9.81;
const MONTHS = ['Jan', 'Feb', ...];
А они используют const для обычных переменных, это запутывает при чтении кода. Хуже того, "константы" в Ноде не такие уж и постоянные:
const cant_change_this = [];
cant_change_this.push(1); // никаких ошибок
Как было бы сделать правильно: использовать другое слово, например, val, и запретить изменение содержимого однократно присваиваемой переменной. Хотя, последнее может быть сложно реализовать. Но константами это точно назвать нельзя.
И еще, почему-то разработчики на Ноде не любят называть вещи своими именами и объявляют функции как константы, то есть вместо:
function some_name(some_arg1 = 5, some_arg2 = 6) { return some_arg1 == some_arg2; }
Пишут
const some_name = (some_arg1 = 5, some_arg2 = 6) => some_arg1 == some_arg2;
Очевидно, что первый вариант намного лучше: прочитав первое слово, уже понятно, что перед нами функция. А во втором варианте нужно прочесть всю строку, и найти в ней стрелку, спрятанную среди знаков равенства, прежде чем поймешь, что у нас функция, замаскированная под константу.
Кстати, приватные свойства в JS все-таки недавно добавили. Однако, там много чего не хватает, например:
- автогенерация конструктора
- автогенерация геттеров/сеттеров
То есть, если у меня есть класс
class Test {
#someProperty;
}
То я хочу, чтобы я мог добавить какую-то пометку вроде @property и JS для меня сгенерировал бы конструктор, который заполнит это свойство и геттеры-сеттеры, которые позволят мне обращаться к этому полю:
let test = new Test(10);
test.someProperty = 20;
А этого нету. На эти грабли во всех остальных языках программирования уже наступили, и яваскриптщики, похоже, тоже хотят наступить.
При этом, естественно, я бы хотел выбирать, что сделать:
- сгенерировать геттеры и сеттеры
- сгенерировать только геттеры
- перенаправить обращение к свойству в выбранную мной функцию
- сгенерировать конструктор или методы вроде "получить все свойства"/"обновить все свойства"
- сгенерировать методы для сравнения или хеширования объектов
Так что я не понимаю того анона, который сказал, что Нода лучше Питона, хотя в Питоне описанное выше есть, а в Ноде нету. Это есть в Питоне, в Свифте, в C# если не путаю.
Кстати, приватные свойства в JS все-таки недавно добавили. Однако, там много чего не хватает, например:
- автогенерация конструктора
- автогенерация геттеров/сеттеров
То есть, если у меня есть класс
class Test {
#someProperty;
}
То я хочу, чтобы я мог добавить какую-то пометку вроде @property и JS для меня сгенерировал бы конструктор, который заполнит это свойство и геттеры-сеттеры, которые позволят мне обращаться к этому полю:
let test = new Test(10);
test.someProperty = 20;
А этого нету. На эти грабли во всех остальных языках программирования уже наступили, и яваскриптщики, похоже, тоже хотят наступить.
При этом, естественно, я бы хотел выбирать, что сделать:
- сгенерировать геттеры и сеттеры
- сгенерировать только геттеры
- перенаправить обращение к свойству в выбранную мной функцию
- сгенерировать конструктор или методы вроде "получить все свойства"/"обновить все свойства"
- сгенерировать методы для сравнения или хеширования объектов
Так что я не понимаю того анона, который сказал, что Нода лучше Питона, хотя в Питоне описанное выше есть, а в Ноде нету. Это есть в Питоне, в Свифте, в C# если не путаю.
Ты пишешь странные вещи. Во-первых, копипастить нет никаких проблем, если твой редактор поддерживает команды "увеличить отступ" и "уменьшить отступ" (все нормальные редакторы кроме какого-нибудь легаси времен DOS это поддерживают).
Во-вторых, если ты копипастишь код на JS, тебе точно так же надо поддерживать в нем правильные отступы.
const rpj = path => readFile(path, 'utf8')
Кто догадается, что значит rpj?
const readBinDir = async (path, data) => {
const add_id = data => {
Каждый называет функции как хочет, никакого единообразия.
Ну и, конечно, ужасный синтаксис со стрелками. Стрелочные функции предназначены для ситуаций, когда функция маленькая и передается в какую-то другую функцию:
array.map(e => e.name)
Это не значит, что слово function устарело и теперь надо везде писать громоздкую и плохо читаемую конструкцию с const. Я подозреваю, это функциональщики хотят сделать JS код похожим на их функциональные языки, где функции объявляются через равенство. Но JS это не функциональный язык и у него есть свой синтаксис, и код должен быть читаемым, а не похожим на твой любимый функциональный язык.
И да, кстати, что тебе мешает настроить редактор или написать плагин, чтобы при вставке он исправлял отступы сам?
er => {
if (er.code === 'EJSONPARSE') {
Похоже, разработчик на Яваскрипте не слышали, что можно делать разные классы исключений и проверять эти классы. Тогда хотя бы IDE будет подсказывать и проверять их имена.
https://github.com/npm/cli/blob/latest/workspaces/arborist/lib/arborist/build-ideal-tree.js#L327
.then(root => this[_global] ? root
: !this[_usePackageLock] || this[_updateAll]
? Shrinkwrap.reset({
path: this.path,
lockfileVersion: this.options.lockfileVersion,
resolveOptions: this.options,
}).then(meta => Object.assign(root, { meta }))
: this.loadVirtual({ root }))
Это же просто тяжело читать. Ужасный стиль кода. Я не робот, чтобы в уме разбирать такие выражения.
Ну и отдельно минус им за то, что нагородили там кучу .then вместо использования await. Эта асинхронность в Ноде полезна в 1% случаев и только мешается в 99%.
Кстати, в этом же файле оператор return имеет длину более 70 строк:
https://github.com/npm/cli/blob/latest/workspaces/arborist/lib/arborist/build-ideal-tree.js#L311
return начинается в строке 311 и заканчивается где-то в районе 380.
Если такой код написали функциональщики, то, конечно, желания когда-либо использовать функциональные языки у меня поубавилось. Императивный код однозначно лучше хотя бы тем, что в нем не пишут return на 70 строк и гору из then.
Так это одно и тоже по сути - await это синтаксический сахар просто, который так же работает через промисы, просто декларация более привычная, но это так же асинхронно работает.
Они пишут свои скрипты в notepad++
Читается лучше.
let x =await getX();
let y = await getY(x);
Против горы из коллбеков.
А еще лучше, конечно, использовать язык, где есть блокирующие функции и await не нужен.
https://github.com/npm/cli/blob/latest/workspaces/arborist/lib/arborist/load-virtual.js#L86
async [loadFromShrinkwrap] (s, root) {
Что такое s? Что такое root? Понять невозможно.
Ну да, await дает некое удобство, но все равно продолжает оставсть асинхронным.
Так в ноде же вроде есть блокирующие и неблокирующие операции: типа readFile() и readFileSync()
https://learnjavascript.online/
Это тоже хорошо.
>Какие костыли им приходится изобретать из-за отсутствия приватных свойств.
Уже как несколько лет есть.
> это запутывает при чтении кода
Запутывает только тебя, когда ты пишешь на JS больше одной недели - привыкаешь.
> "константы" в Ноде не такие уж и постоянные
Потому что объекты передаются по ссылке. Тут абсолютно логичное поведение. Для неизменяемых объектов в JS есть Object.freeze
>Очевидно, что первый вариант намного лучше
Нет, не очевидно. Ты забываешь про минификацию
>найти в ней стрелку
Зачем ты ищешь стрелку, если тебе IDE цветом показывает, что это функция? Даже если ты в блокноте пишешь код, то наличие скобок после = сразу говорит о том, что эта функция.
>>392033
>пометку вроде @property
Уже есть в планах на 2023.
>в Питоне описанное выше есть
А в ноде есть нормальная асинхронность, лучшая производительность, интеграция с SPA-фреймворками, более дешевая цена разработки.
Причем тут вообще JS, если это очевидная проблема макаки-формошлепа, который это писал? Говнокодить можно и на питоне и на пыхе и на чем душе угодно.
Ну вообще есть концепция, одна из, что исключения нужно использовать при критических ошибках в логике программы, а если речь идет об ожидаемом поведении: вроде как пользователеь что не так ввел - то тут лучше воспользоваться паттерном увдедомлений.
> привыкаешь.
А зачем привыкать к плохому?
>> "константы" в Ноде не такие уж и постоянные
> Потому что объекты передаются по ссылке. Тут абсолютно логичное поведение.
Зачем мы используем const? Чтобы сказать читателю кода, что эта переменная не изменится, и чтобы защититься от случайного изменения. Если ты массивы и объекты при этом разрешаешь изменять, то весь смысл const теряется. const для массивов и объектов по сути ничего не значит.
И это точно не константа.
>>Очевидно, что первый вариант намного лучше
> Нет, не очевидно. Ты забываешь про минификацию
Ты пишешь странные вещи. При чем тут минификация? Я говорю про исходный код, который мы пишем и читаем, мне неинтересно, как он поменяется при минификации. Мне безразлично, если минификатор перепишет константы на функции или наоборот.
> Зачем ты ищешь стрелку, если тебе IDE цветом показывает, что это функция?
Я смотрю код на Гитхабе и там никак цветом не показано, что это функция. Более того, ты не прочел мой аргумент, читай внимательно. В случае с function ты понимаешь, что это функция, увидев первое слово, а в твоем случае я должен просмотреть глазами всю строку, найти в ней нужное место и убедиться что оно нужного цвета.
IDE, конечно, может улучшить восприятие плохого кода. Но это не значит, что можно писать плохой код.
Если уж ты упоминаешь IDE, то я замечу, что IDE может так же подсвечивать другим цветом переменные, которые не меняются, и слово const становится ненужным - просто ставь везде let и пусть IDE подсвечивает их разными цветами.
> А в ноде есть нормальная асинхронность, лучшая производительность, интеграция с SPA-фреймворками, более дешевая цена разработки.
только вот код на Ноде, судя по npm, нечитаемая лапша.
Что думаете? Под капотом работа с AST и кодогенерацией. Планирую добавить больше документации (сейчас её мало так как in-house инструмент) + описать внутреннее устройство в большой статье на хабре.
Да можешь с первой начать, че там читать то, ну =)
Я когда-то давно тоже делал конвертацию PHP классов в JS, чтобы можно было работать с моделью и на сервере и на клиенте. Правда там все было в разы примитивнее, копировались только константы и публичные поля, и еще, по моему, генерировались геттеры/сеттеры, чтобы модель могла слать события при изменении свойства (вью слушало эти события и обновляло картинку на экране).
В твоем коде, на мой взгляд, слабое место, что все поля экспортируются по умолчанию. Если этот код доступен на клиенте (в виде JS или внутри мобильного приложения), то легко представить ситуацию, когда один программист добавляет в класс какое-то поле, и оно автоматически появляется на стороне клиента и раскрывает важную информацию злоумышленникам. Было бы, возможно, логичнее, помечать поля аннотацией, что они "общедоступны".
И даже если код используется только на сервере: другой программист видит, что в сущности есть недокументированное, но полезное поле, и начинает использовать его. И теперь ты не можешь убрать это поле, потому что другой сервис сломается.
Что касается swagger, то для PHP есть инструменты для его генерации через DocBlock-аннотации. Хотя, если у тебя есть хорошие DTO, то может быть swagger можно генерировать как-то из них. Swagger хорош как язык документирования API, то есть ты передаешь коллегам не кучу TS-классов со словами "на, разбирайтесь", а человеко- и машинночитаемую документацию.
Ну и иногда в описанной тобой ситуации за основу берут описание класса/интерфейса на IDL. Это не конкретный язык, а скорее разновидность языка. Пример IDL можно увидеть в спецификациях DOM, в исходных кодах Chrome/Firefox.
5 не нужна, можно изучить последнюю версию + прочитать на сайте PHP список изменений между последней версией и PHP7.4. У них есть удобный список того, что поменялось в каждой версии: https://www.php.net/manual/ru/migration81.php
Не должен, если использовать правильно. То есть, только для подстановки чисел или строк в SQL-запрос. Это безопасно:
$safeX = $pdo->quote($x);
$pdo->execute("SELECT ... WHERE x = $safeX");
Но если ты используешь quote для каких-то других целей (например, для защиты от XSS), применяешь quote 2 или более раз, или экранируешь данные в одном месте программы, а используешь их совсем в другом месте, то там могут быть уязвимости.
Но лучше просто использовать плейсхолдеры.
Дефолтный юзер это root без пароля. Или ты по какому-то своему старому логину не можешь зайти?
А все, надо было пароль root
Мне валить из конторы?
Омежка, спокойно, никуда валить не нужно. Пишешь тимлиду/сеньору и просишь помочь развернуть проект и провести краткий экскурс о струтуре проекта, после чего приступаешь к макакингу за 300кк/нс.
>Ни примеров нихуя, откуда нам знать что ТЕБЕ делать?
Каких примеров? Причём тут моя таска? Ты о чём вообще?
>>393016
>Пишешь тимлиду/сеньору
Он тоже в чатике сидит и ему похуй по-моему.
Вообще не понимаю нахуй так делать тогда - давать человеку неизвестный проект без какого-то введения. Они ждут, что я сам изучу за неделю то, что они за 2-3 года напилили?
Так и есть, в пхп самая высокая конкуренция среди всех языков и с него перекатываются на другие типо питона или го, а ты берешь и вкатываешся в пхп в 2022ом лол
Лучший язык так-то.
Не понял твоей мысли.
Картинки хранишь на жёстком диске.
В базе данных создаёшь таблицу в формате "id | путь до картинки".
В таблицу с постами добавляешь столбец, где хранишь id картинки либо null, в случае, если ее нет.
Для поста создаёшь html шаблон. В случае, если у поста есть картинка, то ты в шаблон вставляешь тег наподобие <image src="post->imagePath">.
Если хочешь возможность добавлять к посту много картинок, то, например, вместо одного id храни их массив.
Мимо двухмесячный вкатыш, возможно мой способ не оптимальный
interface.php в корне.
file1.php в папке script : include "../interface.php";
file2.php в корне: include "script/file1.php";
Фатал ошибку выдает, тут походу получается с точки зрения file2, что interface лежит по идее как просто include "interface.php".
1. Удаляешь картинку из хранилища и строчку из таблицы.
2.1. Меняешь порядок чисел в массиве, если тебе нужно изменить порядок прикрепленных картинок.
2.2. Если же тебе нужно иметь возможность вставить картинку в разные места поста, то просто даёшь юзеру добавить метку для картинки.
2.2. Подробнее:
Тело поста ты все равно хранишь в базе данных в формате text, так что ничего не мешает сделать как-то так.
"Lorem lorem lorem
Lorem lorem
@image
Lorem lorem ipsum
Lorem"
Ты сам можешь придумать как улучшить, если что-то не нравится.
Должно быть README с инструкциями по установке. Нет ридми - не беда! Включай голову и попробуй разобраться сам. Прежде всего скажи спасибо предыдущим разработчикам, а затем осмотри корень проекта, а можно и другие папки, на наличие специальных файлов:
- может, есть папки с документацией в формате txt или md?
- может, есть shell-скрипты?
- если есть файл composer.json, то наверно надо установить зависимости с помощью composer. А может в этом файле даже прописано действие для установки?
- если есть bower.json, то наверно это библиотеки для фронтенда
- если есть package.json, то это точно библиотеки для фронтенда. Также там в секции scripts могут быть какие-то полезные команды
- если есть Makefile, то в нем могут быть полезные команды
- а может есть Докерфайл? Тогда, возможно, проект запустится в Докере. А даже если нет, то из него можно извлечь полезную информацию
Далее, поищи конфиги и найди, куда вписывать реквизиты доступа к БД, а может там будут упоминания других сервисов вроде redis или rabbitmq, которые нужны.
После этого попробуй запустить проект. Если падает с ошибкой - разберись, от чего она возникает и поправь.
>попробуй запустить проект
Да это не проблема так-то.
Проблема в том, что это не сайтик, а пачка бекенда с кучей шелл-скриптов которые должны как-то тянуть данные из внешнего источника и обновлять их по кд. Как это должно всё работать я хз - там одних только контроллеров больше сотни и шелл-обработчиков под 50. Документации нет - там не принято её вести. База данных пустая - я её структуру даже не знаю.
Комментариев в коде тоже нет в 2х файлах не считается.
Дело в том, что я не джун уже и у меня нет проблем просто поднять проект.
Как с этим работать я хз.
>должны как-то тянуть данные из внешнего источника
В смысле нескольких источников. Оно там всё повязано друг на друга и везде токены-хуёкены под разный стафф.
Поддержки на это всё я получаю минимум - один пук в чатик в день.
Спасибо, а glob() путь берет относительно места нахождения файла, из которого он вызывается?
>Юнит-тестов тоже не завезли.
Всмысле юнитов там тоже нет - гадят прямо в контроллерах. Тестировать нечего.
я набухался сегодня - пошло оно всё
>Он тоже в чатике сидит и ему похуй по-моему.
Ты читать умеешь? Ты пишешь не в ЧАТИК, а пишешь НАПРЯМУЮ тимлиду. Если не отвечает - звонишь на телефон. Если не берет - идешь к его непосредственному руководителю. Повторяешь до победного конца, постоянно идя к руководителю выше.
>Они ждут, что я сам изучу за неделю то, что они за 2-3 года напилили?
Нахуй ты меня, т.е. гиза на дваче об этом спрашиваешь? ПМа своего спроси лучше.
>в пхп самая высокая конкуренция среди всех языков.
С хуяли, если я только и дело слышу про питон и жаба скрипт. У меня последнее время ощущение, что питон учат все, школьники, домохозяйки, деды в доме престарелых, зэки в тюрячке. Да на питон статистически больше вакансий, но если их забрать там около половины это датасосайенс и машинпукинги всякие, мне это не интересно, мне не интересен матан. Да и эти направления как правило нужны в крупных компаниях с бигдатой, а там дохуя бюрократии и требуют вышку, то есть я уже проигрываю конкуренцию любому дауну 4 года отсидевшему в ВУЗе. Я просто хочу веб делать, а веба на питоне меньше, соответственно и шансы на трудоустройство уменьшаются. Голанг вообще говорят нет смысла вкатываться с нуля, ибо там ищут людей которые уже имеют опыт веб разработки.
Хз, язык интересный, очень удобный особенно для первого, работы дохуя на PHP. Варианты развития есть большие. Почти весь бэкенд, особенно новых сервисов VK написан на пыхе. Они свои фреймворки пишут и много полезных штук. Так же начали выбирать снова пых как основной язык для разработки в Сбере. Еще достаточную часть в Авито и Баду
Изучаешь пхп + ларавель и в дополнение к этому вторым языком учишь js, и считай продался в любую компанию на хайофер.
Удел пхп это блондинки и лендинг страницы
Вордпресс и прочие cms это ебаный кал, да, даже те, которые на основе симфони сделаны и в целом современные, но вот писать на голом симфони/ларавеле кайфово. Функционала из коробки дохуя, код красивенький, если изъебнешься даже по солид хуелид будет, фреймворки стабильные, гарантировано известно, что никуда не денутся, и никакой зумерский нитакойкаквсе фреймворк их не вытеснит как это регулярно происходит в мире жс. Один минус - пхп же, скорость работы говно, плюс после языка, живущего один реквест, интуитивно тяжело переключаться на какую-нибудь ноду.
То есть мне отказываться от вакансии на битрикс? Я думал что норм ща всё будет... Думал потом как-нибудь перейду на этот ларавель, но сейчас надо потерпеть как говорится.
Ты уже выучил битрикс? Что читал?
Очевидно, придётся хранить
- либо каждое просмотренное человеком видео,
- либо случайно сгенерированный порядок клипов и положение просмотра в нём
>>387643 - это не я отвечал.
вообще, мне, например, нужен человек для поддержки приложения на чистом РНР. Если интересно, напиши в ТГ https://t.me/your_future_life
Благодарю
>а мне сказали что php для лохов
Так и есть, а чего ты хотел от знания скриптоязыка? Думал сучки будут течь, а бояре из нормальных языков будут первыми руку тянуть?
480x854, 0:24
Как быть с правами доступа?
Например:
1. Я поднимаю проект на ларавель в докере
2. Композер из контейнера с php генерирует мне файлы и папки фреймоворка.
3.1. Пытаюсь открыть сайт в браузере и получаю permission denied error.
3.2. Пытаюсь отредактировать файлы через редактор и получаю access denied retry as sudo.
4. Прописываю
# chmod -R 777 ./
5. Казалось бы, все хорошо, но если сгенерировать миграцию
(Через $ docker exec -ti project_app bash)
$ php artisan make:migration create_orders_table
И попробовать отредактировать миграцию, то снова 3.2.
Как быть? Что править? Мне надо себя закинуть в какую-то группу? Но миграция, например, генерируется с правами 600, и добавление в группу мне явно не поможет.
Как навсегда забыть о проблемах с правами доступа к файлам? Не прописывать же мне после каждого действия
# chmod -R 777 ./
Да и небезопасно это явно.
Блять, в любом, которое меньше места занимает. Массив id через разделитель + одно число-курсор/положение в этом плейлисте.
Дело в владельце файлов, нужно как вариант синхронизировать айди юзера www-data в контейнере с айди твоего пользователя в системе.
>Массив id через разделитель + одно число-курсор/положение в этом плейлисте.
А если у меня допустим 5000 видео в каждой категории, и каждый час добавляются новые видео в каждую категорию? Надо чтобы пользователь при открытии видео из категории 1 видел при пролистывании далее только видео из категории 1. И еще нужно учесть что id видео будут не порядку, тк некоторые видео могут быть удалены из-за жалоб.
>зачем тратить кучу времени на всю эту настройку и т.п если можно просто на сервере поднять lemp залить с гита проект и все?
Я не спец по докеру, но чтение любой статейки о докере в принципе даёт ответы на твои вопросы. Самое банальное зависимости, ты обновил приложение, запускаешь, а тебе выдаёт "пук пук версия пэхапэ 7.4 больше не поддерживается, требуется обновление мням", докер позволяет избежать этой хуйни. Или ты обновился, а там баг, хочешь вернуться на предыдущую версию, а зависимости библиотеки всякие уже обновлены, надо и их откатывать, это превращается в череду жопной боли и тд. Гораздо проще завалить контейнер и просто поднять новый с предыдущей версией где бага не было. Конечно можно тупо сделать снэпшот машины перед обновлениями и потом откатить но это не бест практикс я думаю. Так же у тебя может там на тачке ещё что-то крутиться которое будет требовать другие зависимости, будет конфликт, то есть придётся для каждой приложухи свою виртуалку заводить, это как бы шиза и нерациональное расходование ресурсов сервака. Ну и типо безопасность, изолированность от ОС.
Я это как-то так вижу, сам работаю админом, могу сказать что админа докер избавляет от лишнего пейна и горения в заднице.
>>395664
Двачую. Зачем нужен докер?
Стеки типа php/composer/laravel(и тд)/vue не нуждаются же в пердолинге (разве что с версией php)?
Типа чего, я например laravel с его богатством офицальных фреймворков буду изобретать велосипед? Я слышал Laravel вообще может на ВИРТУАЛЬНОМ ХОСТИНГЕ размещаться с обычной php.
в чем я не прав? VDS с Git конечно нужен чисто для проффесиональной деятельности и совместной работы, адекватного деплоя и дебаггинга , а ДОКЕР ЗЕЧЕМ?
>ДОКЕР ЗЕЧЕМ
Для тех кому на работе неделями делать нехуй и они придумывают как сделать абстрактные абстракции в изолированных контейнерах чтобы занять себя хоть какой-то видимостью работы. Потом ПМу гордо заявляется чем ты занимался вместо реализации полезных фич или дебага.
Особенно охуенно когда требуют докер, но не дают рабочую машину - типа ставь на свою и тяни всю херь сам к себе и ебись с этим. Прям дногалерное нищебродское айти такое.
Нет никаких проблем поднять рабочий сервак с гитом для каждого разраба чтобы он там работал изолированно. Правда для этого надо отдельно девопса иметь, но у говна для этого нет денег обычно и они эту хуиту на разрабов скидывают - чтобы они сами докер пердолили.
тише, не пали
А что не так? Всё по факту.
Ну блядь, чем не годится сервер с lamp/lemp и системой контроля типа git/hub/lab/gitea? Я просто новичок, неужели мне эту поебень учить? У php-шников ведь есть composer, symphony, laravel, мне что для работодателей нужно учить докер?
Как бы не проблема, но есть ли смысл. Бэкенд на js/node если в проекте, смысл вижу. Фронтенд и система микросервисов там неебическая какая-то тоже. А на php звучит как-то неуместно
Тебе не нужен контроль версий если нечего контролировать, у тебя не такие большие проекты чтобы их заносить по веткам, в будущем когда научишься кодить поймешь зачем это нужно и только тогда выучишь. Сервера никакие ставить тебе не надо, ты можешь скачать готовые стаки, но они однокнопочные, просто запустил и работаешь, в твоем случае тебе даже не нужно никакие конфиги писать. Composer это менеджер пакетов для PHP, упрощает работу в разы, Symfony и Laravel это вообще фреймворки, один строится поверх другого. Докер тебе нужен как раз таки чтобы не заморачиваться с серверами. Микросервисная архитектура пишется на PHP причем повсеместно и это нормальная практика использовать PHP в связке с JS для этого путем разделения фронтов.
Это фиксит csrf да, но теперь если я захожу создать функционал приватных фоток, чтобы их видели не все пользователи.
Я не могу создать просто тег img с сылкой на фотку, т.к это отправляет GET запрос, а он токо кукисы передают, собственно поэтому токен не передается. Получается мне нужно делать запрос на мой роут фоток, чтобы он мне скинул в бейс64?
Тогда стоит вопрос кеширования. Мне его самому пилить?
Делают ли адекватные парни передачу токена в хедерах? Или я че-то не выкупаю.
Как в ВК это реализованно? Они генерируют случайную ссылку которая временно работает и потом по ней может пройти любой чел?
Есть какие нибудь адвайс листы со списком программ на пыхе? типа рулетки? Надо бы тренировать себя, а в чем реализоваться хз
лучше PDO умолчанию использовать?
Да.
>дногалерное нищебродское айти
Судя по твоему высеру, ты ничего другого и не видел.
Когда придется столкнуться с крупным микросервисным приложением, тогда расскажешь, как тебе просто все поднять без докера на локальной машине
Дружок пирожок, а на сравнительно старом ноуте на ubuntu докер нормально работать будет? или нужно неебаться с стационарный комп собирать? Я слышал на винде он лагает пиздос и требовательный, это правда?
Или от проекта зависит?
Может кто знает
Я имею ввиду php стеки вчастности
Я слышал докер не пашет только на win7, а линухи/10 нормально.
>Как по уму сделать, чтобы AJAXом эту таблицу выводить динамически?
Что ты подразумеваешь под "по уму"? Самый простой вариант - сделать кнопку "Поиск", при нажатии на котороую делать запрос и обновлять данные в таблице.
Короче я продублировал всю таблицу и в скрипте, и в шаблоне(где обернул ее в div). При вбивании в строку поиска после каждого символа с помощью обработчика onkeyup у inpuy она аяксом полностью заменяется. Скорее всего для больших реальных таблиц БД это очень нерационально по производительности, но для небольших объемов пойдет по идее.
хх.ру недавно добавили аякс на поиске, я аж вздрогнул, подумал может приснилось, что самый крупный снг сайт по поиску работы додумался сделать себе фичу 15-летней давности
Кстати про хх.ру, люди собеседуются только один раз в в какую-то фирму и попадают типа в блеклист после отказа, или это нормальная практика собеседоваться туда же через какой-то промежуток времени?
Да не, просто второй раз собеседоваться можно через 1-2-3-4-5-6 месяцев. В ультратоп компаниях мб через год.
А в блеклист можно попасть, если ты поведешь себя по-свински. Типа нагрубишь и нахуй пошлешь, или договоришься на собес, а сам не появишься и т.д.
Потому-что битрикс это ебаное говно созданное тупыми ебланами наебывать ссаных гоев.
Зачем тебе heredoc? Ты хочешь всунуть туда таблицу?
Один из грамотных вариантов это послать запрос на твой скрипт сервера который отправит данные в application/json формате, получить ответ и запарсить с помощью ajax, вывести таблицу с помощью директив пыхи. Если нужно обновить данные просто отправляешь свой поисковой post запрос, который потом принимаешь там же и выводишь таким же образом соответствующую информацию.
Двачую.
Да просто во всех примерах ajax'а которые я пока видел там скрипт что-то выводит через echo, а js это присваивает свойству innerHTML какого-то элемента документа.
Если не затруднит, можешь кинуть пример того, о чем ты говорил?
> Если ты хочешь удобный язык, пожертвовав скоростью выполнения, то есть Питон. Если ты хочешь высокую скорость, то есть Раст, если ты хочешь удобную асинхронность и высокую скорость, то есть Го. А какие плюсы у Ноды?
Зачем выбирать из говен когда есть решётки с asp.net которые обладают всем вышеперечисленным?
>>392108
>основательного изучения JS
Чтобы основательно запомнить все баги/костыли этих помоев существующих ради управления DOM'ом надо ещё денег заплатить?
>>396064
Ох уж эта боль ждуна который предпочтёт на каждый проект ставить на ОСь тонны говна вместо того, чтобы просто набрать в консоли: docker-compose up
Заебись наверное накатывать кучу хуйни и запускать через костыли проект, а потом на новом проекте ставить другие костыли пока твоя ОСь не упадёт нахуй от такого кол-ва мусора в системе.
>>397788
>Работаю над крупным распределённым приложением
Из всех зависимостей в котором пыха, мускуль и апач?
Пытался заюзать поделие азиатов, но на 8-ом пыхе не собирается https://github.com/Qihoo360/phptrace
Есть ли еще аналоги phptrace?
>Чтобы основательно запомнить все баги/костыли этих помоев существующих ради управления DOM'ом надо ещё денег заплатить?
Я заплатил, но там норм базу дают.
Самое главное постичь баги этого недоязыка с динамической типизацией, почему NaN !== NaN и прочие фичи
>NaN !== NaN
>1.1*1.1
>'2'+ '2' - '2'
То ли дело в православном C++! Там то по другому все работает, да?
Нужна следующая помощь:
Есть форма для создания тестов с вопросами (пик 1)
Также, есть вопросы. Для них тоже есть форма (пик 2)
Логично, что тест и вопросы связаны один-ко-многим.
Суть проблемы:
В форме для создания тестов будет блок с добавлением вопросов к тесту.
Т.е. кнопка "сохранить тест" должна сохранять в базу данных еще и вопросы, которые будут иметь внешним ключом айди только что созданного вопроса.
Вопрос:
Я правильно понимаю, что для того, чтобы одним запросом отправлять на сервер данные "вложенных форм" нужно копать в сторону JS?
Можете подсказать, какая реализация будет более выигрышной?
Нормально ли, если кнопка "сохранить тест" будет сначала отправлять по пути example.com/tests/store, по которому в таблицу с тестами запишется тест; а затем в цикле, в количестве раз, равному количеству вопросов, будет отправлять по пути example.com/questions/store, по которому в таблицу с вопросами запишется вопрос, связанный с тестом через поле с id теста?
Может быть в Laravel через TestController можно сделать что-то типа
$test = Test::create($testFormData);
$questions = $test->questions()->create($questionFormData);
??
>Я правильно понимаю, что для того, чтобы одним запросом отправлять на сервер данные "вложенных форм" нужно копать в сторону JS?
Разве что только для динамического добавления элементов в вопросы.
Один тест содержит несколько вопросов, которые содержат несколько ответов. Нужна таблица тестов, таблица вопросов и таблица ответов. Вопрос связывается с таблицей тестов с указанием аайдишника таблицы, таким образом связываешь все.
Структура таблицы:
Тесты
— id
— name
Вопросы
— id
— test_id
— text
Ответы
— id
— question_id
— text
Цепляешь таблицы друг за другом, а внутри скрипта создаешь отношения.
Да, это я понимаю.
Но как мне реализовать форму, чтобы из нее данные попадали в таблицы тестов, вопросов и ответов? Из TestController.store делать редирект в QuestionController.store а оттуда в AnswerController.store?
Нормально ли будет если кнопка "добавить вопрос" будет добавлять в форму следующую структуру вида:
</input type="text" name="question_{i}">
</input type="text" name="answer_{i}">
Где i - номер вопроса в тесте
И в контроллере я буду парсить по question_ . '#\\d#' и answer . '#\\d#'
И для каждого блока, где i одинаковый, я буду вызывать редирект в Question controller и оттуда в AnswerController.
Разве пользователь не сможет подменять i через браузер? Это ведь будет все ломать?
У меня intelephense vscode тоже не видел интерфейс, реализованный в классе, пока я не открыл файл с ним в новой вкладке. Видимо баг у них, либо надо как-то док-комментами @ показывать это.
Внезапно, оказалось, что можно.
И подобных методов достаточно:
$test->save($comment);
$test->saveMany([$comment1, $comment2]);
$test->create($commentData);
$test->createMany([$commentData1, $commentData2]);
Тогда вопрос следующий:
Как внутри формы выделять блоки вопрос-ответ? Разве POST-запрос может иметь уровни вложенности?
Из консоли ты можешь подключиться к базе данных через этого юзера? Менять пароль для юзера пробовал?
Выше в треде у анона была такая же проблема.
Чего там, ошибка в конфиге или через судо надо запускать?
glob(), как и большинство других функций, берет пути относительно рабочей директории процесса. То есть, если рабочая директория это c:\data\, и ты пытаешься открыть файл a\b.txt, то PHP будет пытаться открыть c:\data\a\b.txt.
В ОС вроде Linux/MacOS/Windows у каждого процесса есть "рабочая директория". Ты можешь получить ее функцией getcwd() и изменить функцией chdir(). Собственно, рабочая директория придумана как раз для того, чтобы не надо было писать полные пути к файлам, а можно было использовать относительные.
Если ты запустил скрипт из командной строки, то рабочая директория это директория, которая была текущей на момент запуска скрипта (это не директория, где находится скрипт). Например, если текущая папка была
c:\data\
и ты запустил команду
php c:\scripts\1.php
То рабочей директорией будет c:\data\. В линуксе все аналогично, только слеши наклонены в другую сторону и нет букв у дисков.
Если твой скрипт запускается веб-сервером (то есть, ты открываешь страницу в браузере), то рабочая директория непредсказуема и ты не должен на нее полагаться. Ты можешь явно поменять ее с помощью chdir(), если ты хочешь иметь какое-то предсказуемое значение, но лучше генерировать пути относительно какой-то константы вроде ROOT_DIR или относительно папки скрипта __DIR__.
А, еще. Рабочая директория наследуется при запуске нового процесса. Поэтому, когда ты запускаешь скрипт из командной строки, то PHP наследует рабочую директорию от оболочки. Рабочая директория не зависит от того, в какой папке расположен сам скрипт.
Докер запускает программы внутри "контейнера", если упростить, то контейнер это что-то вроде легкой виртуальной машины. Программа в контейнере изолирована от основной системы: она может видеть другие файлы и папки, другие сетевые интерфейсы, и других пользователей.
Мы можем настраивать в Докерфайле (я думаю), под каким пользователем программа запускается внутри контейнера и какому пользователю на хосте он соответствует. Или мы можем не настраивать, и тогда Докер возьмет какие-то свои значения по умолчанию, они написаны в документации:
https://docs.docker.com/engine/reference/builder/#user
https://docs.docker.com/engine/security/userns-remap/
Например: мы настраиваем, что пользователь mysite на хосте соответствует пользователю root в контейнере. Мы запускаем программу в контейнере как root, и если она создает файл, то она видит его владельца как root, но на хосте его реальный владелец виден как mysite.
Это называется linux user namespaces и container uid mapping. Они описаны в мануале по Линуксу: https://man7.org/linux/man-pages/man7/user_namespaces.7.html
Там, кстати, написано, что можно просмотреть маппинги для контейнера через /proc/{id процесса на хосте}/uid_map. Под каким пользователем на хосте запущен контейнер, ты можешь увидеть в /proc/{id процесса на хосте}/loginuid
Погугли эти термины, изучи, как это работает, и выясни: под какими пользователями (это обычно написано в Докерфайле) ты запускаешь программы и как у тебя настроено соответствие uid между хостом и контейнером. Проверь это через информацию в /proc/
После этого выясни, что надо поменять, чтобы все файлы создавались с правильными правами. Я думаю, что root тебе в контейнерах не нужен, и маппинг тоже не нужен, и удобнее всего будет отключить маппинг и запускать все контейнеры с правами твоего пользователя. Или же, если ты хочешь повысить безопасность, сделать отдельного пользователя для сайта, не имеющего доступ к твоим файлам, и запускать все контейнеры из-под него.
Работа с Докером требует знания командной строки, shell и основ Линукса. Докер это не магическая кнопка, которая сама решит все проблемы.
Докер запускает программы внутри "контейнера", если упростить, то контейнер это что-то вроде легкой виртуальной машины. Программа в контейнере изолирована от основной системы: она может видеть другие файлы и папки, другие сетевые интерфейсы, и других пользователей.
Мы можем настраивать в Докерфайле (я думаю), под каким пользователем программа запускается внутри контейнера и какому пользователю на хосте он соответствует. Или мы можем не настраивать, и тогда Докер возьмет какие-то свои значения по умолчанию, они написаны в документации:
https://docs.docker.com/engine/reference/builder/#user
https://docs.docker.com/engine/security/userns-remap/
Например: мы настраиваем, что пользователь mysite на хосте соответствует пользователю root в контейнере. Мы запускаем программу в контейнере как root, и если она создает файл, то она видит его владельца как root, но на хосте его реальный владелец виден как mysite.
Это называется linux user namespaces и container uid mapping. Они описаны в мануале по Линуксу: https://man7.org/linux/man-pages/man7/user_namespaces.7.html
Там, кстати, написано, что можно просмотреть маппинги для контейнера через /proc/{id процесса на хосте}/uid_map. Под каким пользователем на хосте запущен контейнер, ты можешь увидеть в /proc/{id процесса на хосте}/loginuid
Погугли эти термины, изучи, как это работает, и выясни: под какими пользователями (это обычно написано в Докерфайле) ты запускаешь программы и как у тебя настроено соответствие uid между хостом и контейнером. Проверь это через информацию в /proc/
После этого выясни, что надо поменять, чтобы все файлы создавались с правильными правами. Я думаю, что root тебе в контейнерах не нужен, и маппинг тоже не нужен, и удобнее всего будет отключить маппинг и запускать все контейнеры с правами твоего пользователя. Или же, если ты хочешь повысить безопасность, сделать отдельного пользователя для сайта, не имеющего доступ к твоим файлам, и запускать все контейнеры из-под него.
Работа с Докером требует знания командной строки, shell и основ Линукса. Докер это не магическая кнопка, которая сама решит все проблемы.
Докер это очень кривое и костыльное решение проблемы зависимостей. Представь, что ты пишешь проект. Естественно, ему для работы нужно:
- определенные версии библиотек PHP
- определенная версия PHP (у тебя нет желания тестировать каждое изменение кода со всеми предыдущими и будущими версиями PHP)
- определенные расширения к PHP
- определенные утилиты командной строки (например: для конвертации PDF в картинку)
- определенная версия PostgreSQL
- определенные плагины к PostgreSQL
- определенная версия redis
- определенная версия nginx
Часть проблем решает композер: он умеет устанавливать PHP-библиотеки, и позволяет указать, какая версия PHP и какие расширения нужны, но устанавливать их не умеет. Остальное ты должен ставить или настраивать как-то сам.
Установка тоже может быть нетривиальной. Например, чтобы установить какую-то нативную библиотеку (не на PHP), тебе может понадобиться ее скомпилировать, а для этого нужно сначала установить определенную версию компилятора, и определенные версии зависимостей этой библиотеки.
Наконец, может быть такое, что ты используешь не Линукс, а Windows, и никто даже не пытался собирать эту бибилиотеку под WIndows, и неизвестно, работает ли она под Windows вообще. Или ты используешь Линукс, но не тот дистрибутив, который используют авторы библиотеки и их инструкции по установке не работают у тебя.
Согласись, что проблема существует. Теперь подумаем, как ее можно решить.
Одно из правильных решений - это менеджеры пакетов. Мы могли бы попробовать поставить все эти программы и библиотеки менеджером пакетов, а в проекте просто написать их список. Но тут тоже есть несколько проблем:
- линуксовые менеджеры пакетов вроде apt или rpm могут не содержать нужной программы в репозитории, или не содержать нужной версии, или содержать версию, собранную с другими настройками (например, утилита есть, но она не поддерживает какой-то формат данных).
- в разных дистрибутивах пакет с одной программой может называться по-разному. В одном это пакет convert, в другом это libconvert, а в третьем convert-utils. Непонятно, как в документации все это описать.
- линуксовые менеджеры пакетов не умеют ставить программу с произвольными настройками компиляции
- линуксовые менеджеры пакетов умеют ставить программы только глобально и не позволяют поставить две версии одной программы или установить программу в произвольную папку. Одному проекту нужна утилита convert версии 1.5, а другому версии 1.7, и обе поставить невозможно.
- линуксовые программы и утилиты часто хардкодят пути к файлам. Например, программа позволяет хранить настройки только в /etc/hosts. Что делать, если у тебя 2 проекта и в каждом нужны свои настройки, непонятно.
- наконец, линуксовые менеджеры пакетов не работают под Windows или Mac
Докер это костыльное решение проблемы. Он позволяет создать виртуальную машину, в которой установлена нужная версия программы с нужными версиями библиотек. Докерфайл это скрипт, который описывает команды, которыми можно скачать и установить нужную программу внутри виртуальной машины.
То есть, с Докером, мы даем разработчику Докерфайл, он его запускает, у него запускается виртуальная машина с определенной фиксированной версией Линукса, в нее скачиваются исходники программы, компилятор, программа компилируется и получается программа нужной версии с нужными настройками. После этого пользователь может запускать виртуальную машину с этой программой.
То есть, вместо того, чтобы сделать правильный универсальный менеджер пакетов, просто сделали кривой костыль на shell-скриптах, что очень часто принято делать в мире Линукс. Для PHP-библиотек есть композер, для Rust-библиотек есть Cargo, только для Сишного хлама требуются такие костыли.
Мне кажется, правильное решение было бы таким:
- сделать менеджер пакетов вроде cargo/composer для Си. Он должен уметь скачивать исходный код и зависимости и компилировать их под любую платформу с любыми настройками.
- сделать платформу или несколько платформ, которые позволяют писать код на Си кроссплатформенно. Большинству утилит не нужны какие-то навороченные API, им хватает чтения файлов и работы с сетью.
- сделать убер-менеджер пакетов, который сам ничего не ставит, а умеет лишь устанавливать и запускать другие менеджеры. Например, если твоему проекту нужны библиотеки на Го, Ноде и Rust, то он установит соответствующие менеджеры и все что им нужно, и попросит их установить нужные библиотеки и программы. Не глобально, а в папочку с проектом.
Докер это очень кривое и костыльное решение проблемы зависимостей. Представь, что ты пишешь проект. Естественно, ему для работы нужно:
- определенные версии библиотек PHP
- определенная версия PHP (у тебя нет желания тестировать каждое изменение кода со всеми предыдущими и будущими версиями PHP)
- определенные расширения к PHP
- определенные утилиты командной строки (например: для конвертации PDF в картинку)
- определенная версия PostgreSQL
- определенные плагины к PostgreSQL
- определенная версия redis
- определенная версия nginx
Часть проблем решает композер: он умеет устанавливать PHP-библиотеки, и позволяет указать, какая версия PHP и какие расширения нужны, но устанавливать их не умеет. Остальное ты должен ставить или настраивать как-то сам.
Установка тоже может быть нетривиальной. Например, чтобы установить какую-то нативную библиотеку (не на PHP), тебе может понадобиться ее скомпилировать, а для этого нужно сначала установить определенную версию компилятора, и определенные версии зависимостей этой библиотеки.
Наконец, может быть такое, что ты используешь не Линукс, а Windows, и никто даже не пытался собирать эту бибилиотеку под WIndows, и неизвестно, работает ли она под Windows вообще. Или ты используешь Линукс, но не тот дистрибутив, который используют авторы библиотеки и их инструкции по установке не работают у тебя.
Согласись, что проблема существует. Теперь подумаем, как ее можно решить.
Одно из правильных решений - это менеджеры пакетов. Мы могли бы попробовать поставить все эти программы и библиотеки менеджером пакетов, а в проекте просто написать их список. Но тут тоже есть несколько проблем:
- линуксовые менеджеры пакетов вроде apt или rpm могут не содержать нужной программы в репозитории, или не содержать нужной версии, или содержать версию, собранную с другими настройками (например, утилита есть, но она не поддерживает какой-то формат данных).
- в разных дистрибутивах пакет с одной программой может называться по-разному. В одном это пакет convert, в другом это libconvert, а в третьем convert-utils. Непонятно, как в документации все это описать.
- линуксовые менеджеры пакетов не умеют ставить программу с произвольными настройками компиляции
- линуксовые менеджеры пакетов умеют ставить программы только глобально и не позволяют поставить две версии одной программы или установить программу в произвольную папку. Одному проекту нужна утилита convert версии 1.5, а другому версии 1.7, и обе поставить невозможно.
- линуксовые программы и утилиты часто хардкодят пути к файлам. Например, программа позволяет хранить настройки только в /etc/hosts. Что делать, если у тебя 2 проекта и в каждом нужны свои настройки, непонятно.
- наконец, линуксовые менеджеры пакетов не работают под Windows или Mac
Докер это костыльное решение проблемы. Он позволяет создать виртуальную машину, в которой установлена нужная версия программы с нужными версиями библиотек. Докерфайл это скрипт, который описывает команды, которыми можно скачать и установить нужную программу внутри виртуальной машины.
То есть, с Докером, мы даем разработчику Докерфайл, он его запускает, у него запускается виртуальная машина с определенной фиксированной версией Линукса, в нее скачиваются исходники программы, компилятор, программа компилируется и получается программа нужной версии с нужными настройками. После этого пользователь может запускать виртуальную машину с этой программой.
То есть, вместо того, чтобы сделать правильный универсальный менеджер пакетов, просто сделали кривой костыль на shell-скриптах, что очень часто принято делать в мире Линукс. Для PHP-библиотек есть композер, для Rust-библиотек есть Cargo, только для Сишного хлама требуются такие костыли.
Мне кажется, правильное решение было бы таким:
- сделать менеджер пакетов вроде cargo/composer для Си. Он должен уметь скачивать исходный код и зависимости и компилировать их под любую платформу с любыми настройками.
- сделать платформу или несколько платформ, которые позволяют писать код на Си кроссплатформенно. Большинству утилит не нужны какие-то навороченные API, им хватает чтения файлов и работы с сетью.
- сделать убер-менеджер пакетов, который сам ничего не ставит, а умеет лишь устанавливать и запускать другие менеджеры. Например, если твоему проекту нужны библиотеки на Го, Ноде и Rust, то он установит соответствующие менеджеры и все что им нужно, и попросит их установить нужные библиотеки и программы. Не глобально, а в папочку с проектом.
а из-за этой виртуальной машины производительность не падает на продакшене? а если несколько докеров на одном сервере, всё нормально с этим, можно не волноваться?
Используют готовую библиотеку или фреймворк для роутинга, а не пишут велосипед. Или ты имел в виду, как правильно придумать URL для страниц? У меня есть старый пост по теме: https://gist.github.com/codedokode/772a4ccc03e41d6b7cba
>>396274
Ты не обязан использовать Докер. Ты можешь сам установить нужные программы и выставить им нужные настройки. Можешь даже сделать удобный shell-скрипт для запуска и остановки программ. Но чтобы узнать, какие программы установить, тебе придется поковыряться в Докер-файлах.
>>396286
Микросервисная архитектура, я надеюсь, все же не используется повсеместно, так как для большинства небольших и средних проектов это просто выбрасывание денег на ветер. Я же писал где-то выше про это >>390832 >>391723
Там используется контейнеризация, то есть по идее падать производительность не должна, если ты используешь Линукс и все правильно настроил. Раньше в Докере были костыли, например, пакеты по виртуальной сети из одного контейнера в другой передавались через программу-демона, что как я понимаю, неэффективно, не знаю, исправили ли это сейчас.
Плюс Докер это огромный работающий из-под рути монстр с кучей API, немного страшновато держать такую штуку на проде.
Под Windows и Mac используется настоящая виртуальная машина и там есть накладные расходы, например, связанные с обращением к сети, к файлам на хосте.
Часто, Докер используют только для разработки, но не на продакшене.
Выяснил, как можно передавать массивы в POST-запрос, но теперь меня терзают смутные сомнения.
Например, я буду динамически добавлять блоки вопрос-ответ в форму как на пик1.
Но что, если сильно хитрый юзер решит подменить $i в
<input type="text" name="questions[$i][text]">?
разве это не может все мне сломать?
Есть ли способ как-то детектить изменения в html форме, навязанные юзером?
В динамической форме ведь не сработает сохранять начальное состояние формы и сравнивать с формой, пришедшей от клиента?
Передавать картинки через API в больших масштабах неэффективно и сисадмины тебе за это спасибо не скажут. Файлы лучше всего раздаются нгинксом.
Можно вернуться к кукам и использовать их. Также, ты можешь сгенерировать ссылку с токеном в ней вроде /img/ds6ds6fshdf7sdfhsf539sdfsdf/selfie.jpg или selfie.jpg?token=dhd7f8f8f7df77df. Но это не очень безопасно, так как такая ссылка может попасть в поисковики. Например, ты пересылаешь ссылку по скайпу, скайп сливает ссылку в Bing, Bing индексирует картинку и делает ее всем доступно. Или глупый пользователь сам выложит где-нибудь ссылку и будет жалеть.
По моему, ВК использует сложноподбираемые ссылки. Я туда давно не захожу, так что не в курсе. Раньше у них в ссылке был просто прописан id пользователя и пользователи себя деанонимизировали, выкладывая где-нибудь ссылку.
Защищаться от CSRF можно двумя способами:
1) проверять HTTP-заголовок Origin
2) CSRF-токеном
Да, но PDO только для SQL-баз данных и не работает с redis.
>>397285
Под Линуксом используются контейнеры, потому оверхед маленький. Но:
- Докер может скачивать гигабайтные образы, тебе придется удалять аниме, чтобы они влезли на диск
- в проекте для программ могут быть прописаны неадекватные настройки. Например, запустить 10 процессов базы данных и выделить каждому по гигабайту, хотя потребности в таком количестве процессов и памяти нету. Это можно решить либо сделав свои конфиги, либо сделав в Докерфайлах возможность кастомизации настроек
Если у тебя таблица небольшая и не хранится в базе данных, то проще просто целиком засунуть ее в тело страницы в виде JSON и добавить JS библиотеку, которая позволяет брать данные из JSON и выводить постранично с поиском.
> обработчика onkeyup
Это устаревший подход, надо использовать событие input, так как данные в поле ввода можно менять без нажатия клавиш (например, перетащить мышью или вставить через меню).
А вообще, если ты хочешь получить адекватный ответ, то сформулируй:
- примерное количество строк в таблице и сколько примерно байт занимают данные или сколько там символов
- должна ли таблица индексироваться поисковиками или это неважно
- что важнее: немного подождать загрузки, но потом быстро искать, или быстро загрузить страницу, а искать не так быстро. То есть, если поиском почти никто не пользуется, то второй вариант лучше, а если наоборот, люди заходят и делают много поисков подряд, то лучше первый вариант
- быстрый ли интернет у пользователей. Например, если страница используется только внутри компании, то можно считать, что интернет очень быстрый.
В xdebug есть трассировка? в которую попадает каждый вызов функции: https://xdebug.org/docs/trace
>>398054
По второй картинке претензии несправедливы. Я тебе могу точно так же предложить точно вывести на твоем любимом языке корень из 2.
>>398156
О, аккуратно выглядящий дизайн. Единственное, такую форму долго заполнять и можно (при желании) подумать, как минимизировать число кликов и нажатий клавиш (жестов):
- часто бывает, что у вопросов одинаковое кол-во баллов. Не надо заставлять пользователя 50 раз вводить одно и то же число. Можно, например, по умолчанию ставить кол-во от предыдущего вопроса
- в "тип ответа" не подсвечен выбранный вариант. Опять же, можно по умолчанию выбирать тип от предыдущего вопроса.
- поле ввода "число баллов" очень далеко оторвано от лейбла
- хорошо бы иметь возможность перетаскивать ответы и перетаскивать или как-то еще сортировать вопросы
- хорошо бы сделать быструю навигацию между полями, вопросами с помощью горячих клавиш и как-то проинформировать пользователя об этом (простое решение - вывести информацию, более хитрое - выводить подсказку только если пользователь делает операцию неэффективным способом)
О, спасибо за совет с сохранением значений из прошлого вопроса!
Навигацию и перетаскивание я планировал реализовать позднее.
У меня проблема с организацией структуры инпутов в форме.
Я ведь правильно понимаю, что я должен передавать серверу массив вопросов? А как правильно организовать инпуты, чтобы результатом стало что-то вроде пикрил? А может мне не нужно делать вложенные массивы, а обойтись линейным?>>398608
Теоретически, ты можешь обойтись без JS, чистым HTML. В HTML можно использовать имена полей с индексами вроде
question[1][text]
answer[1][1][text]
В PHP они придут массивами. Мануал: https://www.php.net/manual/ru/faq.html.php#faq.html.arrays
Для добавления вопроса ты можешь сделать кнопку, которая отправляет форму на сервер и тот возвращает страницу с добавленной формой для нового вопроса.
Но минус тут, что при каждый отправке формы страница будет перезагружаться. Состояние страницы, например, в каком поле стоял курсор, будет теряться.
Тут тоже есть решение - JS-библиотека pjax умеет перехватывать отправку формы, отправлять AJAX-запрос и обновлять страницу из результатов. Но и тут есть проблема, что состояние страницы теряется, так как поля пересоздаются заново.
Плюс, хорошо бы бекапить данные в браузер, чтобы они не потерялись, если пользователь случайно закроет страницу или у него перезагрузится компьютер.
Так что да, тут нужен JS. Начать можно с того, что сделать добавление/удаление/перестановку вопроса, вариантов ответов через JS. А отправку оставить классическим способом. Потом добавить бекап данных, восстановление из бекапа, отправку формы аяксом.
Чтобы просто добавить вопрос или вариант ответа ты можешь сделать шаблон в теле страницы с помощью тега <template> и JS-скриптом клонировать данные из DOM шаблона и вставлять в DOM страницы. То есть, это будет работать без отправки запроса на сервер.
И не забудь об оптимизации пользовательского опыта. Желательно сделать добавление вопросов максимально просто. Например, сделать поле "текст вопроса", и когда пользователь что-то в нем печатает, автоматически появляются остальные поля (тип ответа, варианты ответов) и поле для следующего вопроса.
Можно также добавить сбоку мини-карту, в которой видны в уменьшенном масштабе все вопросы, правильно ли они заполнены и можно быстро перейти к любому из них.
Насчет внешних ключей: скорее всего у тебя при создании теста еще не будет его id, потому желательно предусмотреть возможность отсутствия id при создании теста или вопроса, но также предусмотреть наличие id при редактировании.
Если с этим совсем сложно, то можно на стороне JS генерировать временные id, которые легко отличить от настоящих.
Нет, это плохая идея, так как это медленно, и непонятно, что делать, если посередине у тебя упал интернет и часть вопросов не отправилась.
Лучше будет в JS собирать все данные и отправлять одной пачкой в формате JSON. Чтобы операция была атомарной: или тест создан целиком со всеми вопросами, или произошла какая-то ошибка.
Также, если ты хочешь более красивые URL, то используй:
POST /tests/ для создания нового теста
PUT /tests/124/ для обновления теста с id
Также, ты можешь сохранять тест в процессе создания как бекап, например, каждые 60 секунд отправляя его на POST /tests/draft/{draft id}/, но эти данные должны сохраняться как "черновик", а не вносить изменения в реальный тест, пока пользователь не подтвердит желание перезаписать тест.
Вообще, я бы советовал тебе подумать о версионировании тестов. То есть, при каждом обновлении теста мы не перезаписываем старый тест, а лишь создаем новую версию теста и помечаем ее как "актуальную". То есть, мы храним все версии теста и после сохранения версия становится неизменяемой (прямо как статьи в Википедии). Это решает такие проблемы:
- можно откатить неудачные правки, переключившись на предыдущую версию
- можно создавать версии-черновики для бекапа, не делая их актуальными
- если кто-то сдал тест, а потом тест отредактировали, то видно, что он сдавал предыдущую версию теста. Это можно использовать при расчете баллов.
- можно иметь несколько похожих версий одного теста, например, одну версию теста за 2021 год, и вторую за 2022 год и разным людям давать разные версии для прохождения
Без версионирования будут проблемы, если кто-то сдал тест на 100%, потом в тест добавили вопросы, и у него оценка автоматически снизилась. Или уже, поменяли текст вопроса, и его ответ стал неправильным. Если не использовать версионирование, то придется запрещать редактировать тест, если кто-то уже проходил его.
>>398600
Да я просто изучаю ajax немного, думаю это на собесах тоже спрашивают, никаких требований естественно. Просто подумал про производительность такого подхода.
>Это устаревший подход, надо использовать событие input
Ты имеешь в виду oninput? Почему-то на htmlbook.ru нет его, они не обновляют сайт или там просто неполная информация? На w3schools естественно нашел.
Это называется сериализация (преобразование объектов в массивы и обратно). Ты можешь использовать возможности Ларавель, или сериализаторы вроде JMSSerializer, Symfony Serializer.
>>398205
Ты отправляешь все данные одной пачкой. На сервере ты:
- при создании создаешь граф из объектов (Тестов, Вопросов, Вариантов Ответов)
- при редактировании ты загружаешь объекты из БД и обновляешь их пришедшими данными
- если у тебя используется версионирование, то ты загружаешь из БД только объекты (Вопросы), которые не изменились, а те, что изменились, создаешь заново. Тест ты тоже создаешь заново. То есть, у тебя будет новый Тест, в нем часть старых Вопросов, а часть созданных заново.
Далее ты валидируешь и если все ок, то сохраняешь объекты обратно в БД. В Ларавель по моему для этого надо вызывать save() у каждого объекта, а в Data Mapper вроде Доктрины достаточно просто вызвать $em->flush() и она сама все сохранит.
Не забудь обернуть сохранение в транзакцию, чтобы не было такого, что при ошибке половина изменений сохранилась, а половина нет.
То есть, принцип такой:
- если ты создаешь новую строчку в таблице, то ты создаешь объект-модель и сохраняешь ее через save()
- если ты обновляешь строчку, то ты должен загрузить модель из БД, обновить в ней поля пришедшими данными и сохранить ее.
Так как тест состоит из многих моделей (сам Тест, Вопросы, Варианты ответов), то тут придется немного заморочиться. При версионировании у тебя будет смесь из новых объектов и существующих.
> Но как мне реализовать форму, чтобы из нее данные попадали в таблицы тестов, вопросов и ответов? Из TestController.store делать редирект в QuestionController.store а оттуда в AnswerController.store?
У тебя будет одна точка входа в контроллере (TestController.store), которая получает большой JSON с данными и создает/обновляет модели. Нет такого правила, что ты можешь создавать Вопросы только в QuestionController. Не нужно делать редиректы.
Также, я советую не писать все в контроллере (это называется "толстый контроллер" и быстро превращает код в лапшу), а разбить код на функции и поместить их в сервисы, например, сделать сервис создания и редактирования тестов TestEditService. Вот пример с использованием версионирования тестов:
- в контроллере принимаем JSON и превращаем его в массив массивов
- вызываем TestEditService#deserializeTest(array $data): Test для преобразования жуткого массива массивов в граф из объектов Test, Question, Answer
- вызываем TestEditService#validateTest(Test $test): Error[] для валидации теста
- вызываем TestEditService#loadTest(int $id) для загрузки предыдущей версии теста из БД
- вызываем TestEditService#createNewVersion(?Test $old, Test $new), которая обнаружит изменения и создаст новую версию теста. Если вопрос изменился, то мы создаем новый вопрос, если нет, то мы включаем в новый тест вопрос из старого теста, чтобы не множить сущности без необходимости.
- если все ок, то редиректим на просмотр теста или возвращаем JSON с успешным результатом
Заметь, что такое разделение кода позволяет тестировать функции по отдельности. Ты можешь, например, вызвать deserializeTest() и проверить, что возвращается правильный набор объектов. Потом протестировать следующую функцию итд. Конечно, в идеале тестировать с помощью автоматических тестов.
То есть, принцип такой:
- если ты создаешь новую строчку в таблице, то ты создаешь объект-модель и сохраняешь ее через save()
- если ты обновляешь строчку, то ты должен загрузить модель из БД, обновить в ней поля пришедшими данными и сохранить ее.
Так как тест состоит из многих моделей (сам Тест, Вопросы, Варианты ответов), то тут придется немного заморочиться. При версионировании у тебя будет смесь из новых объектов и существующих.
> Но как мне реализовать форму, чтобы из нее данные попадали в таблицы тестов, вопросов и ответов? Из TestController.store делать редирект в QuestionController.store а оттуда в AnswerController.store?
У тебя будет одна точка входа в контроллере (TestController.store), которая получает большой JSON с данными и создает/обновляет модели. Нет такого правила, что ты можешь создавать Вопросы только в QuestionController. Не нужно делать редиректы.
Также, я советую не писать все в контроллере (это называется "толстый контроллер" и быстро превращает код в лапшу), а разбить код на функции и поместить их в сервисы, например, сделать сервис создания и редактирования тестов TestEditService. Вот пример с использованием версионирования тестов:
- в контроллере принимаем JSON и превращаем его в массив массивов
- вызываем TestEditService#deserializeTest(array $data): Test для преобразования жуткого массива массивов в граф из объектов Test, Question, Answer
- вызываем TestEditService#validateTest(Test $test): Error[] для валидации теста
- вызываем TestEditService#loadTest(int $id) для загрузки предыдущей версии теста из БД
- вызываем TestEditService#createNewVersion(?Test $old, Test $new), которая обнаружит изменения и создаст новую версию теста. Если вопрос изменился, то мы создаем новый вопрос, если нет, то мы включаем в новый тест вопрос из старого теста, чтобы не множить сущности без необходимости.
- если все ок, то редиректим на просмотр теста или возвращаем JSON с успешным результатом
Заметь, что такое разделение кода позволяет тестировать функции по отдельности. Ты можешь, например, вызвать deserializeTest() и проверить, что возвращается правильный набор объектов. Потом протестировать следующую функцию итд. Конечно, в идеале тестировать с помощью автоматических тестов.
Не изобретай велосипед. В именах полей можно использовать индексы массива, вроде question[1]. Если ты будешь собирать данные из формы с помощью JS, то можно либо самому писать библиотеку для этого, либо использовать готовую вроде https://www.npmjs.com/package/@jalik/form-parser
Эта библиотека собирает данные из формы в массив массивов и поддерживает квадратные скобки в именах полей.
Надо писать use app\modules\admin\AddItem либо new admin\AddItem.
Урок по неймспейсам: https://github.com/codedokode/pasta/blob/master/php/autoload.md
Тут отвечали: >>388360
В новых версиях MySQL подключиться как root можно только через sudo, потому надо для сайта создать отдельного пользователя MySQL с паролем.
>>398578
Прислать тебе могут что угодно: массив вместо строки, строку вместо массива, массив вложенностью в 100 уровней и тд. Твой код должен надежно работать в любой ситуации.
Ты можешь попробовать прикрутить Ларавелевскую валидацию данных запроса:
https://laravel.com/docs/9.x/validation#quick-writing-the-validation-logic
https://laravel.com/docs/9.x/validation#validating-arrays
или что-то другое.
Обрати внимание, что тут фактически два уровня валидации:
- валидация формата передаваемых данных (что тебе прислали массив нужного типа и формата). Если здесь ошибка, то это не вина пользователя, а либо баг в твоем коде отправки данных, либо злоумышленник ищет слабые места.
- валидация по бизнес-логике (например, что число баллов не отрицательное, что у всех вопросов есть ответы и тд). Тут при ошибке мы выводим понятное сообщение пользователю.
Это две разных валидации, и их логично делать в двух разных функциях. Первую валидацию можно совместить с преобразованием массивов в модели. Вторая валидация обычно делается уже не с массивом, а с моделями.
Также, иногда массив из запроса превращают не сразу в модели, а в объекты-DTO, назначение которых перенести информацию из контроллера в сервис. То есть:
- принимаем массив, и создаем объекты-DTO
- передаем в сервис эти объекты и он на их основе вносит изменения в модель или в БД
Отличие DTO от моделей:
- модель хранит полную информацию об объекте, и ее можно сохранить в БД. Модель универсальна и может использоваться где угодно.
- DTO может содержать только часть информации и DTO предназначено для одной конкретной операции (например: только редактирование теста, но не проверка ответа на тест). DTO может содержать поля, которых нет в модели, или поля в DTO могут быть в другом формате.
DTO используют, например, когда у тебя в модели 50 полей, а в форме всего 5 и тебе удобнее передать небольшой объект. Или когда данные в форме хранятся в другом формате, не как в модели. В Ларавеле есть что-то вроде DTO: https://laravel.com/docs/9.x/validation#creating-form-requests но эти "DTO" очень сильно завязаны на формы и могут испортить архитектуру.
Тут отвечали: >>388360
В новых версиях MySQL подключиться как root можно только через sudo, потому надо для сайта создать отдельного пользователя MySQL с паролем.
>>398578
Прислать тебе могут что угодно: массив вместо строки, строку вместо массива, массив вложенностью в 100 уровней и тд. Твой код должен надежно работать в любой ситуации.
Ты можешь попробовать прикрутить Ларавелевскую валидацию данных запроса:
https://laravel.com/docs/9.x/validation#quick-writing-the-validation-logic
https://laravel.com/docs/9.x/validation#validating-arrays
или что-то другое.
Обрати внимание, что тут фактически два уровня валидации:
- валидация формата передаваемых данных (что тебе прислали массив нужного типа и формата). Если здесь ошибка, то это не вина пользователя, а либо баг в твоем коде отправки данных, либо злоумышленник ищет слабые места.
- валидация по бизнес-логике (например, что число баллов не отрицательное, что у всех вопросов есть ответы и тд). Тут при ошибке мы выводим понятное сообщение пользователю.
Это две разных валидации, и их логично делать в двух разных функциях. Первую валидацию можно совместить с преобразованием массивов в модели. Вторая валидация обычно делается уже не с массивом, а с моделями.
Также, иногда массив из запроса превращают не сразу в модели, а в объекты-DTO, назначение которых перенести информацию из контроллера в сервис. То есть:
- принимаем массив, и создаем объекты-DTO
- передаем в сервис эти объекты и он на их основе вносит изменения в модель или в БД
Отличие DTO от моделей:
- модель хранит полную информацию об объекте, и ее можно сохранить в БД. Модель универсальна и может использоваться где угодно.
- DTO может содержать только часть информации и DTO предназначено для одной конкретной операции (например: только редактирование теста, но не проверка ответа на тест). DTO может содержать поля, которых нет в модели, или поля в DTO могут быть в другом формате.
DTO используют, например, когда у тебя в модели 50 полей, а в форме всего 5 и тебе удобнее передать небольшой объект. Или когда данные в форме хранятся в другом формате, не как в модели. В Ларавеле есть что-то вроде DTO: https://laravel.com/docs/9.x/validation#creating-form-requests но эти "DTO" очень сильно завязаны на формы и могут испортить архитектуру.
Проще всего отправлять всю форму на сервер и там сравнивать с данными из БД.
А так, изменения можно определять по событию input с помощью JS. Событие input всплывает, потому достаточно повесить один обработчик на форму, и ты будешь получить информацию об изменении любого поля.
Такой обработчик можно использовать, чтобы выдавать предупреждение при попытке закрыть вкладку с несохраненными изменениями или для бекапа формы в localstorage или на сервер.
Еще можно преобразовать форму в JSON и сравнить с изначальным JSON. Наверно, в JS есть библиотеки для сравнения JSON.
>>398620
Тут нужно несколько уровней вложенности: тест состоит из многих вопросов. А вопрос может содержать много вариантов ответов.
То есть:
questions[1][text]
questions[1][answers][2][text]
questions[1][answers][2][correct]
Ты можешь попробовать сделать форму совсем плоской, но работать с ней может быть неудобно:
question_text[1]
question_points[1]
answers_text[16]
answers_correct[16]
Есть на MDN: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/input_event и в спецификациях DOM. Ты, наверно, используешь устаревший источник информации.
Выходит так, что радио-кнопки должны иметь разные имена
name="questions[1][answers][1][correct]"
name="questions[1][answers][2][correct]"
name="questions[1][answers][3][correct]"
Но ведь это приведет к тому, что они больше не будут составлять одну группу? Здесь тоже надо использовать JS?
У радиокнопок можно сделать одинаковое имя, но разные value.
Вариант с разными именами нужен, если у нас чекбоксы.
>Используют готовую библиотеку или фреймворк для роутинга, а не пишут велосипед. Или ты имел в виду, как правильно придумать URL для страниц? У меня есть старый пост по теме:
Ну и то, и то. А как там вот в уроке url'ы без названия скрипта с расширением php в конце - это в htaccess надо как-то переадресацию настраивать уметь в каждой папке?
Способ переадресации зависит от используемого сервера.
В Apache используется mod_rewrite, это модуль, который переписывает URL согласно правилам до тех пор, пока URL не перестанет меняться: https://httpd.apache.org/docs/2.4/rewrite/intro.html
В Nginx обычно просто все запросы, не соответствующие статическим файлам, перенаправляют на index.php, как тут в конце страницы, только SCRIPT_FILENAME надо присвоить "/index.php": https://nginx.org/ru/docs/beginners_guide.html
Что касается кода, то задача роутера очень проста: он получает набор правил и URL и должен определить, какому правилу соответствует URL. URL могут быть с парамтерами вроде
/posts/{id}/
В таком случае роутер должен дополнительно извлечь значения параметров из URL и вернуть их.
Ну значит я правильно сделал, а на будущее всем скажу, что при устройстве на работу все чему учит ОП - учитывается. И я не говорю, что я сомневался, просто убедился.
Используй бинарные типы, TRUE/FALSE.
На джуна собеседовался?
Я тоже не знаю, как такое делать. Надо наверное фреймворк какой-то начать изучать и там смотреть как сделали.
На кого если не секрет?
У меня в мухосрани на стажера есть вакансия, там в требованиях только php (и/или JS). Вот думаю, что на тестовом будет.
На джуна уже фреймворк/цмс требуют знания, я этого не касался пока вообще.
На фуллстака по Laravel/Vue. Однако я указал в навыках, что знаю PHP вот меня и попросили в ТЗ роутер написать, а я уже и забыл как это делать. ЗП попросил 1500$.
Была еще контора которая на 3000 евро, дали ТЗ сделать CRUD приложение, которое я сделал, но там конкуренция получше меня была, пришлось пососать. Но я вынес из этого, что мне нужно повысить свой уровень и потом пытаться снова, либо пойти джуном поработать, параллельно обучаться дальше в темпе.
Подтверждаю, даже для битрикса спросили почти все.
На джуна не во всех вакансиях требуют фреймворки/смс, но в любом случае это будет огромным плюсом.
если бы вы сейчас начинали изучать что то, стали бы учить пыху или что то другое?
Я сам пыхарь но посоветовал бы изучить JS, а потом пыху.
Для радиокнопок браузер передает name и value нажатой кнопки. То есть, состояние невыбранных кнопок он не передает. Если ты отправляешь данные через JS, то, конечно, можешь передавать состояние любых кнопок, и выбранных, и невыбранных.
Аналогично для чекбоксов, передаются только отмеченные чекбоксы, их name и value.
С помощью JS данные можно передать в любом формате. Но если ты будешь использовать такой же формат, как и браузер, то сможешь воспользоваться готовыми библиотеками вроде той, что я приводил выше.
Javascript и PHP вроде как, довольно самодостаточными языками стали, а приложения на андроид и юбер-фронтенд-стартапы на ноде я не планирую делать. Про то, что он используется в Laravel я знаю, но просто стоит ли тратить время, если он сдуется за ненадобностью, или же он необходим потому-что голый джаваскрипт недостаточно фунцкионален?
Если не знаешь JS то не лезь пока во фреймворки, вне зависимости от того где ты будешь его использовать нужно знать ванильный JS. Потом фреймворки будут легче даваться.
ты на русском общаешься или узбекском?
>правельно сылку
>мол как должна
>сылка
>свой маму ибал
Вы всерьез идете программировать?
Да, платный. https://htmlacademy.ru/profession/backender-solo
Показалось самое адеватное из того что видел. Ну курс от ОПчика пройду паралельно, мне нравится.
Ну для галки стоит изучить, это же недолго и несложно. Во многих вакансиях видел такое требование, иногда оно шло как "плюс".
В том что ты можешь изучить больше, но бесплатно.
Обоснуй?
про вакансии и отзывы похуй, у меня есть контент и план учебы, мне все нравится - там от базы, протоколы/html/css, до проектов,и включает почти полные курсы по этим языкам (js/php) и фреймворкам (yii,laravel). Мало того, я взял с большой скидкой
Отдельно отмечу тренажеры, и поддержку наставников в чате ( моем случае). Менеджеры хорошие, отзывчивые, даже решил одну проблему в свою пользу (в другой конторке меня бы нахуй послали сходу даже не сомневаюсь).
после hexlet например неприятные впечатления, они своей рассылкой меня заебать успели, отвечали долго по почте, по протоколам у них устаревшая инфа как я понял - и вообще все распиздяйски, про скиллбокс и яндекс-обучение как то говорить не хочется, вообще не смотрю даже в ту сторону. Вообще приплыл к htmlacademy от уроков по w3
тоже думал что курсы нахуй не нужны
А думать вас там тоже учат на курсах? Я хуею с вас, учиться нужно не по курсам, а делая что-то, создавая. Какие из вас программисты, когда вам нужно с ложечки подавать информацию? Я бы понял, если бы вы брали курсы по каким то сложным вещам, где реально нужен человек, который поможет разобраться во фреймворке и т.д (И то на ютубе полно информаций), но такие простые вещи объяснять это просто пиздец.
Нахуй мне твой ютуб, с него тоже у меня есть видео. Я предпочитаю и официальную документацию, и спижженые видеокурсы и тд. С хуяли ты взял что я не собираюсь самостоятельно что-то делать?
Там просто структуризированная информация, по главам, аккуратно, с тренажерами и самое главное в мире PHP - современный код, а не легаси хуйня 12летней давности, или пустое дерьмо от васяна для ютабчека из разряда ВЕСЬ ВУЕ ЗА ЧАС.
Я ебал все на разных сайтах искать, (есть отличные материалы не спорю) где каждый порит хуйню в меру своей испорченности, зачем мне тратить время?
Еще раз напомню что ОПчик тоже молодец, мне нравится стиль изложения и затронутые им темы
У меня есть 2 варианта: вкатываться в Laravel и осенью искать оффлайн работу по всей России, либо продолжать тут вкатываться в битрикс, зато удаленно сразу. В планах после вката в битрикс параллельно вкатываться в ларавель потихоньку и через полгода начать пытаться проходить собесы по ларавелю.
Будут ли учитывать мой опыт на битриксе? Или это наоборот хуево, что я был битриксоидом и нахватался "плохой практики кода"? Что посоветуете? Забыть про битрикс и хуячить ларавель сразу?
Я устал сомневаться. Наверное изначально не стоило лезть в битрикс...
Ладно, уточню запрос что возвращают Session::get, или где про это почитать? В официальных доках ларавеля никакого описания
Тире пропустил, ну да и ладно
Почитать можно в API docs, там есть поиск: https://laravel.com/api/9.x/Illuminate/Support/Facades/Session.html#method_get
Увы, описания нет, а это значит, что надо лезть в код и смотреть.
Но в Laravel есть request->session, может это то же самое? Оно описано тут: https://laravel.com/docs/9.x/session#interacting-with-the-session
За это и не люблю ЖС и его фреймворки. Потому, что постоянно вижу кашу из кода и тегов в файлах. Читается как говно и выглядит как говно.
Хуже всего когда такой ещё и в ПХП умеет - тогда жди файлы из адовой мешанины пхп+хтмл+жс где всё во всё завёрнуто, что неделю пить придётся в попытке развидеть.
Поподробнее пожалуйста
Когда дадут ТЗ все что ты изучал на курсах окажется не нужным.
https://onlinephp.io/c/d9f7d
А блять, это же отдельная переменная
Пыха гораздо больше говно. Это я тебе говорю как человек, которому за сутки пришлось искать дыры в жс и пыхе, перед этим вообще их не зная. Если в жскоде я разобрался на лету, то с пыхой долблюсь уже довольно долго, и это ещё не предел
>перед этим вообще их не зная
Так тебе и мнение рано иметь - я то оба языка знаю и работаю на них.
Ну так я тебе мнение со стороны говорю. Пыха — кусок полупереваренного кала без нормальной документации к своим говнофреймворкам и с синтаксисом, который невозможно нормально читать
Так-то у пхп одна из топовых документаций, даун. Что к языку, что к Ларавелям. Просто ты её не читал или не понял в силу скудоумия.
Что глупо, шиз? Работать за деньги? А может срать на пхп в треде про пхп глупо?
Кстати поддвачну, у пыхи топ документация среди всех языков, на которых я работал. У симфони неоч, конечно, но её достаточно по крайней мере.
Не кормите зеленого.
Нет, невозможно. Невозможно по той причине, что на это же место претендентов выше крыши с технической профильной вышкой, молодых, готовых по 24 часа просиживать за задачей клиента на безвозмездной основе (но даже и им далеко не всем обламывается работа).
Я знаю о чём говорю, потому что сам ищу уже 3 года работу, мне 36. Я не с нуля, я сайты делал всю жизнь на фрилансе (на php и js). Сейчас сайты на фрилансе готовы делать за 500 рублей + отзыв, масса желающих, это и выпускники курсов, и выпускники вузов без опыта, и такие как я, кто раньше на этом пытался заработать на жизнь.
Сейчас клиентов на сайты поубивилось, этому есть целый ряд причин:
мелкие/средние сайты в целом сдают позиции на фоне Youtube, Instagram и т.д.
многие отрасли заняли крупные игроки (напр взять вакансии - если раньше были сайты с вакансиями в каждом городе, то сегодня это несколько крупных федеральных игроков, если взять интернет-магазины - то сейчас всё подминают под себя федеральные площадки, имеющие федеральную логистическую сеть, где вам проще стать их партнёром и продавать всё с их площадки, т.к. весь народ тусуется там, это и озон, и вайлдбериз и т.д., в сша ранее всё аналогично было до тех пор, пока не остался один амазон и walmart и так во всех сферах)
всю остальную мелочевку под себя взяли wix'ы и прочие конструкторы сайтов, где все сами себе лепят сайты либо заказывают слепить что-нибудь на этих площадках фрилансеров, а это, как я уже писал, 500 рублей + отзыв и 2 дня работы (но это надо ещё конкурс выиграть на эту работу, т.к. желающих попотеть за эти деньги немеряно).
Так что на фрилансе не от хорошей жизни, а от того, что на работу никого не берут. Моя ошибка была в том, что я вовремя не ушёл из этой отрасли в более перспективную, нужно было уходить либо с PHP, либо с сайтостроения (пытаться устраиваться в финтех джуном лет 10 назад, пока ещё это было возможно, ибо в сайтостроении как программист не прогрессируешь, наоборот - деградируешь, стек технологий устаревает), либо вообще из IT. Меня не берут из-за отсутсвия опыта работы в команде и опыта коммерческой разработки на том или ином фреймворке. Я бы и рад получить этот опыт, но негде. Работодатели дообучать старичков не готовы. Если вам за 30, вы не будете сидеть сутки решать ненужную вам задачку из спортивного интереса (а в 20 я с удовольствием сам это регулярно проделывал).
Джунам без знания готового стека компании двери сейчас везде закрыты, если только по знакомству. Там, где вы в вакансиях видите джун, по факту на собесе будут спрашивать за миддла. Т.е. ООП, паттерны проектирования, GIT, работа в команде, опыт работы с фреймворком X, будут смотреть, можно ли сразу вам будет кинуть задачу и ждать результат, не контролируя каждый шаг. Т.е. им нужен готовый человек, которого не нужно обучать, на это сейчас работодатели уже не идут, ибо нет надобности. Конкурс - по 100 человек на одну вакансию джуна. Из 100 точно найдётся тот, кто уже работал с их стеком в другой конторе, нет смысла кого-то обучать, дураков нет, деньгами работодатели не разбрасываются. А джун сейчас везде указывают лишь для того, чтобы платить по-джуновски. Когда указывают миддл, знайте, что спрашивать будут по знаниям на senior'а, а платить как миддлу.
откуда ветер дует
В интернете есть куча "реальных" историй успешных успешников, вкатившихся в айти, но ответьте себе честно, вы сами то в это (тыц, тыц, тыц) верите? Не чувствуете, чем это всё попахивает? Подумайте, куда побежит добрая половина желающих вкатиться, вдохновившись подобными историями и "честными" комментариями под ними? Не на курсы ли какие-нибудь? Более того, разоблачали уже и кучу таких "вкатышей" и в youtube (да-да, пропаганда не ограничивается текстовыми постами). Сегодня в IT больше всех зарабатывают продавцы лопат. Золота для самих золотоискателей нет.
Подытожим:
Игнорируйте в интернете истории успешных успешников (не важно, посты ли это, или комментарии под ними, или это в youtube "Канал вкатившегося в IT 60 летнего таксиста"), всё, что вам нужно, это мониторинг сайтов вакансий и понимание того, как там всё происходит на самом деле, т.е. немного поэкспериментируйте, не начиная изучать само программирование, прощупайте почву.
Не смотрите на количество самих вакансий. Хрюши отрабатывают свои копейки. Им нужно показывать видимость своей работы. По факту, когда начнёте рассылать отклики, то увидите, что лишь 60% откликов вообще ими открываются (hh показывает, открывали или нет отклик), т.е. почти половину ваших откликов вообще никто не увидит. Но иногда вас могут даже пригласить на собеседование, однако если вы не миддл, то будет пара каких-нибудь вопросов, не имеющих отношение ни к джуну, ни к программированию вообще, и фраза "если что мы вам перезвоним", а хрюша отметит у себя в тетрадке +1 к списку проведённых за день собеседований (при этом за результатом собеседования вы ещё будете бегать неделю, а там как правило про вас уже забывают сразу по его окончании).
Отговариваю ли я вас изучать программирование? Нет, вовсе нет, но подходить к этому вопросу со стороны экстренного поиска нового источника средств к существованию нужно с трезвой головой и пониманием некоторых вещей, упомянутых мной выше. Иначе можно остаться вообще с голой задницей. Программисты низшего звена (высшего - это своего рода управленцы, их много и не нужно, это как в отделке - нужны Равшан, Джамшут и 1 насяльника), коих большинство, сегодня примерно в том же положении, что и таксисты/риелторы. Только в таксомоторку и агентство недвижимости проще устроиться на работу.
Нет, невозможно. Невозможно по той причине, что на это же место претендентов выше крыши с технической профильной вышкой, молодых, готовых по 24 часа просиживать за задачей клиента на безвозмездной основе (но даже и им далеко не всем обламывается работа).
Я знаю о чём говорю, потому что сам ищу уже 3 года работу, мне 36. Я не с нуля, я сайты делал всю жизнь на фрилансе (на php и js). Сейчас сайты на фрилансе готовы делать за 500 рублей + отзыв, масса желающих, это и выпускники курсов, и выпускники вузов без опыта, и такие как я, кто раньше на этом пытался заработать на жизнь.
Сейчас клиентов на сайты поубивилось, этому есть целый ряд причин:
мелкие/средние сайты в целом сдают позиции на фоне Youtube, Instagram и т.д.
многие отрасли заняли крупные игроки (напр взять вакансии - если раньше были сайты с вакансиями в каждом городе, то сегодня это несколько крупных федеральных игроков, если взять интернет-магазины - то сейчас всё подминают под себя федеральные площадки, имеющие федеральную логистическую сеть, где вам проще стать их партнёром и продавать всё с их площадки, т.к. весь народ тусуется там, это и озон, и вайлдбериз и т.д., в сша ранее всё аналогично было до тех пор, пока не остался один амазон и walmart и так во всех сферах)
всю остальную мелочевку под себя взяли wix'ы и прочие конструкторы сайтов, где все сами себе лепят сайты либо заказывают слепить что-нибудь на этих площадках фрилансеров, а это, как я уже писал, 500 рублей + отзыв и 2 дня работы (но это надо ещё конкурс выиграть на эту работу, т.к. желающих попотеть за эти деньги немеряно).
Так что на фрилансе не от хорошей жизни, а от того, что на работу никого не берут. Моя ошибка была в том, что я вовремя не ушёл из этой отрасли в более перспективную, нужно было уходить либо с PHP, либо с сайтостроения (пытаться устраиваться в финтех джуном лет 10 назад, пока ещё это было возможно, ибо в сайтостроении как программист не прогрессируешь, наоборот - деградируешь, стек технологий устаревает), либо вообще из IT. Меня не берут из-за отсутсвия опыта работы в команде и опыта коммерческой разработки на том или ином фреймворке. Я бы и рад получить этот опыт, но негде. Работодатели дообучать старичков не готовы. Если вам за 30, вы не будете сидеть сутки решать ненужную вам задачку из спортивного интереса (а в 20 я с удовольствием сам это регулярно проделывал).
Джунам без знания готового стека компании двери сейчас везде закрыты, если только по знакомству. Там, где вы в вакансиях видите джун, по факту на собесе будут спрашивать за миддла. Т.е. ООП, паттерны проектирования, GIT, работа в команде, опыт работы с фреймворком X, будут смотреть, можно ли сразу вам будет кинуть задачу и ждать результат, не контролируя каждый шаг. Т.е. им нужен готовый человек, которого не нужно обучать, на это сейчас работодатели уже не идут, ибо нет надобности. Конкурс - по 100 человек на одну вакансию джуна. Из 100 точно найдётся тот, кто уже работал с их стеком в другой конторе, нет смысла кого-то обучать, дураков нет, деньгами работодатели не разбрасываются. А джун сейчас везде указывают лишь для того, чтобы платить по-джуновски. Когда указывают миддл, знайте, что спрашивать будут по знаниям на senior'а, а платить как миддлу.
откуда ветер дует
В интернете есть куча "реальных" историй успешных успешников, вкатившихся в айти, но ответьте себе честно, вы сами то в это (тыц, тыц, тыц) верите? Не чувствуете, чем это всё попахивает? Подумайте, куда побежит добрая половина желающих вкатиться, вдохновившись подобными историями и "честными" комментариями под ними? Не на курсы ли какие-нибудь? Более того, разоблачали уже и кучу таких "вкатышей" и в youtube (да-да, пропаганда не ограничивается текстовыми постами). Сегодня в IT больше всех зарабатывают продавцы лопат. Золота для самих золотоискателей нет.
Подытожим:
Игнорируйте в интернете истории успешных успешников (не важно, посты ли это, или комментарии под ними, или это в youtube "Канал вкатившегося в IT 60 летнего таксиста"), всё, что вам нужно, это мониторинг сайтов вакансий и понимание того, как там всё происходит на самом деле, т.е. немного поэкспериментируйте, не начиная изучать само программирование, прощупайте почву.
Не смотрите на количество самих вакансий. Хрюши отрабатывают свои копейки. Им нужно показывать видимость своей работы. По факту, когда начнёте рассылать отклики, то увидите, что лишь 60% откликов вообще ими открываются (hh показывает, открывали или нет отклик), т.е. почти половину ваших откликов вообще никто не увидит. Но иногда вас могут даже пригласить на собеседование, однако если вы не миддл, то будет пара каких-нибудь вопросов, не имеющих отношение ни к джуну, ни к программированию вообще, и фраза "если что мы вам перезвоним", а хрюша отметит у себя в тетрадке +1 к списку проведённых за день собеседований (при этом за результатом собеседования вы ещё будете бегать неделю, а там как правило про вас уже забывают сразу по его окончании).
Отговариваю ли я вас изучать программирование? Нет, вовсе нет, но подходить к этому вопросу со стороны экстренного поиска нового источника средств к существованию нужно с трезвой головой и пониманием некоторых вещей, упомянутых мной выше. Иначе можно остаться вообще с голой задницей. Программисты низшего звена (высшего - это своего рода управленцы, их много и не нужно, это как в отделке - нужны Равшан, Джамшут и 1 насяльника), коих большинство, сегодня примерно в том же положении, что и таксисты/риелторы. Только в таксомоторку и агентство недвижимости проще устроиться на работу.
Так душно пишешь поговорил с пастой.
И еще с нотокой заговора, уныло. Фриланс блядь, я бы на твоём месте жопу а офис понес если деньги нужны.
Конечно таксист или охранник с курсов нехуя не получит, английский сам по себе для простых людей сложен, тем более технический.
Сайт за 500р? Одностраничный лендинг? Даже лендинг никто не станет делать что за пиздобольство
Короч вали нахуй, и забери ссобой свою пасту
>симфони неоч
У Симфоны да. У Ларки годная - там тоже сайт целый для этого. Сайт и сообщество, да не одно. И это не включая обычного погуглить где на любой вопрос ответ найдётся.
Некоторые поехавшие его фреймворком называют. Как и Вордпресс иногда лольно почитай статейки с самоподдувом где они пытаются натянуть MVC на ВП.
Привыкай.
Вообще, если ты не можешь сделать сайт лучше, чем WiX, то может быть тебе надо переквалифицироваться в консультанта по WiX. Наверняка есть люди, которые хотят сайт дешево и быстро, но не хотят возиться с конструкторами. Опять же, есть много CMS, научись делать на них сайты и продавай. У коммерческих CMS вообще есть партнерская программа, ты продаешь клиенту их CMS, а они тебе дают процент от его денег.
Ну и знание ООП или git это скорее требования к джуниору.
Обучиться можно и самому.
В идеале, все языки начинаются с C (на котором все остальные языки и написаны).
Хорошая новость: синтаксис РНР +- похож на С++, так что это не самый плохой язык для обучения.
если расширить твои сомнения:
есть пидорские/санкционные/вендорские/частные технологии,
а есть святой Open Source.
Выбор очевиден какбэ.
Кстати, хоть кто-нибудь работал с управлением памятью на РНР?
Да, есть и такое, и в байтоёбские конторы типа VK это активно требуют.
>есть пидорские/санкционные/вендорские/частные технологии,
Это Битрикс?
>а есть святой Open Source.
А это Laravel?
Если ты за Ларавель, то всё, твёрдо и чётко бросаю Битрикс. Осенью после свадьбы друга поеду в какой-нибудь рандом-город работать на святом Open Source Framework. Спасибо за правильное мнение, Анон. Родина тебя забудет.
Я вот тока понять не могу, зачем эта компания перешла с лары на битрикс? Их подкупили что ли?
А пока придётся работать сборщиком ягод в лесу... Но это и хорошо. Лето всё-таки, надо успеть надышаться свежим воздухом.
>Спасибо за правильное мнение, Анон
Велкам. Давай, продышись там.
А зачем ехать? Можно ведь удалённо.
> зачем эта компания перешла с лары на битрикс
Заказчики редко имеют своё мнение.
+ мб предыдущую версию сделали так хуёво или сложно или дорого, что даже битрикс показался выходом
js знаю на уровне скопировать код из документации и натянуть его на свои нужды, ну и немного промисы.
Цель трудоустроится.
В моем представлении js будет требоваться на галере, а WP для фриланса, так ли это?
И сильно ли сложен wp по сравнению с фреймворками(мой-yii2)
Ну как сказать, хочешь норм функционал сайта изучай js.
>В моем представлении js будет требоваться на галере, а WP для фриланса, так ли это?
Бля, пчёл, ты бы хоть почитал, что это и для чего используется, для начала. Уж представляю, что ты там на yii2 клепаешь..
В Израиле.
Скорее получить пизды от фронтендера за уебищную структуру ответа метода.
Какие могут быть причины такого переката? Я вот думаю в обратную сторону перекатиться
Так laravel теперь с VUE в комплекте, нахуй на js фреймворки перекатываться то, нового пердолинга с js хочеться?
Не понимат
Лучше тогда на go пиздовать
А чем я неправа?
>laravel теперь с VUE в комплекте
Ну да, на вуе же свсем жс не надо знать что бы формошлепать.
ну это то понятно что VUE на JS, но если менять структуру вообще, (работу с базами данных) есть вариант либо на nodejs перейти и подобные JS фреймворки
либо на GO, слышала что с PHP именно на него переходят
он жи современен типа многопоточен что то такое
>laravel теперь с VUE в комплекте
Тебе необязательно его ставить - старый добрый Блейд никуда оттуда не девался. В целом не очень понимаю нынешнюю политику Лары, куда стремятся понапихать всего побольше и помоднее - однажды оно их не туда заведёт.
я смотрю на оферы (европка)
не вижу нихуя о ларавел и вю
а вот вю + тс очень много
+ нюкс
и зп очень даже
да и мне просто заходит вюха очень
Ну так да, зачем лишнее звено в виде PHP, когда условный Next/Nuxt/Gatsby/Remix и что там еще есть справляются точно также, если не лучше?
>лишнее звено в виде PHP
Врятле жс будет хорошо работать с базами данных, для глюченных игрух на юнити только подходит, да кнопочки анимировать
Понимаешь, как бы это по научному сказать, PHP это пенитрация, временами даже двойная пенитрация. А джс это полувялый, который суют на полпалки, смекаешь?
>Врятле жс будет хорошо работать с базами данных
С каких пор с БД работает язык, а не ORM? И нода при таком сценарии отработает быстрее, чем пыха.
>для глюченных игрух на юнити
С каких пор юнити понимает жс?
> да кнопочки анимировать
жс не анимирует кнопочки, анимирует кнопочки DOM api
>Игры на Unity3d пишутся в связке C# +js.
Нет, там свой говноязык, похожий на js, но им не являющийся.
>Как веб вообще связан с твоим C#
Речь шла про БД, не про web. По работе с БД js и PHP одинаково посасывают у C#. js чуть посасывает глубже
Глянул Remix, это они в мире js изобрели фуллстек фреймворки через 10 лет после того, как они померли?
>жснинзя
>адекватный
>смотреть видео
>по js
>и php
Что тебе не хватает книг и тренажеров? Статей там. Видео же как интро можно воспринимать, но на серьезных щщах смотреть видосы по php это грех вообще какой-то, лучше с нуля что нибудь самому высирать и пользоваться официальной документацией, и гуглить по вопросам на stackoverflow
Или купить комплексный курс по языку с тренажерами и теорией
Мне кажется, что людям тяжело переходить от теории к практике, я сам такой. Вот эти видео, где кто-то что-то пишет, как бы являются промежуточным звеном.
10 лет назад они померли потому что появились рякты и вуи, сейчас вновь оживают но уже на фундаменте ряктов и вуев.
>Что тебе не хватает книг и тренажеров? Статей там.
Порекомендуй книги и статьи, тренажеры, пожалуйста.
Через 10 лет изобретут суперреакт и супервуй, фуллстак фреймворки опять сдохнут, а через 20 лет придумают (((новые))) фуллстак фреймворки на основе суперреакта и супервуя?
Да, потом колесо сансары даст новый оборот и все пойдет по новой
Курсы/тренажеры по PHP:
ну во первых курс о ОПа, а шапке треда
https://ru.hexlet.io/courses/php-basics
https://htmlacademy.ru/profession/backender-solo (платный)
Статьи:
https://habr.com/ru/hub/webdev/
https://habr.com/ru/hub/php/
https://habr.com/ru/company/skyeng/blog/666626 (книги)
Документация:
https://www.php.net/manual/ru/
https://laravel.su/docs/8.x/installation
(по JS ахуенные тренажеры, книгу можно скачать на трекере https://learn.javascript.ru/intro#itogo?map )
Возможно в интернете есть еще тренажеры, нужно просто искать
Спасибо! :)
Как ты можешь сравнивать JS с PHP, если в JS все асинхронное и тебе придется писать await через строчку, а в PHP ты просто пишешь бизнес-логику и не мучаешься?
Если уж ты хочешь сравнивать, давай сравнивать PHP и Python, например.
>>406387
> И нода при таком сценарии отработает быстрее, чем пыха.
Ты это можешь подтвердить бенчмарками или хотя бы личным опытом или просто придумал это на ровном месте?
> С каких пор с БД работает язык, а не ORM?
А в JS вообще есть что-то наподобие Доктрины (Data Mapper)? А то я вижу, как разработчики React и Redux передают туда-сюда огромные нетипизированные массивы и мне вспоминается Друпал лет так 10 назад, когда там тоже все было на массивах.
>С каких пор с БД работает язык, а не ORM?
Гуглим что такое ORM и на чём оно пишется. это абстракция, написанная, внезапно, с помощью яп
>И нода при таком сценарии отработает быстрее, чем пыха.
Мнение неграмотного вкатунца не очень важно.
Елисеев.
Попробуй мультиинсерт, когда ты одним запросом вставляешь например сразу 1000 записей. Странно, что медленно, по моему, там производительность порядка тысяч вставок в секунду.
Также, есть статья в мануале:
https://dev.mysql.com/doc/refman/8.0/en/optimizing-innodb-bulk-data-loading.html
https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.html
у меня вообще все операции с бд проходят как будто медленнее чем должны,намного медленнее (мб дело в опенсервере)
>Есть ли адекватные PHP программисты по типу жс ниндзи только по PHP?
вообще никогда не видел полноценный блог по пхп/беку
но запомнились эти три:
1. Дмитрий Елисеев - наверное годная вода по ооп и архитектуре(не для начинающих), вроде у него основной контент платный
2. Дмитрий Афанасьев - разбор ларавел
3. Виктор Зинченко - для новичка нормальный курс пхп старт
Пишу, чтобы сказать: на РНР есть жизнь (хотя меня щас обосрут и скажут, что это копейки, на что отвечу, что я особо и не старался).
Так что, сомневающиеся, не сдавайтесь, есть свет в конце 10 000 часов тоннеля.
немного добавлю, что это включало linux, devops, jira, git, rabbitmq, bootstrap, js, jquery, angular, + fluent/upper-intermediate tech english + some soft & management skills
щтотокое?
MySQL это сервер. То есть, это программа, которая постоянно работает в фоне, принимает запросы от клиентов и отвечает на них. У нее нет графического интерфейса (окошек с кнопками).
> как запускается
Самый простой способ - просто открыть консоль и вручную запустить программу в консоли (это называется foreground mode). Но обычно вручную ее не запускают, а настраивают автоматический запуск при загрузке ОС. В Линукс это называется "демон" (daemon) и реализуется, например, через systemd, в Windows это называется "служба" (service). То есть при установке на Windows MySQL добавляет службу, и таким образом, запускается когда загружается ОС.
Подробнее гугли про службы Windows или про демоны в Linux.
> хранит свои базы
Базы данных хранятся в файлах, в Linux они расположены в /var/lib/mysql, в Windows по моему в C:\ProgramData\MySQL\. Есть два варианта - либо каждая таблица хранится в отдельном файле, либо все таблицы хранятся в одном огромном файле.
На диске хранятся не только таблицы с данными, но и индексы. Индексы делаются для каждой колонки отдельно и позволяют делать быстрый поиск по этой колонки без необходимости читать всю таблицу. То есть, если у тебя таблица на миллион строк, то для поиска в ней тебе надо прочитать и проверить весь миллион. А если у тебя есть индекс по колонке, то для поиска по этой колонке тебе достаточно прочитать около 20 записей из индекса.
Формат данных зависит от используемого движка, сейчас я думаю, основной это InnoDB.
Общая архитектура InnoDB: https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html
Подробно про формат хранения данных на диске: https://dev.mysql.com/doc/refman/8.0/en/innodb-on-disk-structures.html
> как делает запросы
Запрос парсится, строится план запроса (какие таблицы или индексы читать, что искать) и выполняется.
Если ты хочешь лучше разобраться, как работают СУБД, предлагаю попробовать написать свою мини-СУБД. Придумать формат для таблиц и индексов, и написать код, который будет выполнять запросы.
Парсить SQL-запросы относительно сложно, потому тебе прощу будет передавать запросы в виде массивов вроде:
[
'type' => 'select',
'from' => 'some_table',
'where' => ['x', '=', 10]
]
Если есть какие-то еще вопросы, задавай.
MySQL это сервер. То есть, это программа, которая постоянно работает в фоне, принимает запросы от клиентов и отвечает на них. У нее нет графического интерфейса (окошек с кнопками).
> как запускается
Самый простой способ - просто открыть консоль и вручную запустить программу в консоли (это называется foreground mode). Но обычно вручную ее не запускают, а настраивают автоматический запуск при загрузке ОС. В Линукс это называется "демон" (daemon) и реализуется, например, через systemd, в Windows это называется "служба" (service). То есть при установке на Windows MySQL добавляет службу, и таким образом, запускается когда загружается ОС.
Подробнее гугли про службы Windows или про демоны в Linux.
> хранит свои базы
Базы данных хранятся в файлах, в Linux они расположены в /var/lib/mysql, в Windows по моему в C:\ProgramData\MySQL\. Есть два варианта - либо каждая таблица хранится в отдельном файле, либо все таблицы хранятся в одном огромном файле.
На диске хранятся не только таблицы с данными, но и индексы. Индексы делаются для каждой колонки отдельно и позволяют делать быстрый поиск по этой колонки без необходимости читать всю таблицу. То есть, если у тебя таблица на миллион строк, то для поиска в ней тебе надо прочитать и проверить весь миллион. А если у тебя есть индекс по колонке, то для поиска по этой колонке тебе достаточно прочитать около 20 записей из индекса.
Формат данных зависит от используемого движка, сейчас я думаю, основной это InnoDB.
Общая архитектура InnoDB: https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html
Подробно про формат хранения данных на диске: https://dev.mysql.com/doc/refman/8.0/en/innodb-on-disk-structures.html
> как делает запросы
Запрос парсится, строится план запроса (какие таблицы или индексы читать, что искать) и выполняется.
Если ты хочешь лучше разобраться, как работают СУБД, предлагаю попробовать написать свою мини-СУБД. Придумать формат для таблиц и индексов, и написать код, который будет выполнять запросы.
Парсить SQL-запросы относительно сложно, потому тебе прощу будет передавать запросы в виде массивов вроде:
[
'type' => 'select',
'from' => 'some_table',
'where' => ['x', '=', 10]
]
Если есть какие-то еще вопросы, задавай.
Я не он, но чем именно являются индексы "физически", что они позволяют ускорять поиск?
Могут быть B-деревом, хеш-таблицами или другими хитровыебанными видами деревьев, на хабре есть серия статей про индексы PostgreSQL правда, но не суть, у mysql индексы попроще ощутимо
Если бы форма была статическая, я бы просто на oninput у каждого поля повесил функцию, которая запишет данные в LocalStorage.
Можно повесить один обработчик на форму, чтобы отслеживал значения каждого поля и сохранял их в LocalStorage, а потом, при обновлении страницы, генерировать форму на основе данных из хранилища и заполнять соответствующими значениями?
Допустим, у нас есть миллион email и мы хотим быстро искать по ним. В обычной таблице нам придется прочитать все миллион строк и проверить каждую на совпадение. Плюс, так как в таблице кроме email могут быть и куча других данных, и мы можем читать строки только целиком, то нам приходится читать много лишних данных. Это медленно.
Теперь представь, что мы взяли из таблицы все email и выписали их в список по алфавиту, и к каждому приписали id строки, к которой он относится:
...
Чтобы найти email в таком списке мы можем использовать метод деления пополам, то есть, взять середину списка и сравнить с нашим email. Если наш email меньше, то взять середину первой половины списка и сравнить, если больше то взять середину второй половины. И так далее.
То есть, на каждом шаге мы уменьшаем список возможных вариантов в 2 раза. За 20 шагов (log2 от миллиона) мы можем найти любой email или понять, что такого в списке нет.
Более того, так как индекс содержит только email, он меньше, чем таблица и может быть даже поместится в память целиком, что еще сильнее ускорит поиск по нему, так как диск, даже SSD, намного медленнее, чем память.
Однако, у такого списка есть недостаток. Если мы добавим в таблицу новую запись или удалим, нам придется долго перестраивать весь огромный индекс. Поэтому такие индексы в виде списка можно использовать только если таблица не меняется.
Поэтому для индексов обычно используют деревья (гугли структуру данных "двоичное дерево" и "красно-черные деревья"). Мы организовываем email в дерево, и для миллиона записей сбалансированное дерево будет иметь высоту в 20 узлов. То есть, от корня до любого листа можно дойти за 20 шагов.
Еще один подвох, что дерево эффективно только если оно сбалансировано, то есть у каждого узла и справа и слева примерно одинаковое число потомков. Потому придумывают хитрые структуры вроде красно-черных деревьев, которые перебалансируются при вставке/удалении.
Хеш-таблицы тоже можно использовать для индекса, но они позволяют искать только по равенству (WHERE x = 10), а деревья позволяют искать так же по условиям больше/меньше, WHERE x > 10, находить mIN(x) и MAX(x) и быстро брать N первых/N последних записей.
Допустим, у нас есть миллион email и мы хотим быстро искать по ним. В обычной таблице нам придется прочитать все миллион строк и проверить каждую на совпадение. Плюс, так как в таблице кроме email могут быть и куча других данных, и мы можем читать строки только целиком, то нам приходится читать много лишних данных. Это медленно.
Теперь представь, что мы взяли из таблицы все email и выписали их в список по алфавиту, и к каждому приписали id строки, к которой он относится:
...
Чтобы найти email в таком списке мы можем использовать метод деления пополам, то есть, взять середину списка и сравнить с нашим email. Если наш email меньше, то взять середину первой половины списка и сравнить, если больше то взять середину второй половины. И так далее.
То есть, на каждом шаге мы уменьшаем список возможных вариантов в 2 раза. За 20 шагов (log2 от миллиона) мы можем найти любой email или понять, что такого в списке нет.
Более того, так как индекс содержит только email, он меньше, чем таблица и может быть даже поместится в память целиком, что еще сильнее ускорит поиск по нему, так как диск, даже SSD, намного медленнее, чем память.
Однако, у такого списка есть недостаток. Если мы добавим в таблицу новую запись или удалим, нам придется долго перестраивать весь огромный индекс. Поэтому такие индексы в виде списка можно использовать только если таблица не меняется.
Поэтому для индексов обычно используют деревья (гугли структуру данных "двоичное дерево" и "красно-черные деревья"). Мы организовываем email в дерево, и для миллиона записей сбалансированное дерево будет иметь высоту в 20 узлов. То есть, от корня до любого листа можно дойти за 20 шагов.
Еще один подвох, что дерево эффективно только если оно сбалансировано, то есть у каждого узла и справа и слева примерно одинаковое число потомков. Потому придумывают хитрые структуры вроде красно-черных деревьев, которые перебалансируются при вставке/удалении.
Хеш-таблицы тоже можно использовать для индекса, но они позволяют искать только по равенству (WHERE x = 10), а деревья позволяют искать так же по условиям больше/меньше, WHERE x > 10, находить mIN(x) и MAX(x) и быстро брать N первых/N последних записей.
Да, лучше с помощью addEventListener повесить обработчик. И желательно ограничить частоту его срабатывания, например, не чаще чем раз в 10-15 секунд, а то у тебя на каждое нажатие клавиши будет выполняться код и писать данные на диск. Это может замедлить работу браузера.
Если пользователь успешно сохранил тест на сервер, то мы удаляем бекап. Или если он в форме создания нажал на "Отмена".
Если пользователь пытается закрыть вкладку, и есть несохраненные данные, то мы с помощью onbeforeunload спрашиваем, хочет ли он уйти со страницы и потерять данные? Если да, то удаляем бекап.
Если пользователь не сохранил тест (это может быть только если у него упала вкладка или браузер), и снова заходит на создание теста, и есть бекап, то можно вывести вопрос: вы не сохранили тест, восстановить данные или нет? Если нет - то бекап удаляется.
Тут, правда, есть проблема: что, если пользователь откроет несколько вкладок и создает несколько тестов? Не затрут ли бекапы друг друга?
Это можно решить таким образом: при загрузке страницы мы генерируем случайный id и сохраняем бекап с этим id. При восстановлении мы просто берем первый сохраненный id и восстанавливаем из него. После того, как пользователь успешно его сохранит, восстанавливаем второй бекап итд.
А индексы делаются автоматически, или их нужно вручную создавать?
А обращаться к ним через специальную комманду нужно?
мимо-другой-анон
Индексы создаются вручную. Ты можешь при создании таблицы в CREATE TABLE указать их (самый частый пример - когда ты указываешь PRIMARY KEY, KEY это и есть индекс) либо добавить их позже с помощью CREATE INDEX:
https://dev.mysql.com/doc/refman/8.0/en/create-index.html
Индексы не надо указывать в запросе, так как считается, что планировщик MySQL лучше понимает, когда их надо использовать, а когда нет. Но можно указать, чтобы они использовались /не использовались с помощью USE INDEX или IGNORE INDEX: https://dev.mysql.com/doc/refman/8.0/en/index-hints.html
Посмотреть, какие индексы используются в запросе, можно приписав перед ним EXPLAIN или EXPLAIN ANALYZE (это дает информацию в другом формате), например,
EXPLAIN SELECT a FROM b WHERE c = 10;
EXPLAIN ANALYZE SELECT a FROM b WHERE c = 10;
Мануал: https://dev.mysql.com/doc/refman/8.0/en/explain.html
Индексы создаются вручную, так как они не бесплатные. Во-первых, они занимают место на диске (это не критично, диски большие), во-вторых, при каждой вставке, обновлении или удалении данных надо обновлять индексы.
То есть, индекс сильно ускоряет поиск, но немного замедляет обновление данных. Поэтому индексы создаются только там, где нужно, а не на все колонки.
Также, бывают составные и функциональные индексы. Составной индекс делается на 2 или более колонок и позволяет быстро искать по сочетанию этих колонок. То есть, индекс на колонки (a, b) позволяет быстро искать по условиям:
WHERE a = 1 AND b = 2
WHERE a = 1
WHERE a =1 AND b > 2
WHERE a > 1
Но он не позволяет ускорить поиск по WHERE b = 1 (подумай, почему, если хочешь разобраться).
Типичный пример: у нас есть таблица лайков, а ней 100М записей и мы хотим быстро узнать: ставил ли пользователь 123 лайк пользователю 456? Запрос будет вида
WHERE user_id = 123 AND liked_user_id = 456
и тут составной индекс по (user_id, liked_user_id) позволит сделать поиск очень быстро. Также, такой индекс позволит быстро узнать, кому пользователь ставил лайки. Но не позволит узнать, кто ставил пользователю лайки.
Функциональный индекс индексирует не значения колонки, а результат выражения. Например, ты хочешь искать по условию
WHERE a + b = 5
или WHERE LOWER(username) = 'ivan'
Обычный индекс по колонкам a и b тут не поможет (подумай, почему). А функциональный индекс по выражению a+ b или по LOWER(username) поможет.
Мануал: https://dev.mysql.com/doc/refman/8.0/en/create-index.html#create-index-functional-key-parts
Индексы создаются вручную, так как они не бесплатные. Во-первых, они занимают место на диске (это не критично, диски большие), во-вторых, при каждой вставке, обновлении или удалении данных надо обновлять индексы.
То есть, индекс сильно ускоряет поиск, но немного замедляет обновление данных. Поэтому индексы создаются только там, где нужно, а не на все колонки.
Также, бывают составные и функциональные индексы. Составной индекс делается на 2 или более колонок и позволяет быстро искать по сочетанию этих колонок. То есть, индекс на колонки (a, b) позволяет быстро искать по условиям:
WHERE a = 1 AND b = 2
WHERE a = 1
WHERE a =1 AND b > 2
WHERE a > 1
Но он не позволяет ускорить поиск по WHERE b = 1 (подумай, почему, если хочешь разобраться).
Типичный пример: у нас есть таблица лайков, а ней 100М записей и мы хотим быстро узнать: ставил ли пользователь 123 лайк пользователю 456? Запрос будет вида
WHERE user_id = 123 AND liked_user_id = 456
и тут составной индекс по (user_id, liked_user_id) позволит сделать поиск очень быстро. Также, такой индекс позволит быстро узнать, кому пользователь ставил лайки. Но не позволит узнать, кто ставил пользователю лайки.
Функциональный индекс индексирует не значения колонки, а результат выражения. Например, ты хочешь искать по условию
WHERE a + b = 5
или WHERE LOWER(username) = 'ivan'
Обычный индекс по колонкам a и b тут не поможет (подумай, почему). А функциональный индекс по выражению a+ b или по LOWER(username) поможет.
Мануал: https://dev.mysql.com/doc/refman/8.0/en/create-index.html#create-index-functional-key-parts
> не чаще чем раз в 10-15 секунд
Дядь, надо не по интервалу сохранять, а когда юзер заблюрил форму.
>Если да, то удаляем бекап.
Нет гарантий, что ты успеешь его удалить до того, как браузер убьет вкладку.
>>412065
Лучший вариант - сохранять на сервере раз в N секунд и отдать юзеру. Используя уникальный ключ при этом, да.
Ты правильно делаешь, что используешь криптографическую функцию, а не предсказуемый генератор вроде mt_rand.
Ты можешь использовать random_int и преобразовывать числа в символы с помощью массива:
$chars = mb_str_split("abcdefg....789");
$char = $chars[random_int(...)];
Ты можешь также генерировать не символы, а слоги, это сделает пароль читабельнее, но его станет проще подбирать.
Ты можешь оценить, сколько попыток пароля нужно, таким образом: пусть пароль содержит N частей (символов, слогов) и каждая часть с равной вероятностью выбирается из K вариантов. Тогда количество возможных паролей равно KN, а среднее кол-во попыток подбора равно половине этого числа.
Если поделить количество попыток подбора на скорость перебора, то ты получишь сколько времени в среднем нужно на подбор пароля.
Вкладка или браузер могут упасть независимо от того, когда пользователь что-то "заблюрил". Точно так же может отключиться свет в процессе набора.
> Нет гарантий, что ты успеешь его удалить до того, как браузер убьет вкладку.
И что страшного? Лучше лишний раз предложить восстановить документ, чем лишний раз потерять его.
Сохранять на сервере хорошо, но требует постоянное и надежное соединение с Интернетом. И безлимитный трафик. Если эти условия выполняются, то да, можно сохранять данные в тест в статусе "черновик", например.
Спасибо за уделённое внимание, но мне нужна была простая автогенерация. Функцию-то я влепил, как в гуглах... в код, но делать это хочется для в можно меньшем количестве случаев: и чтобы код не раздувался, и чтобы силы на это лишние не тратились.
password: 1234512345
salt: QWERTYqwerty
crypt: $1$QWERTYqw$Z8oTXgHYxGQxpq6hSwz8h.
execute: useradd --no-create-home --password "$1$QWERTYqw$Z8oTXgHYxGQxpq6hSwz8h." cow
https://pastebin.com/x0Mb3T06
Не логинется. А в shadow следующее -
cow:.:19196:0:99999:7:::
Иногда что-то появляется. Но эффект тот же.
Попробуй запустить команду вручную и посмотреть, не выводит ли она какие-то ошибки или сообщения.
Также, попробуй вручную вызвать команду crypt и сравнить хеш с тем, что генерируется в PHP. Может быть, PHP использует другой алгоритм или другой формат хеша.
Также, посмотри, нет ли в параметрах команды спецсимволов, которые надо экранировать. Например, знак доллара в bash это спецсимвол.
Ты можешь проверить, правильно ли bash воспринимает команду, добавив перед ней echo:
echo useradd ...
И посмотреть, что выведется.
На российском рынке вакансий, больше котируется Symfony или Laravel? По вашим наблюдениям?
hh-вакансий
symfony-290
laravel-389
Крупные фирмы на которые я натыкаюсь, почему-то symfony используют. Он мне НЕ нравится, все начиная от логотипа/названия коверканного, и вообще кажется устаревшим. Но если деняки будут платить, и других аналогов в РФ нет - то буду его выдрачивать. Или стоит держать курс на Laravel?
> Он мне НЕ нравится, все начиная от логотипа/названия коверканного, и вообще кажется устаревшим.
Оу, ты тоже оцениваешь "технологию" по логотипу?
Оу, спасибо анончик за такой развернутый ответ
ну все с друг другом связано, я суеверный дизайнер-анальник.
Плюс достаточно зайти на главные презентационные страницы фрейморков, и становиться ясно что к чему, если потыкать по кнопкам и почитать инструментарий, мануалы и решения, чекнуть комьюнити.
>>413962
незнаю, рандомно выбираю с понравившихся сайтов, с вакансий на hh. Просто смотрю стек студий, и часто вижу почему то блядь symfony.
lamoda, creonit.ru - последние на которые я натыкался.
У меня в мухосрани yii требуют (ну и цмс в довесок), причем не 2й, что там вообще может быть на нем?
Симфони тебе может не нравиться, но зато он не основан на статических методах и глобально доступных функциях, а использует dependency injection.
Ты бы изучил лучше, например, насколько удобно писать автоматизированные тесты под оба фреймворка. Насколько удобны их ORM. И тд.
Устаревший код. Но, справедливости ради, Yii не выглядит сложным фреймворком, наверно в нем можно за день-два разобраться.
>что там вообще может быть на нем?
Вонючее легаси. Если за эту работу предлагают меньше 150к, то шли нахуй - пусть сами в своём говне ковыряются.
>Какие 150к в мухосрани, лол?
Такие, пчел. Если у них там на Йи первом всё крутится, значит проект выстрелил и деньги есть. И сам проект на месте будет сложным, нахуеверченным и, скорее всего, засратым за годы разработки. В дополнение к этому обвешанным всяким разным софтом.
Вообще похуй уже мухсрань там или нет. На легаси за маленькие деньги не ходят. Вообще в разработку за маленькими деньгами не ходят иначе просто в ДС яндекс-курой устроиться и не ебать мозг.
Вопрос не в переезде, а в том, что ты хуй человека найдёшь задёшево который в этом будет сидеть и копаться. Джуна ты не посадишь на легаси - он обосрётся, мидл тоже не дурак задёшево работать.
Ну и да - причём тут мухосрань вообще? ИТ-продукты обычно работают в глобальном вебе и деньги отовсюду идут, и их ДС, и из ДС2, и из остальных мухосраней. Просто не будь долбоёбом и не вписывайся за копейки под предлогом классического кабанского пиздежа "мы бедные несчастные из мухосрани".
>под предлогом классического кабанского пиздежа "мы бедные несчастные из мухосрани"
Мне один тоже что-то подобное любил втирать, а в ВК у него что не фотачка, то пальмы вокруг. На дураков рассчитано же.
Про мухосрани ни слова.
Учил iOS разработку на свифте и все было неплохо, но тут произошёл хохлокризис и меня переполняют сомнения по поводу мобилок (малое количество джун/стажер вакансий и страх, что Тим Кук насрёт хуйни ), думаю сменить вектор обучение на бэк с пыхой.
Правильно ли я поступаю или лучше не рыпаться и дальше сидеть на мобилках?
Не, там было как раз на джуна, и к юии был 1-с битрикс и битрикс фреймворк(в чем вообще разница?) в довесок.
Задал вопрос на тостере, но никто тоже не знает. Тут читать удобнее -> https://qna.habr.com/q/1180564
Что я делаю: создаю материнский шаблон layouts/main.twig
<!doctype html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<h1>Главная страница</h1>
{% block content %}{% endblock %}
</body>
</html>
Создаю дочерний шаблон home/index.twig и наследуюсь от главного
{% extends "@app/views/layouts/main.twig" %}
{% block content %}
Дочерняя страница
{% endblock %}
Из HomeController'a рендерю дочерний шаблон, но в браузер выводится только материнский.
Все пути правильные, потому что любое изменение в путях приводит к ошибке "шаблон не найден".
Что я упускаю? Вроде бы с точки зрения синтаксиса все верно. Элементарные примеры же.
Задал вопрос на тостере, но никто тоже не знает. Тут читать удобнее -> https://qna.habr.com/q/1180564
Что я делаю: создаю материнский шаблон layouts/main.twig
<!doctype html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<h1>Главная страница</h1>
{% block content %}{% endblock %}
</body>
</html>
Создаю дочерний шаблон home/index.twig и наследуюсь от главного
{% extends "@app/views/layouts/main.twig" %}
{% block content %}
Дочерняя страница
{% endblock %}
Из HomeController'a рендерю дочерний шаблон, но в браузер выводится только материнский.
Все пути правильные, потому что любое изменение в путях приводит к ошибке "шаблон не найден".
Что я упускаю? Вроде бы с точки зрения синтаксиса все верно. Элементарные примеры же.
ПЫХОВСКУЮ СПЕКУ ЧИТАЙ, ПИДОРАС УДАЧЛИВЫЙ
Хочется это так же посылать на почту, но как это делают обычные сайты?
Я погуглил и нашел что многие пишут юзать mailgun, а там ценник 35 баксов за 50к писем. И пишут что через smtp какой нибудь яндекс почты все письма будут в спам улетать...
Я сомневаюсь что всякие там форумы платят по 100 баксов в месяц что бы уведомления посылать на почту...
Чем тебя стандартный почтовый сервер не устраивает?
>Это норма или работодатели хотят понавесить лишнего на разрабов?
Просто ларка решила запрыгнуть в уже едущий поезд SPA.
>Говно ведь получится когда всё один человек делает.
Да
Может быть тысяча причин: ты на самом деле рендеришь не тот шаблон, который думаешь, ты забыл обновить кеш и тд.
Для начала проверь вариант с кешем, что возможно закешировалась старая версия шаблона. Далее, попробуй дописать что-нибудь в оба шаблона и посмотри, выведется ли текст или нет.
Если ты хочешь хорошо разобраться в этой теме, то придется начать с истории. Прочитай про устаревший протокол CGI (он устаревший, но зато очень простой), разберись как он работает. Затем почитай про протокол FastCGI.
Тут вскользь упомянуто, что делает fpm: https://www.php.net/manual/en/install.fpm.php
PHP-FPM это менеджер процессов и сервер. То есть, он (менеджер) запускается, запускает какое-то количество рабочих процессов и открывает порт для приема запросов по протоколу FastCGI. Когда приходит запрос, он передает его рабочему. Если рабочий падает, он запускает нового. Я правда не уверен насчет тонкостей: например, передает ли менеджер новое соединение рабочему или же куча рабочих просто совместно открывают один порт и ядро Linux передает соединение случайному рабочему?
> как на уровне процесса работает PHP программа
PHP программа работает в однопоточном режиме, без параллелизма. Однако, один процесс PHP может выполнить множество PHP программ подряд, при этом все переменные и состояние очищается после завершения каждой программы.
> как работает параллелизм
Запускается множество рабочих процессов, и ОС распределяет процессорное время между ними. Ты можешь захотеть прочитать про планировщик ядра в Linux, если тебе это не очень понятно.
> как веб-сервер обрабатывает сразу несколько запросов, если есть только 1 PHP процесс.
Один FPM процесс и много рабочих процессов.
Тут среди описания настроек тоже можно подчерпнуть кое-какую информацию: https://www.php.net/manual/en/install.fpm.configuration.php
>>415289
Ты можешь либо сам настроить почтовый сервер, разобравшись во всех тонкостях, либо платить тем, кто уже все настроил.
Как минимум, нужно: не внесенный в спам-листы IP, корректный обратный DNS, настроить SPF/DKIM, обрабатывать случаи недоставки письма (то есть не пытаться 10 раз отправить письмо на один и тот же несуществующий адрес), отправлять письма только на подтвержденные email, сделать ссылку и заголовки для отписки от рассылки, реагировать на случаи, когда кто-то отправляет твое письмо в спам и отписывать его, итд.
Вот, например, на mail ru есть подробная информация:
https://help.mail.ru/developers/mailing_rules
https://help.mail.ru/developers/notes
Есть возможность отслеживать доставляемость писем: https://help.mail.ru/developers/postmaster
Думаю, аналогичная информация есть и у Гугла. Читай, изучай.
form.onsubmit явно не подойдёт, т.к. сервер может выдать ошибку валидации и вернуть пользователя на страницу.
Как можно отправить на клиент событие сохранения в базу данных?
Я знаю про sessionStorage, но мне кажется он не подойдёт для моих целей?
https://www.youtube.com/watch?v=cvjMNjY2gz0&list=PLrCZzMib1e9rx3HmaLQfLYb9ociIvYOY1&index=5
https://www.youtube.com/playlist?list=PLDrmKwRSNx7KOPMxupPxcOqjhRrdqbGVg
https://deworker.pro/edu/series/http-framework/http-serverhttps://www.ozon.ru/product/unix-professionalnoe-programmirovanie-143822722/?sh=b8x7zhXx7Q
https://www.ozon.ru/product/unix-razrabotka-setevyh-prilozheniy-2881910/?sh=b8x7zhofDA
>Как можно отправить на клиент событие сохранения в базу данных?
Ручками отправляй форму через fetch и проверяй ответ.
Пример:
async function sendForm(){
const form = document.querySelector('form');
const fd = new FormData(form);
const resp = await fetch(''/path/to/endpoint", {method: "post", body: fd});
if (!resp.ok) throw new Error(resp.status);
}
потом в момент, когда тебе нужно отправить форму:
try {await sendForm(); } catch (e) {
// пришел ответ с кодом не 2xx или нет соединения...
}
XAMP
Благодарю, анон!
Для чего тебе try/catch? Если ты ловишь какое-то конкретное исключение, то ты ставишь try вокруг функции, которая его выбрасывает.
Если же ты хочешь ловить все непойманные исключения, чтобы показать красивую страницу ошибки, то надо ставить на самом верхнем уровне, как можно выше. Но можно вместо этого просто установить обработчик непойманных исключений. Когда исключение поймано, надо записать его в лог. Описано тут:
- https://github.com/codedokode/pasta/blob/master/php/exceptions.md#ловим-исключения
- https://github.com/codedokode/pasta/blob/master/php/exceptions.md#страница-ошибки-в-веб-приложениях
Спасибо. Ну я в целом хочу понять хорошие практики использования этого блока, общую тактику их использования. А то везде туториалы только по синтаксису, но нигде не объясняют концепцию.
Ебать у тебя крутой учебник, ОП. Почему решил заняться такой благотворительностью? Это типа проект на портфолио или ты как хобби этим занимаешься? Не думал создать цыганские платные курсы? Я бы даже задонатил за труд, не будь я нищим стажёром-вкатуном.
https://tula.hh.ru/vacancy/67619851?from=employer&hhtmFrom=employer
Можете пожалуйста подсказать, что нужно с нуля учить\готовить для вкатунства в эту хуйню, как вообще называется эта хуйня(Я так понял это фуллстек). На руках имеется неоконченная шарага и минимальные знания в c++ и python. Если не сложно накиньте курсы или литературу которую стоит начать изучать для людей с пониженным IQ. Заранее всем спасибо.
Битрикс учи. Будь патриотом ебать. Люби всё русское
Ты не написал, какая у тебя ОС.
Если это Windows, то многие расширения идут в комплекте с PHP и единственное, что надо сделать для их включения - это раскомментировать или дописать в php.ini строчку вида extension=something.dll
Если расширение не идет в комплекте, то надо скачать подходящую dll c http://pecl.php.net/ и точно так же дописать строчку.
Расположение файла php.ini можно узнать, если выполнить php-скрипт с командой
<?php
phpinfo();
Если у тебя Линукс, то расширения ставятся через стандартный менеджер пакетов вроде apt, а если расширения в нем нет, то командой pecl install (если я не путаю).
Однажды кто-то сделал тред по изучению языка Перл, а я решил сделать тред по изучению PHP. Какой-то умный анон написал, что это лучше оформить в виде сайта, чтобы материал не потерялся и примерно за 1 или 2 вечера сайт был нарисован, сверстан и запрограммирован.
Изначально учебника не было, я просто рисовал картинки с пояснениями в фотошопе и прикладывал к постам.
Написано же в вакансии:
> Что мы ожидаем от вас:
> — хороший уровень знаний PHP/MySQL
> — отличный уровень знаний HTML/CSS/JS/jQuery
> — опыт разработки сайтов на 1С-Битрикс
Это и учи.
Я просто не понимаю в какой последовательности, хотелось бы какой-нибудь гайд, или ссылку на курсы, которые я скачаю слитые, чтобы это начать задрачивать. Есть огромное стремление вкатиться за год, т.к в моей шараге этот год последний, я ебал в армию идти, да и сама вакансия интересует. Проходил один раз практику на местном оружейном заводе. Там ахуенный мужик был, дал нам офис и компы и пояснял за веб. За 2 недели с нуля сделали +- простенький многостраничник на HTML+Css, потом начал заебывать с реактом но мы не успели и практика кончилась
А ну и bootstrap был еще, ахуенный конструктор, мне зашло
откосить по IT, да и есть шанс что просто сам не пойду, я очень больной
Тебе уже ответили в соседнем треде: использую гварды из vue router. https://router.vuejs.org/guide/advanced/navigation-guards.html
Примеров полно на гитхабе, сам найдешь.
если бы ты сформулировал нормально, тебе бы ответили
нет
Причем здесь гарды? Мне нужен полностью пак с регистрацией и верификацией, у меня еще jwt в проекте, что усложняет задачу. Проверку я догадался сделать
PHP-FPM это только менеджер. Для обработки запросов он запускает рабочие процессы, и ты в конфиге задаешь их количество.
>>>UnexpectedValueException
Invalid route action: [MainController].
at D:\OpenServer\domains\laravel\vendor\laravel\framework\src\Illuminate\Routing\RouteAction.php:92
88 */
89 protected static function makeInvokable($action)
90 {
91 if (! method_exists($action, '__invoke')) {
➜ 92 throw new UnexpectedValueException("Invalid route action: [{$action}].");
93 }
94
95 return $action.'@__invoke';
96 }
1 D:\OpenServer\domains\laravel\vendor\laravel\framework\src\Illuminate\Routing\RouteAction.php:47
Illuminate\Routing\RouteAction::makeInvokable()
2 D:\OpenServer\domains\laravel\vendor\laravel\framework\src\Illuminate\Routing\Route.php:190
Illuminate\Routing\RouteAction::parse()
методом подбора решил
Route::get('/', action: 'MainController@index');
с остальными вариантами не работало
>Теперь страница выдает:
Illuminate \ Contracts \ Container \ BindingResolutionException
PHP 8.0.14
9.22.1
Target class [MainController] does not exist.
Ставился laravel, node.js и sass.
Напиши полный путь до контроллера или добавь его в import.
Что-то подобное попробуй и нажми на подсказку, путь сам вставится:
Route::get('/', action: App/Http/Controllers/MainController::class, index)
$count надо static сделать, не? Я если честно рекурсию так и не осилил на примере той задачи о пути из шапки, не могу представить в голове процесс.
Для отправки запросов можно просто использовать curl в параллельном режиме, потоки тут не нужны. Хотя, конечно, можно разделить получение страниц и поиск ссылок.
Попробуй более простую задачу на рекурсию. Дан массив, который может содержать числа либо другие массивы такого же вида:
[1, 2, [3, 4, [5, 6, [7], 8], 9]]
1) Надо посчитать сумму чисел в таком массиве. В пустом массиве сумма равна 0.
2) Надо преобразовать его в одноуровневый плоский массив
Проверить, что значение является массивом, можно функцией is_array().
Задача два. Дан список категорий вида:
[
'Хлебобулочные изделия' => ['Хлеб', 'Булка', 'Лаваш'],
'Кондитерские изделия' => [
'Торты' => ['Из бисквита', 'Вафельные'],
'Пирожные',
'Печенье'
];
Надо вывести все категории, перечисляя их родителей через слеш и указывая сколько у них дочерних категорий:
Хлебобулочные изделия (3)
Хлебобулочные изделия / Хлеб (0)
Хлебобулочные изделия / Булка (0)
...
И так далее.
Сделаешь эти, можешь попросить еще. Или можешь попросить подсказку, если непонятно. В обоих случаях нужна рекурсия и обход дерева.
Попробуй более простую задачу на рекурсию. Дан массив, который может содержать числа либо другие массивы такого же вида:
[1, 2, [3, 4, [5, 6, [7], 8], 9]]
1) Надо посчитать сумму чисел в таком массиве. В пустом массиве сумма равна 0.
2) Надо преобразовать его в одноуровневый плоский массив
Проверить, что значение является массивом, можно функцией is_array().
Задача два. Дан список категорий вида:
[
'Хлебобулочные изделия' => ['Хлеб', 'Булка', 'Лаваш'],
'Кондитерские изделия' => [
'Торты' => ['Из бисквита', 'Вафельные'],
'Пирожные',
'Печенье'
];
Надо вывести все категории, перечисляя их родителей через слеш и указывая сколько у них дочерних категорий:
Хлебобулочные изделия (3)
Хлебобулочные изделия / Хлеб (0)
Хлебобулочные изделия / Булка (0)
...
И так далее.
Сделаешь эти, можешь попросить еще. Или можешь попросить подсказку, если непонятно. В обоих случаях нужна рекурсия и обход дерева.
static использовать не надо, так как он будет накапливаться, если функцию вызвать несколько раз подряд. static вообще лучше избегать.
Они разделены, просто не показал этого
Как выводить ошибки валидации для каждого конкретного, сгенерированного с помощью JS, поля? Как передать индексы вопроса/ответа из JS в PHP?
как -- решительно. Из вопроса непонятно, что тебе мешает.
Не очень понятно, как у тебя устроен процесс обработки формы. (1) Ты отправляешь форму на сервер обычным POST, там она валидируется и выводится заново? (2) Ты используешь pjax? (3) Или же ты отправляешь AJAX-запрос из JS кода, он валидируется и возвращает список ошибок?
На скриншоте у тебя код шаблона нового вопроса, который вставляется в DOM при добавлении вопроса?
Если у тебя классическая стандартная отправка формы без AJAX, то тогда сервер проверяет данные и при ошибках выводит форму заново с ошибками (эта логика описана в моем уроке https://github.com/codedokode/pasta/blob/master/forms.md ). Но в Laravel почему-то сделано немного не так: там при ошибках сервер помещает их в сессию, делает редирект на страницу формы и форма выводится с добавлением ошибок из сессии.
Для проверки массивов ты используешь описанный тут синтаксис со звездочками: https://laravel.com/docs/9.x/validation#validating-nested-array-input (если я ничего не путаю). Чтобы вывести ошибки в таком случае, нужно разобраться, как их получить из переменной $errors, которая относится к классу MessageBag. Тут вроде описан синтаксис со звездочкой: https://laravel.com/docs/9.x/validation#working-with-error-messages . Но если тебе надо получить ошибку с определенным номером, я бы попробовал просто добавить номер, в стиле $errors->get('question.0.text'). Естественно, так как ты выводишь блоки в цикле, номер можно брать из переменной: $errors->get("question.$i.text").
Ты можешь также изучить код класса MessageBag и поискать подходящие методы в нем: https://laravel.com/api/9.x/Illuminate/Support/MessageBag.html . Ты также можешь попробовать сдампить объект $errors и посмотреть, какие ключи у ошибок в нем.
Что касается шаблона нового вопроса, то в данном сценарии него не надо добавлять ошибки, так как в новом, еще не отправленном на сервер вопросе не может быть ошибок.
---
Если ты используешь стандартные формы, но добавил pjax для их аякс-отправки, то все описанное выше актуально. Так как pjax имитирует классическую отправку формы.
---
Если у тебя отправка формы через AJAX, то по-видимому, надо делать так. JS код собирает данные формы в JSON и отправляет на сервер. На сервере они валидируются (используй синтаксис со звездочками по ссылке выше) и получается объект с ошибками. Он преобразуется в JSON и возвращается в качестве ответа на запрос. JS код убирает старые ошибки из DOM и добавляет полученные из JSON.
В этом сценарии тебе в шаблоне нового вопроса надо добавить пустой див для ошибки и сделать его скрытым (как и все остальные дивы ошибок). Когда с сервера придет ответ, ты скроешь старые ошибки, затем вставишь тексты ошибок в дивы и сделаешь их видимыми.
Также, для шаблона нового вопроса рекомендуется использовать тег <template>. Чтобы он случайно не отобразился в старых браузерах, добавь ему display: none.
Спрашивай, если что-то непонятно.
Не очень понятно, как у тебя устроен процесс обработки формы. (1) Ты отправляешь форму на сервер обычным POST, там она валидируется и выводится заново? (2) Ты используешь pjax? (3) Или же ты отправляешь AJAX-запрос из JS кода, он валидируется и возвращает список ошибок?
На скриншоте у тебя код шаблона нового вопроса, который вставляется в DOM при добавлении вопроса?
Если у тебя классическая стандартная отправка формы без AJAX, то тогда сервер проверяет данные и при ошибках выводит форму заново с ошибками (эта логика описана в моем уроке https://github.com/codedokode/pasta/blob/master/forms.md ). Но в Laravel почему-то сделано немного не так: там при ошибках сервер помещает их в сессию, делает редирект на страницу формы и форма выводится с добавлением ошибок из сессии.
Для проверки массивов ты используешь описанный тут синтаксис со звездочками: https://laravel.com/docs/9.x/validation#validating-nested-array-input (если я ничего не путаю). Чтобы вывести ошибки в таком случае, нужно разобраться, как их получить из переменной $errors, которая относится к классу MessageBag. Тут вроде описан синтаксис со звездочкой: https://laravel.com/docs/9.x/validation#working-with-error-messages . Но если тебе надо получить ошибку с определенным номером, я бы попробовал просто добавить номер, в стиле $errors->get('question.0.text'). Естественно, так как ты выводишь блоки в цикле, номер можно брать из переменной: $errors->get("question.$i.text").
Ты можешь также изучить код класса MessageBag и поискать подходящие методы в нем: https://laravel.com/api/9.x/Illuminate/Support/MessageBag.html . Ты также можешь попробовать сдампить объект $errors и посмотреть, какие ключи у ошибок в нем.
Что касается шаблона нового вопроса, то в данном сценарии него не надо добавлять ошибки, так как в новом, еще не отправленном на сервер вопросе не может быть ошибок.
---
Если ты используешь стандартные формы, но добавил pjax для их аякс-отправки, то все описанное выше актуально. Так как pjax имитирует классическую отправку формы.
---
Если у тебя отправка формы через AJAX, то по-видимому, надо делать так. JS код собирает данные формы в JSON и отправляет на сервер. На сервере они валидируются (используй синтаксис со звездочками по ссылке выше) и получается объект с ошибками. Он преобразуется в JSON и возвращается в качестве ответа на запрос. JS код убирает старые ошибки из DOM и добавляет полученные из JSON.
В этом сценарии тебе в шаблоне нового вопроса надо добавить пустой див для ошибки и сделать его скрытым (как и все остальные дивы ошибок). Когда с сервера придет ответ, ты скроешь старые ошибки, затем вставишь тексты ошибок в дивы и сделаешь их видимыми.
Также, для шаблона нового вопроса рекомендуется использовать тег <template>. Чтобы он случайно не отобразился в старых браузерах, добавь ему display: none.
Спрашивай, если что-то непонятно.
https://laravel.com/docs/9.x/requests#retrieving-json-input-values
Нужно выставить правильный заголовок Content-Type при отправке запроса.
Получить весь JSON-массив можно, наверно, через $input = $request->input();
Так как php работает по умирающей модели, возник вопрос. Выходит, что никакие постоянные соединения невозможны? Хочется иметь постоянное соединение с клиентом.
Наверное не правильно сформулировал вопрос. Если php всегда умирает, то постоянные соединения бессмысленны. Как сделать чтобы он не умирал? Накостылять event loop?
Где вообще почитать про умирающую модель выполнения php приложения и как это использовать? На английском не получается нагуглить, не знаю как сформулировать запрос, выдает только мнения о том, умер или умрет ли php.
Если да, то что учить, на что держать курс?
Я собираюсь зубрить базовый PHP + ООП + MVC(по курсам Дмитрия Трепачёва + книга Котерова + книга Лукьянова), SQL/MySql, Laravel(так же по курсам Трепачёва + книга Кириченко/Дубовика), Git, PDO.
Примечание - на очень хорошем для джуниора уровне, чтоб от зубов отскакивало! Это важно. Я именно подчёркиваю то, что не одни лишь основы собираюсь учить, а очень плотно сесть за вышеперечисленные технологии.
Возможно ещё подтяну Composer и Docker, но я сильно сомневаюсь, что успею выучить ещё и эти две технологии.
Смогу ли я с вышеперечисленными знаниями отыскать хотя бы стажировку? Не в своей перди, офк. Ради этого я могу взять небольшой кредит, и переехать в Москву/СПб/Екатеринбург и так далее.
+Задействую вакансии на удалёнке, но я очень сильно сомневаюсь, что кому-либо нужны джуниоры/стажёры удалённо.
Дополните меня, если я забыл упомянуть какие-либо очень важные технологии для джуниора. Буду благодарен, если выстроите список наиважнейших технологий в порядке приоритета.
Благодарю заранее всех отписавшихся.
Картинка для привлечения внимания.
За пол года до какого уровня, чтобы что знать и уметь? Нужно понимать, что нельзя просто заучить что-то и ты становишься программистом. Нужно не запомнить теорию, а понимать, и самое важно уметь что-то делать. Если нужно бысто обучиться основам, то PHP для этого подходит, но самый короткий путь это верстка с переходом во фронтенд.
>Смогу ли я вкатиться в работу пыхарем за полгода
не сможешь
>если буду учиться часов 10 в день
это так не работает
>в моей мухосрани не берут даже на днище-работу
это что за мухосрань такая?
Найди себе работу, чтобы были деньги на еду, а в свободное время сиди и спокойно, без спешки изучай пыху или что-нибудь другое. В тот же 1С вкатиться проще, чем в веб.
> Смогу ли я вкатиться в работу пыхарем за полгода, если буду учиться часов 10 в день?
Не сможешь, выгорание никто не отменял.
>в моей мухосрани не берут даже на днище-работу(а если и берут, то кидают)
курьером, таксовать можно (если права есть), в ту же пятерочку/магнит, летом точно туда набирают студентоту, ну в любом случае ищи работу чтобы хотя бы жить на минималках
Не знаю, анон. Учусь последние 4 месяца по 5+ часов в день. Работу еще не нашел, но чувствую, что осенью все получится.
> В тот же 1С вкатиться проще, чем в веб.
Двачую, если такие жесткие ограничения по времени и деньгам, я бы туда шел, а не в пыху.
PHP может работать в разных режимах. Например, в режиме PHP-FPM он принимает запросы от веб-сервера, передает их рабочему процессу, тот выполняет скрипт и отдает ответ. Это и есть "умирающий режим". Умирает не сам процесс PHP, а PHP скрипт - после завершения скрипта все переменные, классы, функции удаляются и PHP снова готов выполнить следующий скрипт "с чистого листа".
Но ты можешь не использовать PHP-FPM, а написать свой сервер, который откроет порт, и будет принимать запросы и их обрабатывать и при этом ничего не будет очищаться. Это на самом деле усложняет жизнь, так как при неправильном написании кода возникают утечки памяти (потребление памяти растет, пока память не закончится).
Тебе не надо читать ничего специально про PHP, тебе стоит разобраться в: сокетах Беркли (не вебсокетах), протоколе FastCGI (который использует PHP-FPM), как вообще работает веб-сервер.
Так что постоянные соединения возможны.
Начинай тогда с верстки и JS, если не успеешь выучить PHP, то хотя бы верстальщиком попробуешь устроиться.
Двачую, можно написать парсер для хх.ру и считать себя сеньор дата-саентистом и архитектором в добавок.
>Умирает не сам процесс PHP, а PHP скрипт
Это же одно и то же. Запустил файл на выполнение - запустился процесс. Выполнился код из файла - процесс умер. Сам модуль php-fpm может и не умирает, он может вообще на Си написан. Только вот экземпляр виртуальной машины PHP умирает после выполнения кода. Если взять например node.js, то там не так. После выполнения кода из файла, виртуальная машина не завершается, а ждет. Поэтому можно спокойно создать вебсокет соединение и обрабатывать его.
>Но ты можешь не использовать PHP-FPM, а написать свой сервер, который откроет порт, и будет принимать запросы и их обрабатывать и при этом ничего не будет очищаться.
Так для нужен бесконечный цикл. Иначе код выполнится и php умрет. Чтобы не быть голословным, дай ссылку где можно прочитать про все что ты написал.
> Это же одно и то же. Запустил файл на выполнение - запустился процесс.
Нет. Неправильно. Процесс php не умирает после выполнения скрипта, а переходит к выполнению следующего скрипта. Один процесс PHP может выполнить множество скриптов. Почитай, что такое "процесс" в операционной системе для понимания.
То, что ты описываешь, было в протоколе CGI, но он использовался в 90-е годы и твоя информация, мягко говоря, устарела. FastCGI (который используется в PHP-FPM) как раз и придуман, чтобы процессы не требовалось постоянно перезапускать.
> Если взять например node.js, то там не так. После выполнения кода из файла, виртуальная машина не завершается, а ждет.
Неверно. Если я запускаю скрипт как node index.js, и в нем нет того самого бесконечного цикла, то процесс node завершается после выполнения скрипта. То есть нода работает точно так же, как и PHP в CLI-режиме. PHP может выполнить скрипт и завершиться, или он может открывать порты и асинхронно обрабатывать поступающие данные, не завершаясь. Как и нода.
> Чтобы не быть голословным, дай ссылку где можно прочитать про все что ты написал.
Вот пример неумирающего сервера: https://sergeyzhuk.me/2017/06/22/reactphp-chat-server/
Что касается остального, то я думаю, что тебе надо читать про сокеты Беркли, что такое процессы в ОС, что такое системные вызовы, то есть общую теорию. Потом может быть изучить библиотеки вроде ReactPHP, почитать их код, или Amphp (он мне не нравится, синтаксис с yield уродливый, и там много глобального состояния, а я не люблю глобальные переменные и потому amphp я использовать не хочу). Ты хочешь прочесть мануал "как сделать неумирающий сервер на PHP" и пропустить изучение теории, но так не получится. Я тебе выше дал как раз такую статью, но ты из нее ничего не поймешь без знания теории.
> Так для нужен бесконечный цикл.
Так сделай бесконечный цикл, кто тебе запрещает?
в рашке зашквар, в святой омерике заебись
у меня на районе за такую хуйню обоссывают лицо
ну и как сложно все эти плагины для вукомерции подключать
там нужно кодить или просто конфиги прописать?
Насколько я помню, переносы строк сохраняются в базу данных, т.к. являются спецсимволом.
Если мне нужно было отобразить текст с переносами, то я включал переносы css-правилом. Возможно, если загонять текст в тег <pre>, то переносы тоже сохранятся. Я не проверял.
В теге <pre> нет ничего магического и ты можешь включить принудительные переносы в любом теге с помощью правила white-space.
Ок.
Константа такая есть: PHP_EOL
Считывание откуда? Из терминала aka stdin?
Вот так:
<?php
$str = "";
while($line = fgets(STDIN)) {
$str .= $line;
}
echo $str;
?>;
Будет вечно считывать данные из терминала пока ему не прилетит EOF (CTRL+D в юниксе и CTRL+Z в шиндоусе)
Root composer.json requires php ^7.4 but your php version (8.1.7) does not satisfy that requirement.
Тебе не в композере надо пыху откатывать на на ОСи интерпритирующей пыху, тебе же русским языком написано: but your php version (8.1.7) но ваша версия 8.1.7. Либо в композере пропиши: ^8.1
А, неважно, я понял, можно даже просто гугловской почтой пользоваться smtp.gmail.com А когда локально на компе приложение запускаешь, есть mailhog, чтобы не отправлять настоящие емэйлы.
Те, кто с этим спорят, просто отрицают очевидное и боятся потерять работу.
Вопросы?
>>423007
https://onecompiler.com/php/3yd93tntm
Как еще тогда без статики хранить промежуточное значение между вызовами функции? Глобальные переменные использовать еще хуже ведь по идее.
https://onecompiler.com/php/3yda5qxf7
Не могу найти ошибку во второй, самое печальное я даже не знаю где в дебаггере поставить точку, чтобы понять промежуточные значения. Не могу наверное на базовом уровне даже понять концепт, только подгонкой под ответ что-то получить.
Не, я же не пехапешник
Код с глобальными или статическими переменными неправильный. Если твою функцию вызвать второй раз, то она будет суммировать не с нуля, а с оставшегося в статической переменной значения. Поэтому не надо использовать глобальные или статические переменные в такой ситуации.
> Как еще тогда без статики хранить промежуточное значение между вызовами функции?
Его просто не надо хранить. Для передачи значений нужно использовать аргументы функции и return для возврата.
Идея рекурсии в том, что мы разбиваем решение задачи на более простые действия. Например, вместо того, чтобы посчитать сумму элементов массива с вложенностью, мы пишем функцию, которая умеет только считать сумму одномерного массива и вызывает сама себя, если встречает вложенные массивы.
Итак, у нас задача посчитать сумму элементов массива. Мы можем написать функцию, которая получает на вход массив и возвращает эту сумму. Логика функции такая:
- пусть сумма = 0
- обходим элементы массива по очереди:
- - если это число, то прибавляем его к сумме
- - если это массив, то вызываем себя рекурсивно, получаем сумму элементов в массиве, и прибавляем возвращенное значение к сумме
- возвращаем сумму
Как видишь, задача решается без глобальных переменных.
Что касается второй задачи, тут не надо пытаться все сделать одной функцией, а нужно использовать несколько.
Напиши одну функцию, которая получает массив категорий и возвращает их суммарное количество. Тут не нужны глобальные переменные. Функция будет выглядеть примерно так:
function countCategories(array $categs): int { ... }
Как и ранее, функция должна считать количество категорий в одномерном массиве, а если она встречает вложенный массив, то вызывает сама себя, чтобы узнать количество вложенных в него категорий.
Затем напиши вторую функцию, которая получает массив и выводит пути категорий в нем. Здесь функция получается чуть сложнее. Допустим, мы выводим какую-то категорию. Нам нужно знать список родительских категорий, чтобы вывести их:
Кондитерские изделия / Торты / Из бисквита
Здесь "Кондитерские изделия / Торты" - это родительские категории, а "Из бисквита" это текущая. Проще всего просто явно передавать в функцию вывода список родительских категорий, то есть функция должна иметь вид:
function printCategories(array $categs, array $parents = [])
Здесь $parents как раз и содержит ["кондитерские изделия", "Торты"].
> Не могу найти ошибку во второй, самое печальное я даже не знаю где в дебаггере поставить точку, чтобы понять промежуточные значения
Иногда вместо пошаговой отладки лучше работает вывод переменных с помощью echo или var_dump.
Если тебе что-то непонятно по двум задачам выше, то задавай вопросы. Если все понятно, то делай их и бери третью задачу:
Есть набор программ, и у программ есть зависимости. То есть, чтобы поставить программу A, нужно сначала установить программы B и C. Зависимости описаны в массиве такого вида:
программа => массив зависимостей, например:
[
'config-parser' => ['yaml-parser', 'json-parser'],
'json-parser' => ['libjson'],
'framework' => ['config-parser', 'twig', 'doctrine'],
'doctrine' => ['pdo'],
'twig' => ['lexer']
]
Тебе дан массив зависимостей и название программы (например: 'framework'). Напиши функцию, которая выведет полный список программ (включая все зависимости), которые надо установить.
К примеру, чтобы установить config-parser, нужно поставить yaml-parser и json-parser, и для json-parser требуется еще libjson. Не используй статические/глобальные переменные.
И вот еще четвертая задача, посложнее. Раньше мы только обходили деревья, а теперь надо их модифицировать. Тебе дано математическое выражение, которое состоит из чисел, переменных, сумм и произведений (то есть, в нем используется только сложение и умножение). Математическое выражение представлено в виде массива, в котором сначала идет знак операции, а потом переменные, числа или вложенные выражения. Например:
['+', 'x', 'y', 5] значит x + y + 5
['*', 'x', 2, 3] значит x * 2 * 3
['*', ['+', 'a', 'b'], 5] значит (a + b) * 5
Задача: напиши функцию, которая упрощает выражение, заменяя в нем суммы или произведения из 2 или более чисел на одно число. То есть:
2 + x + 5 => 7 + x
(2 + x + 1) * 2 * (x + y) * 5 => (3 + x) * 10 * (x + y)
Тут конечно можно голову сломать, но ты попробуй, а если что, попроси подсказку. Как и ранее, не используй глобальные/статические переменные.
> Не могу найти ошибку во второй, самое печальное я даже не знаю где в дебаггере поставить точку, чтобы понять промежуточные значения
Иногда вместо пошаговой отладки лучше работает вывод переменных с помощью echo или var_dump.
Если тебе что-то непонятно по двум задачам выше, то задавай вопросы. Если все понятно, то делай их и бери третью задачу:
Есть набор программ, и у программ есть зависимости. То есть, чтобы поставить программу A, нужно сначала установить программы B и C. Зависимости описаны в массиве такого вида:
программа => массив зависимостей, например:
[
'config-parser' => ['yaml-parser', 'json-parser'],
'json-parser' => ['libjson'],
'framework' => ['config-parser', 'twig', 'doctrine'],
'doctrine' => ['pdo'],
'twig' => ['lexer']
]
Тебе дан массив зависимостей и название программы (например: 'framework'). Напиши функцию, которая выведет полный список программ (включая все зависимости), которые надо установить.
К примеру, чтобы установить config-parser, нужно поставить yaml-parser и json-parser, и для json-parser требуется еще libjson. Не используй статические/глобальные переменные.
И вот еще четвертая задача, посложнее. Раньше мы только обходили деревья, а теперь надо их модифицировать. Тебе дано математическое выражение, которое состоит из чисел, переменных, сумм и произведений (то есть, в нем используется только сложение и умножение). Математическое выражение представлено в виде массива, в котором сначала идет знак операции, а потом переменные, числа или вложенные выражения. Например:
['+', 'x', 'y', 5] значит x + y + 5
['*', 'x', 2, 3] значит x * 2 * 3
['*', ['+', 'a', 'b'], 5] значит (a + b) * 5
Задача: напиши функцию, которая упрощает выражение, заменяя в нем суммы или произведения из 2 или более чисел на одно число. То есть:
2 + x + 5 => 7 + x
(2 + x + 1) * 2 * (x + y) * 5 => (3 + x) * 10 * (x + y)
Тут конечно можно голову сломать, но ты попробуй, а если что, попроси подсказку. Как и ранее, не используй глобальные/статические переменные.
ты меня спрашиваешь?
https://pad.riseup.net/p/um6r06DgiSF1souTMcFq
Нашел на гитхабе пару проектов. Спасибо.
По ссылке нихуя нет полюбому лажа какая-нибудь в виде написать сортировку слиянием или что-то такое же тривиальное
Не работает ссылка. Рассказывай что за тестовое
{
yield 'empty string' => ['', 1000, ''];
yield 'small string' => ['text', 1000, 'text'];
yield 'max length less than text length' => ['text', 3, 'tex'];
yield 'small string with dots' => ['text. text! text.', 1000, 'text. text! text.'];
yield 'trim text without sentences' => ['text, text (text text);', 15, 'text, text (tex'];
yield 'trim text by dot' => ['text text. text.', 12, 'text text.'];
yield 'trim with zero as max length' => ['text.text', 0, ''];
yield 'trim with negative max length' => ['text text. abc', -2, ''];
yield 'trim multibyte text' => ['Für über 30-Jährige wird für Erst- und Auffrischungsimpfungen Moderna verwendet, ausgenommen sind Schwangere und Stillende. Für die Zweitimpfungen wird BioNTech verwendet, wenn der Impfzyklus damit begonnen wurde.', 150, 'Für über 30-Jährige wird für Erst- und Auffrischungsimpfungen Moderna verwendet, ausgenommen sind Schwangere und Stillende.'];
yield 'trim with multiple dots' => ['Bislang (Stand 9.1.) wurden in München insgesamt 2.573.163 Impfungen durchgeführt (1.058.319 Erst- und 1.003.629 Zweitimpfungen sowie 511.215 Drittimpfungen). Impfungen durch (1.2) Betriebsärzt*innen wurden bislang nicht erfasst. Die Münchner Impfquote liegt damit, bezogen auf die Gesamtbevölkerung, bei den Erstimpfungen bei 71,1 %, bei den Zweitimpfungen bei 67,4 % und bei den Drittimpfungen („Boosterimpfung“) bei 34,4 %.', 200, 'Bislang (Stand 9.1.) wurden in München insgesamt 2.573.163 Impfungen durchgeführt (1.058.319 Erst- und 1.003.629 Zweitimpfungen sowie 511.215 Drittimpfungen).'];
yield 'trim text with length equals to max length' => ['text. text.', 11, 'text. text.'];
yield 'trim with sentence separator at max length position' => ['first sentence. second sentence. text!', 32, 'first sentence. second sentence.'];
yield 'trim by ...' => ['first sentence. second sentence... other text.', 40, 'first sentence. second sentence...'];
yield 'advanced: trim by question mark' => ['text. text? text', 15, 'text. text?'];
yield 'advanced: trim by exclamation mark' => ['text? text. text! text text. text.', 25, 'text? text. text!'];
yield 'advanced: trim by question exclamation mark' => ['text. text?! text text text', 15, 'text. text?!'];
yield 'advanced: trim by exclamation question mark' => ['text. text!? text text text', 15, 'text. text!?'];
}
echo "<pre>";
foreach (examples() as $topic => [$original, $length, $expected]) {
$result = truncate($original, $length) === $expected;
if ($result === false) {
echo "-" . $topic . '<font color="red"> - FAIL!</font>' . "\n";
} else {
echo "-" . $topic . '<font color="green"> - CHECK!</font>' . "\n";
}
}
echo "</pre>";
{
yield 'empty string' => ['', 1000, ''];
yield 'small string' => ['text', 1000, 'text'];
yield 'max length less than text length' => ['text', 3, 'tex'];
yield 'small string with dots' => ['text. text! text.', 1000, 'text. text! text.'];
yield 'trim text without sentences' => ['text, text (text text);', 15, 'text, text (tex'];
yield 'trim text by dot' => ['text text. text.', 12, 'text text.'];
yield 'trim with zero as max length' => ['text.text', 0, ''];
yield 'trim with negative max length' => ['text text. abc', -2, ''];
yield 'trim multibyte text' => ['Für über 30-Jährige wird für Erst- und Auffrischungsimpfungen Moderna verwendet, ausgenommen sind Schwangere und Stillende. Für die Zweitimpfungen wird BioNTech verwendet, wenn der Impfzyklus damit begonnen wurde.', 150, 'Für über 30-Jährige wird für Erst- und Auffrischungsimpfungen Moderna verwendet, ausgenommen sind Schwangere und Stillende.'];
yield 'trim with multiple dots' => ['Bislang (Stand 9.1.) wurden in München insgesamt 2.573.163 Impfungen durchgeführt (1.058.319 Erst- und 1.003.629 Zweitimpfungen sowie 511.215 Drittimpfungen). Impfungen durch (1.2) Betriebsärzt*innen wurden bislang nicht erfasst. Die Münchner Impfquote liegt damit, bezogen auf die Gesamtbevölkerung, bei den Erstimpfungen bei 71,1 %, bei den Zweitimpfungen bei 67,4 % und bei den Drittimpfungen („Boosterimpfung“) bei 34,4 %.', 200, 'Bislang (Stand 9.1.) wurden in München insgesamt 2.573.163 Impfungen durchgeführt (1.058.319 Erst- und 1.003.629 Zweitimpfungen sowie 511.215 Drittimpfungen).'];
yield 'trim text with length equals to max length' => ['text. text.', 11, 'text. text.'];
yield 'trim with sentence separator at max length position' => ['first sentence. second sentence. text!', 32, 'first sentence. second sentence.'];
yield 'trim by ...' => ['first sentence. second sentence... other text.', 40, 'first sentence. second sentence...'];
yield 'advanced: trim by question mark' => ['text. text? text', 15, 'text. text?'];
yield 'advanced: trim by exclamation mark' => ['text? text. text! text text. text.', 25, 'text? text. text!'];
yield 'advanced: trim by question exclamation mark' => ['text. text?! text text text', 15, 'text. text?!'];
yield 'advanced: trim by exclamation question mark' => ['text. text!? text text text', 15, 'text. text!?'];
}
echo "<pre>";
foreach (examples() as $topic => [$original, $length, $expected]) {
$result = truncate($original, $length) === $expected;
if ($result === false) {
echo "-" . $topic . '<font color="red"> - FAIL!</font>' . "\n";
} else {
echo "-" . $topic . '<font color="green"> - CHECK!</font>' . "\n";
}
}
echo "</pre>";
Симфони не навязывает какой-то определенной структуры, потому тебе логичнее было бы спросить "как должна выглядеть структура проекта на php".
Если проект небольшой, то можно просто сделать несколько папок и раскидать все по ним: папка для контроллеров, папка для сущностей Доктрины, папка для слушателей событий, папка для сервисов и тд.
Если проект большой, то такая схема плохо подходит, так как у тебя будет по 100 файлов в одной папке. Тут лучше руководствоваться принципом "классы, которые связаны, должны быть рядом, а которые не имеют отношения друг к другу - далеко". Можно разбить проект на части/модули и распределить классы по ним, например, если мы делаем сервис для заказа еды на дом:
- модуль веб-интерфейса с контроллерами, шаблонами и вспомогательными классами
- модуль API мобильного приложения
- модуль интерфейса для ресторанов
- модуль интерфейса для курьеров
- модуль админки
- модуль каталога продуктов (без контроллеров и шаблонов, только сервисы)
- модуль расчета маршрута и стоимости доставки (без контроллеров и шаблонов, только сервисы)
- модуль маркетинга и промокодов
- модуль расчета KPI работников и подсчета разной статистики
И тд. Надеюсь, ты видишь логику. Заметь, что некоторые модули тут отвечают в основном за интерфейс или API, а некоторые за внутреннюю бизнес-логику. То есть, тебе надо подумать, как разбить твое приложение на компоненты, чтобы внутри компонента был код, который тесно связан друг с другом, сами компоненты слабо связаны между собой. И заметь, что некоторые модули содержат контроллеры/шаблоны, а некоторые нет. Нет такого требования, чтобы каждому модулю соответствовала какая-то страница на сайте.
Этот тред закончился, если вас пропустили, напомните о себе в новом треде.
Благодарю. Можно еще вопрос кастельно модулей, раз у тебя есть опыт с ними. Как быть с классами которые связывают несколько классов из разных модулей? Например класс КлиентТелевизор связывающий классы Клиент из модуля клиентов с классом Телевизор из модуля телевизоров.
Это копия, сохраненная 20 сентября 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.