Вы видите копию треда, сохраненную 25 мая 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
ОП довольно занят, но постарается ответить на все вопросы. Также, ответы и решения задач можно поискать в архиве тредов phpclub.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>1917260 (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 - это что-то вроде их хабра.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания 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/
Нарушение разделения ответственности. Функция проверки должна только проверять данные формы, а не заниматься выводом сообщений и тем более убивать скрипт. Она должна вернуть результат проверки, а что с ним будут делать - это не ее дело.
Завтра ты захочешь сделать, чтобы при ошибке выводилась форма с введенными значениями, и эту функцию придется переделывать. А вот если ее сделать, как я написал, то не придется.
> trim($login)
У тебя trim вникуда делается, сама переменная $login после trim останется неизменной. Нужно писать так $login = trim($login);
> if ($login==false)
Можно убрать строчку сверху и написать компактнее:
if (!checkLogin($login)) {
...
}
вот у меня еще есть 3 формы.
можно чтобы сокр код
сделать проверку этих форм через OR в одну строку
типа
if (!checkLogin($login) or !checkCountry(x) or !checkPassword(y)) {
не валидно }
trim можно убрать из функции, все же ее задача - валидация, а не преобразование данных. Тогда можно будет сделать, чтобы функция либо возвращала текст ошибки, либо null, если все ок. В таком случае мы сможем выводить разные сообщения при разных ошибках.
У функции желательно указать тип аргумента и тип возвращаемого значения. Это улучшить читабельность кода: сразу видно, что приходи в функцию и что она вернет.
Также, у тебя странно, что ты возврашаешь 0, но в if сравниваешь с false.
Здесь это не требуется, но если понадобится, чтобы функция возвращала более 1 значения, можно возвращать массив.
Будет лучше написать единую функцию для проверки всех полей сразу. Чтобы она принимала на вход список полей и возвращала список ошибок в них.
>Тогда можно будет сделать, чтобы функция либо возвращала текст ошибки,
а анон выше говорит что так делать нельзя
Какие подводные?
Потому что он сначала прибавляет единицу, но не перезаписывает в переменной. Если хочешь, шобы сразу выводило, юзай ++$a;
Немного непонятно. А почему тогда в гайде написано что $a++ это $a=$a+1 ?
Не читай гайд из шапки, его писал двачер блять. Двачеры априори не могут писать гайды. Учи на php.net + google. Всё.
Это просто бездумно пизданутая хуйня из си.
Просто всегда делай $var++ и не пихай его в выражения, а отдельной строчкой.
Я это понял, но я не понимаю как это работает.
Получается $a++ это оператор, который возвращает значение $a вызывающей его функции, а после ее выполнения увеличивает ее на единицу?
> я не понимаю как это работает
Я тебе даже ссылку скинул на офф документацию, ты хоть открывал её?
>для чего используется оператор return
>чтобы вернуть значение в куда-то,здесь в переменную
Всегда было любопытно, откуда берутся такие логические цепочки рассуждений, например. Они же и не дедуктивны и не индуктивны.
смысле блять? ретурн на английском вернуть. че не так?
а как?
> чтобы вернуть значение в куда-то
Не в куда-то, а ИЗ функции
> в переменную
В переменную значение записывается, а не возвращается
https://www.php.net/manual/ru/functions.returning-values.php
Нет, именно в куда-то. В место вызова функции.
В общем сделал так:
При каждой авторизации юзера создается/обновляется токен
При выходе с аккаунта планировал токен удалять, но понял что это приведет к ошибкам при двух и более одновременных сессиях/SPOILER]
При каждом дергании токена ( эвент retrieved ) проверяется, не протух ли он. Если протух, то токен обновляется.
Токен пробрасывается в html в мета тег. При отправлении AJAX запроса в javascript, он берется оттуда и пробрасывается в header
В миддлваре, при обнаружении AJAX реквеста с токеном в хедере, реквесту назначается юзер с таким токеном ( офк, если токен не протухший )
Что меня напрягает:
1) Нулевая безопасность. Если я получу хоть на момент доступ к ПК жертвы, я могу, например, сфотографировать себе токен жертвы, после чего без особой сложности выполнять на своем ПК любые операции от ее имени, просто подменяя в исходном коде свой токен на токен жертвы. Конечно, пока токен не протухнет или жертва не перелогинится.
2) Есть вероятность того, что токен протухнет между его пробрасыванием в html и отправкой самого запроса. Это как-то несерьезно
Действительно ли это весомые проблемы? И если да, то как они решаются? Есть идея делать очень маленькое время протухания, например 60 секунд, и каждые 55 секунд запрашивать по аяксу новый токен, пока не протух старый. Но это по-моему как-то слишком.
http://sandbox.onlinephpfunctions.com/code/141c2283841d204f4b9e00b4c52123e4324e8d79
Очевидная дополнительная проверка на мета данные браузера и другую тех информацию от юзера.
$a++ увеличивает $a на 1, но (если ты его используешь в выражении или команде) возвращает исходное значение $a до увеличения. То есть, если написать:
$a = 1;
$a++;
echo $a;
То выведется 2. А если написать
$a = 1;
echo $a++;
то выводится 1, хотя $a увеличивается и становится равно 2 (что легко проверить, дописав echo $a в конец).
Почему это не написано в учебнике? Там я старался писать как можно проще и не залезать глубоко в детали. В учебнике предполагается, что ты будешь писать просто
$a++;
и не будешь пытаться засунуть это внутрь какого-то другого выражения или команды. Сколько я не писал код, я не помню ситуации, когда надо засовывать $a++ в другое выражение. Некоторые так делают, но на мой взгляд это ухудшает читабельность кода и делать так не стоит.
По моему, лучше бы конечно в PHP было запрещено вставлять $a++ внутрь других выражений.
>>1958564
php.net читать конечно полезно, но там не учебник, а мануал и он больше рассчитан на тех, кто уже знает какой-нибудь язык программирования, вроде Си, и кому нужно только выучить отличия. Мануал на php.net не очень подходит для начинающих с нулевыми знаниями, как мне кажется.
Да, он увеличивает переменную, но возвращает значение до увеличения. Ты можешь проверить это кодом
$a = 1;
echo $a++; // 1
echo $a; // 2
Зачем так сделано? Логику тут найти трудно. Спроси у автора языка Си, зачем он так придумал. Я подозреваю, что просто потому что в компьютерах тех времен была команда для этого, вот он и скопировал ее в язык.
Ты зачем-то создаешь переменные, которые никак дальше не используются. Вот смотри:
function x() {
return $a = "текст";
}
Эта строка создает переменную $a, записывает в нее значение "текст", затем возвращает его и выходит из функции. При выходе из функции переменная $a уничтожается. Зачем ее тогда было создавать? Нужно писать просто:
return "текст";
У тебя команда
return $errors[] = "текст";
создает массив, но возвращает она не массив, а строку "текст". Зачем создается массив, непонятно, так как он никак не используется и уничтожается при выходе из функции. Если ты хотел вернуть массив из 1 элемента, то надо писать так:
return ["текст"];
Хотя правильнее было бы сначала собрать все ошибки в массив и в конце функции вернуть его:
$errors = [];
$errors[] = "текст";
$errors[] = "текст";
return $errors;
Также, функции надо называть осмысленно. Не form(), а check_form(), validate_form().
Ты зачем-то создаешь переменные, которые никак дальше не используются. Вот смотри:
function x() {
return $a = "текст";
}
Эта строка создает переменную $a, записывает в нее значение "текст", затем возвращает его и выходит из функции. При выходе из функции переменная $a уничтожается. Зачем ее тогда было создавать? Нужно писать просто:
return "текст";
У тебя команда
return $errors[] = "текст";
создает массив, но возвращает она не массив, а строку "текст". Зачем создается массив, непонятно, так как он никак не используется и уничтожается при выходе из функции. Если ты хотел вернуть массив из 1 элемента, то надо писать так:
return ["текст"];
Хотя правильнее было бы сначала собрать все ошибки в массив и в конце функции вернуть его:
$errors = [];
$errors[] = "текст";
$errors[] = "текст";
return $errors;
Также, функции надо называть осмысленно. Не form(), а check_form(), validate_form().
А зачем ты используешь токен для аякс-запросов на сайте? Обычно токен используется для сторонних приложений, которые вызывают твое API.
На сайте у тебя есть стандартная авторизация (через куки или сессию), и стандартные функции, чтобы проверить, залогинен ли пользователь. Зачем нужно отказываться от них и переходить на какие-то токены? Может, я что-то не знаю, но выглядит как бессмысленное усложнение на ровном месте (да, я в курсе, что некоторые так делают, но это их проблемы).
Я понимаю, если бы у тебя было API для сторонних приложений, но у тебя его нет.
> Если я получу хоть на момент доступ к ПК жертвы, я могу, например, сфотографировать себе токен жертвы,
Если ты получишь доступ, ты можешь установить бекдор и вообще делать что угодно с компьютером, так что это мелочи.
> Действительно ли это весомые проблемы? И если да, то как они решаются? Есть идея делать очень маленькое время протухания, например 60 секунд, и каждые 55 секунд запрашивать по аяксу новый токен, пока не протух старый. Но это по-моему как-то слишком.
Не очень понятно, зачем делать короткий срок жизни токена и мучаться с продлеванием, если можно сделать время жизни токена больше, чем время жизни авторизационной куки и не мучаться.
тут фишка в чем,изначально я просто сделал проверку.где просто проверяли и выводили все найденные ошибки,но выполнение проги не останавливается!
можно конечно после каждого echo сделать die,но токга прога выведет первую попавшуюся ошибку и завершит процесс
Произошел перекат на 7 или как попадется?
Вымер ли рынок искаробочных хостингов?
Возможно, кто-то что-то не так понял. Ты можешь сделать, чтобы функция проверки возвращала true/false, но тогда ты не сможешь вывести, в чем именно ошибка. Лучше сделать функцию, которая либо вернет текст ошибки, либо null, если ошибок нету. Либо можно возвращать массив ошибок, если он пустой, то ошибок нет. С массивом плюс в том, что можно вернуть несколько разных ошибок сразу.
Я не понял, в чем проблема. Если ты хочешь при ошибках делать die(), то поставь if с нужным условием.
я написал же,если в первой проверке есть ошибка,он выведет эту ошибку и умрет.не проверив следующие условия.
вроде все и правильно,не не идеально
> С массивом плюс в том, что можно вернуть несколько разных ошибок сразу.
попробую с массивами зайти еше раз
>А зачем ты используешь токен для аякс-запросов на сайте? Обычно токен используется для сторонних приложений, которые вызывают твое API.
А как еще мне, например, отправить коммент от юзера по аяксу? Юзер в аякс запросе же никак не идентифицируем. Если я просто пошлю запрос, $request->user() будет возвращать null.
Алсо, здесь мне так и посоветовали делать: >>1955771 →
Или ты предлагаешь мне через яваскрипт как-то вытягивать данные из кукисов и сессии? Это же вроде небезопасно и по умолчанию невозможно, нет разве?
>Не очень понятно, зачем делать короткий срок жизни токена и мучаться с продлеванием, если можно сделать время жизни токена больше, чем время жизни авторизационной куки и не мучаться.
Чтобы когда хакер украдет токен, у него не было времени с ним что-то плохое сделать. Но это все похоже мои шизоидные теории, так что не обращай внимания.
а как извлечь извлечь из функ,если return['$login','$country','$password','$email'];?
> Юзер в аякс запросе же никак не идентифицируем. Если я просто пошлю запрос, $request->user() будет возвращать null.
Это почему? Аякс-запрос отправляется на сервер вместе с куками, следовательно авторизационная кука (и данные в сессии) должны быть доступны. Или в Ларавел это как-то специально ограничено?
> Чтобы когда хакер украдет токен, у него не было времени с ним что-то плохое сделать.
А если хакер украдет авторизационную куку? Что, заставлять пользователя каждую минуту перелогиниваться?
Я думаю, кто-то что-то напутал. Токены используются в API, к которым обращаются внешние приложения. Там не используются авторизационные куки, нет сессии, потому нужен токен. Также токен может использоваться, чтобы ограничить его использование по времени или ограничить набор прав для него (то есть токен может давать меньше прав, чем полноценный логин).
Не понял вопрос. Извлечь что? Если тебе надо извлечь значения из массива, то можно писать либо:
$login = $array[0];
$country = $array[1];
Либо
[$login, $country, $password ] = $array;
Приведи пример кода и что именно непонятно. Я вроде выше все описал.
list() уже устарел, сейчас массив разбирают с помощью квадратных скобок, как описано тут https://www.php.net/manual/ru/migration71.new-features.php#migration71.new-features.symmetric-array-destructuring
В функции последний if очень странный, смотри сам:
- если массив ошибок пуст (ошибок нет), вернуть пустой массив
- если ошибки есть, то не вернуть ошибки, а вернуть массив с 4 строчками (зачем?)
Нужно было просто написать return $error и все. Зачем написан этот if?
Справа, увы, не ООП, а просто код со словом class. У тебя все сделано статикой. То есть ты не можешь, например, создать 2 объекта для 2 разных форм. И опять же, у тебя все вперемешку - и проверка данных, и вывод результата сделан вместе. Это не ООП.
Бля, спасибо тебе огромное что на путь истинный направил.
Жаль что ты не ответил мне еще в том треде, а то я всё это время потратил на то, чтобы нормально осуществить эту авторизацию, а оказалось что я говна бесполезного накостылил и все с коробки работает.
Просто я был почему-то уверен, что JS с куками взаимодействовать не должен.
Плюс, я не с головы взял, что $request->user() null возвращает. У меня действительно такое было, только я в тот момент не подумал, что это могла просто авторизационная кука протухнуть. А наверняка так и было.
Ну я и лох конечно. Еще и весь этот позор на гитхаб запушил.
Новичек-кун, @kotovoi
О разделении ответственности ( на конкретном примере, что функция не должна и выводить что-то на экран, и проверять значение ) тебе уже писали.
О именовании тоже писали сотню раз. Ну какое нахуй $var?
О указании тайпхинтов тоже писали.
В чем логика, что функции lenght() и symbols() еще и возвращают логин?
И самое главное, ты проебал всю изюминку ООП - инкапсуляцию. Зачем вообще нужен такой класс, у которого я должен явно вызывать методы проверки валидности по каждому правилу?
а не,оно потом сможет ошибку записать в БД
Нет. В ООП у каждого класса есть "зона ответственности", или какая-то роль, которую он выполняет. У тебя класс занимается и проверкой и выводом текста на экран. То есть, все смешано в кучу. Нужно разделять обязанности. Класс должен заниматься только проверкой. Выводом ошибок должен заниматься другой код.
Плюс, у тебя надо вручную вызывать каждую проверку. А правильнее сделать так, что ты вызываешь один метод validate() и он уже делает все нужные проверки и возвращает результат.
Вообще, чтобы разобраться в ООП, тебе стоило бы начать с более простых задач вроде тех, что перечислены тут >>1958238 → А то ты тыкаешься вслепую, пытаясь писать ООП код.
Также, научись форматировать код по PSR-1 и PSR-12. Если ты не можешь настроить плагин к редактору, то научись писать сразу с правильным форматированием. Во втором посте треда есть информация про форматирование кода. Я проверил - для VS Code частично помогает этот плагин: https://marketplace.visualstudio.com/items?itemName=kokororin.vscode-phpfmt
тыб ему просто про паттерный ооп написал солид, драй и тд, банду четырех пусть читнет.
мимокрестораб
return count_chars($a.$b, 3);
}
echo longest("hskfkwiiweqqaaa", "lllfkoioeooqioaskzz");
//вывод — aefhikloqswz
Классная функция. Вдруг кому полезно будет.
В основном 7ые версии на проде сейчас. Найти что-то на 5ых версиях нужно постараться.
Бросай это дело. Программирование явно не для тебя.
Впервые вижу, чтобы так долго безрезультатно вникали в основы кодинга
>Впервые вижу, чтобы так долго безрезультатно вникали в основы кодинга
значит он читал не те книжки или вообще не читал, погромирование это не искусство, а ремесло, формошлепай и прибудет с тобой трудовой стаж.
нет бы вынести Design Patterns, чистый код мартина, полюбому есть специфический учебник по пыхе по типу "как перестать писать говно", в шапку.
а куда вкатываться? для джавы, го, си++, сишарп я туповат. в питоне вообще дата саенс и матан, там мне дорога закрыта. я с математикой вообще не в ладах
читал,и не одну-в целом поверхностое говно для полных нулей,бер рил прожект.
приходиться много гуглить,но там 99% процедурный код-зато работает и понятней
Из того, что я находил в интернете - дают задание написать какой-нибудь CRUD. Но, возможно, сейчас какие-то ещё появились заебы?
Видел ещё инфу, что кто-то требует покрывать тестами весь код. Это действительно так важно сейчас работодателям или можно без этого устроиться? Общие знания о том, как тестами покрывать у меня есть, но мне лень было с этой еботней заморачиваться. Впрочем, если это так важно работодателям, то придется хули
>дают задание написать какой-нибудь CRUD
тот же круд везде это не системщина
>Это действительно так важно
да но времени не всегда хватает
>бер рил прожект
мне уже не надо, но если код с прода != хороший код, шаблоны проектирования хотя нужно иметь представление что это, тем более на собесе за них спрашивают в любом яп.
https://github.com/codedokode/pasta/blob/master/student-list.md
ОП, аноны, можете посмотреть ?
https://github.com/qqzooi/student-list
Так вот, в моей мухосране 2 варианта карьеры бекендера: шарп и пхп.
Вот и я заинтересовался ПХП. Поясните, не начнется ли с определенного момента эта же залупа с тем, что не достаточно просто пилить бек? Как я понимаю, чтобы вкатиться - нужно симфонию и/или ларавель покурить, да сделать какой-нибудь интернет-магазин, чтобы закрепить знания или что-то еще там нужно особое знать?
ты потом откроешь свой же код и нихуя там не поймешь/надо будет его расширять а там пиздец.
Ты реально затупок, один из популярнейших фреймворков веба как раз на питоне
я согласен в целом,что даже эстетически мой код всрат-но рабочая процедурщина.Короче,как вы говорите-херак и в продакшен
дело не в эстетике, процедурный код забит гвоздями и его проще переписать чем расширить, слишком абстрактный код перегружен и хрупок, одно изменение может потянуть пол кода.
>слишком абстрактный код
как раз хотел спросить про ООП,если много кода,много связей,как вы ориентируетесь в нем,особенно если там несколько слоев?
Я не затупок. Чтобы изучить джанго, надо понять от а до я питон. Как мне кажется, без матана ты его хуй поймёшь.
есть принципы проектирования solid, dry, kiss, grasp и другие, вот их и придерживаемся, когда несколько человек пишут в одном стиле то каша более понятная.
Задам смежный вопрос: насколько часто на джуна вообще просят тестовое? Как по мне это ебанистика полная. За пару минут беседы же можно вполне +- понять уровень человека, если не задавать вопросы с листочка. Да и есть у меня гитхаб допустим, там интересные проекты которые месяцами делались, за каждую строчку могу пояснить и доказать что не верблюд. В чем прикол заставлять соискателей делать для каждого работодателя какой-то шаблонный круд с тестами, еще и с ограничением в какие-то условные 2 дня? При том что для меня эти два дня могут являться двумя вечерами после 13-часового таскания бетонных хуев, а для какого-то Ваньки это 48 часов, за которые это все дело даже обезьяна нагуглит и сделает. И какой вообще уровень эти круды могут показать?
>а куда вкатываться?
Явно не в разработку.
Вон тестером попробуй, девопсом, фронтом, аналитиком. Но в бек путь заказан.
>даже эстетически мой код всрат-но рабочая процедурщина
Не, ты даже до рабочей процедурщины не дошел еще.
А на пхп попросят пилить фронт на жиквери
Если у тебя есть гитхаб и можешь пояснить за код там - навязывай его вместо тествого, типо чтобы время не терять.
Суть в том, чтобы убедить работодателя, что ты не хуй с горы и можешь код писать.
На пхп такой залупы больше. Проекты проще, квалификация исполнителей часто ниже, работодатели привыкли экономить на труде, им не нужны хорошие беки, фронты, дизайнеры, поэтому ты будешь этим всем заниматься. Не одновременно же! Сначала одним, потом другим, так что не пизди, что двоя зряплата должна быть как у двух-трех спецов.
> лезть в залупу на сокетах хуячить, а я в универе наигрался с сокетами.
Ору, блядь. Выкатывайся из профессии нахуй, наигрался он.
Этим JS занимается.
это схуя ли? Фронт для меня дрочь дичайшая, не хочу даже туда соваться. Хочу в бэк и пойду в бэк, на твоё мнение мне вообще поебать, выблядос
Твой пост не похож на правду. Что значит "впервые вижу"? Ты что, препод и тебе есть с чем сравнивать? К тому же ты даже не знаешь сколько времени он потратил на изучение, а пишешь, про "так долго вникали". По моему, ты просто скучный тролль.
К тому же, основы кодинга - что какая команда делает - он как раз изучил. Ему нужны не основы, а учиться разбивать код на функции и тд. А для этого надо больше практиковаться и писать код.
>>1959399
Да не нужны тут никакие паттерны, чтобы форму проверить.
>К тому же, основы кодинга - что какая команда делает - он как раз изучил. Ему нужны не основы, а учиться разбивать код на функции и тд. А для этого надо больше практиковаться и писать код.
Лол
Тоже не понимаю, почему эта чмоня агрится?
Ему же советуют не тратить время зря.
Он же даже не сможет пояснить, что каждая строчка тут делает.
>Что значит "впервые вижу"? Ты что, препод и тебе есть с чем сравнивать?
Да, есть с чем сравнить. Видел многих вкатунов, и они явно получше соображают.
>К тому же ты даже не знаешь сколько времени он потратил на изучение, а пишешь, про "так долго вникали"
Ну вот он как минимум неделю пытается простой скриптик накидать. Причем не воспринимает ни слова, что ему пытаются сказать.
>К тому же, основы кодинга - что какая команда делает - он как раз изучил
Он соврешенно не понимает флоу кода, тупо рандомно вызывает встроенные функции и операторы
>Ему нужны не основы, а учиться разбивать код на функции и тд.
Ему нужны основы, он даже без функций код не может написать, или написать код одной функции
> UNIQUE KEY `unique_index` (`email`,`token`)
Тут наверно надо 2 отдельных индекса - по email и по токену. А то у тебя, получается, можно внести несколько записей с одинаковым email, если у них разные токены.
> return json_decode(file_get_contents($file));
Советую добавлять флаг JSON_THROW_ON_ERROR, без него при неправильном JSON функция просто вернет null и не выдаст никакой ошибки (см. мануал по json_decode).
Также, мне кажется, JSON лучше преобразовывать в массив, а не в объект. Так как stdСlass в PHP - это непонятное недоразумение, это по сути не объект, а просто массив (так как у него не определен список полей и нет методов), только без функций для работы с ним. Зачем stdClass нужен, я не понимаю. Если ты хочешь мапить конфиг на объект, то сделай для этого класс и десериализуй JSON в объект этого класса. Если не хочешь, то наверно лучше будет использовать массив.
> $container->register('request'
Мне кажется, не очень логично регистрировать в контейнере реквест. Ведь в контейнере обычно регистрируют постоянно живующие сервисы, которые неизменны. Реквест же меняется на каждом запросе. Потому его нелогично класть в контейнер и вдвойне нелогично, если какие-то сервисы от него зависят. Представь, что у тебя неумирающий после каждого запроса сервер (или ты просто решил написать тесты). Захочешь ты обработать несколько разных реквестов и это не получится сделать.
У тебя от реквеста зависит роутер. Получается, это такой "одноразовый" роутер, который может обработать лишь один реквест? Нелогично.
Роутер логично положить в контейнер, но нелогично, что мы передаем реквест ему в конструктор. Правильнее сделать в нем метод route($request) и тогда один роутер сможет обработать любое количество реквестов. А вот список роутов обычно передают в конструктор роутера. Так роутер будет чуть более универсальным и в нем не будет захардкожен путь к конфигу (и ему вообще не важно будет, откуда берется конфиг).
Соответственно, в App мы бы создавали новый реквест и передавали в роутер. А тот передавал бы реквест и параметры роутинга в контроллер.
Класс Db не особо нужен. У меня такое ощущение, что в каких-то других учебниках зачем-то учат его делать и потому он появляется в коде в каждой работе. Класс Db (создание объекта PDO) полностью можно перенести в bootstrap.php. Ты ведь для других объектов не делаешь классы-фабрики, а для PDO почему-то сделал.
> @var DIContainer
> private DIContainer $container;
> @param DIContainer $container
> public function __construct(DIContainer $container)
> @param int $statusCode
> @return Response
> private function createResponse(int $statusCode = 200): Response
Не стоит писать phpDoc, если он не несет никакой новой информации, а просто дублирует указанный в коде тип.
> error_log($exception->__toString());
Ошибки типа 404 можно не логгировать (они все равно логгируются на веб-сервере вроде nginx, если нужно).
Насчет исключений, я не думаю, что все исключения должны наследовать ApplicationException. Как я понял, этот класс обозначает исключение, к которому привязан определенный HTTP код и сообщение на странице ошибки. Но если взять тот же ContainerException (или DbException), какое отношение контейнер имеет к HTTP-ошибкам? Никакого. Контейнер не должен решать, какую страницу ошибки выводить и что на ней писать, он должен просто сигнализировать об ошибке и все. Потому он не должен наследоваться от ApplicationException. От него должны наследоваться только исключения вроде ошибок доступа (код 403), ошибки 404 и тд.
Получается нарушение принципа единой ответственности. Контейнер или БД, выбрасывая исключение, определяют, какую страницу ошибки показать, с каким кодом и каким сообщением. Это не их ответственность.
> $split = $this->getSplitRealPath();
> $request->setRequestBody($split);
Этот момент в роутере выглядит коряво. Почему-то значения GET/POST проставляются в Request только после роутинга. Логичней проставлять их при создании Request, а позже, при необходимости, добавлять значения параметров через $request->setAttributes. Хотя, мне не очень нравится, что в реквест вообще что-то дописывается. По идее же реквест представляет пришедший от пользователя запрос, а нем нет никаких атрибутов. В нем есть URL, GET, POST и все. Я знаю, что некоторые фреймворки дописывают атрибуты в реквест, но это, на мой взгляд, выглядит коряво. Логичнее было бы параметры после роутинга не записывать в реквест, а просто передавать в контроллер.
Из-за этого у тебя Request и Router получаются спутаны друг с другом, а лучше бы если они были независимы. Уж Request точно не должен никак зависеть от роутера.
actionIndex и actionSearch можно было бы объединить вместе, это очень похожие вещи - выборка из таблицы.
> private function getHtml(string $items): string
Это конечно корявенько, что HTML формируется не через шаблон. Можно было сделать, чтобы Pagination просто возвращал бы данные для отображения пагинатора, а HTML формировать в шаблоне из этих данных.
Неаккуратно сделано, что CookieHelper работает в обход Request/Response и ставит куки напрямую.
> public function getCsrfToken(): string
> return ($this->cookie->getCookie('csrf')) ?: $this->csrfToken;
Логика работы этой функции непонятна. Она возвращает непонятно что.
> if ($_SERVER['REQUEST_METHOD'] == 'POST') {
Это логичнее делать через $request->isPost().
> private int $outputRows;
Мне кажется, это стоило просто прописать в контроллере. StudentTableGateway не отвечает за отображение данных и не знает, по сколько строк надо выводить.
В функции getAll() наверно не надо было заморачиваться с джойном. Обычно делают так, что пагинация работает после сортировки, то есть сначала записи сортируются и затем из них выбирается запрошенная страница. Просто ORDER BY ... LIMIT ....
Не очень хорошо, что разные функции возвращают объекты Student с разным набором полей. Это может вызвать потом путаницу в коде, так как непонятно, как различать эти объекты. Что, если ты передашь "неполноценный" объект в функцию, которой нужно какое-то поле, которого в нем нет?
В роутинге не стоило указывать в регулярках GET-параметры. Ведь никто не гарантирует, что они придут именно в таком порядке, как описано:
> ?key=(id|name|surname|sgroup|score)&sort=(asc|desc)(&page=[1-9][0-9])?
Обычно при роутинге GET-параметры игнорируют и смотрят только на path.
> (isset($student->gender) && $student->gender == 'male'
Тут стоило использовать константу, наверно.
В общем, сделано хорошо. Видно, что ты поковырялся в сторонних фреймворках.
Советую также сделать описание в README и добавить скриншоты, если ты захочешь потом показывать эту работу в резюме.
> UNIQUE KEY `unique_index` (`email`,`token`)
Тут наверно надо 2 отдельных индекса - по email и по токену. А то у тебя, получается, можно внести несколько записей с одинаковым email, если у них разные токены.
> return json_decode(file_get_contents($file));
Советую добавлять флаг JSON_THROW_ON_ERROR, без него при неправильном JSON функция просто вернет null и не выдаст никакой ошибки (см. мануал по json_decode).
Также, мне кажется, JSON лучше преобразовывать в массив, а не в объект. Так как stdСlass в PHP - это непонятное недоразумение, это по сути не объект, а просто массив (так как у него не определен список полей и нет методов), только без функций для работы с ним. Зачем stdClass нужен, я не понимаю. Если ты хочешь мапить конфиг на объект, то сделай для этого класс и десериализуй JSON в объект этого класса. Если не хочешь, то наверно лучше будет использовать массив.
> $container->register('request'
Мне кажется, не очень логично регистрировать в контейнере реквест. Ведь в контейнере обычно регистрируют постоянно живующие сервисы, которые неизменны. Реквест же меняется на каждом запросе. Потому его нелогично класть в контейнер и вдвойне нелогично, если какие-то сервисы от него зависят. Представь, что у тебя неумирающий после каждого запроса сервер (или ты просто решил написать тесты). Захочешь ты обработать несколько разных реквестов и это не получится сделать.
У тебя от реквеста зависит роутер. Получается, это такой "одноразовый" роутер, который может обработать лишь один реквест? Нелогично.
Роутер логично положить в контейнер, но нелогично, что мы передаем реквест ему в конструктор. Правильнее сделать в нем метод route($request) и тогда один роутер сможет обработать любое количество реквестов. А вот список роутов обычно передают в конструктор роутера. Так роутер будет чуть более универсальным и в нем не будет захардкожен путь к конфигу (и ему вообще не важно будет, откуда берется конфиг).
Соответственно, в App мы бы создавали новый реквест и передавали в роутер. А тот передавал бы реквест и параметры роутинга в контроллер.
Класс Db не особо нужен. У меня такое ощущение, что в каких-то других учебниках зачем-то учат его делать и потому он появляется в коде в каждой работе. Класс Db (создание объекта PDO) полностью можно перенести в bootstrap.php. Ты ведь для других объектов не делаешь классы-фабрики, а для PDO почему-то сделал.
> @var DIContainer
> private DIContainer $container;
> @param DIContainer $container
> public function __construct(DIContainer $container)
> @param int $statusCode
> @return Response
> private function createResponse(int $statusCode = 200): Response
Не стоит писать phpDoc, если он не несет никакой новой информации, а просто дублирует указанный в коде тип.
> error_log($exception->__toString());
Ошибки типа 404 можно не логгировать (они все равно логгируются на веб-сервере вроде nginx, если нужно).
Насчет исключений, я не думаю, что все исключения должны наследовать ApplicationException. Как я понял, этот класс обозначает исключение, к которому привязан определенный HTTP код и сообщение на странице ошибки. Но если взять тот же ContainerException (или DbException), какое отношение контейнер имеет к HTTP-ошибкам? Никакого. Контейнер не должен решать, какую страницу ошибки выводить и что на ней писать, он должен просто сигнализировать об ошибке и все. Потому он не должен наследоваться от ApplicationException. От него должны наследоваться только исключения вроде ошибок доступа (код 403), ошибки 404 и тд.
Получается нарушение принципа единой ответственности. Контейнер или БД, выбрасывая исключение, определяют, какую страницу ошибки показать, с каким кодом и каким сообщением. Это не их ответственность.
> $split = $this->getSplitRealPath();
> $request->setRequestBody($split);
Этот момент в роутере выглядит коряво. Почему-то значения GET/POST проставляются в Request только после роутинга. Логичней проставлять их при создании Request, а позже, при необходимости, добавлять значения параметров через $request->setAttributes. Хотя, мне не очень нравится, что в реквест вообще что-то дописывается. По идее же реквест представляет пришедший от пользователя запрос, а нем нет никаких атрибутов. В нем есть URL, GET, POST и все. Я знаю, что некоторые фреймворки дописывают атрибуты в реквест, но это, на мой взгляд, выглядит коряво. Логичнее было бы параметры после роутинга не записывать в реквест, а просто передавать в контроллер.
Из-за этого у тебя Request и Router получаются спутаны друг с другом, а лучше бы если они были независимы. Уж Request точно не должен никак зависеть от роутера.
actionIndex и actionSearch можно было бы объединить вместе, это очень похожие вещи - выборка из таблицы.
> private function getHtml(string $items): string
Это конечно корявенько, что HTML формируется не через шаблон. Можно было сделать, чтобы Pagination просто возвращал бы данные для отображения пагинатора, а HTML формировать в шаблоне из этих данных.
Неаккуратно сделано, что CookieHelper работает в обход Request/Response и ставит куки напрямую.
> public function getCsrfToken(): string
> return ($this->cookie->getCookie('csrf')) ?: $this->csrfToken;
Логика работы этой функции непонятна. Она возвращает непонятно что.
> if ($_SERVER['REQUEST_METHOD'] == 'POST') {
Это логичнее делать через $request->isPost().
> private int $outputRows;
Мне кажется, это стоило просто прописать в контроллере. StudentTableGateway не отвечает за отображение данных и не знает, по сколько строк надо выводить.
В функции getAll() наверно не надо было заморачиваться с джойном. Обычно делают так, что пагинация работает после сортировки, то есть сначала записи сортируются и затем из них выбирается запрошенная страница. Просто ORDER BY ... LIMIT ....
Не очень хорошо, что разные функции возвращают объекты Student с разным набором полей. Это может вызвать потом путаницу в коде, так как непонятно, как различать эти объекты. Что, если ты передашь "неполноценный" объект в функцию, которой нужно какое-то поле, которого в нем нет?
В роутинге не стоило указывать в регулярках GET-параметры. Ведь никто не гарантирует, что они придут именно в таком порядке, как описано:
> ?key=(id|name|surname|sgroup|score)&sort=(asc|desc)(&page=[1-9][0-9])?
Обычно при роутинге GET-параметры игнорируют и смотрят только на path.
> (isset($student->gender) && $student->gender == 'male'
Тут стоило использовать константу, наверно.
В общем, сделано хорошо. Видно, что ты поковырялся в сторонних фреймворках.
Советую также сделать описание в README и добавить скриншоты, если ты захочешь потом показывать эту работу в резюме.
лапша это неструктурированный код, он может работать.
> Из-за этого у тебя Request и Router получаются спутаны друг с другом, а лучше бы если они были независимы.
Меня этот момент тоже напрягал, но что-то было лень переписывать, ибо пару раз приходилось переписывать часть логики, т.к. заранее не продумал + не так много опыта, а хотелось побыстрее закончить
> Это конечно корявенько, что HTML формируется не через шаблон.
Ты имеешь в виду, чтобы сделать отдельный шаблон для пагинатора, а сам пагинатор просто будет возвращать <ul> с необходимыми элементами ?
> В функции getAll() наверно не надо было заморачиваться с джойном.
Как раз и сделал через джойны для пагинации. Чтобы происходила сортировка только для тех данных, которые отображаются на странице. Если делать без джойнов, то получится, что сначала выполняется сортировка, а только потом LIMIT X, Y. Данные на N странице одни, а после сортировки другие. Как по-другому сделать (если вообще можно по-другому сделать на стороне бека) - не знаю
Спасибо большое, Анон, что указал на косяки и что можно исправить. Как думаешь, можно уже пытаться по собесам походить ?
> Этот момент в роутере выглядит коряво. Почему-то значения GET/POST проставляются в Request только после роутинга.
Вспомнил, почему так вообще получилось. Получилось так из-за того, Request разбирает не только GET/POST, но еще и может разбирать параметры из маршрутов, н.р маршрут:
user/(id/[0-9]+) => user/actionView/$1
Соответственно, чтобы разобрать параметры, которые заданы через маршрут, ему нужно дергать метод роутера (getSplitRealPath), который как раз получает путь user/actionView/$1 на основе запрошенного маршрута. По итогу придется либо отказываться от этого, либо будут повторяющиеся методы в разных классах, ну или зависимость
Я немножко подтянул теорию, последовал твоим советам и родил это:
https://ideone.com/HSjBXD
Критикуй, Анонче!
Спасибо!
> Ты имеешь в виду, чтобы сделать отдельный шаблон для пагинатора, а сам пагинатор просто будет возвращать <ul> с необходимыми элементами ?
Можно сделать так: делаем отдельный HTML-шаблон и в него передаем объект Paginator. Шаблон выводит HTML, а за подробностями (какие цифры и ссылки выводить) обращается к Paginator.
Генерация HTML в коде плохая идея, так как такую верстку трудно поддерживать, разбираться в ней, вносить правки.
> Если делать без джойнов, то получится, что сначала выполняется сортировка, а только потом LIMIT X, Y. Данные на N странице одни, а после сортировки другие. Как по-другому сделать (если вообще можно по-другому сделать на стороне бека) - не знаю
Так и должно быть, что данные другие. Представь, что ты смотришь первую страницу. Жмешь на сортировку по баллам и видишь тех, у кого больше всего баллов. Жмешь на сортировку по имени и видишь тех, кто раньше по алфавиту. А в твоей системе непонятно как найти тех, у кого больше всего баллов.
И еще, обычно при смене сортировки пагинация сбрасывается на первую страницу.
> Как думаешь, можно уже пытаться по собесам походить ?
Я не HR. Посмотри требования к вакансиям. Согласись сделать тестовое задание, возможно оно по сложности будет как эта задача или проще.
>>1960782
> Получилось так из-за того, Request разбирает не только GET/POST, но еще и может разбирать параметры из маршрутов, н.р маршрут:
> user/(id/[0-9]+) => user/actionView/$1
Это $1 в Симфони называют "атрибутами" и роутер после разбора URL помещает их в $request->attributes. Ты бы мог тоже сделать в реквесте массив для атрибутов и методы get/set для него. Но мне кажется, это коряво. Получается, объект Request знает что-то о роутинге, хотя он должен лишь представлять полученные от пользователя данные. Было бы корректнее передавать атрибуты вроде $1 в метод контроллера, например так:
public function actionView(Request $r, array $attributes)
Или даже так, с использованием рефлексии по имени параметра определять, что туда передать:
public function actionView(Request $r, int $id)
В Симфони атрибуты реквеста используются и для других вещей - например, код может до вызова контроллера определить город пользователя и сохранить в атрибутах. А контроллер его оттуда возьмет. Но опять же, мне кажется, это коряво, а реквест из-за атрибутов превращается в свалку нетипизированных данных.
> Ты имеешь в виду, чтобы сделать отдельный шаблон для пагинатора, а сам пагинатор просто будет возвращать <ul> с необходимыми элементами ?
Можно сделать так: делаем отдельный HTML-шаблон и в него передаем объект Paginator. Шаблон выводит HTML, а за подробностями (какие цифры и ссылки выводить) обращается к Paginator.
Генерация HTML в коде плохая идея, так как такую верстку трудно поддерживать, разбираться в ней, вносить правки.
> Если делать без джойнов, то получится, что сначала выполняется сортировка, а только потом LIMIT X, Y. Данные на N странице одни, а после сортировки другие. Как по-другому сделать (если вообще можно по-другому сделать на стороне бека) - не знаю
Так и должно быть, что данные другие. Представь, что ты смотришь первую страницу. Жмешь на сортировку по баллам и видишь тех, у кого больше всего баллов. Жмешь на сортировку по имени и видишь тех, кто раньше по алфавиту. А в твоей системе непонятно как найти тех, у кого больше всего баллов.
И еще, обычно при смене сортировки пагинация сбрасывается на первую страницу.
> Как думаешь, можно уже пытаться по собесам походить ?
Я не HR. Посмотри требования к вакансиям. Согласись сделать тестовое задание, возможно оно по сложности будет как эта задача или проще.
>>1960782
> Получилось так из-за того, Request разбирает не только GET/POST, но еще и может разбирать параметры из маршрутов, н.р маршрут:
> user/(id/[0-9]+) => user/actionView/$1
Это $1 в Симфони называют "атрибутами" и роутер после разбора URL помещает их в $request->attributes. Ты бы мог тоже сделать в реквесте массив для атрибутов и методы get/set для него. Но мне кажется, это коряво. Получается, объект Request знает что-то о роутинге, хотя он должен лишь представлять полученные от пользователя данные. Было бы корректнее передавать атрибуты вроде $1 в метод контроллера, например так:
public function actionView(Request $r, array $attributes)
Или даже так, с использованием рефлексии по имени параметра определять, что туда передать:
public function actionView(Request $r, int $id)
В Симфони атрибуты реквеста используются и для других вещей - например, код может до вызова контроллера определить город пользователя и сохранить в атрибутах. А контроллер его оттуда возьмет. Но опять же, мне кажется, это коряво, а реквест из-за атрибутов превращается в свалку нетипизированных данных.
> $n%100
это встречается много раз, нужно было сделать переменную "последние 2 цифры" или "десяткоединицы".
> $j = 10 * (floor(( $n%100) / 10));
переменную надо было назвать "десятки". $tens, например.
> $iSpelling
Тоже неудачное название.
> }
> else {
Что за нестандартное форматирование? Во втором посте треда есть ссылка на сайт, где можно отформатировать код.
> $k=null;
Должно быть $k = 0 так как дальше $k сравнивается с числам (if ($k>0)), а null сравнивать с числом неправильно.
Код функции small_number_to_text можно упростить, если вместо переменных $iSpelling, $jSpelling и тд добавлять слова в массив. Тогда не нужны будут ветки, где переменным присваивается null.
> $smallNInText
Лучше назвать $result или $spelling.
> if ($j>=10 and $j<=20) {
> $wordForm = $form3;
Можно избавиться от $wordForm и сразу писать return $form3. Код будет проще.
> if ($partsArray[2])
Так нельзя проверять наличие элемента, так как если его нет, то обращение [2] вызовет ошибку. Надо проверять через array_key_exists или count($x) >= 2
> $partsArray
Надо было назвать $groups или просто $parts.
В общем, тебе надо сделать следующее:
- поменять названия переменных
- отформатировать код по правилам
- попробовать его укоротить, как я описал выше (не теряя читабельности. Не надо пытаться запихнуть несколько строчек в одну).
> $n%100
это встречается много раз, нужно было сделать переменную "последние 2 цифры" или "десяткоединицы".
> $j = 10 * (floor(( $n%100) / 10));
переменную надо было назвать "десятки". $tens, например.
> $iSpelling
Тоже неудачное название.
> }
> else {
Что за нестандартное форматирование? Во втором посте треда есть ссылка на сайт, где можно отформатировать код.
> $k=null;
Должно быть $k = 0 так как дальше $k сравнивается с числам (if ($k>0)), а null сравнивать с числом неправильно.
Код функции small_number_to_text можно упростить, если вместо переменных $iSpelling, $jSpelling и тд добавлять слова в массив. Тогда не нужны будут ветки, где переменным присваивается null.
> $smallNInText
Лучше назвать $result или $spelling.
> if ($j>=10 and $j<=20) {
> $wordForm = $form3;
Можно избавиться от $wordForm и сразу писать return $form3. Код будет проще.
> if ($partsArray[2])
Так нельзя проверять наличие элемента, так как если его нет, то обращение [2] вызовет ошибку. Надо проверять через array_key_exists или count($x) >= 2
> $partsArray
Надо было назвать $groups или просто $parts.
В общем, тебе надо сделать следующее:
- поменять названия переменных
- отформатировать код по правилам
- попробовать его укоротить, как я описал выше (не теряя читабельности. Не надо пытаться запихнуть несколько строчек в одну).
> Так и должно быть, что данные другие.
Понял. Но как ты смотришь на то, чтобы подзапрос в виде джойна оставить ради оптимизации лимита ? Читал статью (на хабре вроде), что если данных очень много и у нас будет LIMIT 100000, 10 например, то это сильно бьет по производительности. В плане того, что mysql сначала переберет 100000 записей, а только потом выдаст следующие 10
> Это $1 в Симфони называют "атрибутами" и роутер после разбора URL помещает их в $request->attributes.
После прошлого ответа еще посидел подумал и в голову похожая идея пришла. В плане того, что раз это параметры маршрутов, то и разбирать их должен непосредственно сам роутер, а не реквест. Значит в правильную сторону мыслил
> $iSpelling
>Тоже неудачное название.
В общем, лучше всего давать переменным имя, которое максимально будет ее описывать, если это возможно, так?
>Должно быть $k = 0 так как дальше $k сравнивается с числам (if ($k>0)), а null сравнивать с числом неправильно.
Когда писал это, почему-то боялся, чтобы при $k=0 не получилось фигни типа "шестнадцатьноль". Теперь понял, почему этого НЕ получится. Спасибо.
>Код функции small_number_to_text можно упростить, если вместо переменных $iSpelling, $jSpelling и тд добавлять слова в массив. Тогда не нужны будут ветки, где переменным присваивается null.
Пробовал так делать. Но при объединении массива через implode (' ',$x) добавлялись лишние пробелы в числах, в которых отсутствовали сотни, десятки или единицы. Я что-то делаю неправильно?
>Лучше назвать $result или $spelling.
Нет, я все-таки так и не понял принципа названий переменных. :3
В остальном спасибо, Анон, ты как всегда охуенен!
У меня есть раздел ( группа роутов ) приложухи (слим 4), в ней роуты на просто отрисовку страниц, пост-запросы от форм, а так же c этих страниц несколько ajax-запросов к серверу.
Трабла возникла когда я захотел проверку прав закинуть в мидлвэйр на группу роутов, а роуты у меня внезапно ( ага ) есть те что возвращают шаблоны, а есть те что возвращают ajax. Соответственно мидлвэйры могут быть разные, но я хотел как то по группам группировать.
Так вот вопрос - можно ли назвать те маршруты что обрабатывают ajax запросы - API? И нужно ли мне их вынести в отдельный раздел и отдельные классы?
А то, условно, у меня в одном классе контроллера находятся как методы что обрабатывают обычные запросы от браузера, так и те что обрабатывают ajax.
JSON это не .txt, а .json файл.
Тебе надо вывести текст (JSON) через echo, просто перед этим надо выставить правильные заголовки, а именно Content-Disposition: attachment и Content-Type: application/json. Первый говорит о том, что браузер должен предложить сохранить файл, второй указывает тип файла. Для надежности можешь добавить Content-Length, чтобы при обрыве связи битый файл не сохранялся бы.
Вообще, по моему, прописать права в middleware неудобно. Там можно сделать глобальную проверку (вроде того что в раздел /admin может зайти только админ), но если у тебя в админке 40 разделов, ты их все будешь в middleware перечислять? А если у раздела поменяется URL, ты не забудешь в middleware поменять?
Плохо, когда определение роута и права разнесены.
Допустим у тебя есть админка и в ней страницы с разными уровнями доступа. По моему, чище всего и безопаснее было бы сделать так:
Указывать права доступа там же, где указывается роут. Если права не указаны, то смотрим по префиксу:
- /admin - доступно только суперадминистратору
- другой - доступно всем
В такой ситуации, если мы забудем указать права на раздел админки, они будут выставлены максимально строго (защищаемся от своей забывчивости). Если мы меняем URL раздела, права не меняются.
-----
Что касается AJAX. По моему, так это не имеет значения, возвращает контроллер AJAX или JSON. проверка прав для них работает одинаково.
Некоторые выносят API отдельно, но мне кажется это актуально, если у тебя есть настоящее, документированное API для внешних сайтов или устройств. Если у тебя просто обработчики аякс запросов с сайта, я бы не называл это полноценным API.
> В общем, лучше всего давать переменным имя, которое максимально будет ее описывать, если это возможно, так?
Имя должно описывать, что хранится в переменной. При этом желательно кратко.
$millionWord = getWordForm($millions);
$words[] = $millionWord;
это читается как:
слово для миллиона = выбрать форму слова для миллионов
добавить в массив "слова" "слово для миллиона".
Еще лучше убрать лишнюю переменную и написать сразу:
$words[] = getWordForm($millions);
А если написать
$x = $spelling[$j];
то это не читается.
Представь, что ты открываешь проект в 100 000 строк кода (который ты никогда не прочтешь целиком), и в нем какую-то функцию и в ней какую-то строчку. Ты хочешь сразу понять, что она делает, а не искать выше что это за переменная $j и что в ней хранится. Код с переменными вроде $j нечитабелен. Аналогично с именами функций.
> Но при объединении массива через implode (' ',$x) добавлялись лишние пробелы в числах, в которых отсутствовали сотни, десятки или единицы. Я что-то делаю неправильно?
не добавляй в массив пустые строчки и пробелы не появятся.
> В общем, лучше всего давать переменным имя, которое максимально будет ее описывать, если это возможно, так?
Имя должно описывать, что хранится в переменной. При этом желательно кратко.
$millionWord = getWordForm($millions);
$words[] = $millionWord;
это читается как:
слово для миллиона = выбрать форму слова для миллионов
добавить в массив "слова" "слово для миллиона".
Еще лучше убрать лишнюю переменную и написать сразу:
$words[] = getWordForm($millions);
А если написать
$x = $spelling[$j];
то это не читается.
Представь, что ты открываешь проект в 100 000 строк кода (который ты никогда не прочтешь целиком), и в нем какую-то функцию и в ней какую-то строчку. Ты хочешь сразу понять, что она делает, а не искать выше что это за переменная $j и что в ней хранится. Код с переменными вроде $j нечитабелен. Аналогично с именами функций.
> Но при объединении массива через implode (' ',$x) добавлялись лишние пробелы в числах, в которых отсутствовали сотни, десятки или единицы. Я что-то делаю неправильно?
не добавляй в массив пустые строчки и пробелы не появятся.
> Но как ты смотришь на то, чтобы подзапрос в виде джойна оставить ради оптимизации лимита ?
Такая проблема производительности лимита есть. Она решается отказом от номеров страниц и использованием индекса, как описано тут https://use-the-index-luke.com/sql/partial-results/fetch-next-page
То есть, вместо LIMIT 10000, 10 мы используем, например, WHERE id > :lastId LIMIT 10.
У тебя сделать это не получится, так как нам надо сортировать по произвольному полю, а не по заранее выбранному.
У тебя сортировка сейчас, как мне кажется, сделана некорректно. При смене сортировки результаты на странице (например, первой) должны меняться, а у тебя они не меняются.
> Как обойтись без смешивания js, html, php
Никак. Динамическое изменение страницы без перезагрузки по другому не сделать.
Анон, я пофиксил. Можешь еще раз посмотреть ?
https://github.com/qqzooi/student-list
>>1962175
>У тебя сортировка сейчас, как мне кажется, сделана некорректно.
Да, я уже исправил. Просто изначально думал, что должны сортироваться только те данные, которые в данный момент юзер видит на конкретной странице.
Можно переложить рендер из жс в пхп, но тогда будут перезагрузки на каждый чих, а на беке придется хранить состояние отрисованных элементов.
А от хтмл никак не избавишься, если нужен UI.
Чистый бек это какой-нибудь JSON API
>>1962419
Symfony - джава-стайл для крупных проектов
Laravel - RAD-фреймворк для хуяк-хуяк и в продакшен. Антипаттерн на антипаттерне, почти что вордпресс.
Какие кавычки использовать более правильно и почему?
Ларавел - комбайн по типу Рельс, поставил и пользуйся.
Симфони - набор пакетов, которые можно использовать независимо друг от друга
По факту, особой разницы нет, но стоит иметь в виду это
https://www.php.net/manual/ru/language.types.string.php
Только не пакетов а компонент. В композер пакетах бандлы для симфони бывают, хуй ты их где кроме симфони используешь.
А компоненты симфони это хуйня такого уровня, что если ты кастомно из них что-то собираешь, то ты скорее сам фремворк общего назначения можешь написать. В практических задачах это не встречается. Так что не надо это постоянно повторять, типа "симфони гибкая".
Спасибо за ответ, и за ранее сделанные ответы на мои вопросы тоже спасибо!
>>Там можно сделать глобальную проверку
В сущности так я и реализовал.
>ты скорее сам фремворк общего назначения можешь написать
О чем и речь, что симфони может выступать как фреймворком (веб скелетон), так и конструктором фреймворков.
>В практических задачах это не встречается
Крайне редко в очень специфичных условиях. Например, когда делаем прошивку - веб морду для роутера
Не надо пихать HTML в строковые литералы в JS. Это уродливо. Надо сделать HTML-шаблон внутри тега <template> (HTML5) или <script type="text/x-template">. А из JS брать этот шаблон, менять что нужно и вставлять в документ.
Пруфы? Ты просто обманываешь начинающих, которые не могут проверить это утверждение.
И одиночные, и двойные кавычки дают одинаковые опкоды в байт-коде, проверь сам, врун: https://3v4l.org/cXPKF/vld#output
>не добавляй в массив пустые строчки и пробелы не появятся.
Подскажи, правильно ли я понимаю алгоритм (буду описывать простым языком, чтобы не обосраться):
если (существует число сотен) {
$массивПреобразованныхВСловаЧисел[]=$массивСТекстовойФормой[числоСотен];
}
...
то же самое, для десятков и сотен, инструкцию else и elseif можно же вообще не писать?
А потом склеить все через implode ( ' ',$smallNumberInTextArray)?
Но таким же образом нельзя поступать с массивом выбора формы слов для миллионов, тысяч и десятков, ведь там 0-й элемент массива строго соответствует разряду рублей, 1-й элемент - тысячам, 2-й элемент- миллионам.
Я все правильно понял?
Спасибо за терпеливые объяснения.
Не мешай людям тащить бесконечное количество зависимостей.
Ну чего ты такой серьезный. Это старый, бородатый прикол, про скорость одиночных кавычек. Да и все равно мы тут не байты вычисляем, а в бутылочное горлышко базы данных упираемся.
Перепробовал сто вариантов из интернета ничего не работает. Как будто пустота там где строчка с командой UPDATE
как так?
остальное работает, а UPDATe ни в какую
в чём секрет?
$sql = "UPDATE map SET owner = $p_id WHERE x = $p_x AND y = $p_y" ;
$stmt = $link->prepare($sql);
$stmt->bind_param($p_id, $p_x, $p_y);
$stmt->execute();
if (!$link->query($sql)) {
echo "query failed: (" . $link->errno . ") " . $link->error;
}
bind делается для ? плейсхолдеров, а ты сразу вхуячил значения в запрос. Плюс там ещё параметр с какими-то форматами нужен вроде.
Дальше query каким боком там?
Короче, у тебя там косяк на косяке, и это я ещё не шарю в этом mysqli или что это.
Читай документацию.
по простому тоже не работает
выходит Error updating record: но без указания ошибки
$sql = "UPDATE `map` SET `owner` = $p_id WHERE map.x = $p_x AND map.y = $p_y";
if (mysqli_query($link, $sql)) {
warn("Record updated successfully");
} else {
echo "Error updating record: " . mysqli_error($link);
}
сообщение о соединении с базой есть
echo $sql
выдает
UPDATE `map` SET `owner` = 9 WHERE map.x = 34 AND map.y = 34
ввожу в базу руками
работает
Ты в курсе что это не подготовленный запрос? Ты ж подставляешь переменные тупо в строку $sql
Ну хуй знает тогда.
Покажи подготовленный запрос
Попробуй в else сдампить:
var_dump($link->connect_errno);
var_dump($link->errno);
var_dump($link->error);
var_dump($link->error_list);
var_dump($link);
Вдруг что найдется.
У тебя явно проблема при установке соединения с БД. Так как $link должен быть объектом, а не NULL. Покажи код установки соединения и сдампь, чему равна $link.
Всё стандартно
при этом кол работает если переменные заменить на циферки
$link = mysqli_connect('###', '###', '###', '###');
if (!$link) {
die('Could not connect: ' . mysqli_error());
}
echo 'Connected successfully<br>';
if(!empty($_SERVER['REMOTE_ADDR']) ){
$ip = $_SERVER['REMOTE_ADDR'];
}
else{
$ip = empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? '' : $_SERVER['HTTP_X_FORWARDED_FOR'];
}
//mysqli_close($link);
object(mysqli)#1 (18) { ["affected_rows"]=> int(0) ["client_info"]=> string(13) "mysqlnd 7.4.8" ["client_version"]=> int(70408) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(27) "### via TCP/IP" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(11) "5.6.48-88.0" ["server_version"]=> int(50648) ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(330084) ["warning_count"]=> int(0) }
Короче, ты в каком-то месте неожиданно обсираешься, тут гадать можно долго, потому что причина неочевидна и не в самой работе с бд. Ищи.
Сделай в две строчки.
conn = connect
query(conn, 'update table set hui=1 where id=1')
Должно сработать без вариантов. Потом смотри что отличается.
wp сайты за 2 секунды ломаются. как ты думаешь, тебе такое устроит такой расклад?
А почему говорят, что wp неуязвим, если ставить последнюю версию пиэйчпи и обновлять плагины?
обновлять плагины? а ты думаешь избежишь от взлома? а хер там было с маслом. один фиг будут ломать школохакеры. и будут внедрять вирусы, рекламы, всякая чепуха. возможно и станет в ряды ботнетов у китайских школяров. а в hugo всё ахуенно, он железобетонен. в markdown пишешь и пушишь в github. в netlify автоматом билдиться. и всё это невъебически защищен от всех криворуких.
Да, говорят, что хакеры ломают только старье с известными уязвимостями, а если все обновлять, обновлять версии вордпресса, обновлять плагины, обновлять версии пиэйчпи, менять пароль все время, все время, то вордпресс будет неузявим! Так говорят в интернете!
В общем тебя порадую. В даркнете есть такие форумы как exploit.in, wwh-club и т.д. Ну так вот я недавно видел в экплоите как можно ломать новую версию вп 5 и выше. Уже давно слиты как ломаются вп сайты 5.7.
Так работает, а когда делаю чтобы вставлялось из переменных то перестает работать
Да ладно не поправили. Недавно пробовал поднять в виртуалке вп блог, и попробовать взломать. Всё как есть. Ломаются на ура.
> Если уязвимость так широко известна
В том то и дело что уязвимость не известна большинству. Какой среднестатистический вася будет в onion сайтах сидеть? даже топовые менеджеры толком то и не знают, что существуют такие дыры в этих цмсках. в теплых офисах сидят пьют чай, и ничем не думают. и вдруг внезапно бегают во весь офис вырывая волосы, что их сайт взломали хакеры, что внедрили злоебучий скрипт, который копирует сам себя, распространяя во все датацентры. так ломаются крупные сайты, даже твиттер, фейсбук.
Если ломают цмс на пхп, что мешает сломать цмс на го?
В странном выборе языка. Преимущества го в цмс не задействованы, а вот недостатки тут как тут
в общем ты даже не понял о чем идет речь. на кури https://gohugo.io, темы на любой вкус https://themes.gohugo.io. но я бы не юзал эти темы, а самому лучше создать шаблон как-то удобнее.
для людей сделано карл ))
Только рофла ради. Сам это говно даже будучи джуном за км обходил.
Я кажется уже и фреймворки перерос, достался настолько большой проект, что фреймворка в нем не видно
Конечно. Только конкуренция на фронте сильная, но это более квалифицированный труд, ну и зп больше намного даже больше чем у обычных пыхеров.
CMS поедают людей как раз потому, что устроиться с ними работать вообще с нулевыми знаниями проще простого.
Работодатели понимают, что осознанно в этом дерьме копаться мало кто будет, из-за чего выращивают макак с нуля.
В итоге люди по пять лет на CMS работают, а по знаниям не тянут даже на нормального trainee.
>>1963898
И кто тебе такую дурную идею посоветовал? Сам придумал?
>В итоге люди по пять лет на CMS работают, а по знаниям не тянут даже на нормального trainee.
И зарабатывают соответственно. Пикрил самая крупная битриксопараша в городе, берут людей чуть ли не с улицы, лишь бы мог эту коробку шатать
Ну дак речь идет именно тузлов для блогинга, одно цмс пыхой, а другой генератор на golang. В генераторе hugo нужно иметь намного больше багажа знаний. Вот эти: html, js, css, flex, grid, микроразметку, golang в конце-то концов.
> Эти вещи из базового уровня веб макаки
Ну дак то и имелось ввиду, не как макаки. Мало кто правильно имеет логично писать в html, css. Многие пишут без разбора, вермишелят как попало. Хоть бы подкурили бы разных методологий бэм например.
var_dump ($arr); код пыхи обернуть в тег <pre>
http://phpbook.ga/l1/loops.html
в уроке говорится, что всего выплат должно быть 61270 р. за 13 мес.
я поправил код по-своему:
if ($creditBalance < 5000) {
$paymentTotal = $creditBalance + $paymentTotal;
echo "С меня хватит!\n всего {$paymentTotal}";
break;
}
и у меня в 11 месяце остается 4к и всё какбэ
в чем прикол?
Ну, можно упростить, как там написано и расписать вручную алгоритм. Взять кредит не 40к, а 4к.
Через месяц с комиссией получается 4000 + 1000 + 40000.03 = 5120. Шкальник платит 5к, остается 120. Через месяц они превращаются в 1000 + 120 + 1200.03 = 1123,6. Шкальник выплачивает их и в итоге получается он заплатил 5000 + 1123,6 = 6123,6
При этом программа с таким кредитом выдаст следующее:
1 месяц спустя: долг = 120 руб, выплачено всего 5000 руб.
С меня хватит!
Т.е. видно что некорректно считается последняя выплата. Если взять данные из этой строки 12 месяц спустя: долг = 262.31722768997 руб, выплачено всего 60000 руб. и посчитать 60000 + 1000 + 262 + 2620.03 = 61 269,86
В твоей проверке $creditBalance < 5000 ты забываешь про косарь комиссии и проценты.
/ Если баланс отрицательный — хватит считать /
if (($creditBalance + $creditBalance0.03 + 1000) < 5000) {
$sumTotal = $paymentTotal + 1000 + $creditBalance + $creditBalance*0.03;
echo "С меня хватит! Я выплатил {$sumTotal}";
break;
}
Блин, знак умножения исчез, короче где 0.03 там имеется в виду умножение
Пример бы хоть показал, пиздун.
Раньше юзал Cartalist/Sentinel она как раз использует улоквент, думаю ее снова заюзать. Но может другие варианты есть?
Для расширения кругозора мб
Трудно сравнивать hugo и wordpress. Hugo это примитивный статический генератор сайтов, то есть ты берешь, правишь какие-то файлы, из этого генерируется набор HTML, который ты выгружаешь на хостинг. В то время как вордпресс это полноценный динамический движок с админкой.
Вот подумай, что удобнее не разбирающемуся в программировании человеку: удобная админка вордпресса с формами или редактировать руками маркдаун-файлы, потом запускать скрипты в консоли? Плюс, маркдаун-синтаксис очень ограниченный (например там нет вставки видео с Ютуба). Плюс, вордпресс можно расширять и добавлять там произвольные динамические страницы. Например, там посетители могут оставлять комментарии или ставить лайки. А в статических сайтах, генерируемых hugo, ничего подобного нет.
Статические сайты и их генераторы известны уже давно, непонятно зачем вы подаете этот hugo как что-то новое. Простой статический генератор сайтов из маркдауна пишется на PHP за один вечер, после чего hugo становится не нужен.
Зачем нужен Go, когда можно писать и статические, и динамические сайты на PHP, я не понимаю. Ну если кому-то хочется помучаться с этим языком, где даже классов нету - вперед и с песней. Не забудьте только Си сначала выучить, так как без него за Го нет смысла браться, вы ничего не поймете.
В общем, ерунда этот jamstack. Тот, кто пришел тут его пиарить, наверно сам слабенький PHP разработчик, боится конкуренции и хочет сбить с толку изучающих PHP.
И грид тоже отстой, так как не поддерживается старыми браузерами. Зачем тратить свои силы, чтобы получить убогий HTML код, работающий только на твоем компьютере, когда можно писать хорошую кроссбраузерную верстку, которая отображается даже в IE. Убогие всегда найдут какую-нибудь отмазку, лишь бы не признавать свои слабые скиллы.
>можно писать хорошую кроссбраузерную верстку, которая отображается даже в IE
Кто-то еще пользуется ишаком?
Ты сравнил, статический генератор сайтов на убогом Го (он настолько убог, что в нем нет даже классов) и полноценную CMS на PHP.
Насчет уязвимостей последней версии вордпресс - где пруфы?
Если сделать статический генератор сайтов на PHP (есть готовые, или можно написать самому за вечер) то он точно так же будет защищен от уязвимостей. Только он будет на нормальном, удобном языке программирования.
Хотя на практике людям нужны сайты с админкой, а не редактировать маркдаун на гитхабе.
> Подскажи, правильно ли я понимаю алгоритм
Да.
> Но таким же образом нельзя поступать с массивом выбора формы слов для миллионов, тысяч и десятков, ведь там 0-й элемент массива строго соответствует разряду рублей, 1-й элемент - тысячам, 2-й элемент- миллионам.
Не понял, о каком массиве идет речь и зачем его склеивать. Ты сначала получаешь письменное представление числа (например: "сто пять"), кладешь его в массив слов. Затем получаешь форму слова "миллион", тоже кладешь его в массив слов. Потом кладешь туда представление тысяч, потому форму слова для "тысяч" и тд.
А с фреймворками там че? Там как так получается, что защита лучше, чем у вротпресса? Или ты самописную защиту должен хреначить? НИЧЕ НЕ ПОЙМУ!
В фреймворках зачастую единая точка входа в приложение. Соответственно навесить различных ограничителей проще, чем в вп, где этих точек может быть сотни.
Остальное зависит от настроек веб сервера.
> например там нет вставки видео с Ютуба
сразу понятно что чел не разбирается и не понимает. для этого есть в hugo шоркаты.
> И грид тоже отстой, так как не поддерживается старыми браузерами
https://www.caniuse.com/?search=css grid
В роутере сделаны неудачно, на мой взгляд, методы getController() и getAction(). Чтобы они вернули значение, надо сначала вызвать route(), но как об этом догадаться? Получается, один метод при вызове влияет на работу других методов, это называется побочные эффекты и это нехорошо.
Правильнее было бы, если бы был метод, который получает, например, Request или просто $urlPath и возвращает controller, action и attributes.
Та же проблема с пагинацией. Было бы лучше, если бы все методы работали корректно без необходимости вызывать метод run().
> private int $limitStudents = 10;
Это можно было сделать private константой.
Плохо, что тут идет вперемешку PHP и HTML: https://github.com/qqzooi/student-list/blob/6466cbedf7026440a2885c871cc93701a0581cce/App/Components/Navbar.php#L7
Лучше было бы, если бы Navbar только хранил информацию о пунктах меню, а преобразование в HTML происходило бы в шаблоне. То есть, HTML-шаблон бы обращался к классу Navbar, получал список пунктов и рендерил их. В твоем решении править верстку неудобно, так как она раскидана кусками по классу.
То же касается NotificationUtil и других мест, где есть HTML в классах. HTML-код лучше формировать в шаблоне.
SVG-код, наверно лучше поместить в файл и подключать через file_get_contents(). Как в твоем коде редактировать иконки? Руками переносить в файл, потом обратно в код?
Я думаю, что JOIN в getAll() не нужен, так как он ни на что не влияет.
> user-scalable=no,
Это в общем плохое решение, так как лишает пользователя удобства. Может, у человека шрифт слишком мелкий или наоборот, мало информации на экран влезает. Я на десктопе часто на сайтах меняю масштаб.
> Например, там посетители могут оставлять комментарии
> А в статических сайтах, генерируемых hugo, ничего подобного нет.
Для этого есть disqus, isso, github issue много чего есть.
У grid нет даже 5-летней поддержки, не говоря о 10-летней. IE не поддерживает, даже 11 версии. Даже Хром поддерживает с 2017 года. Это значит, например, на телефоне 2016 года работать не будет.
grid пока годится для того, чтобы поиграться (на каком-нибудь пет проекте), может быть для интранета, где есть корпоративный стандарт браузера, но этот ужас нельзя выпускать в продакшен.
Хотя, я вижу, все поступают противоположно тому, что я учу и вовсю используют плохо поддерживаемые технологии. Это понятно, качественно сделать сайт мало кто может, лепят как попало. И ладно бы это были вкатуны, так нет вроде опытные разработчики тоже лепят как придется. Я от работы фронтендеров испытываю только разочарование. Хуже них разве что любители внедрить микросервисы на малоизвестном языке и свалить.
Ты не можешь в disqus настроить, как выводятся комментарии, не можешь управлять авторизацией, не можешь полноценно модерировать и раздавать автобаны. А на PHP можно сделать свои красивые комментарии.
Хотя, конечно, если ты работаешь на нищего заказчика, тебе выгоднее подключить дискус и взять с заказчика денег, как будто ты работал, а не 3 строчки на JS вставил. И то, если он тебя попросит верстку комментария поменять, ты уже не сможешь ничего сделать.
Я очень плохо представляю ситуации, где хватит статического сайта. Я уже написал, что обычные люди не хотят редактировать файлы на гитхабе, они хотят в админке нажимать кнопки. Получается, для любой правки сайта надо нанимать программиста, а это дорого и невыгодно. Если заказчик не дурак, он такое не купит.
Или: надо сделать форму записи на какой-нибудь день с пометкой занятых дней. Ты на hugo это не сделаешь, а на динамическом PHP-сайте - легко.
И ты подаешь hugo как что-то новое, хотя статические генераторы сайтов существуют уже много лет, и есть генераторы на PHP. С которыми ты можешь сделать что угодно, поменять что угодно, и тебе не надо тратить ценное время на изучение языка Го. Зачем нужен hugo, если есть генераторы на PHP?
Так ты узнаешь уже после, лол.
Вордпресс это как шиндовс, все хотят его поиметь, потому что дохуя потенциальных жертв пасется.
Тогда надо антивирусной утилитой прочесывать код! Я видел какой-то видос, где приводился список эксполитов для пиэйчпи. Потом их пихали на сайт пиэйчпи. А потом прочесывали утилитой антивирусной, и она находила, что вот эту хуйню надо выпилить!
Интересно, на чем основан принцип работы подобной лабуды
$arr = ['d' => ['f', 'e' ],'a' => ['c', 'b'] ];
$replace = ['a' => ['b','c'], 'd' => ['e', 'f']];
Чтобы писать код я переключаю раскладку клавиатуры. Например:
echo '<b>Привет мир!</b>';
Потом я могу забыть переключить раскладку, допустим мне потребуется написать слово link, а вместо этого слова я напишу дштл. И вместо того, чтобы мне исправлять это руками punto swither сам мне все поменяет.
У меня такое бывает очень редко, а если и забываю, то сразу это вижу.
Такая же программа наоборот поощряет забывать, вредный костыль.
Я хз где ты там в пхп кириллицу используешь, у меня даже с фронтом таких проблем нет, по большей части ты один хуй пишешь на английском.
Пока нет, но я только только начал использовать.
Хуево, надеюсь это у тебя просто какой-то тестовый прожект. А вообще, полезно научиться слепой печати, тогда проблема неправильной раскладки уйдет на нет и скорость набора существенно вырастет. Я хз как там щас пунто свитчер работает, но раньше он часто обсирался и включал неправильную раскладку.
Она в коммиты не попадает. Тудушки сугубо для себя пишу
>Потом я могу забыть переключить раскладку, допустим мне потребуется написать слово link, а вместо этого слова я напишу дштл
Такие проблемы возникают только у уверенных пользователей ПК, что смотрят на клавиатуру при печатании. Если ты из таких, то что ты здесь вообще забыл?
И, кстати говоря:
>шиндовс
>Потом я могу забыть переключить раскладку, допустим мне потребуется написать слово link, а вместо этого слова я напишу дштл
Как ты можешь не заметить, что ты не переключил раскладку, когда печатаешь, если ты смотришь на текст, который печатаешь?
Потому, что я успею нажать пару кнопок быстрее, чем увижу, что текст стал не той раскладки. Можно конечно удалить эти пару символов, переключить раскладку и заново написать как надо.
А можно до конца дописать "дштл" и punto switcher переделает это на link.
То есть печатаешь же быстро. Мгновенно нажал две кнопки, и потом увидел, что там получилось "дш" вместо "li".
То есть при слепой печати тоже можно ошибиться с раскладкой, особенно, если ты очень быстро набираешь текст. Ты быстропальцый Абелардо! И ты успеешь нажать пару кнопок и лишь потом поймешь, что эту пару символов напечатал с не той раскладкой!
пс
Собственно я о том говорю - что до некоторых книг видимо нужно дорасти. У меня возникла проблема что мой код плохо структурирован, я понял что мой код криво - и возникло желание сделать лучше,и понимание того как я уже плохо сделал, и почему.
На мой взгляд эти ооп - проблемы скрывают современные фреймворки с DI - контейнерами работающие на рефлексии.
Когда сам делаешь косо - отлично понимаешь почему косо и неудобно.
При написании кода Punto подводит, так как код состоит не всегда из корректных английских слов и пунто будет рандомно переключать раскладки по мере набора.
По моему опыту, удобно использовать ручное переключение раскладок, например, по левому/правому Ctrl. Если хочешь набрать что-то на английском - жмешь один из Ctrl и набираешь, хочешь набрать на русском - жмешь другой.
Это называется немодальное переключение - тебе не надо помнить, какая текущая раскладка, чтобы переключиться.
>>1965178
В ручном режиме он позволяет немодально переключать раскладки по левому/правому Ctrl, что удобнее встроенного модального переключателя.
Хотя конечно, удобнее всего было бы иметь выделенные клавиши рус/лат, но западные производители не прислушиваются к мнению русскоязычных пользователей. Даже у Эппл используется убогая раскладка (где русские буквы совмещены с символами, где некоторые символы в разных раскладках на разных клавишах, где не клавиш рус/лат), хотя Эппл делает свое железо и мог бы сделать нормальную клавиатуру, где буквы и символы не совмещены. Но не хотят ради нас заморачиваться.
>Не понял, о каком массиве идет речь и зачем его склеивать.
Я опирался на свою программу, где для текстового представления трехзначного числа и форм названий разрядов я использовал разные массивы.
А потом внимательно перечитал то, что предложил ты и понял, что можно легко и просто избавиться от лишнего массива и вкладывать и число и форму слова в один массив, главное только не обосраться с порядком формирования этого массива.
Анон, ты делаешь великое дело: избавляешь от квадратно-гнездового мышления таких мимохуев, как я, тем самым улучшая генофонд планеты :3
Есть приложение, просто роутер который вызывает обработчики.
В обработчике/контроллере я хочу что то сделать, допустим записать лог в файл.
Пусть у меня нет сервис локатора, или DI контейнера.
Как я реализую подобное:
допустим метод класса обрабатывает запрос
...
public function anyMethod(){
//создаю фабрику сервисов Логгирования
//которая принимает аргументом конкретный сервис ( MonologLoggerService ), который имплементирует общий для всех логгинг-сервисов интерфейс, что бы методы в контроллерах были одни и те же, и я смог легко поменять один сервис логгирования на другой.
$serviceFabric = new ServiceFabric ( new MonologLoggerService );
$serviceLogger = $serviceFabric->getInstanseLogger();
$serviceLogger->warning('что нибудь пишу в лог');
}
}
Если абстрагироваться от контейнеров и сервис локатора - такой подход адекватен?
Это фактически мои первые потуги в рамках ООП.
Получается в моем варианте фабрика - это не совсем то что должно быть?
Фабрика возвращать должна один и тот же экземпляр одного конкретного класса - просто с разными настройками?
Или фабрика может возвращать экземпляры разных классов , объединенных общим интерфейсом или абстрактным классом?
Есть приложение, просто роутер который вызывает обработчики.
В обработчике/контроллере я хочу что то сделать, допустим записать лог в файл.
Пусть у меня нет сервис локатора, или DI контейнера.
Как я реализую подобное:
допустим метод класса обрабатывает запрос
...
public function anyMethod(){
//создаю фабрику сервисов Логгирования
//которая принимает аргументом конкретный сервис ( MonologLoggerService ), который имплементирует общий для всех логгинг-сервисов интерфейс, что бы методы в контроллерах были одни и те же, и я смог легко поменять один сервис логгирования на другой.
$serviceFabric = new ServiceFabric ( new MonologLoggerService );
$serviceLogger = $serviceFabric->getInstanseLogger();
$serviceLogger->warning('что нибудь пишу в лог');
}
}
Если абстрагироваться от контейнеров и сервис локатора - такой подход адекватен?
Это фактически мои первые потуги в рамках ООП.
Получается в моем варианте фабрика - это не совсем то что должно быть?
Фабрика возвращать должна один и тот же экземпляр одного конкретного класса - просто с разными настройками?
Или фабрика может возвращать экземпляры разных классов , объединенных общим интерфейсом или абстрактным классом?
п.с.
$serviceFabric = new ServiceFabric ( new MonologLoggerService );
в рамках этой строки понятие "инверсия управления" означает ли то что класс ServiceFabric получая в качестве аргумента класс MonologLoggerService - перестает зависить от его реализации?
Или "инверсия управления" это что то иное?
> Фабрика возвращать должна
Фабрика может возварщать чт оугодно, тут важно то что ты не напрямую создаешь инстансы нужных тебе класов, а обращаешся к фабрике чтобы она построила что-то подходящее под твою задачу. Естественно чтобы был смысл ебаться с фабриками нужно чтобы она возвращала (как ты и написал) экземпляры разных классов , объединенных общим интерфейсом или экземляр одного класса с разными настройками. Оба варианта возможны но в случае с фабрикой намного предпочтительней первый - для расширения нужно просто добавить новый класс. Второй вариант это скорее для DI (один класс в который передаются разные настройки) - фабрика в общем там лишняя.
> "инверсия управления" это что то иное
Инверсия управления это когда ты напрямую не управляешь порядком выполнения кода, а просто хуяришь отдельные обработчики, а они уже вызываются фрейморком когда нужно.
https://ideone.com/zlq51o
Вполне рабочий калькулятор.
Но потом вернулся к условию и попробовал решить по ТУ, т.е. через посимвольный разбор строки. Калькулятор-то я написал:
https://ideone.com/YqedpG
да вот только мой калькулятор не работает, если первым действием идет деление (почему так? В голове крутится, что я проебал какую-то очевидную, мелкую, но важную деталь в процессе построения цикла) и работает только с целыми числами.
И как при посимвольном разборе строки ввести поддержку дробных чисел без костылей, лишнего дроча, и самозапутывания, в виде нескольких конвертаций строки в разные типы данных?
Не могу придумать структуру, чтобы последовательно наращивать эти данные для последующей записи.
Пока я придумал только два варианта:
- сохранять по датам, а потом дополнительный цикл, чтобы из этого построить новую подходящую структуру
- передавать результат в саму функцию и возвращать обратно с добавлениями, ну или через global
Оба хуевы.
Аноны:
1) Можно ли будет перекатиться из php в frontend если что или опыт php не будет учтен для frontend?
2) Какой из PHP фреймворков легче учить Symfony, Laravel или Yii2? И за сколько?
3) Нужна ли математика или знания алгоритмов для разработки и поддержки highload проектов и участия в проектировании архитектуры проектов?
4) До чего нужно дойти в php и MySQL, чтобы спокойно пойти на джуна?
Если ты решил спроектировать что-то, то ты должен ответить на вопрос: зачем нужен тот или иной класс? Не проще ли без него?
Вот например, зачем ты сделал фабрику логгеров? Что тебе мешает сразу создать логгер через new MonlogLoggerService?
> Если абстрагироваться от контейнеров и сервис локатора - такой подход адекватен?
Я не понимаю, зачем ты сделал фабрику.
> Фабрика возвращать должна один и тот же экземпляр одного конкретного класса - просто с разными настройками?
> Или фабрика может возвращать экземпляры разных классов , объединенных общим интерфейсом или абстрактным классом?
Бывает и так, и так. Фабрику обычно добавляют для решения таких проблем:
- чтобы не копипастить в несколько мест сложный код создания объекта
- в библиотеках, чтобы пользователь бибилиотеки мог повлиять на процесс создания объекта, подменив в ней фабрику на свою
Ну и вопрос: чем тебе не подходит DI? То есть, просто передавать логгер в конструктор твоего класса? Зачем ты начал изобретать какие-то странные решения?
> в рамках этой строки понятие "инверсия управления" означает ли...
Я полистал Фаулера ( https://martinfowler.com/articles/injection.html#InversionOfControl ) и твой код не похож на то, что у него описано как "инверсия управления":
> For this new breed of containers the inversion is about how they lookup a plugin implementation. In my naive example the lister looked up the finder implementation by directly instantiating it. This stops the finder from being a plugin. The approach that these containers use is to ensure that any user of a plugin follows some convention that allows a separate assembler module to inject the implementation into the lister.
> означает ли то что класс ServiceFabric получая в качестве аргумента класс MonologLoggerService - перестает зависить от его реализации?
Я не понимаю, что тут делает ServiceFabric. Он просто возвращает тот объект, который ему дали? Тогда зачем он нужен?
Не видя кода ServiceFabric, нельзя сказать, зависит он от MonologLoggerService или нет. На первый взгляд, он зависит, так как требует его передачи в конструктор.
Непонятное описание задачи.
> Есть список дат,
Понятно
> нужно прогнать их через функцию, которая возвращает список
Понятно
> и в конце записать csv вида item,date1val,date2val,date3val.
Уже менее понятно. dat1val - это склеивание строк date1 и val?
> Не могу придумать структуру, чтобы последовательно наращивать эти данные для последующей записи.
Непонятно.
Решение с регулярками довольно оригинальное. Но хорошо ли оно находит ошибки в входном выражении? Можно ли добавить в него проверки и гарантировать, что любая ошибка в выражении будет обнаружена?
Мне кажется, что можно, но не нравится некоторая хрупкость кода, который полагается на то, что цифры в одном массиве и операции в другом строго соответствуют друг другу.
Если уж использовать регулярки, не лучше ли использовать preg_match_all с регуляркой такого вида:
число | знак операции | любой другой символ
Она разобьет строку "2 + 2 / error" на массив строк [2, +, 2, / , e, r, ,r ,o ,r]. И уже обходя этот массив, мы можем легко выделить из него числа, операции и ошибочные символы.
Мне такой подход нравится тем, что тут у нас один входной массив "токенов", а не два, которые вроде как связаны, но неизвестно, надежно ли.
> да вот только мой калькулятор не работает, если первым действием идет деление
С виду код выглядит верно. Попробуй найти ошибку, выводя значения всех переменных на каждом символе и отслеживая, какие ветки if выполняются.
> И как при посимвольном разборе строки ввести поддержку дробных чисел
Я думаю, можно собирать цифры в строку, а когда мы доходим до знака операции, вызывать функцию преобразования строки в число.
А, понял, в чем ошибка. У тебя при нахождении знака деления выполняется два ифа подряд:
elseif (!is_numeric($symbol) and $operation == '') {
и затем сразу
if (!is_numeric($symbol) and $operation != '') {
Самое простое решение - придумать структуру массива, который сохранит значения для разных дат. вариант 1:
[
item1 => [date1 => val1, date2 => val2],
item2 => [...],
...
]
Вариант 2:
[
date1 => [item1 => val1, item2 => val2],
date2 => [...],
....
]
Основная проблема в том, что генерируем мы по датам, а выводить потом надо по айтемам.
В принципе я уже решил с дополнительным циклом после каждого вызова, но думал может есть какое-то элегентное решение.
Есть 2 таблицы,
в одной список упражнений [id - описание]
в другой журнал [id - id_упражнения - день].
При выполнении упражнения в таблицу журнал добавляется запись. Eсли я сейчас сделаю JOIN journal ON exercises.id = journal.exercise_id WHERE day = x ,и всего упражнений 3 а записей в журнале 2 то мне выдаст 2 строки, а хотелось бы чтоб выдавал все 3 с NULL'ами там где записей нет. Это реально?
https://github.com/deadj/testhub
where выбирает только совпадающие, замени на and
Жадный алгоритм зделол, а как заставить работать эту хуйню с усложнением условий (выдача минимальным числом купюр 6600)- хуй знает. В подсказке к задаче ебаный матан, а я не люблю математику, где букв больше, чем цифр. Я тупой? Выкатываться из треда?
90-е года, дикий веб.
php это и есть шаблонизатор.
> А зачем сделали что php из коробки без шаблонизатора в хтмл лезет?
YAGNI + KISS
PHP это все-таки бэкенд и шаблонизатор там нужен не всегда (например, если ты только принимаешь данные с формы и выдаешь в ответ какой-нибудь JSON). А если нужен - есть много сторонних решений, используй любое. Зачем разрабам ПХП заниматься шаблонизаторами, если им нужно сам язык развивать и поддерживать.
>>Вот например, зачем ты сделал фабрику логгеров? Что тебе мешает сразу создать логгер через new MonlogLoggerService?
Изначально вообще у был некий общий сервис логгеров, а в нем в конструкторе был захардкоден вызов конкретного допустим MonlogLoggerService. Идея была в том что бы я в общем сервисе логинов мог менять конкретный логгер, а так как в клиентском коде везде вызывается общий сервис - то можно было поменять логер в одном месте. Фактически как в контейнере хранить сервис.
Но прочел что не комильфо в конструкторе определять зависимости и родилась идея передавать конкретный сервис в конструктор.
Более того - если в ходе выполнения программы мне нужно что бы в одном случае один сервис логгинга вызывался, а в другом другой - то вариант захардокоденного вызова конкретного сервиса не даст это сделать в принципе.
>>Бывает и так, и так. Фабрику обычно добавляют для решения таких проблем:
>>Ну и вопрос: чем тебе не подходит DI?
Я в первую очередь решал такую для себя проблему - получить возможность быстрой замены конкретной реализации какого то сервиса во всем клиентском коде в приложении. И я специально не пользуюсь DI - контейнерами, или банальным сервис-локатором. Хочу лучше прочувствовать что дает не правильный подход. Мне как то проще сделать криво, столкнуться со всеми минусами кривого решения, и тогда я по настоящему понимаю реальные плюсы правильного подхода.
>>Не видя кода ServiceFabric, нельзя сказать, зависит он от MonologLoggerService или нет. На первый взгляд, он зависит, так как требует его передачи в конструктор.
А как же в таком случае должен выглядить полностью не зависимый ServiceFabric?
А как поправить мой пример кода так что бы стало более правильно?
И вот вопрос тогда, вот в DI контейнере я определил сервис, LogService::class. И в клиентском коде я получаю этот объект из контейнера. А после я решил что в контейнере LogService::class должен быть иной логгер, не монолог. Я просто руками в контейнере меняю Монолог на что то другое, и все?
Или есть иной вариант.
Сорр если туплю, я Зандстру начал читать , разделы про ООП, пока что все немного в кучу. У него сервис локатор это класс, который через статические методы получает и возвращает какие то объекты - паттерн Регистр примерно так.
>>Вот например, зачем ты сделал фабрику логгеров? Что тебе мешает сразу создать логгер через new MonlogLoggerService?
Изначально вообще у был некий общий сервис логгеров, а в нем в конструкторе был захардкоден вызов конкретного допустим MonlogLoggerService. Идея была в том что бы я в общем сервисе логинов мог менять конкретный логгер, а так как в клиентском коде везде вызывается общий сервис - то можно было поменять логер в одном месте. Фактически как в контейнере хранить сервис.
Но прочел что не комильфо в конструкторе определять зависимости и родилась идея передавать конкретный сервис в конструктор.
Более того - если в ходе выполнения программы мне нужно что бы в одном случае один сервис логгинга вызывался, а в другом другой - то вариант захардокоденного вызова конкретного сервиса не даст это сделать в принципе.
>>Бывает и так, и так. Фабрику обычно добавляют для решения таких проблем:
>>Ну и вопрос: чем тебе не подходит DI?
Я в первую очередь решал такую для себя проблему - получить возможность быстрой замены конкретной реализации какого то сервиса во всем клиентском коде в приложении. И я специально не пользуюсь DI - контейнерами, или банальным сервис-локатором. Хочу лучше прочувствовать что дает не правильный подход. Мне как то проще сделать криво, столкнуться со всеми минусами кривого решения, и тогда я по настоящему понимаю реальные плюсы правильного подхода.
>>Не видя кода ServiceFabric, нельзя сказать, зависит он от MonologLoggerService или нет. На первый взгляд, он зависит, так как требует его передачи в конструктор.
А как же в таком случае должен выглядить полностью не зависимый ServiceFabric?
А как поправить мой пример кода так что бы стало более правильно?
И вот вопрос тогда, вот в DI контейнере я определил сервис, LogService::class. И в клиентском коде я получаю этот объект из контейнера. А после я решил что в контейнере LogService::class должен быть иной логгер, не монолог. Я просто руками в контейнере меняю Монолог на что то другое, и все?
Или есть иной вариант.
Сорр если туплю, я Зандстру начал читать , разделы про ООП, пока что все немного в кучу. У него сервис локатор это класс, который через статические методы получает и возвращает какие то объекты - паттерн Регистр примерно так.
То есть, ты хотел иметь несколько логгеров и легко заменять один на другой. Это правильно реализуется так:
- определяем интерфейс логгера LoggerInterface
- делаем несколько логгеров, реализующих этот интерфейс
Далее есть несколько вариантов, как это использовать:
1) с помощью DI
В конструкторе объявляем зависимость от LoggerInterface, сохраняем его в $this->logger, и далее в коде используем его:
$this->logger->warning("Yes");
Разумеется, вместо ручного прокидывания логгера в конструктор можно использовать DI контейнер, который сделает это за тебя.
Получается, наш класс готов работать с любым логгером, который ему дадут в конструктор.
2) с помощью ServiceLocator
Делаем в ServiceLocator метод getLogger(): LoggerInterface и используем его:
$this->locator->getLogger()->warning("Yes");
Здесь для подмены логгера надо лишь заменить единственную функцию getLogger().
Про минусы сервис локатора (и про плюсы DI) можно прочесть у меня в уроке про DI: https://github.com/codedokode/pasta/blob/master/arch/di.md
3) с помощью Registry - создаем логгер, кладем в Registry, а в других местах берем его оттуда.
Заметь, что ни один из этих подходов не требует писать фабрику. Мне кажется, она в данной ситуации не нужна.
-----
Подход с интерфейсом работает, если ты пишешь сам код логгеров. Если ты используешь сторонние библиотеки, ты не можешь заставить их соответствовать твоему интерфейсу. В таком случае ты пишешь интерфейс LoggerInterface и адаптеры (вроде MonologAdapter), которые соответствуют интерфейсу и которые передают сообщения сторонней библиотеке.
-----
Теперь про минусы твоего кода:
- ты копипастишь код создания фабрики много раз (каждый раз, когда тебе нужен логгер), а копипаста это плохо (если придется что-то менять, то придется менять в куче мест). Нарушаешь DRY = Dont Repeat Yourself.
- у тебя, чтобы поменять тип логгера, надо его менять в куче мест
- у тебя каждый раз с помощью new создается новый объект фабрики и новый объект логгера. Это может вызвать проблемы, например, если логгер открывает соединеие с БД, то каждый новый логгер будет открывать новое соединение и ты упрешься в лимит на число соединений. Правильнее использовать один объект логгера везде, а не создавать каждый раз новый. Или другой пример: ты хочешь не печатать в лог сообщение, если оно совпадает с предыдущим. Ты не сможешь это сделать, так как каждый раз ты создаешь новый объект логгера, который ничего не знает о предыдущем логгере и предыдущем сообщении.
> И вот вопрос тогда, вот в DI контейнере я определил сервис, LogService::class. И в клиентском коде я получаю этот объект из контейнера. А после я решил что в контейнере LogService::class должен быть иной логгер, не монолог. Я просто руками в контейнере меняю Монолог на что то другое, и все?
Поменять так просто ты не можешь, так как ты в куче месте в коде прописал LogService и код ждет именно этот класс.
Надо делать так: ты объявляешь логгер в контейнере под именем LoggerInterface, и везде в коде просишь LoggerInterface::class. А в контейнере задаешь, какой именно класс будет использован.
----
На самом деле, тут есть еще второй вариант, без интерфейсов. Ты можешь сделать класс-посредник, LoggerService, вся суть которого в том, что он передает сообщения конкретной бибилиотеке (например, Monolog). Везде ты внедряешь объект этого класса в качестве логгера. Тогда для замены логгера тебе будет достаточно поменять код в LoggerService.
То есть, ты хотел иметь несколько логгеров и легко заменять один на другой. Это правильно реализуется так:
- определяем интерфейс логгера LoggerInterface
- делаем несколько логгеров, реализующих этот интерфейс
Далее есть несколько вариантов, как это использовать:
1) с помощью DI
В конструкторе объявляем зависимость от LoggerInterface, сохраняем его в $this->logger, и далее в коде используем его:
$this->logger->warning("Yes");
Разумеется, вместо ручного прокидывания логгера в конструктор можно использовать DI контейнер, который сделает это за тебя.
Получается, наш класс готов работать с любым логгером, который ему дадут в конструктор.
2) с помощью ServiceLocator
Делаем в ServiceLocator метод getLogger(): LoggerInterface и используем его:
$this->locator->getLogger()->warning("Yes");
Здесь для подмены логгера надо лишь заменить единственную функцию getLogger().
Про минусы сервис локатора (и про плюсы DI) можно прочесть у меня в уроке про DI: https://github.com/codedokode/pasta/blob/master/arch/di.md
3) с помощью Registry - создаем логгер, кладем в Registry, а в других местах берем его оттуда.
Заметь, что ни один из этих подходов не требует писать фабрику. Мне кажется, она в данной ситуации не нужна.
-----
Подход с интерфейсом работает, если ты пишешь сам код логгеров. Если ты используешь сторонние библиотеки, ты не можешь заставить их соответствовать твоему интерфейсу. В таком случае ты пишешь интерфейс LoggerInterface и адаптеры (вроде MonologAdapter), которые соответствуют интерфейсу и которые передают сообщения сторонней библиотеке.
-----
Теперь про минусы твоего кода:
- ты копипастишь код создания фабрики много раз (каждый раз, когда тебе нужен логгер), а копипаста это плохо (если придется что-то менять, то придется менять в куче мест). Нарушаешь DRY = Dont Repeat Yourself.
- у тебя, чтобы поменять тип логгера, надо его менять в куче мест
- у тебя каждый раз с помощью new создается новый объект фабрики и новый объект логгера. Это может вызвать проблемы, например, если логгер открывает соединеие с БД, то каждый новый логгер будет открывать новое соединение и ты упрешься в лимит на число соединений. Правильнее использовать один объект логгера везде, а не создавать каждый раз новый. Или другой пример: ты хочешь не печатать в лог сообщение, если оно совпадает с предыдущим. Ты не сможешь это сделать, так как каждый раз ты создаешь новый объект логгера, который ничего не знает о предыдущем логгере и предыдущем сообщении.
> И вот вопрос тогда, вот в DI контейнере я определил сервис, LogService::class. И в клиентском коде я получаю этот объект из контейнера. А после я решил что в контейнере LogService::class должен быть иной логгер, не монолог. Я просто руками в контейнере меняю Монолог на что то другое, и все?
Поменять так просто ты не можешь, так как ты в куче месте в коде прописал LogService и код ждет именно этот класс.
Надо делать так: ты объявляешь логгер в контейнере под именем LoggerInterface, и везде в коде просишь LoggerInterface::class. А в контейнере задаешь, какой именно класс будет использован.
----
На самом деле, тут есть еще второй вариант, без интерфейсов. Ты можешь сделать класс-посредник, LoggerService, вся суть которого в том, что он передает сообщения конкретной бибилиотеке (например, Monolog). Везде ты внедряешь объект этого класса в качестве логгера. Тогда для замены логгера тебе будет достаточно поменять код в LoggerService.
W5.1. Школьник решил купить айфон и для этой цели взял кредит. Сумма кредита — 40000 р., банк в начале каждого месяца (включая первый) начисляет 3% от остатка долга за пользование кредитом и 1000 р. комиссии (да, а ты думал, обойдешься процентами?). После этого, в конце каждого месяца, наш герой идет в банк и пытается выплатить долг, но он не может заплатить более 5000 р за раз (сэкономленных на школьных завтраках). Вопрос, когда он избавится от долга? Во сколько школьнику обошелся айфон?
Я же выше скидывал как нужно переделать цикл для корректной работы алгоритма
if (($creditBalance + $creditBalance x 0.03 + 1000) < 5000) {
$sumTotal = $paymentTotal + 1000 + $creditBalance + $creditBalance x 0.03;
echo "С меня хватит! Я выплатил {$sumTotal}";
break;
}
Пожилой круг написал на костыличах тупа, остался ряд вопросов: нахуя нужны были $toAngle и $fromAngle? Как напечатать злоебучий пробел, если до него нет других символов? На ideone нельзя кодировку менять? Пришлось английский алфавит выводить.
Спасибо огромное и вообще спасибо тебе за этот Гайд, я давно хожу около этой темы и ты сделал просто супер толчок, именно этого мне не хватало, чтобы дальше изучать самому, ещё раз спасибо, уверен что задам ещё много тупых попросив, но зная что есть такие люди - не страшно делать ничего, редкость в нашей стране
Спасибо тебе огромное анон, только благодаря твоему найду смог начать самообучение, редко встретишь такого человека, спасибо!!
1. Можно, но придется изучать новые темы: работу браузера, верстку, жс, жс фреймворки (они работают немного по другим паттернам, нежели бек)
2. Laravel для простого старта. Yii2 устарел. Symfony может показаться переусложненным.
За сколько - от тебя зависит.
3. Математика не нужна. Алгоритмы только основы чтобы не делать запросы к базе в цикле и потом удивляться, а че так медленно. Higload больше про оптимизацию узких мест, про инфраструктуру, про хитровыебанные запросы в бд, про кеширование и т.д.
4. Быть в состоянии запилить CRUD приложуху (на подобии задачи про студентов) на одном из современных фреймворков
>>1966088
Ларакасты глянь например
Switch case
360x360, 0:03
например, одна строка из базы данных: лук укроп картошка мясо = пюре зразы котлеты картошка
есть кнопка "поиск"
за сколько анон готов сделать поиск по бд?:
1) Вбиваешь "картошка" - выводятся все результаты, где "картошка" хоть слева, хоть справа
2) Вбиваешь в поиск "картошка = " и он искал картошку только в ингридиентах
3) Вбиваешь в поиск "= картошка" и он искал картошку только в продуктах
И если находится такое слово, то выводятся пользователю все строки из базы данных в изначальном формате:
"лук укроп картошка мясо = пюре зразы котлеты картошка"
на биржи не иду, хочу поддержать нашего анона
Русский программист swool становится большой богатый, много риса и нефритовый стержень
Krasota
чи шо совсем долбоеб? Гуглится за 5 минут
tbl - таблица, txt - столбец
1) SELECT FROM tbl WHERE txt LIKE '%картошка%'
2) SELECT FROM tbl WHERE EXISTS (
SELECT LEFT(txt, LENGTH(txt)-LOCATE('=',txt)) FROM tbl WHERE txt LIKE '%картошка%'
)
3) SELECT * FROM tbl WHERE EXISTS (
SELECT RIGHT(txt, LENGTH(txt)-LOCATE('=',txt)) FROM tbl WHERE txt LIKE '%картошка%'
)
на пыхе-то распишешь сам надеюсь. Блять, очередной зумер походу, который нихуя не умеет и хочет вкат.
Как багодарность - хуячь донат https://rayfund.ru/get_involved/donate/ сюда например с пруфом (чеком) или попущен.
Тут, по моему, для поиска слева/справа от равно можно использовать выражение вида
WHERE txt LIKE '%=%картошка%'
Но вообще, структура базы данных какая-то странная. Надо делать отдельно таблицы ингридиентов, блюд и связи многие-ко-многим между ними.
/ В эту переменную запишем получившееся имя /
$name = '';
/ Гененрируем 4 слога /
for ($i = 1; $i <= 4; $i++) {
/ Выкидываем случайное число (count - число элементов в массиве) /
$random = arrey_rand($letters, 1);
$randomText = $letters[$random];
$name .= $randomText;
echo "Выпало число {$random}, слог {$randomText}\n";
....
}
echo "------\n";
echo "Советую имя: {$name} - не прогадаешь!\n";
В чем я не прав?
несть несколько вопросов. буду благодарен, если ответите.
1. Что почитать из русской литературы?
Пока склоняюсь к Котерову + параллельно гуглить
2. В книгах сейчас в основном пыха 7-ая, как потом свитчнуться на 8?
3. мне 25 (не поздно вкатываться?) и я манагер, собираюсь учиться по 2-3 часа по вечерам и на выходных по 5-6. это очень хуево?
А, точно, но всеравно у меня выдется ошибка, не могу понять вч ем проблема того тчо я высрал
Просто начни вкатваться по инструкции в шапке, как только начнешь понимать принцип работы языка - будешь вдаваться в подробности
Писал выше, вот полный текст, не могу понять в чем именно я ошибся
Сотри 24 строку. Ideone, кстати, подсвечивает такие ошибки во время редактирования кода.
Начни дрочить как хобби, и выкинь нахуй далеко маня мечты про вкат, про тыщи денег и маня успех. Если ты сейчас по жизни сосешь хуй, то дело в первую очередь в твоей личности и образе мышления и привычках. И поверь - ты так же будешь учить пхп как живешь - через пизду. И работать будешь также, если дотянешь до этого - через пизду и за три копейки.
Начни лучше с личных качеств.
А прогинг как хобби - это может и не зайти нихуя.
Спасибо, рад как ребёнок)
п.с. мимо 34 лвл, типа вкотился потому что хуебень уже сам пишу всякую за деньги , за 3 блядь года.
но я по вышке - ойти
>>1968598
Ставлю жирный плюс под словами этого анона, сразу после универа хотел вкатиться в фронт энд, были манямечты и все такое, думал, что я смогу зарабатывать и съехать на хату, что мне опмогут курсы на котрые я отходил и что я буду просто супер. Но по факту работал в калл центре, потом переводчиком в брачке и потом в говнофирме, начал работать над мировосприятием( это алкашка, наркота, работа с психологом) сразу вспомнил как в детстве ездил на олимпиады и решал задачи и решил не то что вкатиться - а понять ПХП, понять интересно мне или нет и так же как в детстве порадоваться от решения задач. Сейчас четко понимаю, что тут поможет только упорство и ответственность, других путей нет. Но надежны на перекат в эту сферу как работу я даже не строю, все так же варюсь в менеджерской среде, потому что нужно хавать за какие-то бабки и с этим поможет только имеющийся опыт. Так что ты не думай что все так просто, дело даже не в часах, которые ты потратишь, а будет ли тебе это хотеться
Тупой вопрос:
есть старый сайт на Symphony 2
Отредактировал в нём один из twig-файлов (главный).
Содержимое страницы осталось прежним.
Пробовал:
Перезапустил apache
Обновил страницу через ctrl+f5
Очистил вручную папку app/cache
В чём может быть дело?
На этом же хостинге лежит сайт на Laravel.
C ним таких проблем нет. Если отредактировать blade-файл, то изменения подхватываются на лету.
как поднять свой сервер?
поставил апач 2 и пхп 8.0.3
запускаю в терминале апач и по пути "/var/www/html/test
" есть мой пхп файл, он и обрабатывается.
пока на этом остановлюсь и буду так учить пхп. это правильно?
(знаю про ламп и готовые сервера, но решил попробовать вот так по-деревенски)
Слушай, я столько это говна в своей голове перекрутил, что мне в пору в тиктоке блядь людей жизни учить я полу серьезно, я даже имею концепты и темы о чем говорить. Я на этой хуйне собаку сожрал. И полностью принял то что твой успех - это ты сам. Ты точка отсчета.
А люди тащатся в прогинг как за серебрянной пулей что решит их все проблемы - хуй. Проблемы только сам человек может решить, когда осознает.
chmod 777, мне этого достаточно
Да всего. Открываем справочник, веб из этого нужен только нескольким пунктам в конце, и то они решаются средствами фреймворка, поэтому учатся отдельно.
При чем тут английский? Я тебе говорю, что 95% возможностей языка не требует веба.
а причем тут не требуют веба? я хочу сразу понять работу серверов и т.д. Хочу это всё делать в линуксе, а не в ебливой винде
усложняю потому что пока не особо понимаю, что к чему. Хочется всё и сразу. Послушаю твоего совета и пока буду не спеша осваивать язык.
А мб начнешь писать код в IDE и запускать локально?
Там глядишь и иде подсветит ошибки, и в консоли при запуске выдаст стектрейс
Тогда поднимай нжинкс, чтобы он при загрузке линя автоматом поднимал сервер. А потом упакуй это в докер и так же, чтобы автоматом поднимало.
Только это путь в девопсы, а не бекендеры.
Только одно?
На stackoverflow посоветовали выполнить: php app/console cache:clear --env=prod.
Проблема в том, что в проекте нет ни app/console ни bin/console.
Симфония как будто не установлена полностью. Composer install тоже не срабатывает (проблемы с совместимостью пакетов).
500 руб за код и ещё 500 если созвонимся в скайпе и расскажешь, как работает код и немного основных вопросов по пхп, но не дольше часа
@Dima_Kedr
4-5к
О да, коучем быть заебись - втираешь банальщину, еблом торгуешь. Ахуительно. Главное ебло построже делать, что бы окружающие думали что ты тайное знание открыл.
Земля пухом, ебать
Уже не надо.
Если нет папки console, значит криво установлены пакеы через композер.
Самый быстрый вариант - снести папку кеша. Скорее всего это var/cache.
> Самый быстрый вариант - снести папку кеша. Скорее всего это var/cache
Я бы все-таки не сносил все, а ограничился только кэшем твига, а в идеале еще и забэкапить кэш. Особенно если это продакшн.
Я только сейчас понял, что сайт хостится на виртуалке, а те файлы, что я пытался редактировать вообще не задействованы.
Забавно то, что сам хостинг представляет собой VDS (хост Fastpanel, ось Debian), и на нём зачем-то запущен VirtualBox.
Мне нужно сделать сайтец знакомому (Без тролинга, реально помощь нужна), там всё поставлено на OpenCart, вроде всё просто, только вот как ориентироваться в этом непонятно, документаций там нет ваще никакой, просто концепт MVC и всё. Вроде он тоже понятен, но! Как находить методы и переменные? Какой то плагин в редакторе использовать? ctags? Помогите пожалуйста.
> Мне нужно сделать сайтец
> там всё поставлено на OpenCart
Так нужно сделать с нуля иди доделать/переделать готовое?
> Как находить методы и переменные?
Качаешь сайт себе на локальный сервер и открываешь в IDE
>Так нужно сделать с нуля иди доделать/переделать готовое?
Уже поставил базу данных и её заполняют, нужно добавить минимальный функционал и изменить шаблоны сайта чтобы нормально выглядели, для этого нужно передать в контроллер запрос с помощью модели, примерное представление как они работают есть, проблема в их определений, нужно файлы перебирать постоянно чтобы найти тот или иной метод и какие параметры он принимает.
>Качаешь сайт себе на локальный сервер и открываешь в IDE
ДА поставил давно уже, параллельно разбираюсь, не могу понять как методы искать. В Vim вроде есть CTRL+P плагин с ctags.
Может еще какие советы есть как разбираться в непонятном коде?
{
private $varA;
public function __construct($config = [])
{
parent::__construct($config);
$varA = 1;
}
}
Это выебоны программиста?
Гугл сказал что делается это так
$ch = curl_init('http://site.ru/api1');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
Если я подряд вставлю 3 таких кода каждый на свой URL они будут исполняться по очереди ожидая окончания предыдущего или это всё работает в асинхроне и например с 3 API данные могут прийти быстрее чем с 1?
Надеюсь я понятно объяснил что хочу сделать, если коротко то выводить данные с запасных API если приоритетное не отвечает или тормозит
Чистый курл не нужен, юзай газл, твоя задача замечательно ложится на промисы
>Если я подряд вставлю 3 таких кода каждый на свой URL они будут исполняться по очереди ожидая окончания предыдущего или это всё работает в асинхроне и например с 3 API данные могут прийти быстрее чем с 1?
В твоём коде выполнится последовательно
>В твоём коде выполнится последовательно
То есть если 1 API не доступно весь скрипт будет висеть ожидая его ответа? Или у curl_init есть какой-то таймаут ожидания ответа после которого он дропает запрос и идёт дальше по коду?
>юзай газл
Это типа как XMLHttpRequest в JS?
>у curl_init есть какой-то таймаут ожидания
Да, есть. И он настраивается
>юзай газл
>Это типа как XMLHttpRequest в JS?
Это либа пхпшная. Хоть бы загуглил прежде чем спрашивать
>Это либа пхпшная
Просто хотелось обойтись без костылей, чистой ванилой так скажем 1 файлов скрипта, но вообще у PHP получается только 2 способа загрузить данные с API - это file_get_contents и curl_init получается?
>Да, есть. И он настраивается
Надеюсь не на сервере, а то с этим будет проблема
>Просто хотелось обойтись без костылей, чистой ванилой так скажем 1 файлов скрипта
Использование библиотек - не костыль. Тем более настолько проверенных временем.
К тому же на голом пхп в продакшене далеко не уедешь
>Надеюсь не на сервере, а то с этим будет проблема
Почитай пхп доку по курлу - там все параметры описаны, задается это дело в коде
>>1970821
Cпасибо аноны, вроде стало яснее, мне не для чего-то серьёзного, для себя мелкие фитчи на сайт
Пока для меня загадка только в том в какой последовательности я получу ответы если сделаю запрос сразу на несколько API, я так понял что код будет идти последовательно без асинхрона, особенно благодаря CURLOPT_CONNECTTIMEOUT, чтобы читать следующий API, если предыдущий не дал ответ за указанное время, надеюсь всё так
Пхп по своей природе синхронен. Так что первый запрос в апи будет ждать ответа, либо конца таймаута
Охуенно, завтра начну тестировать кашу что я придумал, ещё раз спасибо
15 лет сидим на Fedora. Лучший дистриб. Я даже домой себе поставил. Чё там осваивать? Ставишь по принципу next-next-next и у тебя просто всё работает. Были бы богатые, на RHEL бы сидели разумеется.
Из различных десктопов мне больше всего нравится Mate десктоп с переработанным Гномом 2, если там конечно от него что-то ещё осталось.
Любой популярный. Как освоишься, уже будешь дрочить разные дистрибутивы, DE и конфиги под свой вкус.
Да, только тебе наверное не в HTML это все нужно получать, а в каком-нибудь JSON, т.е. помимо echo нужно будет еще и заголовки поменять
Заебись, пиздец чё серьёзно от echo так и не ушли и всё выводится им родимым? Ну ещё понятно вар дампом, но это другое
> от echo так и не ушли
Куда уходить и зачем? Вместо echo сделать huecho? И что это даст? Если тебе нужна гибкость и удобство - обмазывайся любым шаблонизатором на выбор. В Си printf уже 50 лет используют и ничего.
Я бы не задавал такой вопрос, если бы мог с нуля
Я только ЗА, просто что не возьми везде всякие пидоры-нигеры обязательно всё переделывают потому что НЕ МОДНО НЕ ТОЛЕРАНТНО, УСТАРЕЛО И НЕ ЕБЁТСЯ В ЖОПУ, НАДО ПЕРЕДЕЛОТЬ
1. У тебя же в ошибке все написано. В $_SESSION не получается найти ключ user_authed. Ты его сам туда пишешь или это какое-то стандартное значение?
2. Зачем ты этот ключ проверяешь двумя условиями, если можно воспользоваться одним с else?
Спасибо большое)
>1. У тебя же в ошибке все написано. В $_SESSION не получается найти ключ user_authed. Ты его сам туда пишешь или это какое-то стандартное значение?
На php 5 все работало, мне кажется тут неверный синтаксис для нового php
>2. Зачем ты этот ключ проверяешь двумя условиями, если можно воспользоваться одним с else?
Потому что я ничего не понимаю. Мне просто интересно почему это не работает сейчас
В коде следующие ошибки:
- есть уязвимость SQL инъекция, она позволяет залогиниться под любым пользоваетелем не зная пароля, подробно описано тут: https://github.com/codedokode/pasta/blob/master/security/sql-injection.md
- не надо хранить в базе пароли в открытом виде, надо хранить соленые хеши от них: https://github.com/codedokode/pasta/blob/master/security/password-hashing.md
В документации и на ларакастах всяких логика в контроллерах и фасады. Не пойму, это просто примеры для краткости, или действительно все так пишут?
У меня почему-то такие вещи вызывают отвращение. Пока что делаю так: для каждой модели создаю сервис, который эту модель декорирует.
Как логика, так и любые запросы к БД оборачиваются в сервис. В итоге контроллер непосредственно общается только с сервисом.
Во избежание копипасты был создан базовый сервис с наиболее используемыми методами: create, find, delete, update, all и т.д.
А чтобы не копипастить вообще любой понадобившийся метод из квери билдера в сервис, я просто сделал публичным метод, который возвращает билдер модели.
Нормально делаю, или ненормально? Если ненормально, то как надо?
Нахуй На фриланс пройди. Никто тут не будет за тебя твою работу выполнять, в говнище колупаясь.
> Мне просто интересно почему это не работает сейчас
Нет, ты просто хочешь чтобы из тебя наводящими вопросами выудили всю нужную информацию и написали тебе рабочий код.
Так это не работает, нужно и самому немного покумекать.
> мне кажется тут неверный синтаксис для нового php
Раз кажется - берешь ошибку и копируешь ее в гугол. Вот что говорит документация по поводу функции которую ты пытаешься использовать https://www.php.net/manual/ru/function.mysql-query.php Нужно переделать код и использовать вместо неё другую
Шторм - стандарт индустрии
Выкинь это говно и пиши на современном пхп
>смесь сервиса и репозитория
Задумывалось это. Хотя, я так задумался, что для некоторых моделей у меня логика отсутствует, и эти "сервисы" действительно являются репозиториями.
Причем вообще бесполезными, так как абстракции никакой по сути и нету.
Надо будет удалить их. Только что вместо них использовать? Фасады богомерзкие? Внедрять инстанс модели в зависимость?
Ох как же сложно с этим вашим актив рекорд. Вот в доктрине на тебе entity, на тебе entity manager, на тебе репозиторий. Бери и пользуйся. А тут уже какой день пытаюсь со всем этим говном совладать
Точно не арч, дебиан потому-что это системы для системных администраторов которым нужна система с минимальным набором стартовых программ. Даже не как новичку, но и профи бы посоветовал Fedora, Ubuntu (Мне не нравится) и это впринципе всё что требуется. Все системы на GNU+Linux похожи и разницы в них мало, в основном различия в сообществах, а так всё тоже самое. (Я бы посоветовал Fedora)
Согласен.
>В Си printf уже 50 лет используют и ничего.
У нас есть не просто printf, у нас есть printf с разными вкусами!
Подскажите вкатывалщику на пыхе. Фриланс, хороший вариант получения опыта? Именно нулевому разрабу, без опыта.
Я тоже нуб, думаю если опыта вообще нет, то во фриланс сразу нельзя, нужно портфолио стартовое сделать, щас этим занят. Пет проекты итд. Тоже интересно узнать как начинать.
Фриланс на пыхе это чаще всего задачи вроде "у нас тут есть куча говнокода, нужно добавить туда еще говнокода". Сомнительный способ научиться грамотно погромировать. Тем более если ты без опыта.
Пилишь проектики для себя. Например, в шапке есть задача. Сделал, показал анону, твой код обосрали, переделал. Потом берешься за проект посложнее. И так далее.
Эти проекты годятся для трудоустроиства? А то РАБотадалям коммершеский опыт подавай
Фрилансить нужно будучи хотя бы мидлом. Дадут тебе хотелок кабанчика - что будешь с этим делать?
Опыт получать через пет проектики.
Можно брать существующие проекты и колхозить свой клон с нуля
Если красиво покажешь и расскажешь - вполне.
А если каким-то чудом выдашь их за комм опыт, то с руками оторвут
Есть легаси проект со своей функцией загрузки классов.
Как безболезненно начать параллельно юзать composer, не порушив старую архитектуру?
Тоже верно, спасибо учту
Благодарю, буду пробывать
Очевидно же, Eclipse
composer начинает пытаться загружать свои зависимости другим, старым загрузчиком
В той же ситуации. Я уже дальше пошел, решил оставить банкомат на потом. Тут
https://php.ru/forum/threads/zadachki-po-php.46947/
кто-то что-то пытался объяснить, но на фразе
>Поскольку мы номиналы банкнот храним в массиве a, естественно, что F(0) = 0, F(a[1]) = F(a[2]) =...= F(a[k]) = 1.
ЯННП. Мне не естественно, например.
Анончики, поясните кто-нибудь за логику решения банкомата.
Олсо, ононче, оцени мой вариант решения задачи на считалочку. Как всегда, стараюсь максимально комментировать, чтобы было легче читать мой говнокод:
https://ideone.com/BghFlD
>В той же ситуации. Я уже дальше пошел, решил оставить банкомат на потом
А мне ОКР не позволяет.
multipart/form-data. А с пхп что то я запутался. Хотя на пхп много больше написал.
В пхп все автоматом из коробки делается, файл попадает в $_FILES , а сам сохраняется где то в temp. А как мне непосредственно а пхп получить доступ к потоку запроса. Я допустим каждые 1000 байт входящего файла хочу подергать?
>>1972296
Я посмотрел по ссылке, вроде несложно там обьяснено.
Строим табличку, сколько нужно купюр для каждой суммы от 0 до нужной, если есть вариант с меньшим числом большими купюрами, то заменяем.
Ну и потом раскручиваем обратно, отнимая наибольшие от суммы.
https://ideone.com/cO6Pdf
>>1972286
В жадном алгоритме мы идем от старших купюр к младшим. Для каждой купюры вычисляем кол-во, вычисляем остаток не выданной суммы и идем дальше.
В общем случае этот алгоритм не работает. Что можно придумать? Можно начать с подхода "в лоб":
- перебирать все возможные комбинации купюр (то есть брать кол-во каждой купюры от 0 до максим. возможного)
- для каждой комбинации считать сумму
- делать так, пока не получим нужную сумму.
Это довольно неэффективный алгоритм (требуется перебрать очень много комбинаций), но он гарантированно найдет решение.
Дальше алгоритм можно оптимизировать. Например, если сумма равна 1200, и у нас есть купюра номиналом 500, то имеет смысл брать только 0, 1 или 2 экземпляра этой купюры, а 3 и больше можно не проверять.
Или еще оптимизация: если у нас сумма равна 1200, мы решили брать 1 купюру по 500 и перебираем кол-во купюр номиналом 200, то можно начать с числа (1200 - 1 x 500) / 200 = 3 и затем проверять остальные варианты (2, 1 и 0 купюр номиналом 200).
---
Что касается алгоритма в интернете, он работает с неограниченным кол-вом купюр. Если вы хотите его использовать, его надо модифицировать для работы с ограниченным кол-вом купюр, и проверить, возможно ли это вообще.
Подскажите современную альтернативу TimThumb
Нахуй
Мне нужно только картинки загружать.
Сначала я проверяю exif_imagetype(), после is_uploaded_file().
Это нормальный вариант?
Есть еще функция mime_content_type(), она в принципе равнозначна exif_imagetype()?
exif_imagetype - вроде читает сигнатуру из первых байт файла, определяя какая это картинка, и картинка ли вообще. По идее mime тип в этих первых байтах и хранится.
А как мне ограничить размер файла? Что бы если мне не залили гигабайтное кино, например.
В ноде просто считаешь поток request,часть где multipart-form-data, и если он слишком большой - перестаешь из него читать.
В пхп только через настройки php.ini? Я так понимаю что если файл попал в $_FILES -то он уже залит, значит ограничения где то выше должны быть.
Я в .htaccess установил директивы
php_value upload_max_filesize 10M
php_value post_max_size 10M
кажется нихуя не дало
как правильно заливтаь файлы?
п.с.
директивы
php_value upload_max_filesize 10M
php_value post_max_size 10M
работают, только не пойму какое исключение они возвращают.
По факту просто не качает файл и все. А скрипт обработчик пытается выполниться
Лол, какая-то дедовская хуйня. Для базы есть prepared statements, которые решают проблемы с эскейпингом и иньекциями, дальше можно заэнкодить через htmlspecialchars, чтобы избежать всяких xss.
Так я понял по документации для этого используются три варианта пакетов: GD , Gmagick , ImageMagick.
Какое из них нужно выбрать?
Или еще варианты есть?
Нужно вместо случайного перебора делать последовательный перебор всех возможных комбинаций купюр.
То есть, берем все возможные количества первой купюры, для каждого количества перебираем все возможные кол-ва второй купюры, для каждой пары первых двух количеств перебираем все возможные кол-ва третей купюры и тд.
>ImageMagick
Я вот это использовал, очень удобно, можно использовать готовый пример. Использовал это для генерации картинок для мобильной версии сайта, чтобы ускорить загрузку сайта для телефонов, там же все равно маленький экран
Чем что-то запрещать в логине, проще что-то разрешать. Сделать регулярку на лат.буквы и цифры. А для пароля сделать ввод чего угодно. Ты ведь все равно прогонишь это через htmlspecialchars, PDO, плюс пароль наверняка захэшируешь с солью. Никакая гадость не пролезет.
А еще мой круг кажется мне кривоватым, как бык поссал.
А еще поясни, пожалуйста, в чем сакральный смысл переменной $height и почему она у нас равна именно 30?
Анончики помогите. С меня - нихуя.
На диске лежит файл image.png, размер 20000 на 20000. Вывести картинку как баннер размером 200 на 100 пикселей.
Скорее все упрется в железо и разница будет несущественной.
https://hackernoon.com/php-laravel-vs-symfony-a-detailed-comparison-of-web-development-frameworks-sq493y3l
Ну вот некий тест. Предполагаю, что может меняться от версии к версии.. В целом, логично, что на старте симфони за счёт сложности будет чуть медленнее.
Я бы лучше смотрел на среднее время ответа сервера, тот же вордпрес упаси боже может две секунды думать в то время пока лара и симфони >50мс
Думаю, при наполнении данными и применении кеширования эта разница нивелируется. Но если просто нужна причина не учить сложную симфони -- то да, можно опираться и на этот тест.
Там для лары на днях Octane презентовали - асинхронный фреймворк на основе swool. 6к рпс из-коробки
Какую?
Легаси евривеа. Даже 7 то не везде используется (тут вот недавно был анон с говнокодом, который работал только в 5), а 8 и подавно. Смотри мануалы по 7, а про 8 разве что для общего развития можешь почитать.
Хочу устроиться на работу PHP джуном, но до этого я готовился на frontend (js). Можете подсказать короткий путь, как подготовиться к собесу за 18 дней?
Я учился по книжке ОПа, но дошел до ООП, да и все забыл уже по PHP. Но что такое циклы, условия и ООП в целом я знаю.
Сейчас уже нет времени решать задачи про банкомат и расчет маршрута как же я с ними марался.
Может подскажете видео курсы или книгу? Так же нужно выбрать фреймворк, который легче и быстрее учится. И если можно по нему тоже курс какой-нибудь.
Вот требования вакансии:
Знание PHP, ООП, MVC
Опыт написания SQL запросов
Опыт использования хотя бы одного из популярных PHP фреймворков (Symfony, Laravel, Yii2)
> 18 дней
> Сейчас уже нет времени решать задачи
Ну тебе тогда нужна книга PHP for dummies in 18 days
> Вот требования вакансии:
Сомневаюсь что ты за 18 дней наберешься таких знаний. Скорее всего у тебя просто каша будет в голове. Мне кажется лучше пока забить на фреймворки и сконцентрироваться на самом PHP + MYSQL. Сами фреймворки просто базово изучить, а на собеседовании так и сказать что ты опыта работы с ними не имел, но очень хочешь и готов быстро во все вникнуть в боевых условиях.
Фронтенд на пых сменить ебать ты дурачина! А так шансов пройти у тебя собес мало, зубри вопросы для собеседований из гугла
>Хочу устроиться на работу PHP джуном, но до этого я готовился на frontend (js). Можете подсказать короткий путь, как подготовиться к собесу за 18 дней?
Ждем через 18 дней пост у мобильщиков/датасаентистов с аналогичным содержанием
>>1974565
Господа, в моей мухосрани мало вакансий (на джуна только вот эта). Я согласен, очень глупо метаться с фронта в бэк, но там и зп белая, а горький опыт показывает, что зп в черную это не всегда хорошо. Короче компания вроде приличная, судя по отзывам знакомого знакомых. Плюс там знания js тоже желателен. Нуууу, не знаю короче, я так долго вкатывался, уже не знаю что делать
Ну ты охуевший это не плохая характеристика на самом деле, такие люди и добиваются успеха.
Я вот почти год как вкатываюсь, все задачки из ОП-поста сделал. Перед этим 4 года вышки писал на всем на чем только можно, помимо кодинга там хорошо выучил сети и базы данных, и всё равно не считаю что я уже готов к работе.
Я ж еще столько всего не пробовал: API, реактивные фреймворки, докер, тесты ( всегда впадлу было их делать ) и прочее. Да и вообще себе много чего не представляю о реальных веб-приложениях.
>Я вот почти год как вкатываюсь, все задачки из ОП-поста сделал. Перед этим 4 года вышки писал на всем на чем только можно, помимо кодинга там хорошо выучил сети и базы данных, и всё равно не считаю что я уже готов к работе
Чел...
Вкратце о ситуации: в самом аналоговнетном фреймворке пхп-мира есть строка, обнуляющая дробную часть float при отправке запросов в БД.
Как же я охуел блять, это просто пиздец.
$eloquent->insert (3.14); // 3 is precise enough!
https://github.com/laravel/framework/issues/23850
Пока ты теряешь время, требования всё больше растут, и становиться всё сложнее вкатиться
Пора высунуть голову из песка и сходить по собесам.
Сейчас даже на джунские ваки требуют знаний архитуктуры и хуйлоада, не говоря уже про всякие докеры
Если б так было - ты бы уже джуном пахал
<input type="submit" name="warmday" value="<?= ($_POST['warmday'] - 1) ?>">
Проблема в том, что при нажатии этой кнопки все остальные значения удаляются и остаётся только эта изменённая переменная. Как сделать так, чтобы остальные значения сохранялись?
Нужно просто вывести значения массивов? Или тут какая-то более глубокая задача?
Ну вот тебе первая строка:
echo $word1[3]. ' ' .$word2[0]. ' ' .$word3[3];
Остальные строки по этому принципу
Вот, я думаю так будет понятней, нужно, чтобы рандомно делался стишок из слов в массиве
Есть же array_rand
дело в том, что в подсказках автор задачи предлагает делать это через цикл, я хуй его пойми как пустить это дело через цикл
>все остальные значения удаляются и остаётся только эта изменённая переменная
Это происходит, т.к. ты при новом запросе посылаешь новый пост, в котором есть только твоя переменная.
Вообще $_POST - это те данные, которые пришли из текущего запроса. Она не хранит данные из прошлых запросов.
Хочешь хранить данные дольше одного запроса - используй другие хранилища, например куки, файл или бд
Недавно, кстати, попробовал Lumen вместо лары. И чет не понял, а нахуя нужна лара?
По ощущениям, люмен - то, чем должна быть лара, просто без нескучных обоев.
>eloquent->insert (3.14); // 3 is precise enough!
Не понял. В ишью же вроде сказали что для децимала нужно передавать '3.14' и все будет ок.
>люмен - то, чем должна быть лара
Люмен - кастрированная версия лары, микрофреймворк. Норм, если нужна апишка или микросервис.
>нахуя нужна лара?
Лара - комбайн для быстрой разработки и прототипирования. Подходит для монолитов
В голову приходит 2 варианта:
1) сделать по принципу работы счетчика за электричество. Как он работает? Изначально все цифры на нем равны 0, например 0000. Затем увеличивается последняя цифра, когда она доходит до 9, она сбрасывается в 0 и увеличивается предыдущая (получается 0010). И так далее, до комбинации вроде 9999.
Ты можешь точно так же увеличивать число купюр.Сначала увеличивать самую младшую, потом сбросить ее в ноль и увеличить следующую, итд. Только разница в том, что максимальное число купюр будет не 9, а какое-то другое число, и для каждой купюры свое. То есть, начать с комбинации 0 0 0 0 и идти до максимально возможной.
Сначала можно сделать это по-простому, а потом ты можешь переделать это с использованием генераторов ( https://www.php.net/manual/ru/language.generators.php ). То есть, сделать функцию-генератор, которая будет через yield выдавать комбинации одна за другой.
2) с помощью рекурсии (это когда функция вызывает сама себя). Пишем функцию, которая принимает на вход массив "зафиксированных" количеств купюр. Например, это может быть "2x1000 3x500". Эти "зафиксированные" купюры она не трогает, а перебирает более младшие. То есть, она добавляет к зафиксированным сначала "0x200", потом "1x200", потом "2x200" и тд. И, получая таким образом новые комбинации, она снова вызывает сама себя, передавая себе эти комбинации.
Ну то есть, сначала мы вызываем функцию, передавая ей пустой список зафиксированных купюр. Она начинает генерировать комбинации из самой старшей купюры вроде 0x5000, 1x5000 итд. И каждый раз вызывает себя, передавая эту комбинацию. Вызванная функция генерирует комбинации из 2 купюр, например: 0x5000, 0x2000, затем 0x5000, 1x2000 итд. При этом на каждой комбинации она снова вызывает себя, передавая эти комбинации. Так постепенно будут перебраны все возможные комбинации.
Тут получится довольно простой код. Опять же, в случае успеха ты можешь переделать его на функцию-генератор. Но сначала попробуй по-простому решить.
Для начала, можно написать без цикла. Но ты заметишь, что получается много похожего однотипного кода. Что, если стишок станет длиннее, копипастить код?
Потому можно сделать генератор на основе массива вариантов и цикла. Ты делаешь массив, в котором каждый элемент - это набор (массив) вариантов слов. То есть массив массивов, или двухмерный массив.
Например:
$template = [
[слово, другое, третье], // варианты для первого слова
[слово, еще, слово], // варианты второго слова
...
];
И затем проходишь по нему циклом и на каждом шаге выбираешь один из вариантов и выводишь его или сохраняешь куда-нибудь, чтобы вывести позже.
>>1975112
Можно передавать их через скрытые поля.
Вообще наоборот, зачем нужен люмен когда есть лара? В этом люмене постоянно что-то работает не так как в ларе, пакеты часто несовместимы. То, что могло занять 5 минут, может затянуться на пару часов, вот и вопрос, в чем ты выигрываешь выбирая более легкий фреймворк? Я думаю точно не в производительности, шо то шо это ну такое, и явно не в dx. Тогда в чем?
Вардамп поставь на каждой строчке в пхп и консол лог на каждой строчке в жс - поймешь, где данные теряются.
Пора учиться самостоятельно дебажить
Тогда лучше для начала код пописать, книжки потом
Попробуй перед респонсом в пхп ебануть header('content-type: application/json')
да, в принципе всё понятно
Не всё изучал, только начал. Почему книги спрашивал, потому-что. Возможно придётся свалить, в родную мухосрань, где нет интернета. И нужно учебный материал приготовить. Ну это, при худшем раскладе
У хероку, насколько я понял, два варианта: либо автодеплой с гитхаба, либо ручной коммит через хероку CLI (ещё есть докер, но я в нём ни ухом, ни рылом). Но конфиги-то коммитить нежелательно, .env у гита должен быть в игноре. Плюс, мне нужно И показать код на гитхабе, И развернуть готовое приложение на хероке, И иметь возможность работать с проектом локально.
Пока что придумал такой велосипед:
- Делаю коммит изменений, пушу на гитхаб.
- Меняю в .env параметры доступа к БД с локальных на хероковые, убираю из гитигнора этот конфиг.
- Коммичу, пушу на хероку.
- Откатываюсь на предыдущий коммит, грохаю из истории коммитов всё, что выше.
И так при каждом коммите. Это норм вообще? Или я делаю нечто странное?
И ещё проблема: нет картинок. Они у меня в /public/storage, который слинкован командой php artisan storage:link. Но, во-первых, линковка работает только пока я подключён (если перелогиниться и проверить - в /public каталога /storage не будет), а во-вторых, даже после линковки, все картинки 404. Я было на права подумал, но нет, у соседних css файлов права ровно такие же. Как починить?
Возникла трабла с warning который бросается на то что файл который клиент заливает на сайт - слишком большой.
Проблема в том что этот варнинг:
Warning: POST Content-Length of 118009112 bytes exceeds the limit of 5242880 bytes in Unknown on line 0
выбрасываеется мне сразу на страницу, с какого то хера. А после него - мое приложение вызывается.
Функции
ini_set('display_errors', '1');
error_reporting(E_ALL);
я вообще не определял.
С помощью
set_error_handler('handlerErr', E_ALL);
тоже это варнинг отловить не могу. Откуда он сука лезет.
Скачиваешь OpenServer (он говно и с него придется слезать в будущем, но для начала более чем пойдет), любой текстовый редактор и вперед и с песней.
п.с.
чето не пойму а с какого хера этот вэрнинг вообще сыпется?
По идее если файл слишком большой - то ошибка эта будет в $_FILES, разве нет?
Проверь, что именно отдает сервер в ответ на запрос. Для этого ты можешь открыть средства разработчика в браузере (F12 или Ctrl + Shift + I) на вкладке Network перед отправкой запроса. И посмотреть, что приходит с сервера и с какими заголовками.
>>1975916
Ты, конечно, все делаешь неправильно. Для облачных платформ обычно параметры передают через переменные окружения, которые можно задать где-нибудь в админке. Ну или, как вариант, можно иметь отдельный .env вне репозитория и как-то попробовать его загрузить на Heroku в обход гита.
Гугление выдало мне такую статью: https://devcenter.heroku.com/articles/config-vars
По-видимому, варнинг выдается до того, как запустится твое приложение и потому перехватить ты его не можешь.
Ты можешь сделать такие вещи:
- отключить display_errors, чтобы варнинг шел в логи, но не показывался на экране (почему он у тебя включен вообще?)
- повысить ограничение на размер POST. Там есть 2 отдельных лимита - на размер тела POST и на размер файла
$toAngle и $fromAngle по задумке должны задавать начальный и конечный угол фразы (угол первой и последней букв). Может, ты хочешь не полный круг сделать, а лишь дугу от 60 градусов до 270.
Пробел невидим, потому от него останется только небольшой промежуток в дуге из букв.
> На ideone нельзя кодировку менять? Пришлось английский алфавит выводить.
На ideone прекрасно работают русские буквы. Проблема в том, что ты используешь обращение к строке как к массиву: $phraseArray[$x], а надо mb_substr (урок: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md )
По коду: для преобразования из радиан в градусы и обратно есть готовые функции вроде rad2deg.
> round($ko)x2.7+$centerX
тут умножение надо было делать внутри round(), а то у тебя получается в итоге дробное число.
lk, ko - неудачные имена переменных.
> for($x = 1;$x<80;$x++){
> echo $screen[$y][$x];
Тут можно было использовать implode для преобразования массива в строку вместо цикла.
Без интернета с пхп каши не сваришь
Ставишь php, phpstorm и пишешь
nginx внутри докера
Не повредят. Тебе нужно будет использовать различные консольные утилиты, а скорее всего и базовым администрированием серверов заниматься.
Как доказать, свой знания в линуксе? Если, с программированием понятно, можно ссылку на github предоставить. То с линуксом, приходит на ум, только принести ноут, с установленным, и настроенным линуксом... Я правильно, понимаю?
> Как доказать, свой знания в линуксе
А их будут проверять? Скорее всего зададут вопросы какие-нибудь. Или ты думаешь тебе скажут "ВОТ ТЕБЕ КОНСОЛЬ - УДИВИ НАС ЗА 5 МИНУТ"?
Вот я как раз о том же, на простом коде без цикла я задание выполнил, но вот с перебором массивов мозг вырубается, спасибо за подсказку большое, буду копать дальше, уже что-то получается)
Спасибо, учту это
Если сумеешь на vds задеплоить свой проект - этого достаточно
> $table->json('tags');
Теги обычно делают через отношение многие-ко-многим, иначе неудобно по тегу искать тесты. Плюс, невозможно будет указать несуществующий тег (а с JSON это возможно). Тем более, что таблица тегов у тебя уже есть.
Связи между таблицами (userId) надо делать не как колонку типа integer, а как внешние ключи: https://laravel.com/docs/8.x/migrations#foreign-key-constraints
У тебя ответы и время прохождения теста привязаны к пользователю. Но это неправильно. Что, если пользователь попытается несколько раз пройти один и тот же тест? Как ты поймешь, какой ответ к какому прохождению относится?
Правильнее сделать сущность "попытка сдачи теста" или "сессия" и привязывать ответы и время прохождения к ней.
Не хватает комментариев к полям БД. Например, непонятно, что значит поле done в тесте и в answers.
В questions поле type логично было бы сделать типом enum, а не string.
> https://github.com/deadj/testhub/blob/master/database/factories/QuestionFactory.php
Здесь странно, что ты задаешь id явно. Это не позволит создать более одного вопроса.
Что касается внешних связей (вроде поля testId), как я понял из документации, их обычно явно задают в коде теста. То есть ты в коде теста создаешь тест с вопросами с помощью has(): https://laravel.com/docs/8.x/database-testing#factory-relationships
> https://github.com/deadj/testhub/blob/master/routes/web.php
Здесь URL выглядят довольно хаотично. Обычно URL формируют по принципу "ресурс/идентификатор" или "ресурс/действие". Например, можно было бы сделать так:
/new -> /tests/new (или /admin/tests/new, если хочется выделить для админки отдельный URL)
/getTags -> /tags
/publish/{id} -> /tests/{id}/publish
/{id}/preface -> /tests/{id}/preface (хотя тут можно оставить /{id}/preface, если хочется более короткий URL для теста)
/addTest -> /tests/add
/addQuestion -> /tests/{id}/questions/add
То есть у нас /tests/ как бы представляет "все тесты", /tests/{id}/ - один конкретный тест.
> https://github.com/deadj/testhub/blob/master/app/Http/Controllers/TestsController.php
> private function getRealPage
Здесь можно сократить код за счет функции min().
Также, этот контроллер очень толстый. Функцию поиска/отбора тестов можно было бы поместить в модель или в сервис. То, есть там мог бы быть просто вызов:
$tests = Test::listPublished($search);
Вместо того, чтобы вручную каждый раз указывать условие WHERE done = 1 , ты мог бы создать скоуп "published", и писать Tests::published(), как описано тут: https://laravel.com/docs/8.x/eloquent#local-scopes
Скоуп также позволит упростить это условие:
> if (Test::where('id', $id)->doesntExist() || Test::find($id)->done == 0) {
Расчет пагинации можно было бы вынести в какую-нибудь утилиту (а может, уже есть что-то готовое). Чтобы можно было написать что-нибудь вроде
[$tests, $testsCount] = paginate($tests, $page, $perPage);
или:
$pager = new Pager($tests, $page, $perPage);
echo $pager->getTotalPages();
Наверняка что-то стандартное для пагинации есть.
Эту строчку тоже скорее всего стоило бы заменить на вызов метода Question::countMaxBalls(Test $t):
> $maxBalls = Question::where('testId', $id)->sum('balls');
Так как завтра алгоритм подсчета суммы баллов может как-то поменяться, и придется лазать по коду и искать все места, где он был реализован.
> if (!$request->cookie('userId')) {
> $user = new User();
> $user->save();
>
> $this->addTestTime($user->id, $id);
Опять, этот код, отвечающий за старт теста, описан прямо в контроллере. Неправильно. Правильнее в модели или сервисе сделать метод startTest(). Куки из сервиса проставлять нельзя, но это не беда. Аналогично метод checkTestTime тоже стоило бы вынести из контроллера в сервис. Сохранение вопроса вынести в метод saveAnswer(), и так далее.
Также, ты очень странно работаешь с отношениями между сущностями:
> $answer->userId = $request->cookie('userId');
Это должно быть реализовано через отношения ( https://laravel.com/docs/8.x/eloquent-relationships#introduction ) и ты должен сохранять в answer не циферку, а объект User. В твоем коде вообще нет проверки, что такой юзер существует, а ведь в куке может прийти любое число.
> if (!$request->cookie('userId') ||
> Result::where([
> ['userId', $request->cookie('userId')],
> ['testId', $id]
> ])->count() == 0) {
Это скопипастено много раз, надо вынести в метод.
> public function setUserName(Request $request): void
>{
> User::find($request->cookie('userId'))->update(['name' => $request->userName]);
Здесь очень ненадежно реализована "авторизация". Мы можем поставить себе в куку id любого пользователя и менять ему имя, проходить от его имени тесты. Правильнее было бы хранить в куке не id, а трудноподбираемый случайный токен.
Для авторизации в Laravel, кстати, есть что-то готовое, стоило бы изучить и использовать.
> if ($type == "oneAnswer" || $type == "multipleAnswers" || $type == "textAnswer") {
Здесь надо использовать константы из класса Question.
> $minNum = $trueAnswer[0] - $trueAnswer[1];
Оказывается, trueAnswer может быть и строкой, и массивом. Неожиданно, такие вещи надо комментировать в коде. А метод checkAnswer логичнее бы разместить в модели Question.
Сейчас код, который разбирает или формирует поле trueAnswer, размазан по контроллерам. Завтра добавится новый тип ответа, и ты будешь бегать по всему коду и искать нужные места? Правильнее поместить его в модели, сделав в ней методы checkAnswer(), setSingleAnswer (для единого ответа), setAnswerRange (для числа с погрешностью) итд.
Ты вручную декодируешь/кодируешь JSON при добавлении или извлечении из модели. Это как-то неправильно. Надо либо сделать геттеры/сеттеры, которые будут это делать, либо посмотреть в сторону https://laravel.com/docs/8.x/eloquent-mutators#introduction
> $balls = Question::where('testId', 15)->get()->sum('balls')
Что здесь за магическое число 15?
> public function changeOrderOfQuestionNumbers(Request $request)
Тут не видно никакой авторизации и проверки, что пользователь имеет право редактировать тест.
> https://github.com/deadj/testhub/blob/master/tests/Feature/NewTestControllerTest.php
> public function testGetTags()
> ->assertJson(['this', 'is', 'tag']);
Здесь ты полагаешься на определенный порядок тегов в ответе, а они не обязаны вернуться в таком порядке. Лучше использовать сравнение массивов, игнорируя порядок: https://stackoverflow.com/questions/3838288/phpunit-assert-two-arrays-are-equal-but-order-of-elements-not-important
Что касается тестов, хорошо, что они есть. Но они проверяют в основном базовые вещи: то, что определенная страница открывается. Хорошо бы еще проверять более тщательно особенности работы той или иной страницы, например:
- что при создании теста не только возвращается 200, но и появляется новый тест
- что при добавлении вопроса в тесте появляется этот вопрос
- что правильный ответ засчитывается как правильный, а неправильный как неправильный
- что в решенном тесте правильно проставляется сумма баллов
- что при создании теста правильно определяется макс. кол-во баллов
- что счетчик прошедших тест увеличивается после прохождения
- что тест можно найти по названию
- что тест можно найти по тегу
- ...
В общем, что надо доработать:
- сделать везде безопасную и надежную авторизацию
- получше изучить предоставляемые Laravel возможности и использовать их
- научиться не писать бизнес-логику стеной в контроллере, а писать его в моделях и сервисах. Это не значит, что контроллеры должны быть пустыми, просто надо научиться понимать, что куда относится.
- более тщательно покрыть тестами
> $table->json('tags');
Теги обычно делают через отношение многие-ко-многим, иначе неудобно по тегу искать тесты. Плюс, невозможно будет указать несуществующий тег (а с JSON это возможно). Тем более, что таблица тегов у тебя уже есть.
Связи между таблицами (userId) надо делать не как колонку типа integer, а как внешние ключи: https://laravel.com/docs/8.x/migrations#foreign-key-constraints
У тебя ответы и время прохождения теста привязаны к пользователю. Но это неправильно. Что, если пользователь попытается несколько раз пройти один и тот же тест? Как ты поймешь, какой ответ к какому прохождению относится?
Правильнее сделать сущность "попытка сдачи теста" или "сессия" и привязывать ответы и время прохождения к ней.
Не хватает комментариев к полям БД. Например, непонятно, что значит поле done в тесте и в answers.
В questions поле type логично было бы сделать типом enum, а не string.
> https://github.com/deadj/testhub/blob/master/database/factories/QuestionFactory.php
Здесь странно, что ты задаешь id явно. Это не позволит создать более одного вопроса.
Что касается внешних связей (вроде поля testId), как я понял из документации, их обычно явно задают в коде теста. То есть ты в коде теста создаешь тест с вопросами с помощью has(): https://laravel.com/docs/8.x/database-testing#factory-relationships
> https://github.com/deadj/testhub/blob/master/routes/web.php
Здесь URL выглядят довольно хаотично. Обычно URL формируют по принципу "ресурс/идентификатор" или "ресурс/действие". Например, можно было бы сделать так:
/new -> /tests/new (или /admin/tests/new, если хочется выделить для админки отдельный URL)
/getTags -> /tags
/publish/{id} -> /tests/{id}/publish
/{id}/preface -> /tests/{id}/preface (хотя тут можно оставить /{id}/preface, если хочется более короткий URL для теста)
/addTest -> /tests/add
/addQuestion -> /tests/{id}/questions/add
То есть у нас /tests/ как бы представляет "все тесты", /tests/{id}/ - один конкретный тест.
> https://github.com/deadj/testhub/blob/master/app/Http/Controllers/TestsController.php
> private function getRealPage
Здесь можно сократить код за счет функции min().
Также, этот контроллер очень толстый. Функцию поиска/отбора тестов можно было бы поместить в модель или в сервис. То, есть там мог бы быть просто вызов:
$tests = Test::listPublished($search);
Вместо того, чтобы вручную каждый раз указывать условие WHERE done = 1 , ты мог бы создать скоуп "published", и писать Tests::published(), как описано тут: https://laravel.com/docs/8.x/eloquent#local-scopes
Скоуп также позволит упростить это условие:
> if (Test::where('id', $id)->doesntExist() || Test::find($id)->done == 0) {
Расчет пагинации можно было бы вынести в какую-нибудь утилиту (а может, уже есть что-то готовое). Чтобы можно было написать что-нибудь вроде
[$tests, $testsCount] = paginate($tests, $page, $perPage);
или:
$pager = new Pager($tests, $page, $perPage);
echo $pager->getTotalPages();
Наверняка что-то стандартное для пагинации есть.
Эту строчку тоже скорее всего стоило бы заменить на вызов метода Question::countMaxBalls(Test $t):
> $maxBalls = Question::where('testId', $id)->sum('balls');
Так как завтра алгоритм подсчета суммы баллов может как-то поменяться, и придется лазать по коду и искать все места, где он был реализован.
> if (!$request->cookie('userId')) {
> $user = new User();
> $user->save();
>
> $this->addTestTime($user->id, $id);
Опять, этот код, отвечающий за старт теста, описан прямо в контроллере. Неправильно. Правильнее в модели или сервисе сделать метод startTest(). Куки из сервиса проставлять нельзя, но это не беда. Аналогично метод checkTestTime тоже стоило бы вынести из контроллера в сервис. Сохранение вопроса вынести в метод saveAnswer(), и так далее.
Также, ты очень странно работаешь с отношениями между сущностями:
> $answer->userId = $request->cookie('userId');
Это должно быть реализовано через отношения ( https://laravel.com/docs/8.x/eloquent-relationships#introduction ) и ты должен сохранять в answer не циферку, а объект User. В твоем коде вообще нет проверки, что такой юзер существует, а ведь в куке может прийти любое число.
> if (!$request->cookie('userId') ||
> Result::where([
> ['userId', $request->cookie('userId')],
> ['testId', $id]
> ])->count() == 0) {
Это скопипастено много раз, надо вынести в метод.
> public function setUserName(Request $request): void
>{
> User::find($request->cookie('userId'))->update(['name' => $request->userName]);
Здесь очень ненадежно реализована "авторизация". Мы можем поставить себе в куку id любого пользователя и менять ему имя, проходить от его имени тесты. Правильнее было бы хранить в куке не id, а трудноподбираемый случайный токен.
Для авторизации в Laravel, кстати, есть что-то готовое, стоило бы изучить и использовать.
> if ($type == "oneAnswer" || $type == "multipleAnswers" || $type == "textAnswer") {
Здесь надо использовать константы из класса Question.
> $minNum = $trueAnswer[0] - $trueAnswer[1];
Оказывается, trueAnswer может быть и строкой, и массивом. Неожиданно, такие вещи надо комментировать в коде. А метод checkAnswer логичнее бы разместить в модели Question.
Сейчас код, который разбирает или формирует поле trueAnswer, размазан по контроллерам. Завтра добавится новый тип ответа, и ты будешь бегать по всему коду и искать нужные места? Правильнее поместить его в модели, сделав в ней методы checkAnswer(), setSingleAnswer (для единого ответа), setAnswerRange (для числа с погрешностью) итд.
Ты вручную декодируешь/кодируешь JSON при добавлении или извлечении из модели. Это как-то неправильно. Надо либо сделать геттеры/сеттеры, которые будут это делать, либо посмотреть в сторону https://laravel.com/docs/8.x/eloquent-mutators#introduction
> $balls = Question::where('testId', 15)->get()->sum('balls')
Что здесь за магическое число 15?
> public function changeOrderOfQuestionNumbers(Request $request)
Тут не видно никакой авторизации и проверки, что пользователь имеет право редактировать тест.
> https://github.com/deadj/testhub/blob/master/tests/Feature/NewTestControllerTest.php
> public function testGetTags()
> ->assertJson(['this', 'is', 'tag']);
Здесь ты полагаешься на определенный порядок тегов в ответе, а они не обязаны вернуться в таком порядке. Лучше использовать сравнение массивов, игнорируя порядок: https://stackoverflow.com/questions/3838288/phpunit-assert-two-arrays-are-equal-but-order-of-elements-not-important
Что касается тестов, хорошо, что они есть. Но они проверяют в основном базовые вещи: то, что определенная страница открывается. Хорошо бы еще проверять более тщательно особенности работы той или иной страницы, например:
- что при создании теста не только возвращается 200, но и появляется новый тест
- что при добавлении вопроса в тесте появляется этот вопрос
- что правильный ответ засчитывается как правильный, а неправильный как неправильный
- что в решенном тесте правильно проставляется сумма баллов
- что при создании теста правильно определяется макс. кол-во баллов
- что счетчик прошедших тест увеличивается после прохождения
- что тест можно найти по названию
- что тест можно найти по тегу
- ...
В общем, что надо доработать:
- сделать везде безопасную и надежную авторизацию
- получше изучить предоставляемые Laravel возможности и использовать их
- научиться не писать бизнес-логику стеной в контроллере, а писать его в моделях и сервисах. Это не значит, что контроллеры должны быть пустыми, просто надо научиться понимать, что куда относится.
- более тщательно покрыть тестами
Спасибо, буду пробовать.
напиши борду простенькую. чтоб можно было треды создавать и отвечать в них.
На меня снизошло откровение, и я до этого сом дошел.
Ты говоришь про DTO (data transfer object). Вообще эта история довольно широкая и неоднозначная. Все зависит от используемого стека, иногда DTO - это зло.
В первом посте есть задача про список студентов. Она хороша тем, что к ней идет большое пояснение, что и как лучше делать, чтобы не наступить на грабли.
С чего сразу DTO ? Если мы туда пихаем данные из формы, то это сразу DTO что ли? Может у чела обычный VO (Value Object) и модель просто агрегирует этой структурой
Ну примерный случай - это очень маленькие приложения, либо приложения с большим количеством маленьких сабмодулей, в таких случаях прибегают к использованию доменных объектов в обход посредников, если архитектура вцелом такое позволяет конечно, например не используется active record.
>>1977613
>сразу DTO
>обычный VO (Value Object)
Тебе нужно внимательнее почитать про эти паттерны, няш.
Любой DTO == data class, но не любой data class == DTO, няш.
$data = new PostData($_POST);
$post = new Post($data)
Что скажешь, это тоже DTO?
во-первых прокачивай общую адекватность и бизнес-этику
на собеседовании постарайся быть (а не казаться) адекватным воспитанным челом
из фреймворков -- успеешь попробовать лёгкий Laravel или Yii, от сложной Симфони можно сразу ёбнуться
Чего сложного в Симфони относительно Ларавеля? В Ларавеле чтобы что-то написать нормально надо изучить как вся его долбанутая магия работает.
>В Ларавеле чтобы что-то написать нормально надо изучить как вся его долбанутая магия работает.
А о какой собсна магии речь идет? Я постоянно слышу про магию в ларавеле, я знаю что там есть свои приколы с Eloquent и магическими геттерами и сетерами, всё настолько тут запущено что даже плагина нормального нет который бы парсил это говно в автодополнение. А кроме ормки что еще то?
>Чего сложного в Симфони относительно Ларавеля?
На симфони довольно сложно писать плохой код. На ларавеле же можно наговнякать всё что угодно вообще не задумываясь, и это будет работать.
>В Ларавеле чтобы что-то написать нормально надо изучить как вся его долбанутая магия работает.
Это чтобы нормально написать. Вот только нормально на ларавеле никто не пишет, не для этого он создан.
>>1977963
>всё настолько тут запущено что даже плагина нормального нет который бы парсил это говно в автодополнение
Есть платный плагин от Аделя Файзрахманова
Хотя, может этот плагин такого и не умеет. Адель же вроде писал в своей книжке, что он докблоки для каждого свойства расставляет.
>На симфони довольно сложно писать плохой код. На ларавеле же можно наговнякать всё что угодно вообще не задумываясь, и это будет работать.
На Симфони тоже можно говнякать как хочется, ну лазай в контроллере сырыми запросами с инъекциями, кто тебе помешает. И данные принимай как json_decode() от raw body.
Чтобы написать что-то классное нужен опыт, погружение в предметную область и знание хотелок юзеров. Всего этого нет у новичка, поэтому бери и пиши что-то простое и известное борду/галерею/файлопомойку
>Что такое борда?
Мы с тобой щас на ней сидим
>И под файлопомойкой ты файлообменник подразумеваешь?
Да, типа меги или ргоста
Я слышал, что симфони - это примерно то же самое, что джавовский спринг. Составляет ли симфони в таком случае реальную конкуренцию джаве?
И еще, пхп ругают за всё, за что только можно, порой пхпшников за программистов не считают, но почему в таком случае есть банки, чьи сайты написаны на битриксе?! И это не единичные случаи. Уж битрикс-то ругают вообще просто 99 человек из 100. Но ведь банки - это как раз и есть самый что ни на есть энтерпрайз! Выходит, битрикс не так плох, как все говорят? Или плох? Банки ведь не дураки, и не стали бы использовать что-то плохое и дырявое для своих сайтов.
> пхп ругают за всё, за что только можно
Любой популярный ЯП ругают
> но почему в таком случае есть банки, чьи сайты написаны на битриксе
Если это по сути сайт-визитка, его можно и на вордпрессе сделать. Весь финансовый функционал в банках уж точно не на ПХП крутится.
Ругают любой, но одно дело, ругать популярную джаву или сишарп, которые являются столпами рпомышленной разработки, другое дело - выслушивать такие же упреки в адрес пхп. Отсуда у меня и возникает вопрос, есть ли место в промышленной разработке для пхп.
Отсюда*
>Я слышал, что симфони - это примерно то же самое, что джавовский спринг.
Я такое тоже слышал. Может кто-то расскажет, зачем тогда нужна симфони? Просто чтобы в два раза меньше разработчикам платить, чем на спринге?
Аноны, какой сложности алгоритмы вам приходилось использовать?
Как хорошо нужно знать алгоритмы? Я просто помню когда решал задачу про банкомат в ОП мануале чуть не офигел (не помню сколько недель я потратил на ее решение). А это задачи для новичков, что дальше будет я боюсь представить.
Ну и с матаном аналогично?
Планирую вкатываться в бэк на пыхе. Но для начала, хочу освойть фронт стек. Какому фреймворку уделить внимание? Vuejs? Или также нужен react?
Нужно основать профсоюз пыхарей и бороться с этой хуйней.
Если взлетит, то язык наконец-то умрет, так как пропадет его последнее преимущество
Последнее преимущество это низкий порог вхождения, но разработчики пыха решили пофиксить это досадное недоразумение
Какую БД используете для тестов?
MySQLi и гоняете тесты в памяти?
Или же создаете отдельную тестовую БД и там тестируете?
Мне интересно узнать предпочтения. Если ещё поясните свой выбор, то было бы вообще замечательно.
И в каком месте он сложнее стал по сравнению с каким-то 5.6? По моему всё легче и легче: тайпхинты, всяческий синтаксический сахар и прочие вкусности.
Если сможет скинуть с себя оковы фасадов и актив рекорда, то нет
Лол, мейнтейнеры PHP обосрались со своим репозиторием, поэтому переезжают на житхаб как на основную площадку.
Возможно они таким образом держат у себя стек недорогих стажеров-разнорабочих, которых выпиннывают через месяц и нанимают новых. 15к в ДС это пиздец вообще, наверное на проезд только хватит.
>ругать популярную джаву или сишарп
А пхп непопулярный?
>есть ли место в промышленной разработке для пхп
Открой вакансии, да посмотри, где пхп используют
инб4: там, где не захотели переплачивать сишарп/джава-пидорам
Тоже так думаю, бизнес по-русски...
И какой вариант тогда, как вкатиться в пых? Может напрямую компаниям писать? Сорян, за глупый вопрос. В отчаянии немного...
Зачем тебе и фронт и бек? Выбери что-то одно, доработай до мидла и тогда уже думай о фулстеке
>как вкатиться в пых?
Как и в любой другой макако-стек: выучить платину вопросов на собесы, сделать спиздить пет, нарисовать опыта в резюме, апплаиться на удаленку на вакансии мидла
спс, учту
буду работать над этим...
>>1980391
>Опыт работы с 1С-Битрикс / Wordpress / Laravel / Symfony.
>Это говно-вакансия?
Хмм, ну даже не знаю....
>>1980405
>15к в ДС это пиздец вообще, наверное на проезд только хватит.
Неделю назад на dou висела эта же вакансия на удаленку, описание один в один. Для интереса только что нашел в архиве - пишет 350-600$. Джуны из украинских деревень стоят дороже, лол?
После работы прихожу, и с настроеним "Фух, ну можно и отдохнуть" начинаю пилить что-то на ларавеле и вью.
Может прозвучит самоуверенно, но я знаю кодить, и знаю как вникнуть во что-то относительно непростое за пару дней(наверное у меня такое ощущение просто на фоне тех, кто со мной работает, и ничего не понимает в принципе), и начать что-то делать.
Проблема в том, что у меня 0 релевантного опыта. Полтора года назад я себе накинул год опыта ларавела в выдуманной студии, но на собесах сразу понял что это всё хуйня, все понимают кто я есть на самом деле буквально за пару минут. И дело даже не в этом, я сам понял что в случае с опытом никакие углы не срезать, это реально просто нужно иметь, и это мне нужно.
Я даже свой текущий опыт не могу назвать коммерческим, потому что мой код никто никогда не проверял, никто не говорил как можно сделать по-другому.
У меня уже просто была мысль никому не врать, сказать как есть и надеяться что кто-то в меня поверит. Я даже не знаю как себя охарактеризовать, наверное я джун, с потенциалом в мидла спустя месяца 3-4 в нормальной фирме. Ну и проблема еще в технологиях, вроде имею опыт со многим, но на каких-то вообще минимальных уровнях. Редис? ну как kv хранилище использовал, всё, больше юзкейсов не было. Эластиксерч? Ну как-то настраивал индексацию с заумными фильтрами по доке, ну и всё на этом, больше не трогал никогда. В последнее время вообще очень много фронтом занимался, хоть там меня не ограничивают в стеке особо, понял как относительно правильно писать на вью, попробовал даже новые хуки, очень понравилось. Короче вроде уже и проработал, и денег заработал, и даже апнул софтскиллы некоторые, но сейчас как будто снова вкат как в первый раз будет. Еще постоянная тревога, что я не стою тех денег, которые мне платят. Мне даже как-то неловко штуку просить, хотя понимаю что это обычная зарплата и всем ок.
После работы прихожу, и с настроеним "Фух, ну можно и отдохнуть" начинаю пилить что-то на ларавеле и вью.
Может прозвучит самоуверенно, но я знаю кодить, и знаю как вникнуть во что-то относительно непростое за пару дней(наверное у меня такое ощущение просто на фоне тех, кто со мной работает, и ничего не понимает в принципе), и начать что-то делать.
Проблема в том, что у меня 0 релевантного опыта. Полтора года назад я себе накинул год опыта ларавела в выдуманной студии, но на собесах сразу понял что это всё хуйня, все понимают кто я есть на самом деле буквально за пару минут. И дело даже не в этом, я сам понял что в случае с опытом никакие углы не срезать, это реально просто нужно иметь, и это мне нужно.
Я даже свой текущий опыт не могу назвать коммерческим, потому что мой код никто никогда не проверял, никто не говорил как можно сделать по-другому.
У меня уже просто была мысль никому не врать, сказать как есть и надеяться что кто-то в меня поверит. Я даже не знаю как себя охарактеризовать, наверное я джун, с потенциалом в мидла спустя месяца 3-4 в нормальной фирме. Ну и проблема еще в технологиях, вроде имею опыт со многим, но на каких-то вообще минимальных уровнях. Редис? ну как kv хранилище использовал, всё, больше юзкейсов не было. Эластиксерч? Ну как-то настраивал индексацию с заумными фильтрами по доке, ну и всё на этом, больше не трогал никогда. В последнее время вообще очень много фронтом занимался, хоть там меня не ограничивают в стеке особо, понял как относительно правильно писать на вью, попробовал даже новые хуки, очень понравилось. Короче вроде уже и проработал, и денег заработал, и даже апнул софтскиллы некоторые, но сейчас как будто снова вкат как в первый раз будет. Еще постоянная тревога, что я не стою тех денег, которые мне платят. Мне даже как-то неловко штуку просить, хотя понимаю что это обычная зарплата и всем ок.
>Полтора года назад я себе накинул год опыта ларавела в выдуманной студии, но на собесах сразу понял что это всё хуйня, все понимают кто я есть на самом деле буквально за пару минут
Ну так нужен хоть какой-то опыт работы с ларой. Молодец, что пет на ней пишешь.
>Я даже свой текущий опыт не могу назвать коммерческим, потому что мой код никто никогда не проверял, никто не говорил как можно сделать по-другому.
Коммерческий код - который крутится на продакшене и приносит прибыль. Это может быть и вылизанный на код ревью и залитый по фтп код.
>У меня уже просто была мысль никому не врать, сказать как есть и надеяться что кто-то в меня поверит
С текущими реалиями рынка маловероятно. Вкатунов толпы.
Апай скилы, пили пет на ларе, штурмуй собесы
>Еще постоянная тревога, что я не стою тех денег, которые мне платят
Тебе наверняка еще и недоплачивают.
>Мне даже как-то неловко штуку просить, хотя понимаю что это обычная зарплата и всем ок.
Это зп джуна
1. Дрочу по верстку по хтмлакадемии - интерактивный курс за 600р на месяц + пиздженные курсы (м.б. барбик сверстаю).
2. Пижжу курсы Кудлая по пхп, смотрю их, дрочу книгу Скляра по пхп.
3. Наворчиваю Кантора по жсу.
4. Решаю задачки ОПа вплоть до списка студентов.
5. Пижжу курсы Кудлая по ларе и MySql, ларакасты, пишу борду/магазин/блог/рсс-читалку
6. Хожу по собесам, принимаю струи мочи на лицо
7. Вкатываюсь
8. Работаю год, дописываю пет из пункта 5, монетизирую, вывожу на IPO, становлюсь миллиардером
Думаю все займет месяцев 8-9 фултайм учебы. Что скажете, что язабыл? Надо ли вью.жс задрачивать для первой работы? На чем чаще джуны срезаются? Что по советуете?
ну проблема в том, тчо ты задаешь эти вопросы аа не делаешь, я сам вот вкатываюсь, но блять тебе отвечаю, чем трачу свое время, так что пищи код молча и работай
> Я просто помню когда решал задачу про банкомат в ОП мануале чуть не офигел
Я чет совсем обмяк от нее, даже желание пропало что-то делать (жадным алгоритмом сделал почти сразу, а вот дальше...)
зачем нужна перезагрузка страниц (формы) после отправки товара в корзину?
есть корзина, все в одно, где и товар и финалка заказа
можно нажать на плюс в товаре и добавить вторую копию, js покажет новые данный, но вот форму уже выслать не получаеться, пока не сделать релоад страницы.
почему так? и если ли варианты как это переделать?
сама страница корзини не обрабатывает заказ, это делает другой файл на бекенде, но корзина обрабатывает товар, чтобы правильно показать конфигурацию, допустим когда собираешь себе комп
Двачую этого. Курсы по айти - клеймо дэбила. Неважно, оплаченные или пизженные.
> зачем нужна перезагрузка страниц
Сейчас есть возможность вообще сделать весь твой сервис без единой перезагрузки (SPA), например, посмотри как работает ВК.
В твоем случае скорее всего не стали заморачиваться с аяксом и сделали по старинке. Перезагрузка страницы при отправке формы это стандартное поведение.
> если ли варианты как это переделать?
Скорее всего да, но не видя как у тебя там реализовано - сказать трудно.
Если кратко, ты вместо дефолтного экшена формы делаешь этот экшен аяксом. Через JS сериализуется форма, отправляется запрос и принимается ответ. Потом уже исходя из ответа ты совершаешь какие-то действия, показываешь уведомление что все ок, либо ошибку. На бэкенде соответственно должен быть обработчик, который будет возвращать респонс, например в JSON формате.
Не опускай руки, отдохни, и вернись к задаче. Можешь на мелкие куски разбить задачу, как вариант.
У тебя хоть какой-то опыт есть. Попробуй по собесам походить. Не зацикливайся на себе, от этого хуже только. И удачи тебе анон.
двачую анона
привет, спасибо
товар летит с сесия[корзина]
на странице корзины все товары загружаються, но только более скожно.
ибо есть разные товары и конфигурации товаров.
но, суть в том что з сесия[корзина] прилетает имя, и уже на странице корзины по этому имени все подружаеться с базы и собираеться в один товар.
ну и дале готовые товары летат в джейсон.
дальше стандартная форма пхп на "куда доставить и что написать".
и все операции на показ товаров производит вю, но задача вю только в том чтобы правильно показать товац, цену и походные.
сам вю может только аяксом выслать в сесия[корзина] еще один такой товар (или отнять) и все. и при этом отнят товар можна без перезагрузки, почему так? и все рабатет.
дальше обычная кнопка в форме высылает товар на бекенд, который уже и проводит все проверки и все что нужно для заказа.
ну вот и вроде сама корзина ничего не делает, а перезагрузка страницы очень напрягает. а как сделать я хз. опыта не хватает чтобы понять в чем суть.
> странице корзины по этому имени все подружаеться с базы
Чего? Т.е. ты выборку не по ID делаешь, а по названию товара?
> при этом отнят товар можна без перезагрузки
Видимо, потому что функционал удаления товара из корзины без перезагрузки сделать гораздо проще чем добавление. Кинул аяксом запрос на удаление и удалил строку с товаром. А вот чтобы добавить - это уже сложнее. Нужно кинуть запрос, обработать ответ, сформировать код для вывода и собственно вывести его, плюс, навесить обработчики действий для новой строки с товаром.
Короче, смотри куда ведет форма добавления товара и по аналогии с удалением сделай добавления. Т.к. у тебя там вью, я хз как правильно это сделать, к сожалению с вью не работал почти.
Похуй-не похуй.
Разрабу нужна практика, чтобы на собесе было о чем поговорить.
Спросят так: Сыч, а как бы ты сделал хуйню_нейм? А ты её уже делал и рассказываешь.
> Сыч, а как бы ты сделал хуйню_нейм? А ты её уже делал и рассказываешь.
В идеале ты должен рассказать несколько способов как можно сделать хуйню_нейм и пояснить достоинства и недостатки каждого способа. Тогда к тебе точно вопросов не будет.
Альтернативные способы так же придут по мере работы с петом
>1) сделать по принципу работы счетчика за электричество. Как он работает? Изначально все цифры на нем равны 0, например 0000. Затем увеличивается последняя цифра, когда она доходит до 9, она сбрасывается в 0 и увеличивается предыдущая (получается 0010). И так далее, до комбинации вроде 9999.
Ты можешь точно так же увеличивать число купюр.Сначала увеличивать самую младшую, потом сбросить ее в ноль и увеличить следующую, итд. Только разница в том, что максимальное число купюр будет не 9, а какое-то другое число, и для каждой купюры свое. То есть, начать с комбинации 0 0 0 0 и идти до максимально возможной.
Вот кто-нибудь вообще внятно может объяснить как это сделать и в чем тут прикол?
Увеличил последнюю, занулил, дальше следующую, также зануляется, в итоге приходим к числу 1 0 0 0, и что дальше с этим делать? Как-то не доходит до меня уже который день, вот в моем случае решением является комбинация 0 3 0 3, как мне ее получить если решать "счетчиком"?
Ну да я тупой и что...
Спасибо за поддержку, для меня это важно
да, по названию, как-то так работает вся система, но там специфика такая.
я немного посидел, и получилось так, что все работает с добавлением товара, тоооолько, форма принимает токен вначале создания файла.
а когда добавляешь новый новар, то токен сесии уже другой получаеться, что логично.
я попытался после аякс поста сделать запрос на доп станицу по новый токен сесии, ну и подставить сразу новый токен в форму.
и все, валидация на заказ прошла успешно по стороне бекенда.
только льзя ли так? вроде все просто? но каженться, что это очень дырявая система получаеться, или нет?
Допустим, у нас такой набор купюр:
5x500
2x200
13x100
Мы начинаем с комбинации 0 0 0. Проверяем, подходит ли она нам. Затем увеличиваем кол-во последней купюры, получается 0 0 1 (0x500 + 0x200 + 1x100). Проверяем ее, затем переходим к 0 0 2. Затем 0 0 3 и так до 0 0 13.
Так как купюр по 100 у нас всего 13 штук, то комбинации 0 0 14 быть не может. Поэтому мы сбрасываем последнюю цифру в 0 и увеличиваем предпоследнюю. Получается 0 1 0. Затем берем 0 1 1, 0 1 2, 0 1 3 и так до 0 1 13. Затем снова сбрасываем последнюю цифру и берем 0 2 0. Затем 0 2 1, 0 2 2 ... и до 0 2 13. Здесь мы достигли предела по последней и предпоследней купюре. Увеличивать их дальше некуда. Потому мы сбрасываем их и переходим к комбинации 1 0 0. После этого мы перебираем такие комбинации:
1 0 1
1 0 2
...
1 0 13
1 1 0
1 1 1
1 1 2
...
1 1 13
1 2 0
1 2 1
...
1 2 13
Тут мы переходим к комбинации 2 0 0 и по такому же принципу проверяем все остальные комбинации (2 0 1, 2 0 2 ... 2 2 13, 3 0 0...)
Последняя комбинация будет 5 2 13. Когда мы дойдем до нее, это значит, что мы перебрали все возможные комбинации и перебирать больше нечего. Если мы до сих пор не смогли подобрать нужную сумму, значит это невозможно.
Твоя ошибка в том, что ты пропустил часть комбинаций. Когда ты увеличиваешь вторую с конца цифру, ты снова должен перебрать все значения последней цифры.
Допустим, у нас такой набор купюр:
5x500
2x200
13x100
Мы начинаем с комбинации 0 0 0. Проверяем, подходит ли она нам. Затем увеличиваем кол-во последней купюры, получается 0 0 1 (0x500 + 0x200 + 1x100). Проверяем ее, затем переходим к 0 0 2. Затем 0 0 3 и так до 0 0 13.
Так как купюр по 100 у нас всего 13 штук, то комбинации 0 0 14 быть не может. Поэтому мы сбрасываем последнюю цифру в 0 и увеличиваем предпоследнюю. Получается 0 1 0. Затем берем 0 1 1, 0 1 2, 0 1 3 и так до 0 1 13. Затем снова сбрасываем последнюю цифру и берем 0 2 0. Затем 0 2 1, 0 2 2 ... и до 0 2 13. Здесь мы достигли предела по последней и предпоследней купюре. Увеличивать их дальше некуда. Потому мы сбрасываем их и переходим к комбинации 1 0 0. После этого мы перебираем такие комбинации:
1 0 1
1 0 2
...
1 0 13
1 1 0
1 1 1
1 1 2
...
1 1 13
1 2 0
1 2 1
...
1 2 13
Тут мы переходим к комбинации 2 0 0 и по такому же принципу проверяем все остальные комбинации (2 0 1, 2 0 2 ... 2 2 13, 3 0 0...)
Последняя комбинация будет 5 2 13. Когда мы дойдем до нее, это значит, что мы перебрали все возможные комбинации и перебирать больше нечего. Если мы до сих пор не смогли подобрать нужную сумму, значит это невозможно.
Твоя ошибка в том, что ты пропустил часть комбинаций. Когда ты увеличиваешь вторую с конца цифру, ты снова должен перебрать все значения последней цифры.
Не знаю, можно ли это сделать в Laravel, но один из вариантов такой:
- используется отдельная БД (чтобы данные из БД не мешали тестам)
- если надо, перед тестами в нее загружаются справочники (например: списки стран, городов)
- далее, перед каждым тестом открывается транзакция, а после теста откатывается. Таким образом, все, что тест сохранил в БД, из нее удаляется автоматически.
Вообще, по моим ощущениям, все нужные записи в БД лучше всего создавать в самом тесте. Есть вариант, когда перед тестами БД заполянется (например, с помощью seeders), но это плохо тем, что ты не можешь определить, для чего добавлена та или иная запись в БД, каким тестам она нужна. То есть получается свалка из непонятно к какому тесту относящихся данных. А когда ты нужные записи создаешь в тесте, такой проблемы нету.
В яве не все идеально. Вот простые примеры:
- в PHP можно сравнить строки как $a == $b, в яве нельзя
- в PHP легко вернуть из функции 4 значения разных типов через массив: [$a, $b, $c, $d]= some_func(), а как это сделать в яве? Почему туда до сих пор не завезли возврат нескольких значений?
Ява более многословная и код, решающий одну задачу, в ней может получиться больше по объему, чем в PHP. Хотя у нее и немало плюсов, например, богаче синтаксис, быстрее скорость работы. Недаром в Андроиде много кода написано на яве.
>в PHP легко вернуть из функции 4 значения разных типов через массив: [$a, $b, $c, $d]= some_func()
Часто такое на проде видел?
Выглядит как попытка заменить объект массивом
К слову в го возврат нескольких значений - та еще залупа
Лол, ну ты бы хоть ошибку показал, а не эту хуйню. Ты нахуй апач как службу то поставил? Не еби мозг поставь openserver, laragon или denwer какой-нибудь. А в идеале вообще лучше в виртуалке это все делать, чтобы свою систему не засирать.
В Го как раз сделано удобно, на уровне языка. А число 4 я указал, чтобы умники не лезли с готовыми классами Pair и Triple.
>>1982418
Можно попробовать поискать подробности в журнале (он находится где-то в настройки ->администрирование -> журнал событий).
Скорее всего, не хватает какой-то библиотеки, которая нужна Апачу для работы. Например, Microsoft VC Runtime. Там, откуда ты скачал Апач, может быть точное название библиотеки.
Проверить, что какой-то DLL не хватает можно с помощью программы вроде Dependency Walker, загрузив в нее exe-файл Апача и посмотрев, что она покажет.
Также, если ты редактировал конфиг Апача, возможно, ты сделал в нем какую-то ошибку и из-за нее Апач не стартует. Можно проверить, правильный ли синтаксис в конфиге, с помощью комадной строки, команда выглядит так:
httpd.exe -t
(если Апач не прописан в PATH, тебе может понадобиться указать полный путь к httpd)
>В Го как раз сделано удобно, на уровне языка
Это неудобно, когда тебе нужен 1 из этих параметров, а другие нужно куда-то деть. Получается простыня кода, либо куча _, что снижает читабельность
>ставить апач на винду
Ты не туда воюешь.
Большинство серверов - линух. Соотв либо бери линь, либо линь в виртуалке, либо как посоветовали xamp/openserver
Удвою этого господина, добавлю что есть еще вариант с Docker. По ценности навыка - будет наверное лучшим вариантом. Почти любой относительно серьезный бэкендер сегодня должен уметь в докер.
В 2к21 по сути стандарт - отдельный фронт-фрэймворк. Шаблонизаторы в более менее серьезных проектах используют обычно максимум для почтовых рассылок и всякой админской мелочевки. А вцелом, есди надо быстро и на коленке - тот что во фрэймворке есть и используют, разница не существенная.
В Laravel можно заполнять нужными данными во время теста и тестировать. Можно сделать также, чтобы после каждого тестирования база очищалась.
Тестирование в памяти кажется как будто бы удобнее, но наверно лучше и правда на нормальной БД проводить тесты, так как это ближе к реальным процессам.
>В 2к21 по сути стандарт - отдельный фронт-фрэймворк.
Я читал, что 95% сайтов - это шаблоны на пиэйчпи CMS-ках или на крайний случай на пиэйчпи фреймворках. А весьма маленький процент - это веб-приложения с отдельным фронт-фреймворком.
Я не прав?
> разница не существенная.
Ни понил. Между чем? Между шаблонизаторами разница не существенная? Они работают очень похожим образом?
Абсолютно прав. 95% либо сделано на коленке, либо легаси. Поэтому я и написал:
>в более менее серьезных проектах
А если пилится что то сложнее, чем портал для парикмахерской ромашка с тремя кнопками - врядли ктото всерьез будет использовать шаблонизаторы. Есть еще приложения с сервер-сайд рендерингом, но там опять же используются js-фрэймворки обычно.
>>1982570
Они оба решают одинаковые задачи, для которых нужны, не более. Это больше вопрос привычки и привязки к фрэймворку, а не популярности.
Что ж ты так быстро сдаешься. Мог бы проверить версию с ошибкой в конфиге и с отсутствием нужной Dll.
Фронтенд-фреймворк это серьезное увеличение объема работы, надо делать не одно приложение, а по сути два. Это нужно только в каких-то особых случаях (сильно интерактивный сайт, работа в оффлайн-режиме).
Плюс обычно SPA тормозные и глючные, долго грузятся, особенно если их делает средний фронтендщик, а не супер-профессионал из яндекса. Плохо работают в старых браузерах. Зачем делать такой сайт, если можно сделать нормально?
Потому, если у тебя типичный сайт фирмы по продаже гвоздей оптом, лучше использовать традиционный подход и формировать страницы на сервере. Не думаю, что SPA сегодня это "стандарт". Разве что там, где разработчики плохо разбираются в разработке и не думают своей головой.
Непонимаю к чему ты эту простыню написал. Просто открываешь браузер и любой портал, более-меннее крупной компании, там js-фрэймворк. Про гвозди оптом я писал. Если потолок писать такое - ну ок наверное, выбор каждого. Стандартом, как мне кажется все же лучше считать best-practices, а не сайты для ашота за 5к.
И с чего бы вдруг js-фрэймворк == спа я вообще не понял, у тебя траблы с матчастью.
>Просто открываешь браузер и любой портал, более-менее крупной компании
Зависит больше не от крупноты компании, а от того, что им надо от сайта. Если компании нужен просто сайт компании в виде блога, то там и вордпресса хватит.
А если им нужен личный кабинет для большого количества пользователей с кучей всякого разного функционала. То тогда, да, там будет фреймворк.
Зависит от статуса я бы сказал. А статус почти всегда имеет прямую финансовую зависимость. Бизнес уже давно прекрасно ориентируется в интеренете и хочет как минимум не хуже, чем у конкурентов. И если бизнес устраивает вордпресс - либо это вышеупомянутые ромашки, которые платят копейки и работают с васян-студиями, либо конторе повезло наткнутся на лоха. Но я за 4 года лохов не встречал чот.
Не приходилось ни разу пилить ничего, сложнее верстки шаблонов документов для печати или формочки письма. Для фронта есть фронтендеры, если контора не веники вяжет.
> И с чего бы вдруг js-фрэймворк == спа я вообще не понял, у тебя траблы с матчастью.
Это что-то новое.
Если это не SPA, тогда зачем вообще нужен рендеринг на клиенте? Это никому не нужное усложнение на ровном месте. Какая выгода при загрузке страницы грузить тяжелый многомегабайтный JS-код (спасибо вебпаку) и ждать, пока он будет делать какие-то аякс-запросы? Если можно просто отдать HTML со всеми данными, который рендерится с помощью Twig? Это и грузится быстрее, и поисковым машинам больше нравится.
Зачем ориентироваться на то, кто как делает и какие-то мифические best-practices, неизвестно кем написанные? Среди разработчиков, особенно фронтендщиков, куча неучей, вкатышей, просто глупцов. Даже именитые разработчики могут защищать глупую идею просто потому, что они ее сами придумали. Давай объективно искать плюсы и минусы, а не ссылаться на то, что кто-то где-то так делает.
Ну если банальный реакт с сервер-рендерингом для тебя что то новое, я вообще хз в какой дыре ты инфу черпаешь.
Про многомегабайтный код - вообще пушка, чекай свой storage, там и реакт и все его друзья давно загружены.
Ориентироваться я буду на то, за что платят хорошо. А хорошо платить люди готовы за чистый бэкенд и нормально распределенный код, а не за фуллстак макакенов, которые всех, не согласных со старперскими фантазиями считают неучами и советуют клепать бложики из 2000х.
> SPA тормозные и глючные, долго грузятся
Вот пример новостного сайта на реакте https://meduza.io/ он летает и грузиться первый раз моментально.
А теперь открой свое говно на каком-нибудь битриксе или жумле
Я вам уже писал пару месяцев назад с вопросом, сколько гривен возьмете за мои хотелки, но потом идею оставил. Решил опять вернуться к вопросу. Набросал что-то вроде тз, что мне нужно, напишите плиз сколько шекелей возьмете за это, примерные сроки и контакты для связи.
https://docs.google.com/document/d/1fELTk3jdpieIDKlTe-xQF8wd62MwaGffjMDf0rNOcYk/edit?usp=sharing
Я бы хотел, чтобы это было в виде каких-то модулей на веб-сайте. Ну типа загружаешь туда файлик еxcel или csv, нажимаешь кнопку, и комплект документов генерируется, либо отправляется рассылка по номерам из примера 2.
Ну вот как раз для медузы, тебе не кажется, что у них все переусложнено? Я когда-то видел там в исходниках следы реакта, не знаю, что сейчас.
Это же просто новостной сайт, который отдает почти статические странички (изредка обновляющиеся). Зачем тут вообще фронтенд-фреймворки? Просто с сервера отдай список статей, либо страницу статьи и все. А они зачем-то наворотили там навороченный фронтенд. Я не вижу, какие плюсы дает тут сложный фронтенд и считаю, что сайт переусложнен на ровном месте.
Не нравится перезагрузка страницы? Есть pjax - очень простое решение (перехватывается клик по ссылке, шлется запрос и HTML на странице заменяется HTML на полученный от сервера). pjax вообще не требует никаких доработок, его можно почти на любой сайт добавить без изменений в коде.
Я помню еще, как-то со смартфона зашел и удивился, как много трафика (несколько мегабайт при начальной загрузке) ест такой простой сайт.
Ну и SPA, по моему опыту, долго грузятся. Сбербанк - там есть заставка и надо ждать. Киви - тоже торможение заметно.
Не надо ссылаться, что кто-то где-то использует реакт. Это ничего не значит. Давай объективно рассуждать, какие есть плюсы и минусы от такого решения.
Если есть люди, которые готовы на ровном месте усложнить проект, не получая никаких преимуществ, утяжеляя сайт и платить x2 за разработку - тут я ничего поделать не могу.
Хотя подозреваю, эти люди просто введены в заблуждение ловкими фронтендщиками, которые верстать сайт для IE не способны, а навешать лапши на уши умеют.
Я не спорю, что SPA хорошо подходит для приложений, которые должны поддерживать офлайн-режим, или которые в высокой степени интерактивны (всякие редакторы). Но тащить эту технологию на каждый сайт просто потому что на Хабре много статей про реакт - глупо.
> вообще пушка, чекай свой storage, там и реакт и все его друзья давно загружены.
Вообще, localstorage презназначен для хранения данных, а не использования как кеш. Это уже само по себе неправильно и негативно говорит о том, кто так делает. Далее, кеш этот принесет мало пользы, так как код постоянно релизится, а значит, его надо загружать с сервера заново.
>которые верстать сайт для IE не способны
Я другой анон. А реакт библиотека - это типа новый жиквери? Такая библиотека для кроссбраузерности и библиотека чтобы она сама под капотом считала виртуальный ДОМ - как оптимальное отрендерить настоящий ДОМ.
Я тут вмешаюсь в ваш диалог. Значится это мой звездный час. Потому что вы же все богатые 300к наносеки. И у вас компы ахуенные с интернетом быстрым.
А я нищук с юсб модемом и некропекой. Значится медуза у меня за джве секунды загрузилась, судя по вкладке Network. Ну, по мне, это достаточно быстрый результат. Там картинка почему-то долго не показывалась.
Далее я нашел топ 50 сайтов на вордпрессе, на первый сайт перешел. Тоже примерно столько же грузится, пару секунд. Тоже не сразу все отобразилось.
пофиксил, спасибо
> верстать сайт для IE
Благо, на дворе не 2010 год и с кроссбраузерностью нужно не так сильно заморачиваться, благодаря стандартам и спецификациям. Да и движок то по сути остался лишь один (ну ладно, два). Короче если у тебя не какой-то йоба проект с миллионами хитов каждый день и у тебя не pixelperfect верстка, то никаких серьезных проблем с кроссбраузерностью у тебя не будет.
> тащить эту технологию на каждый сайт просто потому что на Хабре много статей про реакт - глупо
Согласен, шутка про домашнюю страничку с миллиардом файлов зависимостей уже давно перестала быть шуткой.
Реакт это не jQuery. Это библиотека для рендеринга шаблонов на клиенте с поддержкой data binding ("реактивность").
То есть, у тебя в JS коде будет шаблон, ты его рендеришь, передавая в него данные. Если данные изменились, то ты снова вызываешь рендеринг и данные на странице обновляются.
А если нужно дополнительно пилить апишку для агрегатора, мобильного приложения и прочей хуеты, тогда как? На мой взгляд все просто и лаконично этот бек можно использовать и в других местах, а фронт что в шаблонах верстай, что компоненты для реакта разницы особой нет, остаётся только роутинг прикрутить и ещё пару мелочей. Плюс на бек можно взять более легковесный фреймворк и не париться о роутах и вьюхах, тут больше не усложнение, а перенос части кода и логики на клиентскую часть.
А Сбербанк и прочие банки это совершенно другая история, там есть помимо рюшек-менюшек много логики и всякой специфичной хуйни для безопасности, можно даже понаблюдать как оно работает в консоли и на вкладке network.
На руби если мне память не изменяет
А вот и нет. Сейчас куча людей ходит со старыми телефонами. У многих уже стекло разбито, но они не меняют телефон. И в этих телефонах есть встроенные браузеры, которые никто никогда не обновит.
А современные фронтендщики умудряются верстать так, что во встроенных браузерах несколько летней давности сайт не работает. Так-то.
Это надо постараться, чтобы сломать сайт в Хроме нескольколетней давности. Я когда-то в IE6 скругленные инпуты делал, вот там пришлось заморачиваться. А эти неучи под хром сверстать не способны.
Это надо быть совсем уже долбоебами чтобы при наличии полифилов и бабелей что-то не работало в старом хроме. Что-то из CSS криво, вполне возможно, но вот все остальное должно прекрасно работать даже на ие 11
MVC использую в фреймворках по типу Laravel или там своя система?
>Я когда-то в IE6 скругленные инпуты делал, вот там пришлось заморачиваться. А эти неучи под хром сверстать не способны.
Не думаю, что это то, чем стоит гордиться.
По моим ощущениям, API для сторонних сервисов и API для сайта не одинаковые и лучше сразу делать два разных API. Ибо на сайте тебе нужны одни поля и свойства, а сторонним партнерам совсем другие.
Для мобильного приложения - да, API будут похожи, если оно похоже на сайт (но зачем оно тогда нужно? хотя делают же. Наверно, чтобы можно было спамить нотификациями и получать геолокацию. Ради этого тратится куча труда).
Это только для сайтов уровня туду-листа можно обойтись одним общим API.
> Плюс на бек можно взять более легковесный фреймворк и не париться о роутах и вьюхах,
В классической схеме тебе нужно вывести на странице данные A, B, C . В SPA тебе нужно отдать через API эти же A, B и C. и хорошо еще, если одним запросом, а не несколькими (это будет медленней). По моему, затраты тут примерно одинаковые.
Конечно, если у тебя какой-то тормозной шаблонизатор, может быть разница, но тот же Twig компилирует шаблоны в PHP код и работает быстро. И мощному серверному процессору наверно проще отрендерить страницу, чем дохлому сяомишному ARM (если конечно заказчик не сэкономил на хостинге).
По моему, скорость отдачи ответа будет примерно одинаковая. Только в одном случае ты отдаешь готовую страницу, а в другом - всего лишь ответ на аякс запрос, к которому надо прибавить время загрузки JS бандла, и может быть время отправки других запросов. Есть конечно варианты встраивать JSON прямо в страницу, но тут возникает вопрос, почему бы не встраивать сразу HTML-код.
> остаётся только роутинг прикрутить и ещё пару мелочей
Да нифига не пару мелочей. Надо сделать, чтобы кнопка назад работала как хочет заказчик, надо разбивать JS на бандлы, надо заморачиваться с SSR, подставлять ранее введенный емейл в формы, обрабатывать авторизацию и так далее. Тут именно что гора работы возникает на ровном месте.
Кстати, по поводу производительности. Я как-то букинг открывал со смартфона, он чуть ли не минуту грузился и все тормозило. Может, конечно тут еще виновато медленное соединение, но мне кажется, сайт на HTML и с минимумом JS работал бы куда быстрее на дохлом телефонном процессоре.
По моим ощущениям, API для сторонних сервисов и API для сайта не одинаковые и лучше сразу делать два разных API. Ибо на сайте тебе нужны одни поля и свойства, а сторонним партнерам совсем другие.
Для мобильного приложения - да, API будут похожи, если оно похоже на сайт (но зачем оно тогда нужно? хотя делают же. Наверно, чтобы можно было спамить нотификациями и получать геолокацию. Ради этого тратится куча труда).
Это только для сайтов уровня туду-листа можно обойтись одним общим API.
> Плюс на бек можно взять более легковесный фреймворк и не париться о роутах и вьюхах,
В классической схеме тебе нужно вывести на странице данные A, B, C . В SPA тебе нужно отдать через API эти же A, B и C. и хорошо еще, если одним запросом, а не несколькими (это будет медленней). По моему, затраты тут примерно одинаковые.
Конечно, если у тебя какой-то тормозной шаблонизатор, может быть разница, но тот же Twig компилирует шаблоны в PHP код и работает быстро. И мощному серверному процессору наверно проще отрендерить страницу, чем дохлому сяомишному ARM (если конечно заказчик не сэкономил на хостинге).
По моему, скорость отдачи ответа будет примерно одинаковая. Только в одном случае ты отдаешь готовую страницу, а в другом - всего лишь ответ на аякс запрос, к которому надо прибавить время загрузки JS бандла, и может быть время отправки других запросов. Есть конечно варианты встраивать JSON прямо в страницу, но тут возникает вопрос, почему бы не встраивать сразу HTML-код.
> остаётся только роутинг прикрутить и ещё пару мелочей
Да нифига не пару мелочей. Надо сделать, чтобы кнопка назад работала как хочет заказчик, надо разбивать JS на бандлы, надо заморачиваться с SSR, подставлять ранее введенный емейл в формы, обрабатывать авторизацию и так далее. Тут именно что гора работы возникает на ровном месте.
Кстати, по поводу производительности. Я как-то букинг открывал со смартфона, он чуть ли не минуту грузился и все тормозило. Может, конечно тут еще виновато медленное соединение, но мне кажется, сайт на HTML и с минимумом JS работал бы куда быстрее на дохлом телефонном процессоре.
> Я когда-то в IE6 скругленные инпуты делал, вот там пришлось заморачиваться
Без border-radius заморачиваться приходилось во всех браузерах. Инпуты еще ничего, а вот попапы это да.
А для телефонов один хуй показывается адаптивный вариант верстки, более упрощенный. Те же флексы работают даже в бородатых андроидах.
Ну как: раньше еблись с кроссбраузерностью, теперь ебутся с адаптивом. С одной стороны стало легче (то что делается за три секунды при помощи флексов и гридов раньше приходилось городить костылями и кучей оберток, иногда даже при помощи js), с другой стороны появились новые проблемы в виде мобил и экранов с высоким ppi.
Прописать корректный пассворд в конфиге с настройками коннекта к БД.
Платиновый вопрос: а какой у меня пароль для root@localhost?
>Есть конечно варианты встраивать JSON прямо в страницу, но тут возникает вопрос, почему бы не встраивать сразу HTML-код.
Вставлю свои пять копеек, в последнее время так сложилось что 90% времени пилил на вью а не на пхп. Реакт или вью(чуть в меньшей степени) это прежде всего тулинг. Разбиение на микрокомпоненты(даже на кнопки и инпуты) дает чувство как бы так сказать cohesion(?). Те же CSS-in-js пакеты(не фанат), или цсс модули. Каждая магическая строка превращается в определенную сущность, без которой твоя сборка не соберется. Это добавляет строгости не на уровне согласованности, а на уровне конфигурации. Если ты делаешь проект один, то ты можешь вспомнить при рефакторинге удалить из фронта какой-то класс и т.д. Но на потоке это 100% не выйдет. Со временем всё начнет разбухать. Не зря говорят что тот же CSS unmaintainable в обычном виде. В том же вью, обычно принято писать цсс под шаблоном и логикой компонента. Если ты не используешь компонент в проекте, то ты одновременно не используешь и его логику, и его стили. А потом у тебя получается ситуация, что часть написана на пхп, а часть на вью. Ты начинаешь задумываться, копировать весь компонент на пхп, или просто вставить жсон и использовать уже готовое. Тебе начинает нравится вся эта строгость, ты можешь крутить свой проект как хочешь, и тебе ничего не сделают, ведь ты в другом городе. Абсолютно согласен, что клиент на жсе добавляет хороший такой оверхед при разработке.
По поводу медузы, у них вообще своя история и свой путь. Всё сделано на реакте, потому что так тупо удобнее. Не знаю что у них там за редактор статей, свой какой-то написали, но как я понял там можно буквально для каждого параграфа задавать разные стили и отступы, это всё передается в виде жсона, который потом хавает реакт или флаттер и превращает в компоненты, для мобильного приложения такая же история. Основной аргумент главного по ит из медузы был в том что они так сделали, чтобы в случае чего не обновлять каждый раз приложение, это ведь не веб всё таки. Я с этим согласен, когда у тебя есть какой-то блочный редактор, в котором есть различные компоненты так сказать кастомные, то это всё дело банально удобнее делать на каком-то клиентском фреймворке, потому что часто компонент это не только разметка, а еще и стили и поведение. Как я уже писал выше, отсутствие вот этой связности(? русский язык сложно) приводит к беспорядку спустя время
>Есть конечно варианты встраивать JSON прямо в страницу, но тут возникает вопрос, почему бы не встраивать сразу HTML-код.
Вставлю свои пять копеек, в последнее время так сложилось что 90% времени пилил на вью а не на пхп. Реакт или вью(чуть в меньшей степени) это прежде всего тулинг. Разбиение на микрокомпоненты(даже на кнопки и инпуты) дает чувство как бы так сказать cohesion(?). Те же CSS-in-js пакеты(не фанат), или цсс модули. Каждая магическая строка превращается в определенную сущность, без которой твоя сборка не соберется. Это добавляет строгости не на уровне согласованности, а на уровне конфигурации. Если ты делаешь проект один, то ты можешь вспомнить при рефакторинге удалить из фронта какой-то класс и т.д. Но на потоке это 100% не выйдет. Со временем всё начнет разбухать. Не зря говорят что тот же CSS unmaintainable в обычном виде. В том же вью, обычно принято писать цсс под шаблоном и логикой компонента. Если ты не используешь компонент в проекте, то ты одновременно не используешь и его логику, и его стили. А потом у тебя получается ситуация, что часть написана на пхп, а часть на вью. Ты начинаешь задумываться, копировать весь компонент на пхп, или просто вставить жсон и использовать уже готовое. Тебе начинает нравится вся эта строгость, ты можешь крутить свой проект как хочешь, и тебе ничего не сделают, ведь ты в другом городе. Абсолютно согласен, что клиент на жсе добавляет хороший такой оверхед при разработке.
По поводу медузы, у них вообще своя история и свой путь. Всё сделано на реакте, потому что так тупо удобнее. Не знаю что у них там за редактор статей, свой какой-то написали, но как я понял там можно буквально для каждого параграфа задавать разные стили и отступы, это всё передается в виде жсона, который потом хавает реакт или флаттер и превращает в компоненты, для мобильного приложения такая же история. Основной аргумент главного по ит из медузы был в том что они так сделали, чтобы в случае чего не обновлять каждый раз приложение, это ведь не веб всё таки. Я с этим согласен, когда у тебя есть какой-то блочный редактор, в котором есть различные компоненты так сказать кастомные, то это всё дело банально удобнее делать на каком-то клиентском фреймворке, потому что часто компонент это не только разметка, а еще и стили и поведение. Как я уже писал выше, отсутствие вот этой связности(? русский язык сложно) приводит к беспорядку спустя время
>редактор статей, свой какой-то написали, но как я понял там можно буквально для каждого параграфа задавать разные стили и отступы
Я другой анон. И мне кажется, что реакт может быть удобен тем, что если писателей у медузы много, то можно каждому из них на комп загрузить SPA-редактор на реакте. Они там напишут статью, красиво все отступы и прочую красоту расставят. И отправят все на публикацию.
проверил DLL все в здании, все ровно, да и в целом не хочу тратить время на копание, если это все решается гораздо проще, но спасибо за поодержку)
Далее я натянул верстку на вордпресс. И пришло время закинуть мою тренировочное говно на сервер. Я завел на таймвеб новый акк. Там дают 10 бесплатных дней поиграться с хостингом.
И короче, я нихуя не понял, а где там Apache и GNU/linux? Там в таймвеб просто интерфейс предоставлен, что вот сюда файлы загружай.
Я нихуя не понял, а че куда там и где требуется применять познания в Apache и GNU/linux?
З.Ы. Извините, пожалуйста, я погорячился. Вопрос снят. Не надо отвечать на него.
В общем случае подключиться по ssh к консоли сервера и делать там свои дела.
Можно через sftp менеджер файлы закинуть по старинке, либо через гит (хаб/лаб/си/хуяй)
Ок. Понял, принял, спасибо большое
Ну, я читал про все эти стэйты и просы, что данные изменились, реакт считает виртуальный ДОМ, а потом оптимальным образом рендерит настоящий ДОМ.
Просто я имел ввиду, что реакт - это новый жиквери. Что это модная библиотека которую теперь будут везде пихать.
> реакт - это новый жиквери
Мне кажется это вообще про разное.
> это модная библиотека которую теперь будут везде пихать
Ровно до появления новой модной технологии
Статьи ОПа про MVC, шаблоны и автозагрузку еще актуальны?
поднятие
Делал тестовое задание для одной конторы, отправил вовремя, по итогу просто молча отказали, позже аргументировав тем, что все сделано через жопу.
Если есть свободное время и желание - можешь посмотреть и дать совет, что не так?
git: https://tinyurl _ com/2y7xnv3t
test: https://tinyurl _ com/axw27xpa
Бамп вопросу
Я пытаюсь словить ModelNotFoundException, который выдаёт Model::findOrFail. Исключение выдаётся, но игнорируется обработчиком и потом превращается в другое исключение. Почему?
Всё, догадался заглянуть в родителя хандлера, вопрос снят
Сам ты еблан. Эти ссылки могут содержать что угодно, они не просто так в спам-листе, блять. Конечно нормальным людям на линуксе похуй на всякие вирусы, но тем не менее.
Еще и заставляешь уважаемых господ копировать мышкой это дерьмо, вставлять в строку и заменять символы.
Нахуя тебе это вообще? Боишься что твой никнейм будет в поисковиках индексироваться? Да на здоровье.
https://github.com/rscugh/ - Неуравновешенный человек, сидит на сайтах для анонимных анимешников-педофилов, называет незнакомых людей ебланами. Да и код такой себе пишет.
Вопрос снят, все всё поняли.
Пользователь заходит в товар, срабатывает скрипт который открывает файл для записи, помещает каждую новую строчку в отдельную переменную массива и в итоге я имею массив товаров которые вообще сегодня смотрели, затем я ищу в этом массиве тот товар который пользователь открыл сейчас, и если он там уже есть, я его удаляю и добавляю в начало массива, а если его там не было, то просто добавляю в начало массива и потом начинаю запись всего массива обратно в текстовый файл помещая каждый товар с новой строки, но обрезаю количество например до 100, чтобы в итоге этот файлик не весил миллион гигабайт, ну а потом на специальной странице просто фаршу обратно этот файлик в массив и вывожу на странице списком, правильная логика действий?
Смущает что если страницу откроют одновременно 2 пользователя или больше, то актуальная версия файлика будет только та которая после прокрутки скрипта будет записана последней, то есть просмотренный товар 1 пользователем будет просто затёрт, ведь они были загружены одновременно, я же правильно понимаю логику? И насколько вообще быстро исполняется такой скрипт с чтением файла, парсингом в массив, поиск наличия текущего товара, добавление его в массив, запись обратно в файл построчно, например в 100 строк, или для этих целей лучше ебаться с лайтскьэль?
Или вообще записывать всё это не в текстовый файл, а в json файл где каждый товар будет в виде ассоциативного массива и просто парсить этот json файл, искать в нём текущий посещённый товар, если найден удалять, если нету до добавлять и обратно всё это сохранять в json файл? А на странице вывода просмотренных сегодня товаров просто парсить этот файл и выводить через цикл на странице, я в правильнмо направлении?
Пользователь заходит в товар, срабатывает скрипт который открывает файл для записи, помещает каждую новую строчку в отдельную переменную массива и в итоге я имею массив товаров которые вообще сегодня смотрели, затем я ищу в этом массиве тот товар который пользователь открыл сейчас, и если он там уже есть, я его удаляю и добавляю в начало массива, а если его там не было, то просто добавляю в начало массива и потом начинаю запись всего массива обратно в текстовый файл помещая каждый товар с новой строки, но обрезаю количество например до 100, чтобы в итоге этот файлик не весил миллион гигабайт, ну а потом на специальной странице просто фаршу обратно этот файлик в массив и вывожу на странице списком, правильная логика действий?
Смущает что если страницу откроют одновременно 2 пользователя или больше, то актуальная версия файлика будет только та которая после прокрутки скрипта будет записана последней, то есть просмотренный товар 1 пользователем будет просто затёрт, ведь они были загружены одновременно, я же правильно понимаю логику? И насколько вообще быстро исполняется такой скрипт с чтением файла, парсингом в массив, поиск наличия текущего товара, добавление его в массив, запись обратно в файл построчно, например в 100 строк, или для этих целей лучше ебаться с лайтскьэль?
Или вообще записывать всё это не в текстовый файл, а в json файл где каждый товар будет в виде ассоциативного массива и просто парсить этот json файл, искать в нём текущий посещённый товар, если найден удалять, если нету до добавлять и обратно всё это сохранять в json файл? А на странице вывода просмотренных сегодня товаров просто парсить этот файл и выводить через цикл на странице, я в правильнмо направлении?
Скорее всего у тебя в начале файла невидимый символ BOM (что такое BOM: https://ru.wikipedia.org/wiki/Маркер_последовательности_байтов ). То есть, твой файл выглядит так:
BOM <?php ....
Соответственно, PHP выводит этот BOM, а после вывода чего-либо нельзя отправлять заголовки, о чем тебе и написано в ошибке.
Проверить, есть ли BOM в начале, можно, открыв PHP-файл с помощью hex-редактора вроде HxD или с помощью онлайн-hex-редактора (работает в браузере, до чего дошел прогресс): https://hexed.it/
Советую проверить, заодно узнаешь, как твой файл устроен и из каких байтов состоит.
Чтобы убрать BOM, пересохрани файл в кодировке utf-8 без BOM.
---
По коду:
- вместо ручного экранирования используй плейсхолдеры и подготовленные запросы: https://www.php.net/manual/ru/mysqli.quickstart.prepared-statements.php
- вместо хранения простого хеша пароля храни соленый хеш: https://github.com/codedokode/pasta/blob/master/security/password-hashing.md
- $home_url явно формируется некорректно
- при работе с БД надо либо 1) включить в mysqli режим выброса исключений при ошибках (как тут: https://www.php.net/manual/en/mysqli.quickstart.statements.php) либо 2) проверять наличие ошибок с помощью if после вызова каждой функции, как тут: https://www.php.net/manual/ru/mysqli.quickstart.statements.php
Ты в функции $.ajax указал dataType = json. Если с сервера приходит не JSON, а HTML, то естественно, функция ajax() выдает ошибку.
По моему, все работает корректно.
Что ты хочешь получить?
Что касается вопроса "какой вариант быстрее": надо тестировать. Сделай несколько функций (для каждого способа сохранения) и замерь, за сколько времени в них обработается, допустим 100 000 товаров.
Я могу предложить еще один вариант для сравнения: использовать redis. Redis хранит данные в памяти, не сохраняя их на диск, и поддерживает работу со списками (добавление, обрезание). За счет того, что все происходит в памяти, производительность должна быть очень хорошей.
Также, если тебе не хочется использовать redis, есть еще один вариант: shared memory. Это кусок памяти, который выделяется и не очищается между запусками скрипта. Можно в нем хранить список товаров. Это тоже должно быть быстро. Работать с shared memory можно как напрямую, так и через расширение вроде apcu.
Надо понимать, что БД вроде sqlite - это по сути и есть работа с файлами, только они имеют более сложную структуру (отдельно лежат строки таблицы, отдельно индексы). Иногда это дает плюсы, иногда минусы.
Также, в твоей идее есть проблема. Если на сайт зайдет бот-поисковик, то он начнет смотреть все страницы подряд и замусорит тебе список товаров. Надо исключать ботов.
> Смущает что если страницу откроют одновременно 2 пользователя или больше, то актуальная версия файлика будет только та которая после прокрутки скрипта будет записана последней, то есть просмотренный товар 1 пользователем будет просто затёрт, ведь они были загружены одновременно, я же правильно понимаю логику?
Да. Ты можешь решить эту проблему, используя обязательные блокировки, но тогда все станет работать медленнее (второму скрипту придется ждать, пока первый завершит работу с файлом. То есть работа с файлом будет последовательной, а не параллельной). БД, кстати, тоже используют блокировки, но более эффективно.
Получается анон концепцию я правильную придумал? Доступа к Redis и shared memory у меня нет, хостинг очень кастрированный в этом плане, по этому хочу просто костыль в 1 файл, про ботов не подумал кстати, но пока просто потестировать хочу посмотреть как будет работать, но раз ты советуешь на 100к тестировать, то думаю с 100 записями php справится как нехуй делать, в мгновение, тогда затестирую и файловый метод, и джсон, я так кстати понимаю они будут одинаково работать по скорости, ну и дальше затестирую с скьэльлайт
Тогда пишу такую логику, смотрю есть файл json, если нет - создаю и записываю в него массив с айди товара, названием и ссылкой, если есть, то паршу json в масссив, проверяю есть ли в нём материал с таким айди, если есть - то удаляю его и записываю заново в начало массива, потом обрезаю массив до 100 переменных, паршу обратно в json и записываю всё это дело в файл, на странице со списком промотренных сегодня товаров просто паршу этот json с помощью js и рисую его на странице, надеюсь я правильно нафантазировал
что бы с сервера приходил json
Я имел в виду, не заполнять файл 100 000 товаров, а, например, 100 000 раз сымитировать "заход на страницу товара". И померять, сколько это займет для каждого способа.
> Где новичку можно начать изучать php 8?
Зачем именно 8? Там что-то революционно новое ввели?
Заходишь на официальный сайт и изучаешь.
>Зачем именно 8? Там что-то революционно новое ввели?
Ну лучше сразу последнюю версию начинать изучать, в идеале же.
>Заходишь на официальный сайт и изучаешь.
Я сейчас это делаю, тамошний мануал это нихуя не учебник для новичка. Это вообще не учебник, а справочник какой-то. У меня небольшой опыт в джаваскрипте есть, есть у PHP что-нибудь подобное вот этому https://learn.javascript.ru/ учебнику?? Я по нему жс учил, после него оффициальный мануал пхп это херня от которой голова болит.
Не учи подумой. Меня тоже здесь предупреждали, я не послушал, теперь жалею. Пыха болото ебаное. Потом времени, потраченного на нее, слишком жалко чтобы учить что-то другое.
Спасибо. Оглядел быстренько, че-то как-то это тоже не для вкатуна материал. Похоже на полировку для того, кто уже выучил синтаксис.
>>1986759
Я не для вката в IT (на галеру) учу. У меня планы замутить свои проекты, и самому их полностью поддерживать. Большинство самых популярных CMS на пхп (WordPress итд), плюс даже если сам с нуля пишешь бэк для небольшого проекта, то пхп как понял наилучший выбор. Так что буду учить по-любому.
Тогда laracast посмотри.
А, ну тогда пых самый лучший вариант
>>1986791
Если в нормальном городе живешь или рассматриваешь переезд в ближайшее время то что угодно, к чему душа лежать будет. В обратном случае вакансии нужно смотреть, чтобы борщи не хлебать в будущем.
Что бы ты не выбрал, если это тебе нравится и это не пыха, то выбор правильный.
Фронт не рассматриваю, ибо то ещё болото. С жесточайшей конкуренцией.
Контора постоянно вакансии публикует. Это наёб? Подскажите пожалуйста.
Да эти вкатуны и сами по качеству как грязь. Уважающий себя человек во фронт-энд не пойдет.
>>1986825
Где как. В крупных городах бывают, но как я понимаю, долго не задерживаются. Это топ 1 язык для вката всё же, все инфоцыгане в первую очередь его рекламируют.
Алсо, довольно часто такие вакансии никуда не выкладывают, охуеешь в говне копаться. Меньшие компании по знакомым ищут, большие выращивают с курсов.
А так, основные языки бэкэнда: нода, питон, джава, сишарп, голанг ( для джуна сомнительно ), ну и php конечно.
Если ты еще студент или просто РННщик, то большие компании проводят бесплатные курсы по всем языкам из списка кроме пыхи. Конечно нужно знать основы.
Просят уделять обучению по 8 часов в день. Если ты в итоге выжил, через несколько месяцев после курсов часто зовут трудоустраиваться. Да даже если не позовут, опыт бесценный.
>>1986850
Ты бот чишо? Тебе уже пояснили всё сверху.
Очень даже используют, если это вписывается в архитектуру. Иногда комбинируют даже оба типа. Но чаще это оверкилл, особенно при наличии больших данных.
>Уважающий себя человек во фронт-энд не пойдет.
Ты просто кукаректнуть или есть манядоводы?
>через несколько месяцев после курсов часто зовут трудоустраиваться
Ну зачем ты пиздишь на анонимном форуме? Из яндекс практикума например попадают на оффер меньше процента прошедших весь курс и те по-большей части отлетают на испытательном.
>Ты просто кукаректнуть или есть манядоводы?
Ну это имхо конечно, но ведь фронтенд как и QA - скукота полная. Я сам люблю отвлечься от бэка и что-то поверстать ( отдых - это ведь смена вида деятельности ), но заниматься только этим - ебануться можно. Когда-то пытался вкатиться во фронт, меня хватило на две недели.
>Ну зачем ты пиздишь на анонимном форуме? Из яндекс практикума например попадают на оффер меньше процента прошедших весь курс и те по-большей части отлетают на испытательном.
Говорю просто по опыту знакомых. В компании по типу яндекса конечно кого-попало не берут, я вообще-то имел в виду большие аутсорсные галеры.
Фронтенд это не обязательно верстка. Есть галеры, где версткой занимаются спецом обученные версталы, а жс-ники к ней уже прикручивают свой функционал.
Вкатун во фронт, полюбому верстать будет.
Бизнес, на войтишниках делают.
Там дохуя всякого общения с наставниками и живых онлайн уроков. Товарищ сейчас проходит курс на питон-бэкендера.
по кодерской части, для этого дохуя знаний PHP нужно?
Ну некоторые их курсы действительно дают весьма полезные, даже иногда уникальные по меркам СНГ навыки, в сравнении с откровенным наебаловом, которого 95% рекламируемого. Но я рассматриваю курсы лишь как возможность для повышения квалификации или расширения кругозора,чтобы не тратить время на поиск инфы, когда у тебя есть достаточно денег и база. Опять же далеко не все их курсы хороши, всякие пистон-джс-околоайти откровенное наебалово, как и везде, только дороже и пафоснее.
Имхо, если тебе нужны курсы, чтобы вкатится - нахуй тебе не надо вкатываться, раз с гуглом на старте справиться не можешь.
У нас тут пол треда занимается и тем, и другим, еще и бек на пыхе клепает. И получает как кассир в пятерочке
На других языках - почему бы и нет, если есть возможность. На пыхе - однозначно нет.
Если контора ищет PHP Trainee, то это 99% чтобы вырастить битриксоида/вордпресовщика, или в самом лучшем случае поддерживальщика легаси на CodeIgniter/CakePHP/Zend/Нэйтив пхп в процедурном стиле.
Работаю в галере на пыхе, симфони/люмен, частично go и ts. Зп процентов на 50-70 ниже для чисто пыхарей, как я вижу, в отличии от джавистов(но их итак полтора человека на всю контору) и тайпскриптизеров. Но это отчасти из-за того что большая часть пыхарей сидит на поддержке легаси 10 летней свежести и никуда не рыпается, да и дохуя их просто в конторе.
Питон в вебе ведь особо не популярен, и также с руби, его популярность спадает. Если я не прав, поправь меня анон. Так мне питон нравится очень. Ну похоже это, вспомогательная технология.
на нем написано большинство цмс-ок самых популярных, битриксы, вротпрессы, шопифай и иже с ним. Он всегда будет нужен как средство поддержики этих платформ. Но денег таким образом не заработаешь.
Питон в вебе нормально популярен, особенно в штатах/европе. Инста как популярный пример.
Рубисты - до сих пор топ по зарплате, на днях рейтинг всплывал на хабре.
Как первый язык - питон неоч, но это мое мнение. Я придерживаюсь мнения, что учиться нужно на статической типизации все таки, чтобы снизить шансы стать макакой в перспективе.
>Зп процентов на 50-70 ниже для чисто пыхарей
Но ты со своим "частичным go и ts" к ним не относишься, верно? Если так, то по-моему довольно справедливо, если те пыхари не хотят даже частично освоить другую технологию.
Никуда он не помирает, как клепали средний и лоу ценовой сегмент, так и будут, ибо дешево и бьыстро, плюс он развивается хорошо.
>>1987239
Есть, но чаще это переписывание легаси в ооп код под симфони и иногда новые сервисы, но на ts нового конечно побольше, хотя это наверное больше из-за специфики основного направления.
Хорошо, как мне опыт получить, на руби или питоне? Вкатуну. Удаленно ведь джунов, или трайни не бывает. Насколько я понимаю.
Карьерный рост, если можно так сказать, у пыхеров есть? Т.е топовый разраб может сравниться, например с джавистом, по деньгам, или интересным задачам.
>Никуда он не помирает, как клепали средний и лоу ценовой сегмент, так и будут
This. На чем делать средненький сайт для средненькой конторы, не на Джаве же.
Открываю, а там оказалось что они ищут php-разрабов с опытом 5 лет и больше, чтобы переучить их на руби. Опыт с самим руби не требуется, вот вам и перспективы роста.
На самом деле не отношусь буквально месяц как, подняли зп после того как сдали микросервис на ts, который писали три месяца почти и даже сильно провалили дедлайны, но видимо старания оценили, лул. А так у меня тоже есть свой кусок легаси, на который попал, придя два года назад в контору и с ним приходися ебаться изрядно, как камень на шее.
>>1987253
На руби разве что дрочить английский и искать забугорные стажировки за нихуя, либо пытаться неуклюже комитить в опенсорс, параллельно изучая их свистелки. На пистоне даже не знаю, разве что могу сказать: был недавно пример - знакомый очень хотел на питон, еще и в нейросети, но в результате, попав на испытательный в контору с нейронками- отлетел на испытательном, когда ковид ебнул. Сейчас на джанге за 50к что то ковыряет на галере.
>>1987254
Я бы сказал, что есть движение. Среди активных мидл+ разрабов есть текучка, одни уходят, другие приходят, свапаются между проектами, ктото техлидом становится, ктото в джаву или ts уходит, кто то сеньорит на симфони. Но вцелом все это все равно происходит вокруг пыхи.
То есть вырастают именно энтерпрайзные такие типичные кодеры.
На ноде!
И использовать параметр LOCK_EX для очереди или лучше забить, учитывая что начать ебать этот .json могут сразу в несколько потоков? Данные не критичные, так что похуй если следующий поток затрёт данные с предыдущего из-за того что они начали обработку одновременно
Ты бы сравнил плюсы и минусы каждого подхода.
Что касается блокировок, тут не все просто. Возможна такая ситуация: ты начинаешь читать JSON, на середине чтения другой процесс перезаписывает файл и ты в итоге читаешь половину старого JSON и половину нового. То же самое возможно при записи: ты записал пол-файла, другой процесс перезаписал его, и затем ты перезаписал конец файла оставшейся половиной JSON.
В обоих случаях получается мусор, который может вообще не получится декодировать.
Блокировка защищает от этого, но с ней процессы, которые хотят читать или записать файл перестают работать параллельно и встают в очередь.
Кстати, в случае использования БД эти проблемы решает сама БД.
Также, не лучше ли вместо JSON просто писать в каждой строке один id товара? Не быстрее ли это будет кодироваться/декодироваться?
И еще. Если у тебя данные некритичные, может тебе не заморачиваться и просто генератором случайных чисел нагенерировать id товаров?
В чем плюсы написания бекенда на Руби или TS? В TS все асинхронное, а бизнес-логика обычно синхронная. То есть, требуется сначала сделать A, потом B, а в TS придется возиться с промисами и async/await. Вам это нужно?
TS это не язык, а обертка над JS. Вам это нужно, отладчиком ковыряться в нечитаемой сгенерированной JS-лапше?
В TS нету библиотек вроде Доктрины. В JS можно поделить на ноль, можно опечататься в имени свойства объекта и исключение выброшено не будет.
Так как JS не умирает после запроса, в нем возникают утечки памяти. Так как отладчиков и профайлеров для их поиска я не знаю, то обычно просто по крону перезапускают процесс JS, вместо того, чтобы найти источник проблемы.
Еще небось и микросервисами все делают. Микросервисы это зло. Придется возиться с тяжелым тормозным Докером, который зачем-то на диске создает кучу образов и забивает все свободное место. Все эти "микро" сервисы будут жрать кучу памяти, и тебе придется покупать новый компьютер. Все будет работать медленнее, так как вместо того, чтобы вызвать метод, надо делать более медленный HTTP запрос. Разобраться будет сложнее. В монолите ты просто идешь от функции к функции и видишь, что делает код. В микросервисах для решения проблемы тебе надо переходить между несколькими микросервисами, которые могут быть написаны на разных языках и фреймворках. На изучение которых надо потратить много времени.
То есть, PHP разработчик давно бы исправил проблему, а разработчик микросервисов все еще занят изучением фреймворка на Го, на котором написали соседний микросервис.
Еще небось и фронтенд на реакте или вью делают вместо серверного рендеринга. В итоге разработка занимает еще больше времени, приложение получается тяжелое и тормозное, долго грузится, долго делает кучу аякс-запросов.
Тут пошли какие-то вредные советы. Как усложнить разработку в убыток бизнесу.
Почему же используют Руби и TS, микросервисы, реакт и вью? Не знаю, наверно старшим программистам стало скучно и они от скуки решили поменять язык разработки. При этом нанося ущерб бизнесу.
Нет ничего лучше и проще монолита на PHP, с шаблонизатором Твиг. Получил запрос, обратился к БД, отрендерил шаблон - все это просто пишется и просто отлаживается. И программистов на PHP больше, проще их найти.
В чем плюсы написания бекенда на Руби или TS? В TS все асинхронное, а бизнес-логика обычно синхронная. То есть, требуется сначала сделать A, потом B, а в TS придется возиться с промисами и async/await. Вам это нужно?
TS это не язык, а обертка над JS. Вам это нужно, отладчиком ковыряться в нечитаемой сгенерированной JS-лапше?
В TS нету библиотек вроде Доктрины. В JS можно поделить на ноль, можно опечататься в имени свойства объекта и исключение выброшено не будет.
Так как JS не умирает после запроса, в нем возникают утечки памяти. Так как отладчиков и профайлеров для их поиска я не знаю, то обычно просто по крону перезапускают процесс JS, вместо того, чтобы найти источник проблемы.
Еще небось и микросервисами все делают. Микросервисы это зло. Придется возиться с тяжелым тормозным Докером, который зачем-то на диске создает кучу образов и забивает все свободное место. Все эти "микро" сервисы будут жрать кучу памяти, и тебе придется покупать новый компьютер. Все будет работать медленнее, так как вместо того, чтобы вызвать метод, надо делать более медленный HTTP запрос. Разобраться будет сложнее. В монолите ты просто идешь от функции к функции и видишь, что делает код. В микросервисах для решения проблемы тебе надо переходить между несколькими микросервисами, которые могут быть написаны на разных языках и фреймворках. На изучение которых надо потратить много времени.
То есть, PHP разработчик давно бы исправил проблему, а разработчик микросервисов все еще занят изучением фреймворка на Го, на котором написали соседний микросервис.
Еще небось и фронтенд на реакте или вью делают вместо серверного рендеринга. В итоге разработка занимает еще больше времени, приложение получается тяжелое и тормозное, долго грузится, долго делает кучу аякс-запросов.
Тут пошли какие-то вредные советы. Как усложнить разработку в убыток бизнесу.
Почему же используют Руби и TS, микросервисы, реакт и вью? Не знаю, наверно старшим программистам стало скучно и они от скуки решили поменять язык разработки. При этом нанося ущерб бизнесу.
Нет ничего лучше и проще монолита на PHP, с шаблонизатором Твиг. Получил запрос, обратился к БД, отрендерил шаблон - все это просто пишется и просто отлаживается. И программистов на PHP больше, проще их найти.
Вот блин не знал
Страшно чёто стало какая там очередь может образоваться с LOCK_EX, сейчас сделал просто file_put_contents с FILE_APPEND чтобы вообще посмотреть сколько там запросов сыпит, и уже за 2 часа насыпало 5 тысяч строк, интересно до сколько там время ожидания может дойти, надеюсь по секунд 20 не будет очереди лол, а то хотер сразу заноет
Мне просто нужно не только айди хранить, но и название, урл и прочую хуйню, потом всё это парсить, удалять повторы и выводить уникальные
>оставшиеся данные из БД
Вот здесь самый прикол, доступа к БД нет, по этому хочу сохранять всё, а не только id и хранить в json
Квадратные скобки появились в PHP 5.4. Также, PHP должен был выдать ошибку и записать ее в лог ошибок. Стоит смотреть лог ошибок, а не пытаться угадать, в чем может быть проблема.
Спасибо анон, я бы посмотрел, да кастрат на хостинге не даёт
Клуб археологии двумя блоками ниже
У одного доступа к бд нет, у другого к логам, еще и древние версии пыха
>Ты бы сравнил плюсы и минусы каждого подхода.
Имеется ввиду время выполения каждого из способов? Короче мне надо написать 2 скрипта и тестировать сегодня один, завтра другой, засекать время выполнения и выбирать что быстрее?
Анон, какой сервер дали с тем и приходится работать, ради тебя никто не будет обновлять сервер рискуя что всё сломается
Да, гораздо лучше работать на сервере, где у разраба нет нужных доступов, старый пых и рядом еще куча говна крутится. Багов не будет, атвичаю.
По ftp код заливаете?
Нет, я имел в виду вообще, какие есть преимущества и недостатки. В случае с fopen, по моему просто больше кода придется писать, чем в случае с file_get_contents(). fopen/fwrite нужен, когда ты открываешь файл и потом пишешь по частям.
Да на количество кода пофигу, лишь бы не было километровых очередей на чтение/запись, короче надо постестировать оба варианта, хотя я наверно и не узнаю что очередь на пределе, так как сервер после какого-то там таймаута просто дропает выполнение скрипта лол
Кстати, а очереди на чтение и запись - это 2 разные очереди или одна и та же? Пизде столько нового узнаю для себя, раньше только с js приходилось ебаться, там такой хуйни и близко не предвещало
Кстати анон ты писал нужно будет дропать запросы от ботов, а их с помщью юзер агента вычислять? По сути получается будем дропать только яндекс и гугл, а боты от васянов и дальше будут наполнять json мёртвыми запросами маскируясь под обычный юзер агент?
Хочу попробовать лить креативы через апи, на бирже мне дали ссылку на такое вот https://github.com/kadam-official/php-sdk
Как мне запускать это вот все и допустим лить тизеры/баннеры?
Что такое композер и почему питон с джавой настолько проще?
>Как ты узнал?
В начале карьеры тоже этим занимался. Попался проект без гита
>Да, а чем сейчас модно заливать?
Гит + ci/cd, опционально докер/кубер
А зачем мне опечаток браузера? Я просто хочу собрать список юзерагентов и посмотреть что посещает сайт, варианты с записью в файл которые я кинул выше и используются для таких целей?
Аноны мы походу друг-друга не понимаем, я знаю что юзерагент можно выдернуть с помощью $_SERVER['HTTP_USER_AGENT'], я просто хотел узнать как аноны собрали бы список юзерагентов, судя по ссылкам что я дал все это делают просто записью результата кода $_SERVER['HTTP_USER_AGENT'] с новой строки в обычный текстовый файл, как-то слишком просто получается, может кто-то что-то хитрее и лучше подскажет
Ты серьезно или прикалываешься?
Тебе нужно собрать юзер агенты, пусть в текстовый файл.
На каждый запрос ловишь юзер агента из суперглобального массива HTTP, добавил в файл строчку с ним.
Всё.
Да, это делается в несколько строк.
Пока мы тут беседуем, ты бы уже мог всё это дело написать и протестить.
Я бы помимо юзер агента собирал полный фингерпринт и запихнул в
всё бд, если понадобится какая-то дальнейшая обработка этой статистики.
Потом можно будет графики строить или еще какую аналитику производить
"Очереди" в явном виде нет, она получается сама собой. Если ты берешь эксклюзивную (полную) блокировку на файл, ты как бы ограничиваешь доступ к этому файлу. Если другой скрипт попытается взять блокировку, он остановится до того момента, пока блокировка не будет снята. То есть доступ к файлу идет по очереди, а не одновременно.
То есть, при наличии блокировки только один скрипт (который ее взял) может работать с файлом в один момент времени. Другие скрипты будут ждать снятия блокировки.
Эксклюзивная блокировка берется для записи в файл. Это защищает от ситуации, когда другой процесс попытается прочитать не до конца записанный файл и получит некорректные данные. А с блокировкой он получит доступ к файлу только после того, как тот полностью записан.
Бывает еще разделяемая (shared) блокировка (на чтение). Она позволяет только читать файл любому количеству читателей, но запрещает запись в него для всех. То есть, два скрипта могут владеть разделяемой блокировкой и читать одновременно, но если кто-то попытается взять эксклюзивную блокировку (для записи), он будет ждать до снятия всех разделяемых блокировок. Такая блокировка используется, чтобы гарантировать, что в процессе чтения никто не заменит содержимое файла.
Тебе, кстати, для чтения файла как раз подошла бы разделяемая блокировка - она не мешает другим процессам читать файл, но останавливает (блокирует) их, если они пытаются взять эксклюзивную блокировку.
Блокировки важны при параллельной работе множества скриптов с одним и тем же файлом. Иначе можно при чтении получить мусор или записать в файл мусор.
----
Важный момент: блокировки в PHP не принудительные, а добровольные. То есть, они действуют только на тех, кто их явно использует. Если ты не используешь блокировку и читаешь файл через file_get_contents, то все блокировки игнорируются. Зато эти блокировки работают на любой ОС.
На уровне отдельной ОС, например, Линукс, есть и принудительные блокировки, которые ставятся на уровне ОС и которые действуют на все программы.
"Очереди" в явном виде нет, она получается сама собой. Если ты берешь эксклюзивную (полную) блокировку на файл, ты как бы ограничиваешь доступ к этому файлу. Если другой скрипт попытается взять блокировку, он остановится до того момента, пока блокировка не будет снята. То есть доступ к файлу идет по очереди, а не одновременно.
То есть, при наличии блокировки только один скрипт (который ее взял) может работать с файлом в один момент времени. Другие скрипты будут ждать снятия блокировки.
Эксклюзивная блокировка берется для записи в файл. Это защищает от ситуации, когда другой процесс попытается прочитать не до конца записанный файл и получит некорректные данные. А с блокировкой он получит доступ к файлу только после того, как тот полностью записан.
Бывает еще разделяемая (shared) блокировка (на чтение). Она позволяет только читать файл любому количеству читателей, но запрещает запись в него для всех. То есть, два скрипта могут владеть разделяемой блокировкой и читать одновременно, но если кто-то попытается взять эксклюзивную блокировку (для записи), он будет ждать до снятия всех разделяемых блокировок. Такая блокировка используется, чтобы гарантировать, что в процессе чтения никто не заменит содержимое файла.
Тебе, кстати, для чтения файла как раз подошла бы разделяемая блокировка - она не мешает другим процессам читать файл, но останавливает (блокирует) их, если они пытаются взять эксклюзивную блокировку.
Блокировки важны при параллельной работе множества скриптов с одним и тем же файлом. Иначе можно при чтении получить мусор или записать в файл мусор.
----
Важный момент: блокировки в PHP не принудительные, а добровольные. То есть, они действуют только на тех, кто их явно использует. Если ты не используешь блокировку и читаешь файл через file_get_contents, то все блокировки игнорируются. Зато эти блокировки работают на любой ОС.
На уровне отдельной ОС, например, Линукс, есть и принудительные блокировки, которые ставятся на уровне ОС и которые действуют на все программы.
Кстати, есть альтернативный способ для Линукса, который без блокировок гарантирует целостность чтения и записи.
Что значит целостность чтения:
- что никто не подменит файл, который мы читаем, посередине чтения
- что никто не будет читать не до конца записанный файл (в который сейчас пишет другой процесс)
Что значит целостность записи:
- что 2 процесса не будут писать в один файл одновременно, перемешивая данные друг друга.
Способ такой:
- при чтении просто читаем файл, например, goods.json
- при записи создаем новый файл со случайным именем, например, goods.json.12846464. Пишем в него данные, когда закончим, переименовываем его в goods.json.
Как это работает?
- так как мы пишем данные в файл со случайным именем, никто оттуда не прочтет не до конца записанные данные. По сути, об этом файле знает только скрипт, который его создал и никто другой его не откроет.
- если кто-то читает файл goods.json, а другой скрипт вызывает операцию переименования, то происходит следующее: старый файл goods.json теряет свое имя, но не удаляется и первый скрипт (который его открыл) продолжает читать старый файл. Он будет удален только когда первый скрипт закончит с ним работать и закроет файл. Таким образом, целостность чтения не нарушается. А скрипты, которые откроют файл после переименования, получат доступ к новому файлу.
То есть, операция переименования атомарна. Она отбирает имя goods.json у старого файла, делая его безымянным и невидимым (но все еще существующим), и присваивает это имя новому файлу.
Получается, что в goods.json всегда будут полностью записанные данные и чтение из него будет всегда давать корректный результат.
(получается, с помощью переименования файла можно создавать невидимые файлы? можно, но они удалятся, как только их закроет программа, которая их открыла).
Кстати, есть альтернативный способ для Линукса, который без блокировок гарантирует целостность чтения и записи.
Что значит целостность чтения:
- что никто не подменит файл, который мы читаем, посередине чтения
- что никто не будет читать не до конца записанный файл (в который сейчас пишет другой процесс)
Что значит целостность записи:
- что 2 процесса не будут писать в один файл одновременно, перемешивая данные друг друга.
Способ такой:
- при чтении просто читаем файл, например, goods.json
- при записи создаем новый файл со случайным именем, например, goods.json.12846464. Пишем в него данные, когда закончим, переименовываем его в goods.json.
Как это работает?
- так как мы пишем данные в файл со случайным именем, никто оттуда не прочтет не до конца записанные данные. По сути, об этом файле знает только скрипт, который его создал и никто другой его не откроет.
- если кто-то читает файл goods.json, а другой скрипт вызывает операцию переименования, то происходит следующее: старый файл goods.json теряет свое имя, но не удаляется и первый скрипт (который его открыл) продолжает читать старый файл. Он будет удален только когда первый скрипт закончит с ним работать и закроет файл. Таким образом, целостность чтения не нарушается. А скрипты, которые откроют файл после переименования, получат доступ к новому файлу.
То есть, операция переименования атомарна. Она отбирает имя goods.json у старого файла, делая его безымянным и невидимым (но все еще существующим), и присваивает это имя новому файлу.
Получается, что в goods.json всегда будут полностью записанные данные и чтение из него будет всегда давать корректный результат.
(получается, с помощью переименования файла можно создавать невидимые файлы? можно, но они удалятся, как только их закроет программа, которая их открыла).
Спасибо анон за пояснение, с 1 файлом у меня работает один и тот же скрипт, просто его могут запустить сразу 10 раз в один момент разные хосты, в общем я вот так на всякий случай сделал чтобы не было такого что при добавлении строки другой поток дропнул запись и начал свою file_put_contents('order.txt', $order, FILE_APPEND | LOCK_EX)
Кстати для быстрого парсинга этот текстового файла в массив можно сразу file() использовать и потом искать наличие текущего товара в этом массиве с помощью in_array()? А сколько вообще можно строк загрузить в массив? На сколько памяти хватит? Или лучше резать количество строк допустим до 10 000? А то я чёто смотрю и понимаю что у меня там могут и 100 000 товаров за сутки назаписывать в этот текстовый файл, это если дубликаты не удалять, или 100 000 строк в массиве для php это раз плюнуть?
Вот уж воистину костыли, ещё раз спасибо, учту это
А ты померяй, сколько это времени займет. Но читать и писать по 100 000 строк на каждый запрос не очень хорошая идея, так как это создает большой трафик на диске (нужно постоянно перемещать данные с диска в память и обратно на диск, а его скорость работы ограничена).
> А сколько вообще можно строк загрузить в массив? На сколько памяти хватит?
Да, на сколько хватит. Используй функцию memory_get_usage(), чтобы узнать, сколько памяти съел текущий скрипт, и померяй.
>Используй функцию memory_get_usage()
1 строка памяти до создания массива, 2 строка памяти после создания массива из 20 000 строк, 3 строка время выполения скрипта, как думаешь нормальные показатели? И насколько плохо обстоят дела с памятью? Я так понимаю по умолчанию занято 200 мегабайт, после создания такого массива все 400 мегабайт? Или это килобайт?
скорее всего в настройках интерпритатора отключены короткие теги.
призываю опытных анонов в тред. полтора года греб в мелкой галере фулстаком на всяких битриксах, вордпрессах и тп шлаке. и так вышло что каждый из тимы (нас было всего 4 разраба) зачастую работал только с одним проектом и был сам себе и бэком, и фронтом, и тестером, и девопсом. сейчас свалил в другое место уже на ларавель. и тут всплыли проблемы уже. то девопс почему то снихуя выебывается и посылает меня нахуй отказываясь выполнять команду в контейнере по специфике таски ее надо было запустить один раз, то теперь выясняется что гендир дс2 офиса какой то ебанутый наглухо неадекват который требует фиксов нашей внутренней CRM над которой я собсно щас и работаю при этом давая 0 нахуй инфы, и при попытках спросить и уточнить он полыхает и чуть ли нахуй тебя прямым текстом послать может коллеги вообще на полном серьезе рассказали что у него там сидит тима фронтов которых он натурально любит попиздить иногда палкой, из за чего и остальные разрабы/девопсы/менеджеры перед ним ходят на задних лапках. и вот интересует вопрос: это вообще норм ситуация в конторах или я попал в какое то исключительное место и надо все таки бежать оттуда ?
Это неправильный подход. Зачем так делать? Можно подумать, пропустив данные через strip_tags, они волшебным образом станут "безопасными" и все уязвимости исчезнут?
Нет. Например, от SQL-инъекции это не защитит.
Данные надо экранировать там, где они используются. Например, при подстановке в SQL-запрос - по одним правилам, при выводе в шаблоне - по другим, при подстановке в регулярку - по третьим. Так мы, глядя на код, сразу видим, что он безопасный.
А если экранировать в одном месте, а использовать данные в другом, то непонятно сразу, безопасный код или нет. Надо его весь от начала до конца изучить сначала. А кода может быть 100 000 строк. И даже если он безопасный сегодня, завтра кто-нибудь допишет пару строчек и, не зная того, создаст уязвимость.
Плюс, для подстановки данных в БД и в шаблон нужны разные типы экранирования. А ты хочешь один универсальный метод.
Вот пара статей про то, как избежать уязвимостей и правильно экранировать данные:
https://github.com/codedokode/pasta/blob/master/security/sql-injection.md
https://github.com/codedokode/pasta/blob/master/security/xss.md
Конечно, данные из POST можно "очищать", если для них есть какие-то ограничения. Например, если параметр это целое число, можно принудительно преобразовать строку в число через intval().
А вот лепить функции наугад не надо. нет волшебного способа сделать данные безопасными.
Память меряется в байтах. И там не 400 000, а 4 миллиона.
5 мс ради того, чтобы просто записать id товара - многовато. Хотя, если у тебя сайт тормозной, это мало заметно.
>>1988328
Надо использовать <?php, а не <?
Также, неправильно, что ты запускаешь редактор кода от рута.
>>1988348
Это не кракозябры, а допустимый для JSON синтаксис (вроде \u0234). Если ты декодируешь корректно этот JSON, то кириллица никуда не исчезнет.
>там не 400 000, а 4 миллиона
Всё уже в глаза ебусь, там не id пишется, а строка массив где хранится название, айди, урл и т.д. и таких строк было 20 000, да получается 4 мегабайта всё это дело занимает, а если одновременно запустит 10 человек то уже все 40 наверно будет
Кстати анон, я данные в этот файл передаю с помощью post и думаю хранить в json же, а мне надо эти данные в виде айди, названия, урл и т.д. как-то фильтровать прежде чем записывать в новую переменную в массиве или в новую строку в файле? Ведь я потом всё это буду на другой странице парсить и выводить на странице с помощью js, не сможет ли какой-нибудь хуй передать туда например html и при отрисовке страницы с результатами хранящимися в json или файле вывести свой произвольный код который выполнит его js скрипт или прочую хуйню?
>Тут пошли какие-то вредные советы. Как усложнить разработку в убыток бизнесу.
>И программистов на PHP больше, проще их найти.
Лол, так в этом и вся суть. Малому и среднему бизнесу пыха выгодна, но только из-за того, что к разрабам на ней можно относится как к рабам и платить миску риса в день. Для большого бизнеса это не приоритет.
И даже не пытайся это отрицать, ведь ни одна большая контора php не использует. Совсем ни одна. Фейсбук и вк используют свои модификации, у которых путь кардинально отличается от пути современного php.
>Наверно старшим программистам стало скучно и они от скуки решили поменять язык разработки. При этом нанося ущерб бизнесу.
С php уходят исключительно из-за престижности и оплачиваемости труда на других языках. Думаешь, очень сильно хочется людям после 8 часов работы придти домой и учить новый язык, просто потому что прикольно? Да нет, жизнь заставляет.
Ну а потом можно уже и подискутировать, насколько микросервисы лучше за монолит, насколько язык_нейм лучше за пых и прочее. Каждая свинья свое болото хвалит, сам знаешь.
Алсо, очень забавно как ты сильно за барина переживаешь. Два раза про убыток для бизнеса написал.
>Еще небось и фронтенд на реакте или вью делают вместо серверного рендеринга. В итоге разработка занимает еще больше времени, приложение получается тяжелое и тормозное, долго грузится, долго делает кучу аякс-запросов.
>Нет ничего лучше и проще монолита на PHP, с шаблонизатором Твиг. Получил запрос, обратился к БД, отрендерил шаблон - все это просто пишется и просто отлаживается.
Не, ну это уже святая толстота. Написать конечно может и проще, вот только поддерживать красивый структурированный код на Vue и какой-то пиздец на jQuery или нативном js - это уже принципиально разные вещи.
Про удобство разделения команд фронтовиков и бэкэндеров при этих подходах я совсем молчу.
Ты чего, ОПа не узнал?
>Также, неправильно, что ты запускаешь редактор кода от рута.
Ну по другому он не сохраняет
пчел я сам учусь но у тебя пиздец дичь а не код, ты же не принимаешь данные посланные формой, у тебя персон и меседж даже не созданы, они пустые
Для начала научись бек от фронта отделять
я не спорю что возможно ещё до прихода иисуса php файлы так обзывали, но не в 2021 же году
Ок, покажи современный проект на пхп, где этот формат используется.
Я прошел через пару десятков проектов, нигде этого не встретил.
Либо используется .php, либо шаблоны twig, blade
>Но к чему тут кукареканье про древность я вообще хз.
Пикрил
>как вы собираетесь поднимать этот язык с колен
А зачем? Жс расхайпили - подняли требования для вката.
В пхп пока ситуация получше
С вами походу придётся просто это долго, это не JS который прямо в браузере можно проверить
>это не JS который прямо в браузере можно проверить
Онлайн интерпретаторы для кого?
Консольный режим пхп для кого?
То есть у меня массив примерно такого вида
[
5 => ["id" => 26, "title" => "Название 1"],
10 => ["id" => 64, "title" => "Название 2"],
1 => ["id" => 43, "title" => "Название 3"],
]
И мне надо добавить новый массив
14 => ["id" => 82, "title" => "Название 4"]
В начало, как это сделать чтобы ключи не стирались и не сортировались с нуля?
Походу нашёл, нужно просто не array_unshift делать, а тупо плюсовать 2 массива
В вакансии написано
>Опыт использования хотя бы одного из популярных PHP фреймворков (Symfony, Laravel, Yii2)
Я глянул краткий курс по Laravel, думаю сейчас написать задачу про студентов. Как думаете - этого хватит, если вакансия на Джуна или под опытом подразумевается что-то большее?
Вообще не понятно если честно как использовать документацию Laravel. Вот откуда мне узнать есть ли нужная функция в Laravel...
Рендеринг страничек на пыхе - это вообще охуеть как современно.
А раз тебе не нравится, что ФОРМАТ ФАЙЛА добавлен не вчера, так не используй его, я так и написал, можешь вообще не юзать ничего, что придумано не в этой версии языка, древнее говно же. В спецификации он есть, не deprecated.
Выше вы до чела доебались за то что у него 'кривой' формат файла, хотя он использовал его как раз по назначению, а то что тебе некоторые вещи незнакомы - ну бывает, лул.
>Я глянул краткий курс по Laravel, думаю сейчас написать задачу про студентов. Как думаете - этого хватит, если вакансия на Джуна или под опытом подразумевается что-то большее?
Для начала пойдет, но на собесе могут завалить вопросами по кишочкам лары (di контейнер, елоквент, фасады). Так что советую и их пощупать + подключить парочку популярных либ в свой проект.
>Вообще не понятно если честно как использовать документацию Laravel. Вот откуда мне узнать есть ли нужная функция в Laravel...
Гуглить laravel feature_name
>Рендеринг страничек на пыхе - это вообще охуеть как современно.
Не везде нужны реакты с твигами
>А раз тебе не нравится, что ФОРМАТ ФАЙЛА добавлен не вчера, так не используй его, я так и написал, можешь вообще не юзать ничего, что придумано не в этой версии языка, древнее говно же. В спецификации он есть, не deprecated.
То, что он придуман давно роли не играет. А то, что выпал из употребления минимум намекает на то, что новые разрабы на проекте будут смотреть на это с мыслью WTF
>Выше вы до чела доебались за то что у него 'кривой' формат файла, хотя он использовал его как раз по назначению, а то что тебе некоторые вещи незнакомы - ну бывает, лул.
Если бы он использовался чаще чем никогда, то претензий не было б
Повторяю реквест: доставь актуальную пхп либу или проект, где такой формат используется
Спасибо.
У меня смежный вопрос: если в вакансии джуна есть вот такое требование:
>Опыт использования хотя бы одного из популярных PHP фреймворков (Symfony, Laravel, Yii2)
Понятное дело что везде по разному, но, скорее всего, как будут обстоять дела в конторе?
Придется по ходу работы учить все фреймы и понемногу пилить на них разные проекты, или же меня будут садить на проекты на выбранном фрейме?
А то не очень хочется лишний раз тратить свое время на Ларавел или, упаси Б-же, Yii.
С мыслью WTF будут смотреть только вчерашние вкатуны, но они много на что так смотрят. А свой манямирок про ненужность стандартных опций языка можешь в psr направлять, там твое мнение очень важно.
Вообщем когда формат объявят deprecated - тогда и приходи со своими претензиями.
Про либу с версткой - ну вообще пушка, я с cmsками не работаю, сам ковыряйся в этом.
Ну вакансия через 2 дня должна закрыться.
А я много чего не знаю. Я просто хочу попытаться пойти на собес, но ссыкотно, вдруг я ничего не отвечу
А у тебя включен показ ошибок или запись их в лог ошибок? Тогда бы по тексту ошибки можно было понять, в чем дело. Почему не смотришь логи и не включаешь отображение ошибок?
Также, у тебя код странный. Ты используешь переменные $message, $person, а где задаются их значения? Они автоматически из POST-запроса в переменные не подставляются.
Вот урок про работу с формами: https://www.php.net/manual/ru/tutorial.forms.php
Также, у тебя тут дикая уязвимость. Ты полученные от пользователя (или хакера) данные записываешь в файл и затем иклудишь этот файл (то есть, если в нем содержится PHP код, он выполнится). Есть другая, безопасная, функция, которая выводит содержимое файла, но не выполняет код в нем.
Также, прочитай про уязвимость XSS: https://github.com/codedokode/pasta/blob/master/security/xss.md - она у тебя тоже есть.
Надо настроить права доступа к папке и файлам, возможно, поменять владельца файлов или группу владельца. Почитай про права файлов в линукс (rwx, владелец, группа владельца, chmod) и подумай, что надо поменять. Ну или пиши сюда, если не додумаешься.
>>1988768
Это нормальное расширение для HTML-шаблонов с включением PHP.
>>1988566
Кстати, у тебя еще одна проблема. Ты не делаешь redirect-after-POST и если после добавления сообщения обновить страницу, то запрос отправится снова и добавится еще одно сообщение. Надо делать редирект после обработки запроса. Можешь почитать это: https://github.com/codedokode/pasta/blob/master/forms.md
Рано перекатывать. В тред легко попасть, нажав кнопку PHP в закрепленном треде.
>>1988915
Массивы в JS и PHP разные. В JS массив всегда упорядочен по возрастанию ключей, не важно в каком порядке ты вставляешь значения. И в JS в массиве ключи (почти) всегда идут по возрастанию разрывов: 0, 1, 2, 3 ... и так далее.
Есть, конечно, исключения. В JS можно создать массив с разрывами так:
let a = [1, 2, 3];
delete a[1]; // сделали разрыв
console.log(0 in a); // true
console.log(1 in a); // false
Но это извратный способ (и нелогично, что в массиве могут быть дырки, это видимо тяжелое наследие прошлого), и делать так не надо.
Массив в PHP больше похож на словарь из JS (ассоциативный массив), но в JS словари неупорядоченные, а массивы PHP упорядоченные.
В PHP массив "помнит" порядок, в котором вставляли значения. В PHP ключи не обязаны идти по возрастанию и могут идти в произвольном порядке, например:
$a = [10 => 'a', 3 => 'b', 99999 => 'x'];
И этот порядок следования элементов запоминается.
Рекламу тебе будут показывать, просто не будут засчитывать просмотры. А вообще, попробуй, посмотри, может какой-то сайт тебе что-то интересное и покажет.
>>1989214
> А то, что выпал из употребления минимум намекает на то, что новые разрабы на проекте будут смотреть на это с мыслью WTF
Ты путаешь большие реальные проекты (где используют twig/blade) и учебный проект на 10 строчек (где оправданно использовать нативный шаблонизатор).
Так, по твоей логике, ему надо эту форму на Симфони что ли переписать, с dependency injection и доктриной?
Я кстати, встречал большой проект с использованием нативного шаблонизатора. Во времена Zend Framework так делали.
Голыми SQL-запросами, с захешированным вручную через консоль паролем и его же ручным экранированием?
Топорно как-то. На ум приходят фикстуры, но они же для тестирования предназначены.
Можно сделать миграцию и в ней добавить через SQL-запрос. Можно сделать CLI-команду и запустить ее руками.
МимоВкатунНачинающий
Если планируешь на норм работу устроиться - однозначно да. Докер для бэкендера сейчас - дефолтный навык, такой же, как гит например.
Спасибо буду освайвать. Из linux, нужно уметь настрайвать файрвол, политики безопасности? Вообще на каком уровне linux нужно знать?
Попробовал if (5 > 10) echo "Да" : echo "Нет" выдаёт ошибку
И как присваивать результат if в переменную? Без прописывания её в фигурных в скобках?
Типа $res = if (5 > 10) {"Да"} else {"Нет"}; echo $res крашится
В тернарном операторе просто нужно убрать if и он заработает
Тернарный оператор работает примерно так же, как и в js.
'Yes' ?: 'No';
'Yes' ? 'if true' : 'if false';
Ну не прям задрачивать, но вцелом ориентироваться будет не лишним, уметь wpsку настроить, nginx поднять, права и порты раскидать. Вообще для этого девопс есть, но пугаться при виде терминала тоже не солидно.
>>1989644
Ну это путь симфони, какой уж есть, более того весь php в 8+ версии к этому идет, там аннотации по типу симфони на уровне языка прикрутили уже. Вообще в симфони часто можно их избегать, например мапить доктрину мне удобнее через xml, особенно сложные структуры.
$id = "1";
$title = "Тест";
echo "{";
echo '"id":"' . $id . '","title":"' . $title . '";'
echo "}";
Или парсят данные в массив, кодируют его в JSON и выводят типа
$array = ["id" => 1, "title" => "Тест"];
$array = json_encode($array);
echo $array;
Или есть ещё какие-то способы о которых я даже не догадался, кроме фреймворков, хочу понять основу
Наверно непонятно объяснил, как они формируют ответ, выводят его построчно или кодируют массив и выводят это через echo
Вот например паблик API https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY как они сгенерировали весь этот текст, выдернули из базы, собрали в массив, обработали, кодировали в json формат и тупо echo? Как вообще в основном это делают, ведь способов нарисовать этот текст много, но мне кажется 2 вариант что я описал нормальный и им можно пользоваться
Не хранят же они всё это в файлах, ни же это генерируют когда ты запрашиваешь ответ с этого API, вот мне интересно как они его собираюь в кучу и отрисовывают на странице которую ты запрашиваешь
Не знаю просто взял симфони. По ларавелу мне показалось слишком много мусора. Мусор как мусор, куча прям. Надеюсь ты понимаешь что я имею ввиду.
Ну точно не построчно. Они все возвращают данные в json формате.
> Какие обычно задачи выполняет junior на работе?
Запилить небольшую фичу, исправить какой-нибудь баг. Миддл уже делает более глобальные задачи с серьезным функционалом.
> И еще: мидл проводит код ревью джуну, а сеньер мидлу?
Везде по разному.
Вообще это сильно зависит от конторы.
Вцелом джун обычно пишет круды, делает мелкие фиксы, либо пилит какие то новые модули под контролем куратора, если контора может себе такое позволить.
Мидлы и сеньоры уже самостоятельно решают задачи в командах или поодиночке и вцелом могут делать вообще все что угодно. Грань между middle и senior не жесткая, то есть например "сеньор" Вася из рандом студии по клепанию сайтецов будет middle- в крупной энтерпрайзной конторе.
Но вцелом сеньоры чаше разрабатывают какуюто сложную логику, планируют общую архитектуру итд. В крупных конторах есть отдельные сеньорские должности для техлида, архитектора, тимлида и всякое такое.
Ревью устроено везде по-разному. Я чаще встречал перекрестное. Когда реквест не заливается, пока не будет заапрувлен хотябы двумя разработчиками. Бывает, что этим занимается техлид или тимлид. Ну а за джуном обычно все равно крепят куратора и он уже смотрит за ним.
Еще есть такая фича как отдельный Q&A для кодовой базы. Но это больше за бугром распространено, у бохатых.
Тупо в текстовом файле в формате
65|Телефон|100$
567|Телевизор|200$
58|Компьютер|500$
И каждый раз разбивать его на массив по \n, а далее на подмассивы по | и отрисовывать
Или в json формате в json файле
{{"id":65,"order":"Телефон","buy":"100$"},{"id":567,"order":"Телевизор","buy":"200$"},{"id":58,"order":"Компьютер","buy":"500$"}}
И каждый раз расспаршивать его в массив и отрисовывать
Или вообще в базе данных? Или тут по сути без разницы и выбирать то что нравится или то что занимает меньше времени на отрисовку, меньше оперативной памяти и меньше места на диске?
Вообще в базе данных конечно. Можно кэш накатить, если данные большие.
Аноны, нужно ли мне писать, что у меня базовые знания всего, чего они требуют? Если да, то как?
Или не делать акцент на то, что у меня базовые знания?
>Ты путаешь большие реальные проекты (где используют twig/blade) и учебный проект на 10 строчек (где оправданно использовать нативный шаблонизатор).
Вот, на большом проекте будет шаблонизатор. На учебном .php
Зачем брать неиспользуемое расширение?
>Так, по твоей логике, ему надо эту форму на Симфони что ли переписать, с dependency injection и доктриной?
Где я такое писал?
>Я кстати, встречал большой проект с использованием нативного шаблонизатора. Во времена Zend Framework так делали.
+ к тому, что это устаревший формат. Неоффициально, но из бестпрактис он выпал
Вдохновлено джавой, как и все остальное в Симфони. Причем названия аннотаций и параметры зачастую те же. Джависты вон уже давно шутят про Annotation Oriented Programming.
А вообще, так просто удобнее. Когда есть выбор между php кодом и конфигом, аннотации часто вбирают в себя все плюсы этих двух вариантов.
>>1989701
> например мапить доктрину мне удобнее через xml, особенно сложные структуры.
Больной ублюдок. XML же вообще не ориентирован на удобство записи и чтения человеком, это ж язык разметки для машин по большей части?
>$id = "1";
>$title = "Тест";
>echo "{";
>echo '"id":"' . $id . '","title":"' . $title . '";'
>echo "}";
Сам то как думаешь, удобно так рендерить?
Ну это само както пришло, сперва был проект на симфони, который дописывал на аутсорсе - там было много сложных связей, большие таблицы и ебейшая вложенность сущностей, в аннотациях все по самые гланды, разбираться было невозможно, потому что банально десяток файлов листать и искать поля в объекте - та еще ебля. Вот и пришлось все в xml переписывать. Потом на мэйн работке, когда стали симфони использовать тоже приняли xml как дефолт.
Значит все используют массивы которые перед выводом кодируют с помощью json_encode? Просто не хочу потом всё переписывать
Ну так не юзай, раз в твоем проде это не используют, тебе так и сказали с самого начала. Зачем ты доебываешься до людей в треде со своими фантазиями?
Ты неправильно понял.
Получать данные можно в разном виде: набор переменных, массивы, объекты, коллекции и т.д.
Отдавать тоже можно по разному: json, xml, html, просто текст, csv, бинарные данные и т.д.
А ямлы всякие разве не удобнее будут?
Не, меня интересует именно json, получается все json API достают данные из базы данных, помещают их в массив и в конечном итоге кодируют в json и выводят его через echo, буду тогда по такому принципу делать
В туториале ZF1, например, PHP-шаблоны используются с расширением phtml. Логично, что для шаблонов используется другое расширение. Так что это не малоизвестный формат, просто ты с таким не сталкивался и не знаешь.
Код, где ты по частям собираешь JSON из строк, неправильный. Ты не экранируешь содержимое строк. Например, если в строке встретится двойная кавычка, ее надо корректно заэкранировать, а ты это не делаешь.
Для вывода логично использовать json_encode. Не забудь только отдавать правильный HTTP-заголовок content-type.
Не корми его пожалуйста, еще поселится тут. Его уже дважды тыкали носом в доки.
>все json API достают данные из базы данных
Помимо бд есть другие хранилища
>помещают их в массив
Об этом уже писал. Не только массивы
Постоянно натыкаюсь, что пишут, что через 5 лет он уже будет вообще неактуален. И ещё если его брать как первый ЯП, то всё по пизде пойдёт, потом никуда не свитчнешься.
анон, 25лвл
Его уже хоронят 10 лет
>что через 5 лет он уже будет вообще неактуален
Скорее через 5 лет реакт будет неактуален.
На пхп на наш век работы хватит
Неактуален - это слишком расплывчатое понятие. Работа на пыхе еще долго будет, если ты об этом.
Как первый язык, зависит от того, какую цель ты преследуешь в изучении языка. Если цель именно стать программистом и тебе интересно само программирование - то это один из худших вариантов например, слишком велик риск нахвататься фатальных привычек. Если быстро вкатиться и начать что то зарабатывать этим - отличный вариант, лучше только js наверное и то спорно.
Хочу сделать товары популярные за 24 часа, всё что я придумал это делать проверку есть текущий товар в массиве или нет, если есть - увеличивает ему количество просмотров на 1, если нету - то добавляем товар, плюс сохраняем дату, и обновляем её каждый раз когда этот товар посмотрели снова, и если дата последнего просмотра уже больше 24 часов - то удаляем этот товар из массива
Но сука меня ждал подвох, а как быть с просмотрами, как посчитать столько их было за 24 часа, ведь товары которые могут посмотреть сегодня 1000 раз могут ещё неделю висеть в топе просмотров, хоть их уже и не смотрят вовсе, но они там потому что когда-то у них набило большое количество просмотров, можно обнулять количество просмотров в 12 ночи, но это же не вариант, в 1 ночи там уже будет количество просмотров за 1 час, а не за 24 часа
Пока в голову приходит только сохранение количества просмотров в массив из 24 значений в каждом товаре и допустим в 1 ночи перезаписывать 1 значение, в 2 значение 2 и т.д, но как это сделать без затирания новых просмотров х.з., а чтобы узнать общее количество просмотров нужно будет сложить все эти 24 значения из массива просмотров в этом товаре, в общем надеюсь я понятно объяснил, подскажите как ещё можно это сделать и лучше чтобы за зря не напрягать сервак
Коротко: Как сохранять количество просмотров за 24 часа? Чтобы просмотры которые добавлись 25 часов назад удалялись из общего числа просмотров в текущем товаре
> Хочу сделать товары популярные за 24 часа
Очевидно что товары из блока "популярные" будут иметь больше просмотров чем другие. Я бы не выебывался и просто раз в неделю вручную чекал топ просмотров и вручную же обновлял товары в популярном (алсо, туда же можно пихнуть не популярные товары, а те которые ты хочешь продвинуть). Если у тебя там конечно не овер сто позиций в популярном.
Я хотел не блок, а отдельную страницу и там постранично выводить то что больше всего посмотрели за 24 часа, и чтобы самые популярные были имеено вверху, и вот мне интересно а как остальные считают количество просмотров за 24 часа, я пока придумал только записывать количество просмотрво за каждый час и складывать их чтобы узнать общее количество при сортировке товаров, а через 24 часа тупо удалять 1 значение и писать новое, то есть удалять значение которому уже 25 часов, надеюсь понятно изъесняю лол, просто я думаю наверняка есть способ проще ведь наверняка многие с этим уже сталкивались и придумали то до чего я не догадался, а составлять топ самому лень, хочу чтобы юзеры сами его составляли своими просмотрами
Подозреваю что у остальных "популярное" это далеко не то что смотрят пользователи, а скорее то что хочет продать маркетолух.
> хочу чтобы юзеры сами его составляли своими просмотрами
Если у тебя магазин, то логичнее топ составлять не по просмотрам, а по продажам.
> можно обнулять количество просмотров в 12 ночи, но это же не вариант, в 1 ночи там уже будет количество просмотров за 1 час, а не за 24 часа
Не вижу проблемы, ты в 0:00 смотришь количество просмотров за прошедшие сутки (а не за час) и составляешь топ, просмотры же обнуляешь. Через сутки делаешь тоже самое.
Если тебе нужно именно строго за последние 24 часа, то нужно в лог или таблицу БД писать и id товара, и точное время просмотра. То есть, на каждый просмотр создается новая запись, и удаляются записи старше 24 часов.
Так в таблице или файле быстро наберется куча записей. В принципе, БД не умрет от этого, а вот вручную возиться с файлом на 10 000 записей будет довольно неэффективно.
Можно сделать такой трюк для уменьшения числа записей: группировать вместе просмотры одного товара внутри одного часа. То есть, записи будут такого вида:
товар1,10,2021-01-01 12:00:00
Так мы получим чуть меньшую точность (будет браться число просмотров примерно за последние 23-24 часа, а не точно за 24), но зато надо будет меньше записей.
А зачем тебе явно хранить кол-во просмотров?
Логай куда-нибудь просмотры товаров с датой и временем просмотра.
Потом по логам сможешь посчитать кол-во просмотров за нужный промежуток времени. И пересчитывать топ раз в N времени
>а скорее то что хочет продать маркетолух
Мне нужно именно по количеству промотров, товары я привёл для примера
>Через сутки делаешь тоже самое
Тоже самое, хочу чтобы список обновлялся в лайве, а не раз в 24 часа, по этому и нужно придумать или узнать как делают другие чтобы считать количество просмотров за последние 24 часа в любое время суток, а не только в 12 ночи
>>1990273
Вот по этому я и ВСТАЛ, всё занимает много места и будет много крутиться за зря увеличивая очереди на запись, так как храниться всё будет в json файле
Я придумал немного компактнее твоего, хотя может и нет, в общем в ключе просмотре писать массив с 24 массивами где хранится час от 1 до 24 и рядом дата, когда дата равна 24 часам значит эти данные в этом часу уже старые и их нужно затереть и выставить свежую дату и начать запись просмотров с 1, то есть у нас есть предыдущие 23 часа и текущий час обнулился и начал записываться заново, походу так и придётся ебаться, просто много циклов получается пиздец, зато самый компатный вариант на выходе, интересно сколько по времени это будет обрабатываться и занимать оперативки
Можешь посмотреть в сторону хранения связок событий и uuid товаров в оперативке с ограниченным сроком жизни. Ну это если есть возможность redis или memcache накатить. Работать быстро будет. Всякие озоны похожий подход используют для некритичных данных.
окей, тогда очевидный вопрос: стоит ли в резюме указывать что вот 3 месяца работал там то там то на таком то стеке? с одной стороны это для меня плюс тк люди видят что есть коммерческий опыт в ларе, а не только на пэт проектах, но с другой стороны минус в том что в новую будет тяжело залететь тк будут думать мол что это я какой то ебанутый/джампер и тд и тп
магенто2 его использует. так что где он -там и этот формат. съебался с галеры как раз когда к ним прилетел проект на этом говне, спустя месяц связался с бывшими коллегами и они говорят что это кал и боль лютая
так что да, говно, старо - тут ты прав, но то что нигде не юзается - тут ты не прав
И каким образом формат файла доставляет боль ты сможешь придумать? Он во всех интерпритаторах php работает. Может кал и боль это сама ебучая цмс?
Походу придётся не выёбываться и просто выводить собранные данные за вчера, а то что соберу сегодня показывать завтра
Аноны, а такой вопрос, вот я хочу в 12 часов ночи обнулять все просмотры в масиве, как по быстрому это сделать? Только через цикл? Типа крутить в цикле $order[key]["view"] = 1;? Или есть какая-то специальная функция для таких задач? Поиска нужного ключа в ключе и его сброс на нужное значение?
это фреймворк , а не цмс я тоже с этого прогорел лол
сам не работал, но по словам бывших коллег проблема в том что там часть вьюх в phtml, а часть в xml. на мой вопрос почему нельзя гонять просто json и посадить на фронт нормальный js фреймворк был такой ответ: структура и ядро слабо под это подготовлены, сами разрабы вот вот только начали пилить такие фичи туда + у заказчика куплен готовый модуль для этой платформы который является краеугольным камнем во всей системе последнее также звучало объяснением для того почему они проект с симфы переписывают на магенто2 лол
Подожди минутку, я пропустил важный момент в твоем посте, а зачем ты вместо бд json файл используешь?
Ну значит у них точно такие же проблемы с .php. Я не вижу корреляции с конкретно .phtml.
А переписывать с симфони на магенто - это новости из параллельной вселенной просто.
Мне не дают доступ к БД, да и там будет максимум 1000 товаров, можно и в файлике похранить
Снова сам отвечаю на свой вопрос date("dmY", strtotime('yesterday'))
>А переписывать с симфони на магенто - это новости из параллельной вселенной просто.
трустори, я не троль. как мне сказали проще было взять магенту с готовым модулем и перекинуть старый функционал туда, чем на симфонии пилить новый функционал тот что в том модуле есть
$array = array(
'0' => array(
'id' => '5',
'name' => 'Нариман',
),
'1' => array(
'id' => '10',
'name' => 'Виталик',
),
'2' => array(
'id' => '15',
'name' => 'Павлик',
)
);
Вот например как тут отсортировать массив по имени? sort() мне просто выдаёт true
Читай офф документацию, для функций, которые используешь. Вероятно тебе лучше подойдет array_multisort();
Лол по традиции отвечаю сам себе
function abu($a, $b){
return ($a['name'] < $b['name']);
}
usort($array, 'abu');
Аноны, а почему помещение функции во внутрь сортировки вызывает ошибку?
usort($array, function ($a, $b){
return ($a['name'] < $b['name']);
});
Это может быть из-за старой версии PHP? 5.2
Может потому что используют все ее как цмс, вообще фрэймворком назвать можно даже wordpress, если очень захотеть, а лара со всеми модулями и обмазками - почти готовая цмс сейчас. Вот только если называть говно шоколадом, вкуснее оно от этого не станет.
Много мест по паре месяцев не очень выглядит в глазах херки. То ли ты мешкаешься, то ли тебя выгоняют. Лучше это объединить в одну фирму, пусть и приврав
> гонять просто json и посадить на фронт нормальный js фреймворк
Я не понимаю, чем JSON и "нормальный фреймворк" лучше, чем рендерить шаблоны на сервере.
На сервере ты имеешь объекты вроде Product, Order, Category, ты можешь посмотреть, какие у них есть свойства и методы. К ним есть комментарии и документация.
На фронтенде ты имеешь никак не типизированный и не документированный JSON - просто помойка, свалка из случайных данных. Причем вполне возможно, что, например, одно API отдает одни данные о товаре, а другое - немного другие. Это же JSON-помойка без типизации.
По моему, первое лучше второго.
Соснешь хуйцов на фрилансе без опыта.
Будешь в лютом говне ковыряться типа цмсок и самописов. Нормального опыта не получишь
Неправильно. В документации написано, что функция сравнения должна вернуть -1, 0 или 1. У тебя она возвращает true либо false. Почитай про оператор <=> (spaceship) и переделай.
>Я не понимаю, чем JSON и "нормальный фреймворк" лучше, чем рендерить шаблоны на сервере.
Вчера ебался с багом как раз с рендером шаблонов на сервере.
Проблема была в том, что сервер не знает текущего состояния на фронте и тупа шлет новую верстку, жс и стили, которая ломает текущий жс функционал.
Был бы фронтенд фрейм - такой хуйни не было б
Хотя, если у тебя PHP 5.2, то оператора <=> там нету. Ну, тогда руками делай сравнения или используй функцию вроде strcmp.
>Это может быть из-за старой версии PHP? 5.2
Эту версию перестали поддерживать 10 лет назад. Задумайся, 10 лет. За эти 10 лет фронтенд перевернулся с ног на голову
Для тебя наверное лучше, если ты вкатыш или клепаешь магазины для ашотов. Если попадешь в нормальную продуктовую компанию - сам все поймешь довольно быстро.
Я боюсь представить, что с твоим мирком будет, когда c graphql или протобафом столкнешься.
Я понимаю, но админам похуй на это, я её поменять не могу, так почему ошибку выдаёт? Значит эта версия не поддерживает анонимные функции внутри системных функций?
Больше тесткейсов запусти и тогда сможешь утверждать, что работает
аноны, учу laravel, возникла проблема скорее по js ну да и похуй - собираю через npm run dev в app.js весь жс. Проблема в том что все что я туда импортирую вне скрипта недоступно, а я хочу в onclick в html повесить медтод импортируемого класса. Как фиксить?
Symfony? Angular?
>Vue используют, в связке с Laravel
Его использовали, т.к. vue одно время был предустановлен в ларе.
>А какой front end фреймворк используют в связке с
Symfony? Angular?
Любой
Понял спасибо
Vue чем то схож по назначению с ларой. Простой, дружелюбный, идеален для среднемелкого софта. Плюс легкий и приятный вкат, в отличии от того же ангуляра.
Ну и анон выше написал еще.
Изучение плюсов даёт преимущество... Долго, плюсы изучал кстати?
Или это то о чём предупреждали выше? Что один поток перебивает другой, то есть пока 1 поток считывает содержимое файла, другой начинает запись и предыдущий получает данные не до конца? А как защить его во время считывания? В file_put_contents() есть метод LOCK_EX, а вот в file_get_contents() такого нет, или переписать всё на fopen() fwrite() fclose()?
Симфони - это про другое, больше про интерпртайз или чтото масштабное, мощный, гибкий, при этом сложный достаточно. Но на нем вцелом и зарплаты самые высокие в php. Doctrine - вообще отдельный каеф, очень похожа на Hibernate из java, при наличии прямых рук позволяет творить прям очень мощные штуки. Но как первый фрэймворк - имхо лара все таки лучше.
Есть ceil() для этого, если я правильно понял тебя. Кстати всместо intval() можешь использовать явное приведение (int)$val;
Ты при каждой итерации цикла перезаписываешь переменную $row и записываешь в нее результат из новой строки таблицы.
А строка меняется с какой стати?
>>1991302
Блин аноны происходит какая-то коллизия когда в массиве собирается от 1000 значений или много запросов одновременно, я не разобрался, в один момент файл в который всё сохраняется становится просто пустым, я так понимаю один из потоков просто не может записать файл или загрузить его до конца из-за прерывания другим потоком, интересно что это на самом деле и поможет ли замена file_get_contents file_put_contents на fopen fwrite fclose, сейчас уже просто нет сил всё переписать чтобы проверить, всё происходит рандомно через несколько минут или часов
Я правильно понимаю что из-за нескольких потоков происходит то что во время считывания один из потоков начинает запись обработанного файла и предыдущий поток не дочитав файл до конца теряет его часть и в иторе происходит ошибка и он сохраняет только тот товар при просмотре которого он был вызван и затирает собой старый файл с 1000 товаров записю с 1 текущим просмотренным товаром?
Выход из этого проверять перед загрузкой размер файла и проверять его после окончания загрузки? И если он меньше то скачивать его снова? А может быть что во время проверки размера файла он тоже попадёт на момент записи другим потоком и считает не тот размер что должен был быть?
Или я так понял ещё вариант это при записи сохранять файл под другим названием и в конце записи просто переименовывать его в то название что должно быть? И в таком случае другой поток во время считывания прочитает файл до конца хоть он уже и будет заменён путём смены имени? Верно?
Ну или какие ещё способы обхода этого есть? Могу только сохранять в файл, БД нету, размер его получается при 1000 товарах около 250кб, и походу этого размера хватает чтобы один из потоков не успел его скачать до конца как другой поток начинает его затирать записью в него
>>1991510-хуй
Или может файл открыть с помощью fopen, блокировать, читать, разблокировать, закрывать, потом обрабатывать, опять открывать fopen, блокировать, записывать, разблокиивать и закрывать? Так получится избежать коллизий с перезаписями друг-друга?
И что будет делать другой поток если ему встретится блокировка другим файлом? Он будет ждать или выдаст ошибку и прекратит работу?
По идее ты из своих скриптов должен ставить обработчик. Также, как костыль, можно сделать функцию публичной с помощью window.x = function(){}
>>1991148
Во многих случаях фронтенд-фреймворки не нужны и удобнее сразу на сервере генерировать и отдавать HTML, чем грузить мегабайты JS кода, делать кучу аякс-запросов и тд.
>>1991285
Блокировки в PHP добровольные (я писал выше), то есть LOCK_EX действует только на операции, которые используют блокировку (через LOCK_EX или fcntl). Например, если ты читаешь заблокированный файл через file_get_contents без блокировки, то поставленная блокировка игнорируется и читается не записанный полностью файл.
То есть, чтобы блокировки работали, все (читатели и писатели) должны их использовать. Так как они добровольные, и процесс должен явно проверять наличие блокировки, чтобы они работали. Если он не проверяет блокировки, то ему никто не помешает писать или читать файл.
Смотри мануал по функции flock(). Она как раз позволяет проверять наличие блокировки.
>>1991392
Потому что там цикл while, который выполняется много раз. Также, почитай мануал по mysqli_fetch_row, ты явно не понял, как она работает.
>>1991434
У int чисел есть ограничение на макс/мин. Ты не можешь преобразовать в int число, которое выходит за пределы допустимого диапазона. Потому что под int выделено ровно 4 (в 32-битных) или 8 байт (в 64-битных системах) и в них нельзя впихнуть произвольно большое число.
Если провести аналогии, представь, что у тебя на листке в клеточку выделено 4 клеточки, и в каждую можно запихнуть только одну цифру. Ты не сможешь так записать число больше, чем 9999.
Потому число преобразуется в float, возможно с потерей точности (то есть может немного отличаться от правильного числа).
Чтобы работать точно с произвольно большими числами, используй расширения bcmath или GMP. Они хранят число в виде строки.
Ну так я ее перезаписываю одним и тем же значением. Ты поясни нормально.
И почему в условии цикла присваивание блядь? Как это обрабатывается, истинность чего проверяется циклом? И вообще цикл должен быть бесконечным или вообще не выполнится, так как ни $row, ни значение функции не меняется в теле цикла.
> Я правильно понимаю что из-за нескольких потоков происходит то что во время считывания один из потоков начинает запись обработанного файла и предыдущий поток не дочитав файл до конца теряет его часть и в иторе происходит ...
Если ты используешь JSON, и прочитал файл частично (так как другой процесс еще не дописал его), то ты не сможешь декодировать этот JSON - функция json_decode вернет null вместо массива. JSON можно декодировать только если он целый. Если ты пишешь кривой код и не проверяешь результат на null, то наверно твой кривой код думает, что массив пустой, добавляет в него свой один товар и записывает это назад на диск.
> Или я так понял ещё вариант это при записи сохранять файл под другим названием и в конце записи просто переименовывать его в то название что должно быть?
Это работающий вариант.
> И в таком случае другой поток во время считывания прочитает файл до конца хоть он уже и будет заменён путём смены имени? Верно?
Да. При переименовании ОС просто отбирает имя у старого файла и присваивает его новому файлу, но сам старый файл остается на диске в неизменном виде (хоть и без имени), и ты сможешь без ошибок его дочитать до конца.
> Могу только сохранять в файл, БД нету
Вообще, есть встраиваемая БД SQlite, она работает с файлами и она умеет делать блокировки при чтении и записи. БД решает проблему блокировок за тебя.
>>1991708
> Или может файл открыть с помощью fopen, блокировать
Можно, но в промежутке между открытием и блокировкой другой процесс может тоже успеть открыть файл на запись и обнулить его, прежде чем упрется в блокировку. То есть, возможно, будет так:
Процесс 1 открывает файл на чтение
Процесс 2 открывает файл на запись и этим обнуляет его
Процесс 1 успешно берет блокировку LOCK_SH
Процесс 2 пытается взять блокировку LOCK_EX и ждет снятия блокировки первым процессом
Процесс 1 читает обнуленный файл
Хотя я на 100% не уверен. Возможно, открытие файла (fopen) на запись не обнуляет его содержимое, а файл обнуляется только при попытке что-то записать (fwrite). Тогда все будет работать как надо. Можешь проверить это экспериментально, сделай скрипт, который просто открывает файл на запись (fopen с 'w') и закрывает его и проверь: обнулится ли открытый файл или нет.
> И что будет делать другой поток если ему встретится блокировка другим файлом? Он будет ждать или выдаст ошибку и прекратит работу?
Если поток попытается взять блокировку на заблокированный файл, то он остановится и будет ждать снятия блокировки. А если он не пытается взять блокировку, а просто делает file_get_contents или fwrite, то операция выполняется, игнорируя блокировку. Так как блокировки в PHP добровольные, а не принудительные.
> Я правильно понимаю что из-за нескольких потоков происходит то что во время считывания один из потоков начинает запись обработанного файла и предыдущий поток не дочитав файл до конца теряет его часть и в иторе происходит ...
Если ты используешь JSON, и прочитал файл частично (так как другой процесс еще не дописал его), то ты не сможешь декодировать этот JSON - функция json_decode вернет null вместо массива. JSON можно декодировать только если он целый. Если ты пишешь кривой код и не проверяешь результат на null, то наверно твой кривой код думает, что массив пустой, добавляет в него свой один товар и записывает это назад на диск.
> Или я так понял ещё вариант это при записи сохранять файл под другим названием и в конце записи просто переименовывать его в то название что должно быть?
Это работающий вариант.
> И в таком случае другой поток во время считывания прочитает файл до конца хоть он уже и будет заменён путём смены имени? Верно?
Да. При переименовании ОС просто отбирает имя у старого файла и присваивает его новому файлу, но сам старый файл остается на диске в неизменном виде (хоть и без имени), и ты сможешь без ошибок его дочитать до конца.
> Могу только сохранять в файл, БД нету
Вообще, есть встраиваемая БД SQlite, она работает с файлами и она умеет делать блокировки при чтении и записи. БД решает проблему блокировок за тебя.
>>1991708
> Или может файл открыть с помощью fopen, блокировать
Можно, но в промежутке между открытием и блокировкой другой процесс может тоже успеть открыть файл на запись и обнулить его, прежде чем упрется в блокировку. То есть, возможно, будет так:
Процесс 1 открывает файл на чтение
Процесс 2 открывает файл на запись и этим обнуляет его
Процесс 1 успешно берет блокировку LOCK_SH
Процесс 2 пытается взять блокировку LOCK_EX и ждет снятия блокировки первым процессом
Процесс 1 читает обнуленный файл
Хотя я на 100% не уверен. Возможно, открытие файла (fopen) на запись не обнуляет его содержимое, а файл обнуляется только при попытке что-то записать (fwrite). Тогда все будет работать как надо. Можешь проверить это экспериментально, сделай скрипт, который просто открывает файл на запись (fopen с 'w') и закрывает его и проверь: обнулится ли открытый файл или нет.
> И что будет делать другой поток если ему встретится блокировка другим файлом? Он будет ждать или выдаст ошибку и прекратит работу?
Если поток попытается взять блокировку на заблокированный файл, то он остановится и будет ждать снятия блокировки. А если он не пытается взять блокировку, а просто делает file_get_contents или fwrite, то операция выполняется, игнорируя блокировку. Так как блокировки в PHP добровольные, а не принудительные.
Выражение вида while ($x = func()) работает так:
- выполняется $x = func()
- проверяется: если $x равен null, 0, "", "0", [] (лживенькие значения, false values) то условие считается не выполненным, иначе условие считается успешно выполненным и цикл продолжается.
Аналогично работает конструкция вроде while($x) или if ($x): если в $x лживенькое значение, то условие не выполнено, а если что-то другое (например: не пустой массив) то условие успешно выполнено.
То есть, присваивание выполняется перед каждым шагом цикла и результат этого присваивания преобразуется в boolean тип как описано в мануале: https://www.php.net/manual/ru/language.types.boolean.php#language.types.boolean.casting
Если после преобразования получилось false, то условие не выполнилось. Если true, то выполнилось.
Это то же самое, что я написал выше, только со ссылкой на официальный мануал.
>Выбирает одну строку данных из результирующего набора и возвращает её в виде массива, в котором индексы элементов соответствуют номерам столбцов (начиная с 0). Каждый последующий вызов функции будет возвращать массив с данными следующей строки набора или null, если строки закончились.
Так уже яснее стало. Перечитывание документации помогает.
бамп
Спасибо анон пока решил проблему с переименованием, вроде всё работает, хотя в временной папке появились пустые файлы которые не удаляются, сдаётся мне где-то проскакивает ошибка даже во время переименования которая ломает сам php что он оставляет нулевые файлы, завтра попробую их удалить ещё раз может какой-то кеш их защищает, а так да придётся склайт освоить, есть какой-то хороший русский гайд с простейшими примерами без ООП? Быстрый поиск выдал какие-то куски информации
добавить листенер в app.js который в ресурсах
Для Двача уже есть такое ? Допустим, чтобы можно было все картинки/видео с треда скачать или с раздела (единственное, я хз, как это к браузеру прикрутить в виде расширения, я во фронте не бум-бум, поэтому буду просто скрипт на Убунте пилить).
Еще думаю, мб классификатор написать, чтобы собранный контент по папкам сам распределялся. У Яндекса или Гугла же сервисы для этого должны быть ?* Правда эт уже сложновато будет, но можно попробовать.
короче я заебался ждать от вас каких-либо контактов. с предложениями пишите в телегу @mrzpdr
Если коротко, то нужна йоба, которая построчно будет подставлять данные из таблицы (exсel, csv) в документы, готовые к печати (пдф). то есть на входе табличка с данными, на выходе - пак документов с подставленными данными количество документов соответствует количеству строк.
учтите пацаны, если я начну в итоге делать это сам, то я вас заебу вопросами. подумайте
Если когда-нибудь добавят дженерики и алгоритмическую либу под них, пых станет ультра-имбой и начнет теснить даже яву и си шарп на их поле.
>Ебушки воробушки, миллион лет ждал эту хуйню!
Вот это двачую конечно, хотя восьмерка как мажорный релиз всё равно хуйня унылая.
>Если когда-нибудь добавят дженерики и алгоритмическую либу под них, пых станет ультра-имбой и начнет теснить даже яву и си шарп на их поле.
А это к сожалению нет. Современный пых уже давно далеко не похож на тот, каким он был в нулевых. Вот только видишь ли ты изменение его репутации с того времени хоть чуточку в лучшую сторону? Я не вижу.
По-моему, единственной надеждой на спасение этого языка ну или последним гвоздем в крышку гроба, что не сильно хуже был P++, да только все интерналсы проголосовали против, включая автора RFC. Попахивает заговором
Надо смотреть логи ошибок, чтобы увидеть их причину, а не гадать. Что касается трюка с переименованием, он работает только в Линуксе. В Виндоуз, например, так сделать может не получиться.
Файлы остаются скорее всего из-за того, что программа падает с ошибкой где-то до переименования.
>>1993589
А мне не нравится. Это провоцирует написание кривого кода, где любая переменная может быть пустой из-за того, что корректно не проверяются ошибки. Вместо того, чтобы проверять ошибки, будут лепить эти null-safe операторы и в коде невозможно будет разобраться.
Зависит от контента.
Если у тебя они ничем не отличаются я бы их держал в одном классе, типа PublicImage.
>Это провоцирует написание кривого кода
Странная претензия чот. ТО есть if (!_is_null(huinya)) {} не провоцирует? По такой логике, все кроме простейших конструкций провоцирует.
Просто сахар для сокращения и удобочитаемости же.
Они отличаются только классом, с которым у них отношение, ну и видом отношений ( One-To-One или One-To-Many ).
И как ты предлагаешь это реализовать в одном классе с доктриной? Будет допустим таблица, в ней поля url и imageable_id. Ну допустим даже накостылил бы я поле "imageable_class" и буду вручную его задавать.
Доктрина ж никак не поймет что при обращении к $post->images нужно искать в таблице images записи, где imageable_class = App\Entity\Post. Лучше уж тогда просто inheritance mapping использовать.
У тебя есть класс Image, он замаплен на таблицу images, а в нужной сущности есть поле Image/Images и связь с таблицей images по айди, ну либо таблица связей. Зачем тебе разные классы тут я не понимаю.
Пацы, у кого есть опыт собесов по скайпу? Меня прогоняли по тому, что было на прошлой работе, что знаю, что использовал и всё такое и назначили собес по скайпу. Как это происходит, будем мило болтать с тимлидом за чашечкой кофе, задачи через share-screen, гонять по теории или что? Как у вас было?
Есть данные, сохранененные в сессию, стоит session.gc_maxlifetime ебовый и лайфтам сессионной куки ебовый, около недели. Данные из сессии выводятся на форму. Вижу, что PHPSESSID в куке остается тем же, но данные на форме через некоторое (рандомное) время исчезают. В какую сторону копать?
>Доктрина ж никак не поймет что при обращении к $post->images нужно искать в таблице images записи, где imageable_class = App\Entity\Post.
Нихуя не понял, что ты делаешь. У самого примерно такая же структура, все заебись ищет. Из сущности делаешь запрос ->getImage() и всё ок. Там же по id связь.
По опыту моих нескольких собесов:
- будут херочка и кто-то из менеджеров спрашивать базовые вещи и с чем работал, что писал, могут попросить примеры кода.
- будет тимлид или ЧСВшный синьор-помидор, будет спрашивать и качать головой типа какой ты убогий. Спрашивать будет примерно ту же хуйню что и верхние, пояснять почему ты убогий тоже не будет - он сам не знает и делает это чтоб продавить тебя по зарплате.
- будут левые пацаны, которые замутили бизнес на коленке и пока сами ещё не знают что спрашивать. Ждать можно что угодно - от нормальных вопросов, до в стиле "почему крышки люка круглые?"
И самое главное - собес не означает трудоустройство. Будь на похуе и даже не думай волноваться - это просто досужий пиздёжь, по большому счёту. Как пройдёшь с десяток таких, то сам поймёшь.
>Мне всё равно сейчас, попаду я на эту должность или нет, но страх обосраться никак не исчезает
Скорее всего нет - первый собес почти всегда провальный. Посмотришь просто, что ничего особенного.
В том то и дело, что собес не первый, я до этого несколько раз обосрался ну и несколько раз прошёл, поработав по стеку год, а страх так никуда и не девается. Видимо, пора к психиатру.
Видимо недостаточно собесов было.
После пары десятков собесов в основном провальных уже на похуях прохожу или не прохожу.
Начал относится к собесам как к игре. Планирую, на что и как отвечать, какие вопросы задать, как себя повести.
хуервый
>ну либо таблица связей.
Точно, почитал доку, вспомнил что можно городить One-To-Many-Unidirectional связь через костыль как Many-To-Many с уникальными id изображений в промежуточной таблице.
Но как-то муторно это. С inheritance-mapping то же самое в два клика делается, еще и красиво это всё по-моему, в одной таблице концентрируется, а не по всей базе размазано.
Но я так понимаю, на практике все делается предложенным тобой способом.
Лара это вообще почти как CMS считай. Можешь столкнуться с болью, пытаясь применять нормальные паттерны и практики в среде ебанутых антипаттернов ларки и таких же ебанутых кодеров на ней.
у меня такая детская травма присутствует
Если уж к тебе во сне пришел Иисус и сказал что нужно стать пыхарем или ты умрешь через год, то может все таки Симфони? Зайдешь как по маслу: те же концепции, те же аннотации с теми же названиями и параметрами, те же принципы и т.д.
Хотя, лучше всего выбей дурь из головы и уходи из треда. Если начальство вынуждает или еще кто-то, шли их нахуй.
Да, на РАБоте попросили поРАБотать в проекте на Ларе, потому что им типа разработчиков не хватает :(
Лол, а говорят рынок перегрет, хуе мое, требования космические, специалистов имея в виду не вкатывальщиков с курсов, конечно, их то достаточно в тыщу раз больше чем вакансий и прочее.
Хуй там правда, джуна на лару найти не могут.
Это как раз нехороший знак, что спеца с норм стека пересаживают на стек похуже. Сначала ухудшаются условия работы, а следом пойдут снижения зп и сужение рынка вплоть до битриксов
Ну с битриксами ты конечно загнул. Уже даже в провинциях понемногу переходят на что то более вменяемое, это говно могло расти только в условиях тотальной безграмотности кабанчиков.
>джуна на лару найти не могут
Не "не могут", а "не хотят". У некоторых контор требования как к иному мидлу не прёдъявляют. Меня лично какой-то важный и опытный опущ спрашивал про опыт с высокими нагрузками, когда я к ним на джуна шёл. Порой пишут стек 100% твой, и даже предлагают типа "мы научим и покажем как и куда, только хотя бы азы знай и куда там эту sql-строку пихать", пишешь им - "сам знаю куда строку пихать, писал то-то и то-то, вот вам пример моей работы, вот исходники - смотрите, буду радостно развиваться и даже денег много просить не хочу" и тишина блядь. У других висит вакансия - нужен разработчик, пишите на мыло. Стек мой - пишу, что умею, пруфы даю и тоже, сука, мороз.
Со всей этой индустрией что-то сильно не так.
Уже мысли с лары на битрикс\вордпресс перекатываться т.к. там кабанчики в личку регулярно пишут с предложениями. Давно бы перекатился, да не нравится мне там код и подходы.
Что за "твой стек" такой, мне прям интересно стало. И какие пруфы того что умеешь ты отсылаешь, что тебя везде морозят?
>Что за "твой стек" такой
Лара\Октобер + Вью\Бутстрап.
>какие пруфы того что умеешь ты отсылаешь
Есть несколько рабочих сайтов, на гитхабе пара апишек на Люмен.
Что ещё им надо от джуна?
Ну вообще звучит норм, может быть код очень корявый? Гит, sql, сервера указано в резюме?
>Гит, sql, сервера
Я сперва написал всё, что пробовал и игрался, но писали не очень активно. Сократил до 10 именований где-то совет увидел - стали писать активнее, но всё какое-то левое.
А так конечно - гит даже на своих проектах юзаю гениальная штука, sql умею, но всё больше на ОРМ последнее время, сервера - апач, нжинкс. SSH, Ubuntu server норм знаю - на ноуте игрался полгода с ней ещё до вката в ПХП.
Хз что не им так. На собеседованиях не матерюсь и мамок не ебу. Может стоит начать?
Без понятия чесно говоря почему так. У нас приходили джуны, незнакомые с ООП практически даже, зато с миксом разной херни на гитхабе, брали на испытательный, один из двух выреб даже, второй по учебе слился. Единственное может скажу, не бойся писать в крупные галеры, даже если стек не совсем подходит а то вдруг стесняешься и пишешь откровенным васянам в студии онли. Ну и на гитхаб что нибудь по алгоритмам например залей для солидности, а не онли бложики на ларе.
>У нас приходили джуны, незнакомые с ООП практически даже
Вот и я в ахуе от ситуации. Может это из-за того, что на удалёнку лезу?
Попробую алгоритмов в гитхаб накидать - не проблема.
Так вот, изучаю тут Симфони, уже убедился что Symfony Forms воистину очень крутая и мощная вещь. Но... Как эти формы вообще комбинируют с фронтендом на каком-нибудь Vue?
Упустим простые примеры, рассмотрим более-менее сложную форму с CollectionType'ами, несколькими уровнями вложенности сущностей и т.д.
Вот я ее прописал на бэкенде, отправил в twig, в шаблоне написал {{ form(form) }} и все, у меня все готово.
Ладно, на самом деле нет, надо еще прототипы вывести и на jQuery с их помощью сделать кнопочки удаления и добавления элементов в коллекцию. Но всё равно работы на 5 минут.
А что люди делают если весь рендеринг на джаваскрипте? В доке этому, блин, ни слова не уделено.
Ввел в гугл "symfony forms vue", что-то мне увиденное не понравилось.
В основном советуют выводить по api на фронт уже отрендеренную на бэкэнде форму. Как-то не очень это, фронтовик получается никакой власти над этой формой не имеет, на каждый пук приходится в php лезть. А в таких случаях это ведь два разных проекта.
Еще и, получается, все вокруг на фронте реактивно и завязано на объектах, а добавление/удаление элементов в форме внезапно осуществляется старым дедовским способом через прямую работу с DOM-деревом, лол.
Еще прочитал статью от чела который тонну костылей на бэкэнде нагородил, чтобы отдавать эту форму в виде адекватного JSON, и еще тонну костылей на фронте, чтобы слепить с этого JSON форму во вью компоненте.
Похвально конечно, но я уверен что больше никто таким не занимается.
Пока что мне таки кажется, что самым нормальным решением в таком случае будет лепить такую форму на фронтенде с нуля. Хотя подводные камни есть, и времени это тоже много займет. Такого кстати совета я в интернете не встретил.
Так вот, мудрые аноны, у вас на реальных проектах были такие проблемы? Как решали?
Так вот, изучаю тут Симфони, уже убедился что Symfony Forms воистину очень крутая и мощная вещь. Но... Как эти формы вообще комбинируют с фронтендом на каком-нибудь Vue?
Упустим простые примеры, рассмотрим более-менее сложную форму с CollectionType'ами, несколькими уровнями вложенности сущностей и т.д.
Вот я ее прописал на бэкенде, отправил в twig, в шаблоне написал {{ form(form) }} и все, у меня все готово.
Ладно, на самом деле нет, надо еще прототипы вывести и на jQuery с их помощью сделать кнопочки удаления и добавления элементов в коллекцию. Но всё равно работы на 5 минут.
А что люди делают если весь рендеринг на джаваскрипте? В доке этому, блин, ни слова не уделено.
Ввел в гугл "symfony forms vue", что-то мне увиденное не понравилось.
В основном советуют выводить по api на фронт уже отрендеренную на бэкэнде форму. Как-то не очень это, фронтовик получается никакой власти над этой формой не имеет, на каждый пук приходится в php лезть. А в таких случаях это ведь два разных проекта.
Еще и, получается, все вокруг на фронте реактивно и завязано на объектах, а добавление/удаление элементов в форме внезапно осуществляется старым дедовским способом через прямую работу с DOM-деревом, лол.
Еще прочитал статью от чела который тонну костылей на бэкэнде нагородил, чтобы отдавать эту форму в виде адекватного JSON, и еще тонну костылей на фронте, чтобы слепить с этого JSON форму во вью компоненте.
Похвально конечно, но я уверен что больше никто таким не занимается.
Пока что мне таки кажется, что самым нормальным решением в таком случае будет лепить такую форму на фронтенде с нуля. Хотя подводные камни есть, и времени это тоже много займет. Такого кстати совета я в интернете не встретил.
Так вот, мудрые аноны, у вас на реальных проектах были такие проблемы? Как решали?
>twig с jQuery удобнее, но против тенденций не попрешь
Нет никаких тенденций - есть бюджеты и требования к проекту. Пилить полноценные микросервисы нет никакого смысла для простых сайтов без сложного взаимодействия на клиенте. Тот же двоч - без фронтенд-фреймворков работает, если ты не заметил, как и подавляющее большинство интернета.
По моим наблюдениям есть некоторый избыток фронтенд-разработчиков уже - общался с некоторыми начинающими студиями и вот там всегда есть фронтенд, а то и не один, уже со старта, при отстутсвии всех остальных.
Ок, бумер.
> По моим наблюдениям есть некоторый избыток фронтенд-разработчиков уже
Зарплатные вилки фронтендеров чот не согласны с твоми наблюдениями. На ангуляр уже мидлов на 150+ ищут. Джунов-вкатунов везде много, да.
Мб у тебя с софтами плохо? Не показываешь заинтересованности в проекте?
>Зарплатные вилки
Потому, что нужны только в больших конторах, а у тех деньги есть. А в мелких студиях больше мешают со своим Vue - мне предлагали микросайты за 5к на этом Вью пилить, в другом месте "фронтенд-разработчик" себе отдельно верстальщика требовал, потому, что не умел верстать - он дескать погроммист у мамы, и не для того его роза цвела. Кстати частое являние у макак.
Если же рассматривать фронтенд-разработчика как универсала, которому можно отдать клинетскую разработку в любом виде, то да - везде нужны и цены будут расти.
>он дескать погроммист у мамы, и не для того его роза цвела. Кстати частое являние у макак.
Ну это охуевший в край бездарь просто. Странно что держат вообще.
Везде, где я знаю фронта за такие заявления выкинули на мороз бы сразу.
Не очень пойму как по сервисам раскидывать нужно.
Если просто - есть у меня в контроллере ( понятно что бизнес-логика не в контроллере, а в каком нибудь классе который в общем описывает то что должно твориться по этому роуту ) нужно вызывать "сервис" генерации отчета exel.
Суть в том что этот сервис у меня из разных контролеров может вызываться.
Сам сервис в каталогк "сервисы" сидит.
Но чето у меня оч высокая и кривая связность всего этого.
Если в общем - мне какой то приближенный к реальности пример нужен, а то у меня чет какая то хуита выходит.
хуй знает че я вообзе спросил, лол
>Как эти формы вообще комбинируют с фронтендом на каком-нибудь Vue?
Я с Symfony не знаком, но скорее всего никак. Разве что оставляют валидацию входящего запроса. UI отрисовывается полностью на фронте.
>В основном советуют выводить по api на фронт уже отрендеренную на бэкэнде форму
Мне приходилось быть по обе стороны баррикад, и я делал и бэк, и фронт, и с точки зрения фронтера могу сказать, что за такое надо по рукам бить.
>Еще прочитал статью от чела который тонну костылей на бэкэнде нагородил, чтобы отдавать эту форму в виде адекватного JSON, и еще тонну костылей на фронте, чтобы слепить с этого JSON форму во вью компоненте.
Только вот какой вообще в этом смысл? Единственное применение этому, которое я вижу, это если у тебя какая-то охуенно сложная динамическая форма, состав полей которых фронтеру заранее неизвестен. Но такое редко случается.
>Нет никаких тенденций - есть бюджеты и требования к проекту.
Ну ок, допустим бюджет хороший, из требований - шобы все было модно стильно как у других кабанчиков, перед пацанами не стыдно.
Тебя если такое попросят, ты с работы уволишься и будешь искать веб студию где позволят на jQuery писать?
>Тот же двоч - без фронтенд-фреймворков работает, если ты не заметил, как и подавляющее большинство интернета.
Подавляющее большинство интернета - это магазины на CMSках. А я написал "почти весь современный веб".
>>1995668
И я о том же самом
>Странно что держат вообще.
А они по-корешам с организатором вроде как были. Когда он мне начал диктовать - на чём апишку и админку делать, то был послан в пешее. Но было забавно смотреть как он пытался завязать на себя разработку, ничего не умея по-сути и всё дико усложняя, только чтобы ему таски перепадали. У них так и не вышло ничего вроде как. Я, наверное, про таких и писал в посте - пиздос у меня тогда от него пригорело.
Но таких уебанов и потом ещё встречал и всегда были без работы.
Там еще предлагали вариант, когда ты не в фото указываешь id объекта (к которому оно относится), а в таблице с объектом - id фото.
>>1995210
В гитхабе не забудь про РИДМИ с картинками и поясняющим текстом. Рекрутеру шлют по 100 гитхабов в сутки, ему некогда там в твоем коде самому выискивать подробности.
>>1995343
Есть такой вариант: преобразовывать форму в JSON, там клиент ее отрендерит и пошлет на сервер данные аяксом, эти данные на сервере запихиваются в форму, проверяются и клиенту шлются ошибки.
Минус в том, что надо писать преобразователь формы в JSON (со всеми подробностями) + на клиенте надо писать построитель формы из JSON. Плюс в том, что если форм много, то тебе не надо будет их делать руками.
Можно сделать частично: в HTML форма рисуется руками, а данные на сервере проверяются с помощью формы из Симфони. Так не придется делать преобразователь и построитель. Но будет много рутины по программированию инпутов и селектов.
Есть и другие варианты. Отказаться от форм и использовать Symfony Validator, который может валидировать произвольный объект по правилам в аннотациях. Данные, пришедшие аяксом, с помощью какого-нибудь Serializer преобразовывать в объект, и валидировать его. Но я не уверен, что делать, если при валидации надо обратиться к какому-то сервису из контейнера.
Так или иначе, если форм много, то нужен будет какой-то построитель, либо на основе Symfony, либо на JS фреймворке. Иначе нарушится принцип DRY.
> Похвально конечно, но я уверен что больше никто таким не занимается.
Не надо смотреть, кто чем занимается. Особенно если речь о фронтендщиках - это специалисты по переизобретению велосипедов и наступанию на грабли. Надо выбирать то, что больше подходит под задачу. Сравнивать плюсы и минусы.
Ну и по моему, "реактивный" фронтенд мало где реально нужен. В какой-нибудь админке (а где еще бывает куча форм?) он даром не нужен.
Если ты хочешь взять, например, букву номер 20, но в строке всего 10 букв, надо выводить пробел вместо нее. А ты ничего не выводишь, и от этого строки съезжают влево.
Также, не забудь убрать из кода магические числа вроде $i < 33.
>>1995664
В сервисы помещается бизнес-логика. То есть, действия, для выполнения которых написано твое приложение, но без взаимодействия с пользователем. То есть в сервис мы не передаем POST, GET (или их заменитель Request), не генерируем там HTML-страницу.
Если, например, у твоего сервиса генерации отчета есть какие-то параметры, то ты не бросаешь ему весь массив POST со словами "сам ищи свои параметры", а передаешь их отдельно или даже делаешь для этого специальный объект.
Сервис может использовать другие сервисы (обычно через dependency injection). Ну например, если для генерации отчета надо получить какие-то данные, он может обратиться к другому сервису.
> а в каком нибудь классе который в общем описывает то что должно твориться по этому роуту
Сервис ничего не должен знать о роутах, это забота контроллера.
> Но чето у меня оч высокая и кривая связность всего этого.
В чем это проявляется? Не очень понятно.
> Разве что оставляют валидацию входящего запроса. UI отрисовывается полностью на фронте.
Это плохой подход, если форм много, так как при добавлении поля в форму надо лезть в фронтенд и там руками добавлять инпуты.
> Только вот какой вообще в этом смысл?
Смысл в том, что ты описываешь форму один раз на сервере и не пишешь руками однотипный HTML для каждой новой формы.
>Это плохой подход, если форм много,
Это плохой подход для твоих микропроектов, которые полтора васяна-оркестра лепят, не проецируй его на всю индустрию плз.
>Смысл в том, что ты описываешь форму один раз на сервере и не пишешь руками однотипный HTML для каждой новой формы.
Вообще ахуеть. Про банальные компонентны ты видимо не слышал. В любой уважающей себя продуктовой галере тебя с такими историями отправят чистить древнее легаси вилкой и к нормальной разработке близко не подпустят. А ты еще без стеснения такое втираешь тут, пздц.
Я искренне непонимай, откуда вы блядь лезете постоянно такие пещерные? Из 2005го?
Спасибо за развернутый ответ)
>Не надо смотреть, кто чем занимается.
Не могу, у меня культ лучших практик головного мозга.
>проецируй его на всю индустрию
Ты сейчас сам проецируешь свой подход на всех остальных. Кто сказал, что подход помойной галеры на пару сотен сотрудников есть смысл использовать вообще везде?
>плз
Зумер, спок.
>Не могу, у меня культ лучших практик головного мозга.
Тогда лучше закрой этот тред навсегда. Тут такие best practices советуют каждый день, что понять где жирнота, а где необучаемость тяжело.
>>1996261
Где ты видел фулстак-макакенов, кроме веб студий сейчас? Или вебстудии у нас на острие индустрии для тебя? Разделение фронтенда и бэкенда произошло еще в начале десятых, а ты неможешь этого принять и живешь в манямирке, еще и сюда свою шизофазию постишь. Не хочешь учиться и развиваться - смирись и оставайся на обочине, это айти 2020х, дедушка.
Например, там, кнопку лайка на нем сделать, добавления в избранное, прогрузку комментариев и т.д.
Вью вроде как намного меньше весит чем тот же jQuery, легко интегрируется в проект на Симфони и Ларе. Прикольная концепция хранения скриптов и стилей в одном файле с компонентом.
Читать и расширять vue-компонент намного легче, чем лапшу на jQuery. Могу тут до бесконечности продолжать, но это всё лишь мои фантазии, а мне интересно ваше мнение послушать.
Покрывает ли Vue достаточное количество случаев, чтобы использовать его вместо jQuery? Видели ли где-то такое на проде?
>Это плохой подход, если форм много, так как при добавлении поля в форму надо лезть в фронтенд и там руками добавлять инпуты.
Так это вообще можно сказать про любой запрос к API, лол. Добавилось/поменялось какое-то новое поле в ответе — надо лезть во фронт и менять его логику. Только плюсов реактивного SPA это не перекрывает. И тебя как бэкендера вообще не должно волновать, чо там на фронте, даёшь им документацию к API на каком-нибудь Swagger и пусть там ебутся как хотят :)
Звучит как какой-то костыль. Если у тебя сложный фронт и тебе уже не хватает JQuery, то стоит задуматься, чтобы сделать полноценный фронт на SPA-фреймворке.
Ты пишешь какую-то ерунду. Чтобы провалидировать форму, мы создаем ее описание на стороне сервера. Дальше, нам надо отобразить ее на клиенте. Это можно сделать двумя способами: а) получить с сервера описание формы (которое там уже есть) или б) повторно описать форму руками на стороне клиента. Вариант б) предполагает двойную работу, и требует обновлять обе версии формы (на сервере и на клиенте) при изменениях, в то время как вариант а) не требует что-то менять на клиенте.
При чем тут какие-то "мои" "микропроекты" и какие-то мифические "best practices", я не понял.
Мне кажется, что ты описал, как раз проще будет сделать на jQuery. или каком-нибудь его более легком заменителе, чем делать полноценный клиентский рендеринг и целое клиентское приложение. Также, ты думаешь, что вью "легкий", а какого размера получится бандл после вебпака? Наверно, не такой и легкий.
Подгрузка комментариев с сервера на jQuery займет строк 20, и это с обработкой ошибок (а делают ли правильно обработку ошибок все, кто тут советует везде пихать SPA? Уверен, что нет, ведь в best practices об этом забыли написать).
Вью нужен там, где есть сложный интерактивный фронтенд (построитель чего-нибудь, редактор чего-нибудь), или там, где нужно сделать что-то похожее на приложение (например, чтобы была работа при перебоях со связью). В блоге или интернет-магазине он даром не нужен, на мой взгляд (усложняет разработку, утяжеляет фронтенд, замедляет рендеринг сайта).
>>1996290
Если где-то так делают, это не значит, что это правильно. Когда форм много, гораздо разумнее настроить автоматическое отображение форм на основе конфигурации с сервера (кстати, ее логично не запрашивать аяксом, а вшить в фронтенд-приложение).
у меня была обратная история: 3 месяца я не писал ничего, кроме дешевых парсеров с досок объявлений.
позвонили, позвали в относительно крупный проект, приложение для таксы. На Симфони нахуй, хотя я даже Yii не трогал.
Я спросил - "А чего так, неужто я так хорош". Сказали, мидлы слишком дороги, я в самый раз. Полгода охуевал с симфони
>Вью нужен там, где есть сложный интерактивный фронтенд (построитель чего-нибудь, редактор чего-нибудь), или там, где нужно сделать что-то похожее на приложение (например, чтобы была работа при перебоях со связью). В блоге или интернет-магазине он даром не нужен, на мой взгляд (усложняет разработку, утяжеляет фронтенд, замедляет рендеринг сайта).
В этом параграфе написан полный бред.
>Вью нужен там, где есть сложный интерактивный фронтенд
SPA-фреймворки убирают необходимость манипуляций с DOM, автоматически обновляя его при изменении состояния приложения, и нет, это полезно не только в охуенно сложных приложениях.
>или там, где нужно сделать что-то похожее на приложение
То есть 90% современных проектов? Потому что уже давно трендом в UX является предоставление пользователю опыта, близкого к использованию нативных приложений.
>например, чтобы была работа при перебоях со связью
То есть, опять же, подавляющее большинство современных проектов, потому что сейчас бОльшая часть трафика веб-приложений идёт с мобилок, где со стабильностью связи всё очень не очень. Конечно, обеспечение полноценной работы в оффлайне — это довольно редкий кейс, но вот показать юзеру надпись "Вы оффлайн" и отображать данные из последнего состояния приложения при навигации — кейс вполне себе актуальный.
>усложняет разработку
Усложняет разработку только на начальном этапе, потому что тебе придётся учить новую технологию. Как только освоишься, то ничего оно не усложняет, наоборот, поддерживать и разрабатывать SPA намного проще, чем лапшу на JQuery, потому что там есть устоявшаяся архитектура, паттерны и best practices.
>утяжеляет фронтенд, замедляет рендеринг сайта
Ты упускаешь охуенно важную деталь: это актуально только при первой загрузке приложения либо при выпуске обновления. Если у тебя на серваке нормально настроено кэширование или если ты используешь service worker, то при дальнейших загрузках приложение будет загружаться очень быстро. Также есть разбиение приложения на чанки и ленивая подгрузка модулей, а ещё есть SSR.
>Вью нужен там, где есть сложный интерактивный фронтенд (построитель чего-нибудь, редактор чего-нибудь), или там, где нужно сделать что-то похожее на приложение (например, чтобы была работа при перебоях со связью). В блоге или интернет-магазине он даром не нужен, на мой взгляд (усложняет разработку, утяжеляет фронтенд, замедляет рендеринг сайта).
В этом параграфе написан полный бред.
>Вью нужен там, где есть сложный интерактивный фронтенд
SPA-фреймворки убирают необходимость манипуляций с DOM, автоматически обновляя его при изменении состояния приложения, и нет, это полезно не только в охуенно сложных приложениях.
>или там, где нужно сделать что-то похожее на приложение
То есть 90% современных проектов? Потому что уже давно трендом в UX является предоставление пользователю опыта, близкого к использованию нативных приложений.
>например, чтобы была работа при перебоях со связью
То есть, опять же, подавляющее большинство современных проектов, потому что сейчас бОльшая часть трафика веб-приложений идёт с мобилок, где со стабильностью связи всё очень не очень. Конечно, обеспечение полноценной работы в оффлайне — это довольно редкий кейс, но вот показать юзеру надпись "Вы оффлайн" и отображать данные из последнего состояния приложения при навигации — кейс вполне себе актуальный.
>усложняет разработку
Усложняет разработку только на начальном этапе, потому что тебе придётся учить новую технологию. Как только освоишься, то ничего оно не усложняет, наоборот, поддерживать и разрабатывать SPA намного проще, чем лапшу на JQuery, потому что там есть устоявшаяся архитектура, паттерны и best practices.
>утяжеляет фронтенд, замедляет рендеринг сайта
Ты упускаешь охуенно важную деталь: это актуально только при первой загрузке приложения либо при выпуске обновления. Если у тебя на серваке нормально настроено кэширование или если ты используешь service worker, то при дальнейших загрузках приложение будет загружаться очень быстро. Также есть разбиение приложения на чанки и ленивая подгрузка модулей, а ещё есть SSR.
>Если где-то так делают, это не значит, что это правильно. Когда форм много, гораздо разумнее настроить автоматическое отображение форм на основе конфигурации с сервера (кстати, ее логично не запрашивать аяксом, а вшить в фронтенд-приложение).
Бумер, ты реально в 2006м застрял? Сейчас фронт это отдельное приложение в отдельном репозитории, которое деплоится на отдельный сервак отдельным CI/CD пайплайном. Ну какое нахуй вшитие конфига с бэка на фронт? Уже давно в тренде полное разделение бэка и фронта. Мухи — отдельно, котлеты — отдельно.
>Так или иначе, сейчас почти весь современный веб на реактивных фреймворках.
Развек что в твоем манямирке
Ты вопрос нормально задай. Как вью конфликтует с формами симфони?
Ты на тролля похож, смысл тебе отдельно разжевывать? Хотя ладно:
>Развек что в твоем манямирке
Читай выше, магазины на CMSках к современному вебу я не отношу.
>Ты вопрос нормально задай. Как вью конфликтует с формами симфони?
Ну видишь, после моего вопроса тут у одного молодого человека с не очень молодым возникла дискуссия насчет разных подходов к решению этой проблемы.
А ты похоже самый умный, раз никакой проблемы не видишь и всё очевидно. Может быть поделишься мудростью? Или я это все зря пишу?
Зачем ты ему пытаешься доказывать что то? Там чел кроме любимой цмсочки ничего не видел уже лет десять.
jQuery блять в 2021, jQuery карл! Этот объёбыш даже про современный js не слышал, о чем ты ему рассказываешь. CI какой то, пайплайны блять, с таким же успехом можешь еще про контейнеризацию и событийную модель своей бабушке рассказать.
Я не удивлюсь, если он еще и процедурно свое говно хуячит и нахваливает.
>Ты на тролля похож, смысл тебе отдельно разжевывать?
Мне тебя и твоего дружка искренне жаль, честно. Зашел глянуть как тред поживает, а тут такое.
> Хотя ладно:
Ладно что? Ты либо вопрос нормально формулируешь - либо нахуй идешь. Так не только на дваче, привыкай
>Ну видишь, после моего вопроса тут у одного молодого человека с не очень молодым возникла дискуссия насчет разных подходов к решению этой проблемы.
Ты сюда зачем пришел? Кому то что то доказать? Нахуя мне гора бесполезного текста? Мне ебать что ты там думаешь, и в каком современном мире ты живешь. Если не умеешь мысль адекватно выражать - бери своего дружбана-студента, который брызжа слюной метает слова аля "ci, пайплайны, контейнеризация", не понимая что это вообще такое, связано ли это с сабжем, и сталкивался со всем этим разве что у очередного блогера на ютюбе, и идите оба нахуй отсюда
>А ты похоже самый умный, раз никакой проблемы не видишь и всё очевидно. Может быть поделишься мудростью? Или я это все зря пишу?
Проблемы запихнуть вью в твиг? не вижу. Как это мне мешает выводить формы? Ты хочешь формы кастомизировать? Это делается стилями и жсом. Что еще тебе нужно? Я не вижу проблемы от слова совсем. Если у тебя спа-админка на реакте, о каких симфони формах речь может идти?
>>1996440
Клоун
>Мне тебя и твоего дружка искренне жаль
Еще и уровень дискусии прямиком из одноклассников.
>Мне ебать что ты там думаешь
Ну бывает, тебя просто пару раз мокнули в твою же неграмотность, чтобы другие аноны всерьез твои шизодные высеры не воспринимали.
> и идите оба нахуй отсюда
Нихуя начальник двача разбушевался.
Дед, проснись, у тебя джиквери из вордпреса опять протекает, иди чини.
Пиздец у тебя мозги отсохли, завязывай лучше с CMSками, это действительно приводит к деградации.
Ощущение что ты вообще вопрос не читал и сам с собой разговариваешь сейчас. Я прямо спросил, отдают ли люди форму с бека на фронт и каким образом.
Два нормальных человека вопрос поняли и начали обсуждать плюсы и минусы данных подходов. А тут ты, словно король заваливаешься, и выдаешь перл
>Проблемы запихнуть вью в твиг? не вижу. Как это мне мешает выводить формы? Ты хочешь формы кастомизировать? Это делается стилями и жсом. Что еще тебе нужно? Я не вижу проблемы от слова совсем.
Просто пиздец, у меня слов нету. Я уже молчу о том, что ты вопрос мой не понял. Но какой нахуй TWIG вообще? Ты знаешь хоть что такое Vue? Ты знаешь что такое SPA?
Да ты вообще похоже даже представить себе не можешь, что фронт и бэк могут быть разделены, это за гранью твоего понимания.
Пиздец, мне плохо уже, нахуй я в этот ебучий пхп подался? Предупреждали же меня не раз.
Таких как ты ведь тысячи, у вас мозги от маразма поплыли, вы уже не понимаете какой на дворе год и не помните как вас зовут, зато ваши закостенелые пальчики еще как-то по инерции пишут хоть и плохой, но как-то работающий код.
Я просто боюсь, что когда в моем городе появится вакансия для джуна на симфони а таких уже пол года не было, я туда приду и встречу в команде таких же идиотов как ты, которые будут меня жизни учить.
Конечно же сразу уволюсь и буду еще пол года ждать следующую.
Чувак, я с этим сталкиваюсь не у блоггеров на Ютубе, я с этим сталкиваюсь на работе постоянно. Я хз, может мне повезло попасть в компанию, в которой это всё реально применяется, но я так не думаю. Открой любую вакансию на фронтера и я почти уверен, что в требованиях ты найдёшь там вовсе не JQuery, а React / Angular / Vue, какой-нибудь стейт менеджер и опыт работы с RESTful API / GraphQL. Конечно, есть вероятность, что они все врут и на самом деле тебя посадят ковырять говно на JQuery, но что-то мне подсказывает, что это не так.
Видимо когда десяток лет клепаешь шаблонную хуйню - мозг атрофируется и перестает воспринимать новую информацию. Таких и называют веб-макаками и негативное отношение комьюнити к вебу, пыхе и джсу сформировалось на фоне именно таких формошлепов.
PHP будет актуален, и для РАБоты это заебись
Но как первый язык, конечно, печальный вариант.
Если нужны прям настоящие знания -- начинай с C.
Если только прикладные для работы -- бери РНР и не парься.
>теснить даже яву и си шарп на их поле.
лол, с такой скоростью работы этого точно не произойдёт
но и производительность растёт, посмотрим-с
Семён спок
>Я прямо спросил, отдают ли люди форму с бека на фронт и каким образом.
Отдавать форму с бека для спа на реакте? Чёт даже не смешно уже
>Пиздец у тебя мозги отсохли, завязывай лучше с CMSками
При чем тут cms. С чего ты думаешь что я с ними работаю? Ты правда ещё не понял, что с двумя разными людьми общаешься? Пиздец развелось вас
>ты знаешь хоть что такое Vue? Ты знаешь что такое SPA?
Я то знаю и работаю с этим, а вот у тебя, видимо, провал в этом. С каких пор любой приложение с использованием vue должно быть spa? Это тебе кто такое сказал, или где это написано? Если это спа, то как и для чего тебе формы с бека отдавать. Пойди в жс тред и спроси у ребят, которые на реакте работают - как им такая идея.
>Я просто боюсь, что когда в моем городе появится вакансия для джуна на симфони а таких уже пол года не было, я туда приду и встречу в команде таких же идиотов как ты, которые будут меня жизни учить.
Не напрягайся ты так, лучше на манерами поработай. Если ты прочитал что такое spa и как это в двух словах работает - не стоит говорить об этом так, будто это единственный и верный вариант. Ведь в большинстве случаев ты сядешь жопой в лужу (например, как сейчас).
Я весь тред не читал, но заходит ли Оп? И тот ли ОП это?
По тредам пройдись, расскажи анонам про контейнеризайию и ci. Клоун малолетний
>а больше это сколько
Неебу - из описания задачи мало конкретной информации. Что за модули? На сайт какой-то или что? Интерфейс нужен или нет? Ещё пачка уточняющих вопросов по ходу дела.
Никакой кастомный код не стоит 20$ - 1500 рублей. Это цена одной копии плагина, который продают сотнями штук.
>позвонили, позвали в относительно крупный проект, приложение для таксы. На Симфони нахуй, хотя я даже Yii не трогал.
Мне тоже пишут такие, но там нужны мидлы и синьоры на тот стек, где я не работал почти. Последнее предложение даже ножкой топнули и требуют ответа, но там требуют переезда и я не готов внезапно сорваться куда-то в даль пока что.
>любую вакансию на фронтера и я почти уверен, что в требованиях ты найдёшь там вовсе не JQuery, а React / Angular / Vue, какой-нибудь стейт менеджер и опыт работы с RESTful API / GraphQL.
jq не для фронтендеров, а для бекендеров, которых посадили ажакс на фронте дёргать и шаблончики натягивать. Действительно - требовать жиквери от фронтендера это ебануто и слишком просто, это уровень веб-мастера из прошлого десятилетия, если человек кроме этого ничего не знает.
Просто тупых хипстеров почти нигде не любят. Дело не в технологиях, а их бездумном использовании без оглядкина целесообразность.
Ты - тупой хипстер от фронтенда.
Ты старый пердун-бумер. KEKW. Не шаришь за ci, контенеризацию, паплайны. GraphQl.Тебе о чем нибудь говорит? Нет, конечно. Вы старые никчемные говнокодеры. Я - умный и прогрессивный. Смотрите еще че могу: синглтон, тайп скрипт, кубернетс, дженкинс. Видали? Так че, как там симфони формы моему ручному 200k/nansec фронту отдавать? А то он на ангуляре пишет (мертвый фреймворк, вообще все мои хоуми юзают vue.), сидит чета дрочит, мямлит - не выходит у него, в общем. Ну я ему и говорю: "Забирай свои формы и сьебывай. А я пойду на дваче в пхп треде спрошу, как их кастомизировать на этих ваших жс фреймворках". В современном мире, вообще то, все сайты так работают. Это у вас в ваших отстойниках цмс одни на жквери лол! И вообще жквери это так, прошлый век. Кореш у меня есть один - серьезный фронтендер, даже тайпскрипт знает. Помню рассказывал он мне, что взяли его стажироваться в одну галеру, а там проект - ну пиздец 19век. Админка, которой 15 человек пользуются, да и на шиблонизаторе ебаном, прикиньте? Ну типа тоже js,css, html, местами компоненты вью, но это же не spa-ебана рот. Ну он дело в свои руки взял, прошелся с вопросом о переписывания админки на spa по всем: от местных джунов до пмов других проектов. Ну его короче выгнали вы поняли да? Тупые старые пердуны-бумеры-цмсники не захотели переписывать админу, которой 1.5 года на новое современное спа приложение, я ебал почему они такие упертые?
>Пиздец, мне плохо уже, нахуй я в этот ебучий пхп подался? Предупреждали же меня не раз.
Да, зря.
На скольких проектах не был, везде либо олдскульный фулстек на пхп+жиквери с фреймворками офк, либо то же самое, но с разговорами и тщетными попытками перехода на SPA.
мимо >>1996798
Помню когда вкатывался только, то тоже так же себе всё представлял - всё будет модно-современно, весело, чисто и красиво. А когда с реальными проектами поработал - теми, которые людям деньги приносят, и порой неплохие, то сразу эта дурь из головы вышла. Неофитов на этом легко спалить - они из детских туториалов не выросли ещё и не видели некоторого дерьма, и поэтому прибывают в стране радуги и поей. Почти как таксисты, когда думают, что программисты за нажимание кнопок деньги получают.
У меня была админка на реакте. Кончилось жуткой хуйней и жопоеблей.
Когда начали вылезать кейсы типа "юзер вбил хуету, нельзя сохранять в БД, нужно написать ему жирно-красным цветом наверху что он долбоеб и пытается провести неоплаченный документ" (к примеру), реакт показал свое истинное лицо и начал ебать.
Когда полезли массовые обновления стейта с бека начался пиздец.
Реакт - это не волшебный мир розовых единорогов, это достаточно ёбнутый фреймворк с которым нужен крайне продвинутый опыт разработки. Если ты крутой опытный разработчик, детально представляющий себе бизнес-процесс задач и паттерны проектирования, то он принесет тебе больше пользы чем вреда.
Вкатыш, научившийся делать на нем тудушки, со 100% гарантией сотворит на нем ад который придется потом выкидывать целиком.
Хз, я начал работать с 2019 года и сам лично никогда с шаблонизаторами не сталкивался даже, кроме случаев, когда надо было с бэка посылать отформатированный email. На моей памяти, у нас в компании было только 2 или 3 проекта, где делали "по старинке", во всех остальных проектах с клиентской частью бэк давал REST API, фронт был SPA. Единственное плохое с точки зрения технологий, с чем я лично сталкивался, это SOAP-сервисы в паре проектов.
Вангую, ты писал логику прям в компонентах, поэтому у тебя всё и посыпалось. Надо использовать стейт-менеджер (я, например, люблю MobX) и всю логику выносить туда, а копмоненты делать тупыми.
всем положить на твои петушиные маняфантазии и дроч на %библиотекинейм%, бизнес-заказчику нужен рабочий продукт за приемлемую цену и в кратчайшие сроки
>Ашоту нужен магазинчик за 30к, ты не панимаешь, я говно ем и ты ешь, хули ты захотел по-нормальному то работать?
>Ашоту нужен магазинчик за 30к
Даже для битрикса похоже на сказку.
Больше поверю в какой-нибудь конструктор магазинов, который за 30к тебе только развернут, а всякие доработки и поддержки пойдут отдельным чеком
> SPA-фреймворки убирают необходимость манипуляций с DOM, автоматически обновляя его при изменении состояния приложения, и нет, это полезно не только в охуенно сложных приложениях.
В тех случаях, когда манипуляция с DOM сводится к "вставить HTML, пришедший с сервера" или "раскрыть скрытый блок" выгоднее использовать jQuery, чем писать полноценное фронтенд-приложение.
Вот пример: показать первые 10 комментариев и сделать кнопку "показать следующие". Здесь выгоднее рендерить комментарии на сервере и подгружать их через JQuery (или его облегченный аналог). Это будет 20 строк на jQuery. При этом страница будет загружаться уже с отрендеренными первыми комментариями. Просто и удобно. Ты можешь при рендере шаблона вызывать вспомогательные функции из серверного кода. В то время как с фронтенд-фреймворком тебе надо будет переносить шаблоны на клиента, переносить все вспомогательные функции на клиента, загружать огромный бандл JS кода, делать аякс-запросы, чтобы отобразить первые комментарии. С Vue ты потратишь больше труда и получишь более тяжелый и медленный сайт.
Другой пример: форма, где при выборе опции надо показать/скрыть часть полей, сделать аякс-валидацию по мере заполнения. Опять же, решение на jQuery здесь более простое. Так как на сервере форму может рендерить фреймворк, а на клиенте пришлось бы ее руками составлять из элементов и удваивать объем работы.
> То есть 90% современных проектов? Потому что уже давно трендом в UX является предоставление пользователю опыта, близкого к использованию нативных приложений.
Ты опять вместо объективного рассмотрения плюсов и минусов (инженерный подход) смотришь на какие-то мифические тренды. Откуда ты взял эти 90%? Из своей головы? И даже если бы эти 90% были правдой, это ничего не значит, так как есть много некомпетентных разработчиков и глупо на них ориентироваться. Есть компании с жирными бюджетами, которые могут позволить тратить на разработку больше, чем она стоит. И так далее.
> Усложняет разработку только на начальном этапе, потому что тебе придётся учить новую технологию.
Неверно. Усложняет разработку, так как в итоге требуется написать больше кода для решения той же самой задачи.
> это актуально только при первой загрузке приложения либо при выпуске обновления.
Это актуально, если ты, например, из Гугла переходишь на сайт впервые. У многих сайтов не постоянные посетители, а именно случайно приходящие с других сайтов люди. А обновления сейчас принято делать непрерывно и каждый день.
> если ты используешь service worker,
Это одна из самых уродливых и кривых фронтенд-технологий. Ради кеширования тратить большой объем памяти на отдельный постоянно запущенный JS-процесс.
> есть SSR.
Это вторая уродливая и кривая технология. Как ты сделаешь SSR, если разным пользователям надо показывать разные страницы? Например, в интернет-магазине пользователю показывают стоимость и сроки доставки в зависимости от его города, выбранной валюты. SSR это нерабочая кривая фигня.
> SPA-фреймворки убирают необходимость манипуляций с DOM, автоматически обновляя его при изменении состояния приложения, и нет, это полезно не только в охуенно сложных приложениях.
В тех случаях, когда манипуляция с DOM сводится к "вставить HTML, пришедший с сервера" или "раскрыть скрытый блок" выгоднее использовать jQuery, чем писать полноценное фронтенд-приложение.
Вот пример: показать первые 10 комментариев и сделать кнопку "показать следующие". Здесь выгоднее рендерить комментарии на сервере и подгружать их через JQuery (или его облегченный аналог). Это будет 20 строк на jQuery. При этом страница будет загружаться уже с отрендеренными первыми комментариями. Просто и удобно. Ты можешь при рендере шаблона вызывать вспомогательные функции из серверного кода. В то время как с фронтенд-фреймворком тебе надо будет переносить шаблоны на клиента, переносить все вспомогательные функции на клиента, загружать огромный бандл JS кода, делать аякс-запросы, чтобы отобразить первые комментарии. С Vue ты потратишь больше труда и получишь более тяжелый и медленный сайт.
Другой пример: форма, где при выборе опции надо показать/скрыть часть полей, сделать аякс-валидацию по мере заполнения. Опять же, решение на jQuery здесь более простое. Так как на сервере форму может рендерить фреймворк, а на клиенте пришлось бы ее руками составлять из элементов и удваивать объем работы.
> То есть 90% современных проектов? Потому что уже давно трендом в UX является предоставление пользователю опыта, близкого к использованию нативных приложений.
Ты опять вместо объективного рассмотрения плюсов и минусов (инженерный подход) смотришь на какие-то мифические тренды. Откуда ты взял эти 90%? Из своей головы? И даже если бы эти 90% были правдой, это ничего не значит, так как есть много некомпетентных разработчиков и глупо на них ориентироваться. Есть компании с жирными бюджетами, которые могут позволить тратить на разработку больше, чем она стоит. И так далее.
> Усложняет разработку только на начальном этапе, потому что тебе придётся учить новую технологию.
Неверно. Усложняет разработку, так как в итоге требуется написать больше кода для решения той же самой задачи.
> это актуально только при первой загрузке приложения либо при выпуске обновления.
Это актуально, если ты, например, из Гугла переходишь на сайт впервые. У многих сайтов не постоянные посетители, а именно случайно приходящие с других сайтов люди. А обновления сейчас принято делать непрерывно и каждый день.
> если ты используешь service worker,
Это одна из самых уродливых и кривых фронтенд-технологий. Ради кеширования тратить большой объем памяти на отдельный постоянно запущенный JS-процесс.
> есть SSR.
Это вторая уродливая и кривая технология. Как ты сделаешь SSR, если разным пользователям надо показывать разные страницы? Например, в интернет-магазине пользователю показывают стоимость и сроки доставки в зависимости от его города, выбранной валюты. SSR это нерабочая кривая фигня.
Сначала пишете тз, продумываете архитектуру, накидываете мокап?
Или тупо херачите, что получается?
Выше я уже все расписал: >>1996297 . Либо ты автоматически конвертируешь и встраиваешь формы с сервера в фронтенд, либо ты делаешь двойной объем работы.
> Уже давно в тренде
Зачем смотреть на тренды? Есть некомпетентные разработчики, есть компании, сорящие деньгами. Есть еще какие-то факторы, которых нет у тебя. Глупо на них ориентироваться.
Глупо ориентироваться на других. Вот кто-то пишет код на Си++. Значит ли это, что мы должны отказаться от PHP, и перейти на Си++? Вряд ли.
>>1996440
Я еще и к атрибутам вроде onlick нормально отношусь, как тебе такое?
>>1996479
Ты написал какую-то фигню. "фронт и бек разделены" это не абсолютная истина, а один из возможных подходов. То, что кто-то где-то разделяет фронт и бек и потом делает в два раза больше работы при выводе формы, не значит, что остальные должны так же делать.
Что касается "разделения фронта и бека", я когда-то генерировал классы-модели в JS на основе классов в PHP. Так как у меня был редактор кое-чего и мне надо было работать с документом и на сервере и на клиенте. Чтобы с ним работать, надо было его представить в виде дерева объектов. Но не хотелось делать двойную работу и делать по две версии каждого класса (в JS и в PHP). Этот подход упростил мне жизнь.
.product {
&__price {
color: red;
}
}
Который компилируется в такой CSS:
.product__price { color: red }
В чем тут убожество? Умный анон уже наверно догадался, а если не догадался, то при такой записи, если мы захотим поиском по файлам найти, где задан идентификатор product__price, то мы ничего не найдем. Поиск по коду перестает работать. Я видел это убожество в нескольких проектах.
Поэтому я очень скептически отношусь к так называемым "фронтенд-специалистам" и их "best practices". Они пишут плохой код и не видят его недостатки.
Я её оттуда вытаскивал, лол. Делал не я, а какой-то хуй который так-же лечил про SPA, и съебался раньше чем все распидорасило. С тех пор у меня глаз и дергается при рассказах о том как это заебись.
В компонентах там не сильно много логики было, вполне терпимо. Гемморой возникал от того, что был рассинхрон того, что на клиенте и того, что на сервере - бекенд мог решить что так делать нихуя нельзя и зарезать любую операцию, после чего приходилось стейт компонента откатывать взад.
Стейтменеджер и использовался, но там был адовый говнокод (в значительной степени от меня, лол). Когда тебе там надо хранить штуки 3 формы которые могут менять друг-друга все перестает напоминать лаконичные примеры из документации.
Я реакт изучал по ходу дела, добил этот проект и съебался назад на няшный пых. Учитывая, что у наших фронтов регулярно всплывают проблемы на чем-то сложнее формочки быстрого заказа которые они решают с умным видом, заимел привычку травить эту публику в интернетах.
>>1996904
Из крупного - редукс.
Та как бэ принцип "нормально делай - нормально будет" везде применим.
Сам же пишешь, что на фронте говнокод был.
Бек на пыхе тут принципиально мало чем отличается, разве что количеством вкатунов
>если мы захотим поиском по файлам найти, где задан идентификатор product__price, то мы ничего не найдем
Аргумент уровня б. Когда так пишут, то ОБЫЧНО есть конвенция что это лежит в файле _product.scss или чем-то подобном, поэтому ты не ищешь по всему проекту, ты знаешь в каком хотя бы файле это находится. Конечно, если ребята работали на отъебись, то будешь два дня искать где поправить, но это не значит сам подход плохой.
>>1996991
>Это вторая уродливая и кривая технология. Как ты сделаешь SSR, если разным пользователям надо показывать разные страницы? Например, в интернет-магазине пользователю показывают стоимость и сроки доставки в зависимости от его города, выбранной валюты. SSR это нерабочая кривая фигня.
Абсолютно так же, как это делается и на пхп, сср фронтенд фреймворков "уродливым" можно назвать потому что иногда нужно понимать где ты находишься, на клиенте или сервере, получается такой гибридный ком кода.
>SSR это нерабочая кривая фигня.
Двачую. Сами сделали проблему и сами же её решили технологически-всратым велосипедом. Всё ради SPA даже тогда, когда оно не нужно и создаёт проблемы.
Всегда сперва проектируется. Херачить что получается это детский садик - штаны на лямках.
Вернее даже - сперва неделю ходишь задумчивый и смотришь аналоги, выписывая идеи себе. Потом следующую неделю прикидываешь общее приложение и пилишь архитектуру нормальными словами технический проект или как-то так, на этом этапе всплывают почти все подводные, которые не заметил. Ну а когда всё расписано, то на код положить любая макака сможет с закрытыми глазами.
>Отдавать форму с бека для спа на реакте? Чёт даже не смешно уже
> Если это спа, то как и для чего тебе формы с бека отдавать.
Каком реакте, дед? Ты опять сам с собой разговаривать начинаешь, таблетки выпей
Ну ведь ОП прямо здесь в треде отстаивает такую точку зрения, что это все дело нужно автоматизировать при большом количестве форм.
А индусы на стакере советуют просто форму отрендеренную отдавать. Я решил спросить на любом анимешном форуме мнения людей.
Почему я это всё повторяю специально для тебя, человека неспособного прочитать вопрос, зато громче всех смердящего?
>Ты правда ещё не понял, что с двумя разными людьми общаешься? Пиздец развелось вас
Это ты похоже не понял, что с двумя разными людьми общаешься. Что за бред шизоидный?
>С каких пор любой приложение с использованием vue должно быть spa? Это тебе кто такое сказал, или где это написано?
Не должно. Но когда голова твоя отойдет от пивасика, почитай хоть раз мой вопрос, не позорься. А пока что, пока ты не в состоянии, еще раз разжую:
> Вот я ее прописал на бэкенде, отправил в twig, в шаблоне написал {{ form(form) }} и все, у меня все готово.
> А что люди делают если весь рендеринг на джаваскрипте?
Что ты отвечаешь?
>Да засунь весь этот рендеринг на джаваскрипте в твиг, тю ебать, дурачок.
И после этого ты спрашиваешь, почему я думаю что ты работаешь с CMSками?
>Не напрягайся ты так, лучше на манерами поработай
Ты свои то посты перечитай, неадекват.
>>1997019
>Ты написал какую-то фигню. "фронт и бек разделены" это не абсолютная истина, а один из возможных подходов.
>То, что кто-то где-то разделяет фронт и бек и потом делает в два раза больше работы при выводе формы, не значит, что остальные должны так же делать.
Слушай, ну я в вопросе написал про "что люди делают если весь рендеринг на джаваскрипте". Это уже не вывод шаблонов в твиге, чего персонаж, которому я ответил выше, не понимает.
И про то что это "абсолютная истина" я нигде не писал, возможно ты меня с кем-то спутал.
Наоборот, я полностью поддерживаю твои слова о том, что моднявые технологии даром не нужны, когда заказчику нужно максимально быстро и бюджетно выполнить какой-то сайтец, на который будут заходить по 3 человека в день, без амбиций на дальнейшее расширение и поддержку.
Но зачем мне равняться на худших, если можно на лучших? Чем плоха продуктовая компания, "сорящая деньгами"? Это мечта любого кодера, ты разве не в такой работаешь?
>Отдавать форму с бека для спа на реакте? Чёт даже не смешно уже
> Если это спа, то как и для чего тебе формы с бека отдавать.
Каком реакте, дед? Ты опять сам с собой разговаривать начинаешь, таблетки выпей
Ну ведь ОП прямо здесь в треде отстаивает такую точку зрения, что это все дело нужно автоматизировать при большом количестве форм.
А индусы на стакере советуют просто форму отрендеренную отдавать. Я решил спросить на любом анимешном форуме мнения людей.
Почему я это всё повторяю специально для тебя, человека неспособного прочитать вопрос, зато громче всех смердящего?
>Ты правда ещё не понял, что с двумя разными людьми общаешься? Пиздец развелось вас
Это ты похоже не понял, что с двумя разными людьми общаешься. Что за бред шизоидный?
>С каких пор любой приложение с использованием vue должно быть spa? Это тебе кто такое сказал, или где это написано?
Не должно. Но когда голова твоя отойдет от пивасика, почитай хоть раз мой вопрос, не позорься. А пока что, пока ты не в состоянии, еще раз разжую:
> Вот я ее прописал на бэкенде, отправил в twig, в шаблоне написал {{ form(form) }} и все, у меня все готово.
> А что люди делают если весь рендеринг на джаваскрипте?
Что ты отвечаешь?
>Да засунь весь этот рендеринг на джаваскрипте в твиг, тю ебать, дурачок.
И после этого ты спрашиваешь, почему я думаю что ты работаешь с CMSками?
>Не напрягайся ты так, лучше на манерами поработай
Ты свои то посты перечитай, неадекват.
>>1997019
>Ты написал какую-то фигню. "фронт и бек разделены" это не абсолютная истина, а один из возможных подходов.
>То, что кто-то где-то разделяет фронт и бек и потом делает в два раза больше работы при выводе формы, не значит, что остальные должны так же делать.
Слушай, ну я в вопросе написал про "что люди делают если весь рендеринг на джаваскрипте". Это уже не вывод шаблонов в твиге, чего персонаж, которому я ответил выше, не понимает.
И про то что это "абсолютная истина" я нигде не писал, возможно ты меня с кем-то спутал.
Наоборот, я полностью поддерживаю твои слова о том, что моднявые технологии даром не нужны, когда заказчику нужно максимально быстро и бюджетно выполнить какой-то сайтец, на который будут заходить по 3 человека в день, без амбиций на дальнейшее расширение и поддержку.
Но зачем мне равняться на худших, если можно на лучших? Чем плоха продуктовая компания, "сорящая деньгами"? Это мечта любого кодера, ты разве не в такой работаешь?
Чаю. Они же когда-то были молодыми и шутливыми, доказывали другим дедам о преимуществах ООП, MVC, фреймворков и т.д., на что те деды плевались и отвечали:
>Мань, то что ты начиталась умных книжек про всякие ООП не значит, что бизнесу это нужно. Пойми, они в твой код заглядывать не будут, бизнесу нужен только результат.
>Процедурный стиль выигрывает по всем параметрам. В нем быстрее писать, вот "хуйня_нейм" у меня в процедурном стиле занимает 20 строчек. Ты бы эту же вещь написал в четырех классах, миллениал ебучий.
>Эти же 20 строчек легче читать, и они все в одном файле, что немаловажно. Не нужно по классам бегать, искать кто кого вызывает, кто с кем общается, всё как на ладони. Зачем утяжеление на ровном месте?
>Вот тебе бенчмарк: вызов глобальной функции и вызов метода класса. Вы же просто вставляете палки себе в колеса, делая код более медленным.
>То что кто-то выводит html не через echo, а как шаблон, еще не значит что так должны делать все.
Просто никто не собирается подмахивать фронтенд-макакам, которые кроме SPA ничего не знают и знать не хотят. Такая-то детская маняпопытка всех построить и оправдать своё существование.
У тебя просто горит жопец, от того что у так называемых фронтед-макак зарплата больше, а за твой говнокод в 2021 не хотят платить столько же.
Sad but true.
Ок, бумер.
>SPA-фреймворки убирают необходимость манипуляций с DOM, автоматически обновляя его при изменении состояния приложения, и нет, это полезно не только в охуенно сложных приложениях.
Вот тут дико дваждую, васянил нативный JS для формы в которой много всяких AJAX списков + некоторое количество условно появляющихся полей. Как же меня заебала возня с DOM это пиздец просто. За неделю освоил вью по верхам - задышал просто пиздец как по другому. Стало приятно писать клиентские формы и логику в них.
пс вообще не понимаю прям батхерта от изучения react|angular|vue - что бы по верхам хрюкнуть - неделя, и вперед.
Мне вью реально жизнь облегчил. И что важнее- я начал удовольствие от дрочки с написанием клиента получать.
Просто ты либо молодой, либо не сидел всю жизнь на жопе без амбиций в региональной веб-студии, выполняя ту самую работу и смотря сериалы по выходным, а шевелил мозгами.
Те, кто бугуртят от необходимости изучения новых технологий и оправдывают это НИНУЖНОСТЬЮ - это просто несчастные люди у которых атрофировались соответственные участки мозга.
Да, такое не только у заводских рабочих всяких бывает, сам в ахуе.
>Каком реакте, дед? Ты опять сам с собой разговаривать начинаешь, таблетки выпей
Фреймворк такой, почитай на досуге.
>Ну ведь ОП прямо здесь в треде отстаивает такую точку зрения, что это все дело нужно автоматизировать при большом количестве форм.
>гррряяя вы старые и не прогрессивные, в моем современном мире все пишут спа на жс фреймворках
>фронт не может написать форму на фреймворк-нейм, давайте будет отдавать ее с бека?
>ой а как он с ней работать то будет(((
Ну че, как? Сходил в жс-тред как я советовал? Сколько человек тебя послали нахуй?
>Пиздец развелось ВАС
>Это ты похоже не понял, что с двумя разными людьми общаешься
Ок, клоун
>почитай хоть раз мой вопрос
Я прочитал твою кашу говна, и посоветовал тебе научиться формулировать вопрос нормально. Если же нет - дело твое, будешь послан нахуй любым адекватным человеком. Никто в здравом уме не захочет разбираться в маня-фантазиях вайтишников без опыта работы, которые эти маня-фантазии нормально сформулировать и структуризировать не могут.
>>Да засунь весь этот рендеринг на джаваскрипте в твиг, тю ебать, дурачок.
>И после этого ты спрашиваешь, почему я думаю что ты работаешь с CMSками?
Проиграл с этого дегенерата. По этой причине я и писал, что соболезную тебе. Тяжело, наверно, делать вид что ты в чем то разбираешься, а на деле собеседников тупостью троллить
>Ты свои то посты перечитай, неадекват.
Вполне адекватное послание тебя нахуй. Любой уважающий себя и своих коллег человек так поступит. Анскильный, необразованный, невоспитанный еблан без опыта, залетевший на борду и начавший раскидывать на борде говно аля
"
ну короче вы все цмс-говнокодеры, сейчас в современном мире все на спа, все юзер интерфейсы рендерятся на жаваскрипте епта. Шаблонизаторы прошлое столетие, сейчас они нахуй никому не нужны. Что? Отдавать приложение отрендеренное на жсе с сервера? Лооол, кек, лмао. Я же говорил что вы цмс-говнокодеры, да? Пиздец убогие. А че думаете, если короче нанять фронтенд-макаку, посадить его писать приложение на реакт/вью/ангуляр (хотя реакт и ангуляр ты видимо не выкупаешь что такое, блогер-ютюбер рассказал только про обоссаный вью, да?), а короче формы (пиздец рофл) мы будем отдавать с сервера. Ну типа автоматизация. Мне так индусы на стаковерфлоу написали. А вот писать код на том же vue и отдавать его отрендеренным с сервера можете только вы - ебаные цмс бумеры-деды (22y.o)
>рендерить приложение на сервере НЕ ОК
>нанять макаку чтобы он нихуя не делал?? ОК
>рендерить формы на сервере и отдавать их макаке ОК
>макака ахуела, просит вернуть ему привелегию написать ебаную форму ручками с использованием нормальной технологии для этого предназначенной ОК
>анон в шоке, а как же маня-автоматизация макак в природе?
Очень смешно. Большое спасибо. Нужно чаще в тред заходить, а не раз в пол года.
>>1997476
> изучения react|angular|vue
А как же разделение ответственности. Ах ты старый цмс-разработчик с 2010 года. Сам что ли будешь вот это все трогать? Шок, эти вебмастера вонючие как же меня от вас тошнит. Вылечить бы вас
>И что важнее- я начал удовольствие от дрочки с написанием клиента получать.
Нахуя, если можно написать спа на вью, а потом с сервера html код отдавать и рендерить его в этом же вью? Ну не гениально ли? Почитай как нибудь, indus.stackoverflow
>Каком реакте, дед? Ты опять сам с собой разговаривать начинаешь, таблетки выпей
Фреймворк такой, почитай на досуге.
>Ну ведь ОП прямо здесь в треде отстаивает такую точку зрения, что это все дело нужно автоматизировать при большом количестве форм.
>гррряяя вы старые и не прогрессивные, в моем современном мире все пишут спа на жс фреймворках
>фронт не может написать форму на фреймворк-нейм, давайте будет отдавать ее с бека?
>ой а как он с ней работать то будет(((
Ну че, как? Сходил в жс-тред как я советовал? Сколько человек тебя послали нахуй?
>Пиздец развелось ВАС
>Это ты похоже не понял, что с двумя разными людьми общаешься
Ок, клоун
>почитай хоть раз мой вопрос
Я прочитал твою кашу говна, и посоветовал тебе научиться формулировать вопрос нормально. Если же нет - дело твое, будешь послан нахуй любым адекватным человеком. Никто в здравом уме не захочет разбираться в маня-фантазиях вайтишников без опыта работы, которые эти маня-фантазии нормально сформулировать и структуризировать не могут.
>>Да засунь весь этот рендеринг на джаваскрипте в твиг, тю ебать, дурачок.
>И после этого ты спрашиваешь, почему я думаю что ты работаешь с CMSками?
Проиграл с этого дегенерата. По этой причине я и писал, что соболезную тебе. Тяжело, наверно, делать вид что ты в чем то разбираешься, а на деле собеседников тупостью троллить
>Ты свои то посты перечитай, неадекват.
Вполне адекватное послание тебя нахуй. Любой уважающий себя и своих коллег человек так поступит. Анскильный, необразованный, невоспитанный еблан без опыта, залетевший на борду и начавший раскидывать на борде говно аля
"
ну короче вы все цмс-говнокодеры, сейчас в современном мире все на спа, все юзер интерфейсы рендерятся на жаваскрипте епта. Шаблонизаторы прошлое столетие, сейчас они нахуй никому не нужны. Что? Отдавать приложение отрендеренное на жсе с сервера? Лооол, кек, лмао. Я же говорил что вы цмс-говнокодеры, да? Пиздец убогие. А че думаете, если короче нанять фронтенд-макаку, посадить его писать приложение на реакт/вью/ангуляр (хотя реакт и ангуляр ты видимо не выкупаешь что такое, блогер-ютюбер рассказал только про обоссаный вью, да?), а короче формы (пиздец рофл) мы будем отдавать с сервера. Ну типа автоматизация. Мне так индусы на стаковерфлоу написали. А вот писать код на том же vue и отдавать его отрендеренным с сервера можете только вы - ебаные цмс бумеры-деды (22y.o)
>рендерить приложение на сервере НЕ ОК
>нанять макаку чтобы он нихуя не делал?? ОК
>рендерить формы на сервере и отдавать их макаке ОК
>макака ахуела, просит вернуть ему привелегию написать ебаную форму ручками с использованием нормальной технологии для этого предназначенной ОК
>анон в шоке, а как же маня-автоматизация макак в природе?
Очень смешно. Большое спасибо. Нужно чаще в тред заходить, а не раз в пол года.
>>1997476
> изучения react|angular|vue
А как же разделение ответственности. Ах ты старый цмс-разработчик с 2010 года. Сам что ли будешь вот это все трогать? Шок, эти вебмастера вонючие как же меня от вас тошнит. Вылечить бы вас
>И что важнее- я начал удовольствие от дрочки с написанием клиента получать.
Нахуя, если можно написать спа на вью, а потом с сервера html код отдавать и рендерить его в этом же вью? Ну не гениально ли? Почитай как нибудь, indus.stackoverflow
>vue
Норм тема, прекрасно мешается с jquery, применяется в конкретных местах и здорово облегчает жизнь там где надо
>angular
не сталкивался с проектом, где бы он был прям так оправдан, обычно это оверкилл, но он неплохо форсит архитектуру диким фронт макакам.
>react
Спидозное говно говна. Самое популярное ко всему прочему. 1001 способ сделать всё через жопу, практики, меняющиеся каждые полгода (как раз когда сойбои выясняют, что залупа с которой они бегали полгода назад - кусок говна).
Ты написал длинный и плохо понятный пост, но мог бы просто написать, что не знаешь, что делать с формами и как избежать двойной работы (описания формы на бекенде и на фронтенде).
Кстати, генерация форм нужна не только когда хочется избежать двойной работы. Бывает, что формы вообще генерируются динамически (а не описаны где-то в коде). Пример: бизнес-процессы. Пользователь создает новый бизнес-процесс (закупка офисных принадлежностей), описывает какие у него есть свойства (товар, цена), какого они типа и где-то должна появиться форма с соответствующими полями.
В чем проблема сделать это на вью?
Нихуя тебя порвало, иди валерьяночки выпей. Выдал просто поток сознания несвязный, тут нету даже что цитировать чтобы тебя, собачку глупую, мордой в говно макнуть, ты сам себя в говно макнул глубже некуда.
Мой тебе совет: если ты не умеешь отличать людей в потоке сообщений без аватарок и никнеймов, лучше не сиди на дваче. Ну очень убого смотришься.
Ты даже в этом посте под меня приписал посты половины треда, при том что я только спросил у людей как они используют формы при условии разделении бэка и фронта, ну и непосредственно с тобой в нескольких постах поигрался.
Наверное тебе так удобнее, из-за того что я заявил о своем сравнительном ньюфажестве. Тут-то появляется что ответить, вместо реальных аргументов можно просто заявить что ты уже два с половиной года интернет магазины на битриксе делаешь, а потому лучше меня не меня во всем смыслишь.
А хуй его знает, просто увольняемся с работы когда появляется проект на Vue/Angular/React и ищем нормальную веб-студию без всей этой пидорской хуйни.
>Просто ты либо молодой
мне 34
>либо не сидел всю жизнь на жопе без амбиций в региональной веб-студии
Я вообще в студиях не сидел - самозанятый типа + госшарага.
Че ты несешь, поехавший? Я в вашем сраче вообще не участвовал.
vue и в меньшей степени реакт ( потому что в нем нет на сколько я понял альтернативы директивам для уже существующего хтмл) изучил для своих нужд пока что на уровне своих нужд за неделю. Доволен.
>>А как же разделение ответственности.
Разделения чего? Разделения куда? Меня тошнило от возни с DOM, ща на вью васяню свои условные пагинаторы и получаю удовольствие от того что на клиенте и бэке пишу приятный для меня код.
Меня не ебут экзистенциальные вопросы нубарей "какой вэб-фреймворк выбрать" с абсолютным не пониманием зачем эти фреймворки вообще нужны.
Ещё токсичность эта зашкаливающая - безработного за версту видать т.к. с таким говном никто работать не будет. Либо возьмут на позицию хуесоса у джунов, откуда эта обида ёбаная.
CMS у него, видите ли, говно и вообще для дидов, а модные-молодёжные все даже сраные визитки на SPA пилят с сотнями эндпоинтов. Сразу видно идиота не умеющего подбирать инструмент под задачу.
Еще как вариант нанять макаку, которая умеет кастомные формы делать, а не верстальщика, который выдает себя за фронта
>>1997701
Выронил тебе за щеку, сынок
>>1997510
А кто говорил что js нинужон и все будем писать хуй пойми как? Завтра выпустят новый функциональный вантуз для унитаза - ты им вместо унитаза жопу свою чистить будешь?
>>1997708
>vue и в меньшей степени реакт
А laravel в меньшей степени yii? Попробуй посмотреть что то кроме ролика "vue за час" или "реакт для чайников"
>Разделения чего? Разделения куда?
Пиздец, ты ироничный рофлан над лохами-джунами, которые symfony формы на spa присылают не выкупил?
Какие IDE для ПиЭйчПи-разработчика посоветуете?
PHPStorm - тормознутый
VSCode - тупит с intellisense
Это исключительно вопрос вкуса и привычки.
По количеству всяких свистелок полезных наверное все таки шторм, но подглючивает и обновы корявые часто. Плюс, если разные языки используешь приятно по Intelij идешкам скакать.
В VS можно плагинами вцелом поднастроить и будет не хуже, но при этом стабильнее и легковесней.
Остальное не юзал особо.
Вот привыч нащадно к Шторму, но он стал жрать под 90% проца при печати, я и переустанавливал разные версии и на новом проекте пробовал - не помогает.
Поэтому решил свитчнуться в VSCode и теперь страдаю от непривычки.
В твоей дурной головушке не умещается осознание, что тебя тут хуесосят больше чем 1 человек?
Вот это манямирок у зумера.
С памятью кстати ни разу не было проблем, открыто несколько инстансов из их семейки - жрут стабильно вцелом, хотя коллеги иногда жалуются на похожие косяки.
Я пользуюсь VS на ноуте иногда, тоже сначала привыкал долго и плевался. Через месяц +- попривык.
>>1997945
Ты уже реально заебал со своей шизой, иди в срачетред. Я сомневаюсь, что в треде одновременно заспавнилось несколько таких долбоебов.
>Я сомневаюсь
Я ж говорю - манямир зумера непобедим.
>иди в срачетред
Иди нахуй, малолетка ограниченная. Это ты сюда пришёл учить нас как приложения писать - сиди и слушай, что тебе умные люди говорят.
Ну в первую очередь он нужен там, где большие команды и есть нормальный QA, чтобы не шарить постмановские коллекции и не мучится с их актуальностью. Если у тебя небольшое публичное апи - обычной доки за глаза хватает.
Я с тобой ни о чем не спорил, успокойся, ты реально какой то больной.
> Пишет индусокал на cms и джиквери в 2021
>Ни учите миня ПРИЛАЖЕНИЯ писать!!
Мань, приложение тут только моего хуя к твоему тупорылому еблету.
Траллируй - траллируй
>>1997938
А чем условные cms плохи? В рамках своей ниши? Хочет кабанчик у которого два-три ИРЛ магазина по продаже плинтусов и фурнитуры выйти в интернет, он хочет масимально типовую поебень, с каталогом и номером телефона. Бюджет 30 тыщ максимум - и хуле? На реакте + нода + деплоить в облаках + личный дизайн тыщ за 400 ему предложишь? И этот рынок существует, и не такой уж он узкий.
Другой вопрос что на говне уровня вордпресса писать противно.
Но я для своих быстрых нужд хочу Октябрь освоить, что бы и я не страдал, и быстро/просто реализовывал типовые проекты. У меня есть круг знакомых, мелких коммерсов, которым такой вариант очень подойдет.
Да ничем они не плохи, нишевое решение, магазинчики нужны всегда, просто местный шиз, из за своей ограниченности продвигает ебанутые походы оттуда, как стандарт в индустрии.
>хочу Октябрь освоить
С Октябрём сложно всё - у него скоро будет версия 2, которая платная будет и бесплатная какая-то. Часть разрабов прихуела от таких раскладов и сделала Винтер.цмс на базе первой версии.
Они там год-полтора только бурлить в говнах будут без явного результата.
>версия 2, которая платная
Если у них получится сделать аналог Битрикса, но с нормальным кодом внтури первый Октобер вполне годный, то вообще заебца будет. Правда Битрикс только для рашкинских бизнесменов, а тут глобально.
>первый Октобер вполне годный
Там же лара с eloquent под капотом? Не сказал бы что в ларе прям очень годный код. Хотя конечно в сравнении с битриксом все равно победа.
>нечно в сравнении с битриксом все равно победа.
Ну да - Ларовские Элоквент, Роутер, вместо Блейда - Твиг, Контейнер с зависимостями и поддержка композера из коробки. Но там не вся Лара, а некоторые компоненты только + они свои понапилили вполне удобные. В принципе, на уровне разработки плагинов всё пишется в стиле фреймворка - с контроллерами, маршрутами, моделями и их отношениями. С вордпрессом тем же не сравнить, да и много из коробки уже нормально работает без танцев с бубном и установки ёбаных сотен плагинов.
Прикольно звучит, а конкуренты сейчас есть популярные у нее? Может на симфони чот похожее наклепали уже?
>конкуренты сейчас есть популярные у нее?
Вроде как конкуренцию вордпрессу хотели сделать, но тут без вариантов - эту гору закаменевшего векового дерьма уже не сдвинуть. На ней веб-студии среднего ценового диапазона любят работать, по моим наблюдениям, да и удобен он в штамповке типовых сайтов - понаписал плагинов по частые кейсы и только собирай из них сайты.
>Может на симфони чот похожее наклепали уже?
Друпал на симфони переехал давненько уже.
Алсо можно и на вью сайтики делать, если кто думает, что CMS этого не умеет https://www.youtube.com/watch?v=9A-obKktlYw
Во-первых, она отличается от рукописной. В рукописной документации ты замучаешься рисовать все таблички, которые тебе предоставляет swagger.
Во-вторых, можно не писать swagger файл руками, а писать в коде аннотации, из которых потом генерируется swagger. Так документация хранится радом с кодом и ее легко поправить при исправлениях кода.
Тебе в любом случае надо как-то описать API для фронтендщиков. Лучше сделать это нормально, а не как попало.
Также, теоретически можно бы использовать swagger-описание для автоматической валидации приходящих параметров, но я не сталкивался с библиотеками, которые это реализуют.
>В рукописной документации ты замучаешься рисовать все таблички, которые тебе предоставляет swagger.
Кроме красивых вьюшек - я сразу сказал.
>можно не писать swagger файл руками, а писать в коде аннотации, из которых потом генерируется swagger
Что как бы одно и то же по-сути и от дублирования работы не избавляет.
>Лучше сделать это нормально, а не как попало.
Какая разница где править документацию - в файле кода или разделе документации? И там - и там проебаться можно по чисто человеческим причинам.
Как минус получаем добавление очередного синтаксиса в проект, довольно всратого при этом, и увеличение объёма работы т.к. описывать он требует очень досконально.
>>С Октябрём сложно всё - у него скоро будет версия 2, которая платная
Нихуя се, жаль.
>>Они там год-полтора только бурлить в говнах будут без явного результата.
Это да. Попридержу коней тогда.
Анончики. Я очень не шарящий в кодинге и тем более в пхп. Есть один магазинчик wordpress+woocommerce+astra theme. Я хочу изменить какое-то свойство товара прямо в БД вордпресса.
Но, когда я меняю значение (цена или название товара или наличие) в соответствующей таблице бд, сохраняю. На сайте оно не обновляется.
Поясните мне балбесу, как это работает и как сделать, чтоб значение внесенное руками в бд отображалось на сайте?
Сколько пользователей? Вообще-то этот довольно простой запрос база должна быстро выполнить, если у тебя структура не въёбана.
Или там таблица терабайт на 5? Тогда хуйле тебя на этот проект посадили, ёбу дали штоле?
>>Смотри плагины\настройки кеширования и сбрасывай их кеш.
А не, все ок. я не в той таблице менял просто. Спс.
вот насчет вывода числа юзеров в админке-обращение к массиву?
>Пиздец, ты ироничный рофлан над лохами-джунами, которые symfony формы на spa присылают не выкупил?
Красавчик, два года назад задачку для дэбилов про айфон в кредит решить не мог, а теперь ОПа джуном называешь, лол
>на самоподдуве закатиться в тред бекенда
Лол, какой тред бекенда? Здесь большинство - такие же пхп жиквери фулстек макаки как ты.
А теперь зайди к чистым бэкэндерам: к гоферам, джавистам, нодистам или еще куда хочешь, и расскажи им свою позицию.
Хотя ладно, ничего интересного с этого не выйдет, тебя там с твоими охуенными идеями за такого толстяка примут что даже нахуй не пошлют.
-Показываем пользователю форму логина
-Получаем от него пароль
-Проверяем пароль на наличие в базе данных
-Если пароль есть - генерируем хеш, сохраняем хеш в таблицу сессий, и вместе с айдишником пользователя записываем в сессию.
-После этого на каждом важном действии сверяем айди и хеш текущего пользователя с табличным.
А вот вопрос: что если хакер украдет текущий хеш из сессии браузера клиента? Это можно вообще сделать?
>Проверяем пароль на наличие в базе данных
Проверяют не пароль, а хеш пришедшего пароля с хешем пароля в БД. Обязательно посолить - соль тоже хранить в БД.
>После этого на каждом важном действии сверяем айди и хеш текущего пользователя с табличным.
Не обязательно - можно просто первым делом запрашивать на каждой защищённой страничке пользователя из БД по хешу сессии. Если не пришёл, то редиректи на страницу логина.
>если хакер украдет текущий хеш из сессии браузера клиента? Это можно вообще сделать?
На https все данные шифруются и их перехват ничего не даст.
Хуевасто как-то для миддла у тебя, через постель на работу попал?
>На https все данные шифруются и их перехват ничего не даст.
Спасибо за ответ, аношка. Но что если есть только http? Гипотетически хакер может как-то украсть данные сессии и использовать их? Или не беспокоиться?
Если тебе для зачёта, то не трахай мозги и делай хоть как. Если для реального дела, то обязательно https и никаких велосипедов - бери проверенный фреймворк и делай на нём. Начальству скажи, что по требованиям безопасности обязаны предоставить https - это не прихоть.
спасибо анон
Тебе стоит изучить, как работают сессии.
Данные сессии хранятся на сервере (в файле, БД, редисе в зависимости от настройки). Они не передаются в браузер.
В БД надо хранить не пароль, а соленый хеш от пароля.
>>1998423
Если HTTP, то данные передаются в открытом виде. В том числе данные из формы логина, а также кука с идентификатором сессии. Соответственно, все, через кого проходят данные (роутер, который может быть заражен, провайдер, который сохраняет весь трафик по закону, сервера) могут их видеть и использовать. Потому надо использовать HTTPS.
и тебе спасибо аноний
Если вам не ответили, или вас забыли, можете напомнить о себе в новом треде.
А я напомню, что в нашем треде есть заказчик >>1982834 Вы можете не только решить его интересную задачку, но и даже получить за это деньги (но это не точно).
тащем-та он прав
как ты собрался работать разработчиком без нормального компа?
ну Notepad++ тогда юзай, чо доебался до анона?
8 это тот же 7.х по большей части. Так что бери любой по 7.х учебник. Вау отличий нет.
Если я хочу просто найти работу, лучше сразу начать ковырять фреймворк? Одного laravel хватит или еще что-то и в каком порядке?
В принципе да. Делаешь гостевую книгу и тут же ищешь должность ждуна на галере. За еду. На реальных задачах быстрее развиваться будешь.
А вообще тред перекатится. https://2ch.pm/pr/res/1998470.html (М)
мб ты там уже и спрашивал
Но я столкнулся с непонятной проблемой. По какой-то причине в моём коде \D меняет лишь буквы, и при этом не затрагивает, как и положено - цифры, но в то же время и специальные символы, пример: #, |, ~ и так далее.
Я понимаю что есть квадратные скобки и всё такое, но меня интересует сугубо данный вопрос: что здесь не так? Почему \D вместе с цифрами не трогает и специальные символы?
Блядь, я долбоёб тупой. Там же начало и конец подстроки не подпадают под регулярку. Нужно чтоб было вначале 'a', потом в конце 'b', а у меня в примере со спец. символами не так. Сорян, в глаза ебусь.
Вы видите копию треда, сохраненную 25 мая 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.