Здесь мы изучаем язык PHP (а также JS/CSS/HTML/SQL) и учимся делать сайты. Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.
ОП довольно занят, но постарается ответить на все вопросы. Также, ответы и решения задач можно поискать в архиве тредов phpclub.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>1917260 (OP) . Все старые треды есть в архиве: https://phpclub.tech/ (там есть поиск, можно искать решения и обсуждения задач).
С чего начать
Наши уроки по PHP собраны по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не запоминайте его, он временный). Это учебник для изучающих с нуля. Там есть задачи, их нужно решать. Но если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.
Если не знаешь как решать, запости код и попроси подсказку или поищи задачу в архиве тредов.
Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование. У нас есть задачи для изучения этого:
Параллельно стоит подучивать английский, на первых порах можно без него, но по мере развития придется все чаще сталкиваться с англоязычными статьями, так что лучше не откладывать. Читать можно news.ycombinator.com - это что-то вроде их хабра.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
Оформляй код аккуратно!!! — например пропусти через 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? — Да, однозначно. Посмотри любую вакансию.
Код надо писать аккуратно и оформлять, как принято. Потому, что другой человек, который будет смотреть твой код, вряд ли обрадуется, когда ему придется разбирать слипшиеся строчки, разбросанные в беспорядке скобки и написанные русскими словами названия переменных. Особенно плохо будет если это, например, код тестового задания, которое ты сделал, чтобы устроиться на работу. Если он будет неряшливым, это будет большой минус.
Вообще, в 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, где все это описано подробнее и даны примеры оформления:
Нарушение разделения ответственности. Функция проверки должна только проверять данные формы, а не заниматься выводом сообщений и тем более убивать скрипт. Она должна вернуть результат проверки, а что с ним будут делать - это не ее дело.
Завтра ты захочешь сделать, чтобы при ошибке выводилась форма с введенными значениями, и эту функцию придется переделывать. А вот если ее сделать, как я написал, то не придется.
>>1958481 вот у меня еще есть 3 формы. можно чтобы сокр код сделать проверку этих форм через OR в одну строку типа if (!checkLogin($login) or !checkCountry(x) or !checkPassword(y)) { не валидно }
trim можно убрать из функции, все же ее задача - валидация, а не преобразование данных. Тогда можно будет сделать, чтобы функция либо возвращала текст ошибки, либо null, если все ок. В таком случае мы сможем выводить разные сообщения при разных ошибках.
У функции желательно указать тип аргумента и тип возвращаемого значения. Это улучшить читабельность кода: сразу видно, что приходи в функцию и что она вернет.
Также, у тебя странно, что ты возврашаешь 0, но в if сравниваешь с false.
Здесь это не требуется, но если понадобится, чтобы функция возвращала более 1 значения, можно возвращать массив.
Я вкатыш и мне кажется шапка устарела. Что делать? php.net от а до я вылизать собираюсь, после этого на ларавельку пиздовать собираюсь, после этого пойду сразу миддлом за 100к+, т.к. живу в ДС и есть возможность работать в офисе, бок о бок с профи. Какие подводные?
>>1958543 >>1958564 Написано то всё верно. Только в гайде походу не уделилось времени этому достаточно. $a = 0; echo $a++; //выводит ноль при том, что а будет единицей.
>>1958567 Я это понял, но я не понимаю как это работает. Получается $a++ это оператор, который возвращает значение $a вызывающей его функции, а после ее выполнения увеличивает ее на единицу?
Я тут спрашивал в прошлом треде о авторизации для AJAX запросов. В общем сделал так: При каждой авторизации юзера создается/обновляется токен При выходе с аккаунта планировал токен удалять, но понял что это приведет к ошибкам при двух и более одновременных сессиях/SPOILER] При каждом дергании токена ( эвент retrieved ) проверяется, не протух ли он. Если протух, то токен обновляется. Токен пробрасывается в html в мета тег. При отправлении AJAX запроса в javascript, он берется оттуда и пробрасывается в header В миддлваре, при обнаружении AJAX реквеста с токеном в хедере, реквесту назначается юзер с таким токеном ( офк, если токен не протухший )
Что меня напрягает: 1) Нулевая безопасность. Если я получу хоть на момент доступ к ПК жертвы, я могу, например, сфотографировать себе токен жертвы, после чего без особой сложности выполнять на своем ПК любые операции от ее имени, просто подменяя в исходном коде свой токен на токен жертвы. Конечно, пока токен не протухнет или жертва не перелогинится. 2) Есть вероятность того, что токен протухнет между его пробрасыванием в html и отправкой самого запроса. Это как-то несерьезно
Действительно ли это весомые проблемы? И если да, то как они решаются? Есть идея делать очень маленькое время протухания, например 60 секунд, и каждые 55 секунд запрашивать по аяксу новый токен, пока не протух старый. Но это по-моему как-то слишком.
$a++ увеличивает $a на 1, но (если ты его используешь в выражении или команде) возвращает исходное значение $a до увеличения. То есть, если написать:
$a = 1; $a++; echo $a;
То выведется 2. А если написать
$a = 1; echo $a++;
то выводится 1, хотя $a увеличивается и становится равно 2 (что легко проверить, дописав echo $a в конец).
Почему это не написано в учебнике? Там я старался писать как можно проще и не залезать глубоко в детали. В учебнике предполагается, что ты будешь писать просто
$a++;
и не будешь пытаться засунуть это внутрь какого-то другого выражения или команды. Сколько я не писал код, я не помню ситуации, когда надо засовывать $a++ в другое выражение. Некоторые так делают, но на мой взгляд это ухудшает читабельность кода и делать так не стоит.
По моему, лучше бы конечно в PHP было запрещено вставлять $a++ внутрь других выражений.
php.net читать конечно полезно, но там не учебник, а мануал и он больше рассчитан на тех, кто уже знает какой-нибудь язык программирования, вроде Си, и кому нужно только выучить отличия. Мануал на php.net не очень подходит для начинающих с нулевыми знаниями, как мне кажется.
Да, он увеличивает переменную, но возвращает значение до увеличения. Ты можешь проверить это кодом
$a = 1; echo $a++; // 1 echo $a; // 2
Зачем так сделано? Логику тут найти трудно. Спроси у автора языка Си, зачем он так придумал. Я подозреваю, что просто потому что в компьютерах тех времен была команда для этого, вот он и скопировал ее в язык.
Ты зачем-то создаешь переменные, которые никак дальше не используются. Вот смотри:
function x() { return $a = "текст"; }
Эта строка создает переменную $a, записывает в нее значение "текст", затем возвращает его и выходит из функции. При выходе из функции переменная $a уничтожается. Зачем ее тогда было создавать? Нужно писать просто:
return "текст";
У тебя команда
return $errors[] = "текст";
создает массив, но возвращает она не массив, а строку "текст". Зачем создается массив, непонятно, так как он никак не используется и уничтожается при выходе из функции. Если ты хотел вернуть массив из 1 элемента, то надо писать так:
return ["текст"];
Хотя правильнее было бы сначала собрать все ошибки в массив и в конце функции вернуть его:
А зачем ты используешь токен для аякс-запросов на сайте? Обычно токен используется для сторонних приложений, которые вызывают твое API.
На сайте у тебя есть стандартная авторизация (через куки или сессию), и стандартные функции, чтобы проверить, залогинен ли пользователь. Зачем нужно отказываться от них и переходить на какие-то токены? Может, я что-то не знаю, но выглядит как бессмысленное усложнение на ровном месте (да, я в курсе, что некоторые так делают, но это их проблемы).
Я понимаю, если бы у тебя было API для сторонних приложений, но у тебя его нет.
> Если я получу хоть на момент доступ к ПК жертвы, я могу, например, сфотографировать себе токен жертвы,
Если ты получишь доступ, ты можешь установить бекдор и вообще делать что угодно с компьютером, так что это мелочи.
> Действительно ли это весомые проблемы? И если да, то как они решаются? Есть идея делать очень маленькое время протухания, например 60 секунд, и каждые 55 секунд запрашивать по аяксу новый токен, пока не протух старый. Но это по-моему как-то слишком.
Не очень понятно, зачем делать короткий срок жизни токена и мучаться с продлеванием, если можно сделать время жизни токена больше, чем время жизни авторизационной куки и не мучаться.
>>1958867 тут фишка в чем,изначально я просто сделал проверку.где просто проверяли и выводили все найденные ошибки,но выполнение проги не останавливается! можно конечно после каждого echo сделать die,но токга прога выведет первую попавшуюся ошибку и завершит процесс
Возможно, кто-то что-то не так понял. Ты можешь сделать, чтобы функция проверки возвращала true/false, но тогда ты не сможешь вывести, в чем именно ошибка. Лучше сделать функцию, которая либо вернет текст ошибки, либо null, если ошибок нету. Либо можно возвращать массив ошибок, если он пустой, то ошибок нет. С массивом плюс в том, что можно вернуть несколько разных ошибок сразу.
>>1958954 я написал же,если в первой проверке есть ошибка,он выведет эту ошибку и умрет.не проверив следующие условия. вроде все и правильно,не не идеально
>>1958870 >А зачем ты используешь токен для аякс-запросов на сайте? Обычно токен используется для сторонних приложений, которые вызывают твое API. А как еще мне, например, отправить коммент от юзера по аяксу? Юзер в аякс запросе же никак не идентифицируем. Если я просто пошлю запрос, $request->user() будет возвращать null. Алсо, здесь мне так и посоветовали делать: >>1955771 → Или ты предлагаешь мне через яваскрипт как-то вытягивать данные из кукисов и сессии? Это же вроде небезопасно и по умолчанию невозможно, нет разве? >Не очень понятно, зачем делать короткий срок жизни токена и мучаться с продлеванием, если можно сделать время жизни токена больше, чем время жизни авторизационной куки и не мучаться. Чтобы когда хакер украдет токен, у него не было времени с ним что-то плохое сделать. Но это все похоже мои шизоидные теории, так что не обращай внимания.
> Юзер в аякс запросе же никак не идентифицируем. Если я просто пошлю запрос, $request->user() будет возвращать null.
Это почему? Аякс-запрос отправляется на сервер вместе с куками, следовательно авторизационная кука (и данные в сессии) должны быть доступны. Или в Ларавел это как-то специально ограничено?
> Чтобы когда хакер украдет токен, у него не было времени с ним что-то плохое сделать.
А если хакер украдет авторизационную куку? Что, заставлять пользователя каждую минуту перелогиниваться?
Я думаю, кто-то что-то напутал. Токены используются в API, к которым обращаются внешние приложения. Там не используются авторизационные куки, нет сессии, потому нужен токен. Также токен может использоваться, чтобы ограничить его использование по времени или ограничить набор прав для него (то есть токен может давать меньше прав, чем полноценный логин).
В функции последний if очень странный, смотри сам:
- если массив ошибок пуст (ошибок нет), вернуть пустой массив - если ошибки есть, то не вернуть ошибки, а вернуть массив с 4 строчками (зачем?)
Нужно было просто написать return $error и все. Зачем написан этот if?
Справа, увы, не ООП, а просто код со словом class. У тебя все сделано статикой. То есть ты не можешь, например, создать 2 объекта для 2 разных форм. И опять же, у тебя все вперемешку - и проверка данных, и вывод результата сделан вместе. Это не ООП.
>>1959075 Бля, спасибо тебе огромное что на путь истинный направил. Жаль что ты не ответил мне еще в том треде, а то я всё это время потратил на то, чтобы нормально осуществить эту авторизацию, а оказалось что я говна бесполезного накостылил и все с коробки работает. Просто я был почему-то уверен, что JS с куками взаимодействовать не должен. Плюс, я не с головы взял, что $request->user() null возвращает. У меня действительно такое было, только я в тот момент не подумал, что это могла просто авторизационная кука протухнуть. А наверняка так и было. Ну я и лох конечно. Еще и весь этот позор на гитхаб запушил.
>>1959263 О разделении ответственности ( на конкретном примере, что функция не должна и выводить что-то на экран, и проверять значение ) тебе уже писали. О именовании тоже писали сотню раз. Ну какое нахуй $var? О указании тайпхинтов тоже писали. В чем логика, что функции lenght() и symbols() еще и возвращают логин? И самое главное, ты проебал всю изюминку ООП - инкапсуляцию. Зачем вообще нужен такой класс, у которого я должен явно вызывать методы проверки валидности по каждому правилу?
Нет. В ООП у каждого класса есть "зона ответственности", или какая-то роль, которую он выполняет. У тебя класс занимается и проверкой и выводом текста на экран. То есть, все смешано в кучу. Нужно разделять обязанности. Класс должен заниматься только проверкой. Выводом ошибок должен заниматься другой код.
Плюс, у тебя надо вручную вызывать каждую проверку. А правильнее сделать так, что ты вызываешь один метод validate() и он уже делает все нужные проверки и возвращает результат.
Вообще, чтобы разобраться в ООП, тебе стоило бы начать с более простых задач вроде тех, что перечислены тут >>1958238 → А то ты тыкаешься вслепую, пытаясь писать ООП код.
Также, научись форматировать код по PSR-1 и PSR-12. Если ты не можешь настроить плагин к редактору, то научись писать сразу с правильным форматированием. Во втором посте треда есть информация про форматирование кода. Я проверил - для VS Code частично помогает этот плагин: https://marketplace.visualstudio.com/items?itemName=kokororin.vscode-phpfmt
>>1959901 >Впервые вижу, чтобы так долго безрезультатно вникали в основы кодинга значит он читал не те книжки или вообще не читал, погромирование это не искусство, а ремесло, формошлепай и прибудет с тобой трудовой стаж. нет бы вынести Design Patterns, чистый код мартина, полюбому есть специфический учебник по пыхе по типу "как перестать писать говно", в шапку.
>>1959886 а куда вкатываться? для джавы, го, си++, сишарп я туповат. в питоне вообще дата саенс и матан, там мне дорога закрыта. я с математикой вообще не в ладах
>>1959915 читал,и не одну-в целом поверхностое говно для полных нулей,бер рил прожект. приходиться много гуглить,но там 99% процедурный код-зато работает и понятней
Подскажите, кто в курсе, какие тестовые задания сейчас дают джунам на ларавел? Из того, что я находил в интернете - дают задание написать какой-нибудь CRUD. Но, возможно, сейчас какие-то ещё появились заебы? Видел ещё инфу, что кто-то требует покрывать тестами весь код. Это действительно так важно сейчас работодателям или можно без этого устроиться? Общие знания о том, как тестами покрывать у меня есть, но мне лень было с этой еботней заморачиваться. Впрочем, если это так важно работодателям, то придется хули
>>1959976 >бер рил прожект мне уже не надо, но если код с прода != хороший код, шаблоны проектирования хотя нужно иметь представление что это, тем более на собесе за них спрашивают в любом яп.
Меня заебал шарп, потому что на всех работах требуют не просто пилить бек, но и фронт на ангуляре/вью/реакте ну и прочей хренью заниматься, типа, блядь - лезть в залупу на сокетах хуячить, а я в универе наигрался с сокетами. Так вот, в моей мухосране 2 варианта карьеры бекендера: шарп и пхп. Вот и я заинтересовался ПХП. Поясните, не начнется ли с определенного момента эта же залупа с тем, что не достаточно просто пилить бек? Как я понимаю, чтобы вкатиться - нужно симфонию и/или ларавель покурить, да сделать какой-нибудь интернет-магазин, чтобы закрепить знания или что-то еще там нужно особое знать?
>>1960043 дело не в эстетике, процедурный код забит гвоздями и его проще переписать чем расширить, слишком абстрактный код перегружен и хрупок, одно изменение может потянуть пол кода.
>>1960052 >слишком абстрактный код как раз хотел спросить про ООП,если много кода,много связей,как вы ориентируетесь в нем,особенно если там несколько слоев?
>>1960057 есть принципы проектирования solid, dry, kiss, grasp и другие, вот их и придерживаемся, когда несколько человек пишут в одном стиле то каша более понятная.
>>1959990 Задам смежный вопрос: насколько часто на джуна вообще просят тестовое? Как по мне это ебанистика полная. За пару минут беседы же можно вполне +- понять уровень человека, если не задавать вопросы с листочка. Да и есть у меня гитхаб допустим, там интересные проекты которые месяцами делались, за каждую строчку могу пояснить и доказать что не верблюд. В чем прикол заставлять соискателей делать для каждого работодателя какой-то шаблонный круд с тестами, еще и с ограничением в какие-то условные 2 дня? При том что для меня эти два дня могут являться двумя вечерами после 13-часового таскания бетонных хуев, а для какого-то Ваньки это 48 часов, за которые это все дело даже обезьяна нагуглит и сделает. И какой вообще уровень эти круды могут показать?
>>1960146 Если у тебя есть гитхаб и можешь пояснить за код там - навязывай его вместо тествого, типо чтобы время не терять. Суть в том, чтобы убедить работодателя, что ты не хуй с горы и можешь код писать.
>>1960035 На пхп такой залупы больше. Проекты проще, квалификация исполнителей часто ниже, работодатели привыкли экономить на труде, им не нужны хорошие беки, фронты, дизайнеры, поэтому ты будешь этим всем заниматься. Не одновременно же! Сначала одним, потом другим, так что не пизди, что двоя зряплата должна быть как у двух-трех спецов.
>>1960279 это схуя ли? Фронт для меня дрочь дичайшая, не хочу даже туда соваться. Хочу в бэк и пойду в бэк, на твоё мнение мне вообще поебать, выблядос
>>1960086 Ну совсем без матана нет, нужно уметь складывать, вычитать, делить, умножать, иногда ещё в степени возводить и корни извлекать, но это редко. Ещё желательно синус от >>1960066 косинуса отличать, но не обязательно.
Твой пост не похож на правду. Что значит "впервые вижу"? Ты что, препод и тебе есть с чем сравнивать? К тому же ты даже не знаешь сколько времени он потратил на изучение, а пишешь, про "так долго вникали". По моему, ты просто скучный тролль.
К тому же, основы кодинга - что какая команда делает - он как раз изучил. Ему нужны не основы, а учиться разбивать код на функции и тд. А для этого надо больше практиковаться и писать код.
>К тому же, основы кодинга - что какая команда делает - он как раз изучил. Ему нужны не основы, а учиться разбивать код на функции и тд. А для этого надо больше практиковаться и писать код. Лол
>>1960537 Ну на таком уровне знаю, конечно, не совсем же ебанат. Даже производные смогу решить, лол. >>1960562 Буду рад вновь увидеть червя тут, залетай
>>1960572 Тоже не понимаю, почему эта чмоня агрится? Ему же советуют не тратить время зря. Он же даже не сможет пояснить, что каждая строчка тут делает.
>>1960568 >Что значит "впервые вижу"? Ты что, препод и тебе есть с чем сравнивать? Да, есть с чем сравнить. Видел многих вкатунов, и они явно получше соображают.
>К тому же ты даже не знаешь сколько времени он потратил на изучение, а пишешь, про "так долго вникали" Ну вот он как минимум неделю пытается простой скриптик накидать. Причем не воспринимает ни слова, что ему пытаются сказать.
>К тому же, основы кодинга - что какая команда делает - он как раз изучил Он соврешенно не понимает флоу кода, тупо рандомно вызывает встроенные функции и операторы
>Ему нужны не основы, а учиться разбивать код на функции и тд. Ему нужны основы, он даже без функций код не может написать, или написать код одной функции
> 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 почему-то сделал.
> @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 и тд.
Получается нарушение принципа единой ответственности. Контейнер или БД, выбрасывая исключение, определяют, какую страницу ошибки показать, с каким кодом и каким сообщением. Это не их ответственность.
Этот момент в роутере выглядит коряво. Почему-то значения 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-параметры. Ведь никто не гарантирует, что они придут именно в таком порядке, как описано:
> Из-за этого у тебя 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 на основе запрошенного маршрута. По итогу придется либо отказываться от этого, либо будут повторяющиеся методы в разных классах, ну или зависимость
Здравствуй, мудрый Анон! Я >>1941113 → -хуй, которому ты указал на криворукое решение на представление чисел в текстовой форме. Я немножко подтянул теорию, последовал твоим советам и родил это: https://ideone.com/HSjBXD
> Ты имеешь в виду, чтобы сделать отдельный шаблон для пагинатора, а сам пагинатор просто будет возвращать <ul> с необходимыми элементами ?
Можно сделать так: делаем отдельный HTML-шаблон и в него передаем объект Paginator. Шаблон выводит HTML, а за подробностями (какие цифры и ссылки выводить) обращается к Paginator.
Генерация HTML в коде плохая идея, так как такую верстку трудно поддерживать, разбираться в ней, вносить правки.
> Если делать без джойнов, то получится, что сначала выполняется сортировка, а только потом LIMIT X, Y. Данные на N странице одни, а после сортировки другие. Как по-другому сделать (если вообще можно по-другому сделать на стороне бека) - не знаю
Так и должно быть, что данные другие. Представь, что ты смотришь первую страницу. Жмешь на сортировку по баллам и видишь тех, у кого больше всего баллов. Жмешь на сортировку по имени и видишь тех, кто раньше по алфавиту. А в твоей системе непонятно как найти тех, у кого больше всего баллов.
И еще, обычно при смене сортировки пагинация сбрасывается на первую страницу.
> Как думаешь, можно уже пытаться по собесам походить ?
Я не HR. Посмотри требования к вакансиям. Согласись сделать тестовое задание, возможно оно по сложности будет как эта задача или проще.
> Получилось так из-за того, 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.
В общем, тебе надо сделать следующее:
- поменять названия переменных - отформатировать код по правилам - попробовать его укоротить, как я описал выше (не теряя читабельности. Не надо пытаться запихнуть несколько строчек в одну).
> Так и должно быть, что данные другие. Понял. Но как ты смотришь на то, чтобы подзапрос в виде джойна оставить ради оптимизации лимита ? Читал статью (на хабре вроде), что если данных очень много и у нас будет LIMIT 100000, 10 например, то это сильно бьет по производительности. В плане того, что mysql сначала переберет 100000 записей, а только потом выдаст следующие 10
> Это $1 в Симфони называют "атрибутами" и роутер после разбора URL помещает их в $request->attributes. После прошлого ответа еще посидел подумал и в голову похожая идея пришла. В плане того, что раз это параметры маршрутов, то и разбирать их должен непосредственно сам роутер, а не реквест. Значит в правильную сторону мыслил
>>1961293 > $iSpelling >Тоже неудачное название. В общем, лучше всего давать переменным имя, которое максимально будет ее описывать, если это возможно, так? >Должно быть $k = 0 так как дальше $k сравнивается с числам (if ($k>0)), а null сравнивать с числом неправильно. Когда писал это, почему-то боялся, чтобы при $k=0 не получилось фигни типа "шестнадцатьноль". Теперь понял, почему этого НЕ получится. Спасибо. >Код функции small_number_to_text можно упростить, если вместо переменных $iSpelling, $jSpelling и тд добавлять слова в массив. Тогда не нужны будут ветки, где переменным присваивается null. Пробовал так делать. Но при объединении массива через implode (' ',$x) добавлялись лишние пробелы в числах, в которых отсутствовали сотни, десятки или единицы. Я что-то делаю неправильно? >Лучше назвать $result или $spelling. Нет, я все-таки так и не понял принципа названий переменных. :3
Анон, тупой вопрос. Я вроде думал что понимаю что такое API, REST, вся эта блудня с create|update и т.д. Но как обычно практика все пом есстам расставила, лол. У меня есть раздел ( группа роутов ) приложухи (слим 4), в ней роуты на просто отрисовку страниц, пост-запросы от форм, а так же c этих страниц несколько ajax-запросов к серверу. Трабла возникла когда я захотел проверку прав закинуть в мидлвэйр на группу роутов, а роуты у меня внезапно ( ага ) есть те что возвращают шаблоны, а есть те что возвращают ajax. Соответственно мидлвэйры могут быть разные, но я хотел как то по группам группировать. Так вот вопрос - можно ли назвать те маршруты что обрабатывают ajax запросы - API? И нужно ли мне их вынести в отдельный раздел и отдельные классы? А то, условно, у меня в одном классе контроллера находятся как методы что обрабатывают обычные запросы от браузера, так и те что обрабатывают ajax.
Есть ли такая команда, которая позволяет выводить текст с сайта в виде файла txt? У меня есть код, который выводит данные БД в виде JSON, но я не знаю как сделать так, чтобы он выдал мне этот JSON текст в виде txt файла.
Тебе надо вывести текст (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.
это читается как: слово для миллиона = выбрать форму слова для миллионов добавить в массив "слова" "слово для миллиона".
Еще лучше убрать лишнюю переменную и написать сразу:
$words[] = getWordForm($millions);
А если написать
$x = $spelling[$j];
то это не читается.
Представь, что ты открываешь проект в 100 000 строк кода (который ты никогда не прочтешь целиком), и в нем какую-то функцию и в ней какую-то строчку. Ты хочешь сразу понять, что она делает, а не искать выше что это за переменная $j и что в ней хранится. Код с переменными вроде $j нечитабелен. Аналогично с именами функций.
> Но при объединении массива через implode (' ',$x) добавлялись лишние пробелы в числах, в которых отсутствовали сотни, десятки или единицы. Я что-то делаю неправильно?
не добавляй в массив пустые строчки и пробелы не появятся.
То есть, вместо LIMIT 10000, 10 мы используем, например, WHERE id > :lastId LIMIT 10.
У тебя сделать это не получится, так как нам надо сортировать по произвольному полю, а не по заранее выбранному.
У тебя сортировка сейчас, как мне кажется, сделана некорректно. При смене сортировки результаты на странице (например, первой) должны меняться, а у тебя они не меняются.
Здраствуйте аноны в общем я хотел написать на laravel с 0 знаниями форму где динамически добавляются новые строки в таблице по нажатии кнопки. Добавление и удаление я сделал, но получилось крайне хуево, можете дать совет. Как обойтись без смешивания js, html, php
>У тебя сортировка сейчас, как мне кажется, сделана некорректно. Да, я уже исправил. Просто изначально думал, что должны сортироваться только те данные, которые в данный момент юзер видит на конкретной странице.
>>1962255 Можно переложить рендер из жс в пхп, но тогда будут перезагрузки на каждый чих, а на беке придется хранить состояние отрисованных элементов. А от хтмл никак не избавишься, если нужен UI. Чистый бек это какой-нибудь JSON API
Почему в ларавеле по умолчанию в .gitignore не прописаны автогенерируемые вебпаком папки/файлы из public? Может быть в этом есть какой-то здравый смысл? Или просто потому что? >>1962419 Symfony - джава-стайл для крупных проектов Laravel - RAD-фреймворк для хуяк-хуяк и в продакшен. Антипаттерн на антипаттерне, почти что вордпресс.
>>1962454 А компоненты симфони это хуйня такого уровня, что если ты кастомно из них что-то собираешь, то ты скорее сам фремворк общего назначения можешь написать. В практических задачах это не встречается. Так что не надо это постоянно повторять, типа "симфони гибкая".
>>1962165 Спасибо за ответ, и за ранее сделанные ответы на мои вопросы тоже спасибо! >>Там можно сделать глобальную проверку В сущности так я и реализовал.
>>1962457 >ты скорее сам фремворк общего назначения можешь написать О чем и речь, что симфони может выступать как фреймворком (веб скелетон), так и конструктором фреймворков.
>В практических задачах это не встречается Крайне редко в очень специфичных условиях. Например, когда делаем прошивку - веб морду для роутера
Не надо пихать HTML в строковые литералы в JS. Это уродливо. Надо сделать HTML-шаблон внутри тега <template> (HTML5) или <script type="text/x-template">. А из JS брать этот шаблон, менять что нужно и вставлять в документ.
>>1962169 >не добавляй в массив пустые строчки и пробелы не появятся. Подскажи, правильно ли я понимаю алгоритм (буду описывать простым языком, чтобы не обосраться): если (существует число сотен) { $массивПреобразованныхВСловаЧисел[]=$массивСТекстовойФормой[числоСотен]; } ... то же самое, для десятков и сотен, инструкцию else и elseif можно же вообще не писать? А потом склеить все через implode ( ' ',$smallNumberInTextArray)?
Но таким же образом нельзя поступать с массивом выбора формы слов для миллионов, тысяч и десятков, ведь там 0-й элемент массива строго соответствует разряду рублей, 1-й элемент - тысячам, 2-й элемент- миллионам. Я все правильно понял? Спасибо за терпеливые объяснения.
>>1962722 Ну чего ты такой серьезный. Это старый, бородатый прикол, про скорость одиночных кавычек. Да и все равно мы тут не байты вычисляем, а в бутылочное горлышко базы данных упираемся.
Почему у меня не работает UPDATE базы данных? Перепробовал сто вариантов из интернета ничего не работает. Как будто пустота там где строчка с командой UPDATE как так? остальное работает, а UPDATe ни в какую в чём секрет?
>>1963393 $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();
>>1963394 bind делается для ? плейсхолдеров, а ты сразу вхуячил значения в запрос. Плюс там ещё параметр с какими-то форматами нужен вроде. Дальше query каким боком там? Короче, у тебя там косяк на косяке, и это я ещё не шарю в этом mysqli или что это. Читай документацию.
У тебя явно проблема при установке соединения с БД. Так как $link должен быть объектом, а не NULL. Покажи код установки соединения и сдампь, чему равна $link.
>>1963639 Сделай в две строчки. conn = connect query(conn, 'update table set hui=1 where id=1') Должно сработать без вариантов. Потом смотри что отличается.
>>1963665 обновлять плагины? а ты думаешь избежишь от взлома? а хер там было с маслом. один фиг будут ломать школохакеры. и будут внедрять вирусы, рекламы, всякая чепуха. возможно и станет в ряды ботнетов у китайских школяров. а в hugo всё ахуенно, он железобетонен. в markdown пишешь и пушишь в github. в netlify автоматом билдиться. и всё это невъебически защищен от всех криворуких.
>>1963676 Да, говорят, что хакеры ломают только старье с известными уязвимостями, а если все обновлять, обновлять версии вордпресса, обновлять плагины, обновлять версии пиэйчпи, менять пароль все время, все время, то вордпресс будет неузявим! Так говорят в интернете!
>>1963681 В общем тебя порадую. В даркнете есть такие форумы как exploit.in, wwh-club и т.д. Ну так вот я недавно видел в экплоите как можно ломать новую версию вп 5 и выше. Уже давно слиты как ломаются вп сайты 5.7.
>>1963701 Да ладно не поправили. Недавно пробовал поднять в виртуалке вп блог, и попробовать взломать. Всё как есть. Ломаются на ура.
> Если уязвимость так широко известна
В том то и дело что уязвимость не известна большинству. Какой среднестатистический вася будет в onion сайтах сидеть? даже топовые менеджеры толком то и не знают, что существуют такие дыры в этих цмсках. в теплых офисах сидят пьют чай, и ничем не думают. и вдруг внезапно бегают во весь офис вырывая волосы, что их сайт взломали хакеры, что внедрили злоебучий скрипт, который копирует сам себя, распространяя во все датацентры. так ломаются крупные сайты, даже твиттер, фейсбук.
>>1963723 >>1963882 З.Ы. я еще не учил, что такое фреймворк. Я пока только вордпресс изучаю. >>1963864 Я думаю, что начну с ЦМС, потому что фреймворки - СЛОЖНА!
>>1963864 Только рофла ради. Сам это говно даже будучи джуном за км обходил. Я кажется уже и фреймворки перерос, достался настолько большой проект, что фреймворка в нем не видно
>>1963879 Конечно. Только конкуренция на фронте сильная, но это более квалифицированный труд, ну и зп больше намного даже больше чем у обычных пыхеров. CMS поедают людей как раз потому, что устроиться с ними работать вообще с нулевыми знаниями проще простого. Работодатели понимают, что осознанно в этом дерьме копаться мало кто будет, из-за чего выращивают макак с нуля. В итоге люди по пять лет на CMS работают, а по знаниям не тянут даже на нормального trainee. >>1963898 И кто тебе такую дурную идею посоветовал? Сам придумал?
>>1963971 >В итоге люди по пять лет на CMS работают, а по знаниям не тянут даже на нормального trainee. И зарабатывают соответственно. Пикрил самая крупная битриксопараша в городе, берут людей чуть ли не с улицы, лишь бы мог эту коробку шатать
>>1963864 Ну дак речь идет именно тузлов для блогинга, одно цмс пыхой, а другой генератор на golang. В генераторе hugo нужно иметь намного больше багажа знаний. Вот эти: html, js, css, flex, grid, микроразметку, golang в конце-то концов.
В общем hugo - это jamstack. Кто нихуя не понимает что это за махина? Вот https://jamstack.org/generators также есть в этом списке next.js как многие сейчас в нем пишут.
Ну дак то и имелось ввиду, не как макаки. Мало кто правильно имеет логично писать в html, css. Многие пишут без разбора, вермишелят как попало. Хоть бы подкурили бы разных методологий бэм например.
if ($creditBalance < 5000) { $paymentTotal = $creditBalance + $paymentTotal; echo "С меня хватит!\n всего {$paymentTotal}"; break; } и у меня в 11 месяце остается 4к и всё какбэ в чем прикол?
>>1964165 Ну, можно упростить, как там написано и расписать вручную алгоритм. Взять кредит не 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; }
Аноны, какую либу можно заюзать для авторизаци/регистрации и проверки прав? приложуха slim 4, ORM eloquent. Раньше юзал Cartalist/Sentinel она как раз использует улоквент, думаю ее снова заюзать. Но может другие варианты есть?
Трудно сравнивать hugo и wordpress. Hugo это примитивный статический генератор сайтов, то есть ты берешь, правишь какие-то файлы, из этого генерируется набор HTML, который ты выгружаешь на хостинг. В то время как вордпресс это полноценный динамический движок с админкой.
Вот подумай, что удобнее не разбирающемуся в программировании человеку: удобная админка вордпресса с формами или редактировать руками маркдаун-файлы, потом запускать скрипты в консоли? Плюс, маркдаун-синтаксис очень ограниченный (например там нет вставки видео с Ютуба). Плюс, вордпресс можно расширять и добавлять там произвольные динамические страницы. Например, там посетители могут оставлять комментарии или ставить лайки. А в статических сайтах, генерируемых hugo, ничего подобного нет.
Статические сайты и их генераторы известны уже давно, непонятно зачем вы подаете этот hugo как что-то новое. Простой статический генератор сайтов из маркдауна пишется на PHP за один вечер, после чего hugo становится не нужен.
Зачем нужен Go, когда можно писать и статические, и динамические сайты на PHP, я не понимаю. Ну если кому-то хочется помучаться с этим языком, где даже классов нету - вперед и с песней. Не забудьте только Си сначала выучить, так как без него за Го нет смысла браться, вы ничего не поймете.
В общем, ерунда этот jamstack. Тот, кто пришел тут его пиарить, наверно сам слабенький PHP разработчик, боится конкуренции и хочет сбить с толку изучающих PHP.
И грид тоже отстой, так как не поддерживается старыми браузерами. Зачем тратить свои силы, чтобы получить убогий HTML код, работающий только на твоем компьютере, когда можно писать хорошую кроссбраузерную верстку, которая отображается даже в IE. Убогие всегда найдут какую-нибудь отмазку, лишь бы не признавать свои слабые скиллы.
Ты сравнил, статический генератор сайтов на убогом Го (он настолько убог, что в нем нет даже классов) и полноценную CMS на PHP.
Насчет уязвимостей последней версии вордпресс - где пруфы?
Если сделать статический генератор сайтов на PHP (есть готовые, или можно написать самому за вечер) то он точно так же будет защищен от уязвимостей. Только он будет на нормальном, удобном языке программирования.
Хотя на практике людям нужны сайты с админкой, а не редактировать маркдаун на гитхабе.
> Но таким же образом нельзя поступать с массивом выбора формы слов для миллионов, тысяч и десятков, ведь там 0-й элемент массива строго соответствует разряду рублей, 1-й элемент - тысячам, 2-й элемент- миллионам.
Не понял, о каком массиве идет речь и зачем его склеивать. Ты сначала получаешь письменное представление числа (например: "сто пять"), кладешь его в массив слов. Затем получаешь форму слова "миллион", тоже кладешь его в массив слов. Потом кладешь туда представление тысяч, потому форму слова для "тысяч" и тд.
По вротпрессу говорят, что надо ставить последнюю версию вротпресса, плагины обновлять до последней версии, надо чтобы был SSL, https. Настроить htaccess. Все время менять пароль. И ТОГДА ВРОТПРЕСС СТАНЕТ НЕУЯЗВИМЫМ!!!!!!!! Так говорят в интернете.
>>1964907 В фреймворках зачастую единая точка входа в приложение. Соответственно навесить различных ограничителей проще, чем в вп, где этих точек может быть сотни. Остальное зависит от настроек веб сервера.
В роутере сделаны неудачно, на мой взгляд, методы getController() и getAction(). Чтобы они вернули значение, надо сначала вызвать route(), но как об этом догадаться? Получается, один метод при вызове влияет на работу других методов, это называется побочные эффекты и это нехорошо.
Правильнее было бы, если бы был метод, который получает, например, Request или просто $urlPath и возвращает controller, action и attributes.
Та же проблема с пагинацией. Было бы лучше, если бы все методы работали корректно без необходимости вызывать метод run().
> private int $limitStudents = 10; Это можно было сделать private константой.
Лучше было бы, если бы Navbar только хранил информацию о пунктах меню, а преобразование в HTML происходило бы в шаблоне. То есть, HTML-шаблон бы обращался к классу Navbar, получал список пунктов и рендерил их. В твоем решении править верстку неудобно, так как она раскидана кусками по классу.
То же касается NotificationUtil и других мест, где есть HTML в классах. HTML-код лучше формировать в шаблоне.
SVG-код, наверно лучше поместить в файл и подключать через file_get_contents(). Как в твоем коде редактировать иконки? Руками переносить в файл, потом обратно в код?
Я думаю, что JOIN в getAll() не нужен, так как он ни на что не влияет.
> user-scalable=no, Это в общем плохое решение, так как лишает пользователя удобства. Может, у человека шрифт слишком мелкий или наоборот, мало информации на экран влезает. Я на десктопе часто на сайтах меняю масштаб.
У grid нет даже 5-летней поддержки, не говоря о 10-летней. IE не поддерживает, даже 11 версии. Даже Хром поддерживает с 2017 года. Это значит, например, на телефоне 2016 года работать не будет.
grid пока годится для того, чтобы поиграться (на каком-нибудь пет проекте), может быть для интранета, где есть корпоративный стандарт браузера, но этот ужас нельзя выпускать в продакшен.
Хотя, я вижу, все поступают противоположно тому, что я учу и вовсю используют плохо поддерживаемые технологии. Это понятно, качественно сделать сайт мало кто может, лепят как попало. И ладно бы это были вкатуны, так нет вроде опытные разработчики тоже лепят как придется. Я от работы фронтендеров испытываю только разочарование. Хуже них разве что любители внедрить микросервисы на малоизвестном языке и свалить.
Ты не можешь в disqus настроить, как выводятся комментарии, не можешь управлять авторизацией, не можешь полноценно модерировать и раздавать автобаны. А на PHP можно сделать свои красивые комментарии.
Хотя, конечно, если ты работаешь на нищего заказчика, тебе выгоднее подключить дискус и взять с заказчика денег, как будто ты работал, а не 3 строчки на JS вставил. И то, если он тебя попросит верстку комментария поменять, ты уже не сможешь ничего сделать.
Я очень плохо представляю ситуации, где хватит статического сайта. Я уже написал, что обычные люди не хотят редактировать файлы на гитхабе, они хотят в админке нажимать кнопки. Получается, для любой правки сайта надо нанимать программиста, а это дорого и невыгодно. Если заказчик не дурак, он такое не купит.
Или: надо сделать форму записи на какой-нибудь день с пометкой занятых дней. Ты на hugo это не сделаешь, а на динамическом PHP-сайте - легко.
И ты подаешь hugo как что-то новое, хотя статические генераторы сайтов существуют уже много лет, и есть генераторы на PHP. С которыми ты можешь сделать что угодно, поменять что угодно, и тебе не надо тратить ценное время на изучение языка Го. Зачем нужен hugo, если есть генераторы на PHP?
>>1964963 Тогда надо антивирусной утилитой прочесывать код! Я видел какой-то видос, где приводился список эксполитов для пиэйчпи. Потом их пихали на сайт пиэйчпи. А потом прочесывали утилитой антивирусной, и она находила, что вот эту хуйню надо выпилить!
Сосоны, а вы знали, что существует punto switcher, который автоматически меняет раскладку? Типа пишешь дштл и эти буквы автоматически превращаются в link.
>>1965191 Чтобы писать код я переключаю раскладку клавиатуры. Например: echo '<b>Привет мир!</b>'; Потом я могу забыть переключить раскладку, допустим мне потребуется написать слово link, а вместо этого слова я напишу дштл. И вместо того, чтобы мне исправлять это руками punto swither сам мне все поменяет.
>>1965233 Хуево, надеюсь это у тебя просто какой-то тестовый прожект. А вообще, полезно научиться слепой печати, тогда проблема неправильной раскладки уйдет на нет и скорость набора существенно вырастет. Я хз как там щас пунто свитчер работает, но раньше он часто обсирался и включал неправильную раскладку.
>>1965197 >Потом я могу забыть переключить раскладку, допустим мне потребуется написать слово link, а вместо этого слова я напишу дштл Такие проблемы возникают только у уверенных пользователей ПК, что смотрят на клавиатуру при печатании. Если ты из таких, то что ты здесь вообще забыл? И, кстати говоря: >шиндовс
>>1965615 Потому, что я успею нажать пару кнопок быстрее, чем увижу, что текст стал не той раскладки. Можно конечно удалить эти пару символов, переключить раскладку и заново написать как надо.
А можно до конца дописать "дштл" и punto switcher переделает это на link.
>>1965615 То есть при слепой печати тоже можно ошибиться с раскладкой, особенно, если ты очень быстро набираешь текст. Ты быстропальцый Абелардо! И ты успеешь нажать пару кнопок и лишь потом поймешь, что эту пару символов напечатал с не той раскладкой!
Аноны, недавно, велосипедя свою приложуху понял что она кривая и косая. Короче начал читать Зандстру, 5 издание "Объекты, шаблоны и т.п." - реально книга заходит.
>>1965666 пс Собственно я о том говорю - что до некоторых книг видимо нужно дорасти. У меня возникла проблема что мой код плохо структурирован, я понял что мой код криво - и возникло желание сделать лучше,и понимание того как я уже плохо сделал, и почему. На мой взгляд эти ооп - проблемы скрывают современные фреймворки с DI - контейнерами работающие на рефлексии. Когда сам делаешь косо - отлично понимаешь почему косо и неудобно.
При написании кода Punto подводит, так как код состоит не всегда из корректных английских слов и пунто будет рандомно переключать раскладки по мере набора.
По моему опыту, удобно использовать ручное переключение раскладок, например, по левому/правому Ctrl. Если хочешь набрать что-то на английском - жмешь один из Ctrl и набираешь, хочешь набрать на русском - жмешь другой.
Это называется немодальное переключение - тебе не надо помнить, какая текущая раскладка, чтобы переключиться.
В ручном режиме он позволяет немодально переключать раскладки по левому/правому Ctrl, что удобнее встроенного модального переключателя.
Хотя конечно, удобнее всего было бы иметь выделенные клавиши рус/лат, но западные производители не прислушиваются к мнению русскоязычных пользователей. Даже у Эппл используется убогая раскладка (где русские буквы совмещены с символами, где некоторые символы в разных раскладках на разных клавишах, где не клавиш рус/лат), хотя Эппл делает свое железо и мог бы сделать нормальную клавиатуру, где буквы и символы не совмещены. Но не хотят ради нас заморачиваться.
>>1964881 >Не понял, о каком массиве идет речь и зачем его склеивать. Я опирался на свою программу, где для текстового представления трехзначного числа и форм названий разрядов я использовал разные массивы. А потом внимательно перечитал то, что предложил ты и понял, что можно легко и просто избавиться от лишнего массива и вкладывать и число и форму слова в один массив, главное только не обосраться с порядком формирования этого массива. Анон, ты делаешь великое дело: избавляешь от квадратно-гнездового мышления таких мимохуев, как я, тем самым улучшая генофонд планеты :3
ОП, или кто тоже разбирается. подскажите вот в чем: Есть приложение, просто роутер который вызывает обработчики. В обработчике/контроллере я хочу что то сделать, допустим записать лог в файл. Пусть у меня нет сервис локатора, или DI контейнера. Как я реализую подобное: допустим метод класса обрабатывает запрос ... public function anyMethod(){
//создаю фабрику сервисов Логгирования //которая принимает аргументом конкретный сервис ( MonologLoggerService ), который имплементирует общий для всех логгинг-сервисов интерфейс, что бы методы в контроллерах были одни и те же, и я смог легко поменять один сервис логгирования на другой.
$serviceFabric = new ServiceFabric ( new MonologLoggerService );
Если абстрагироваться от контейнеров и сервис локатора - такой подход адекватен? Это фактически мои первые потуги в рамках ООП. Получается в моем варианте фабрика - это не совсем то что должно быть? Фабрика возвращать должна один и тот же экземпляр одного конкретного класса - просто с разными настройками? Или фабрика может возвращать экземпляры разных классов , объединенных общим интерфейсом или абстрактным классом?
>>1965889 п.с. $serviceFabric = new ServiceFabric ( new MonologLoggerService );
в рамках этой строки понятие "инверсия управления" означает ли то что класс ServiceFabric получая в качестве аргумента класс MonologLoggerService - перестает зависить от его реализации? Или "инверсия управления" это что то иное?
>>1965889 > Фабрика возвращать должна Фабрика может возварщать чт оугодно, тут важно то что ты не напрямую создаешь инстансы нужных тебе класов, а обращаешся к фабрике чтобы она построила что-то подходящее под твою задачу. Естественно чтобы был смысл ебаться с фабриками нужно чтобы она возвращала (как ты и написал) экземпляры разных классов , объединенных общим интерфейсом или экземляр одного класса с разными настройками. Оба варианта возможны но в случае с фабрикой намного предпочтительней первый - для расширения нужно просто добавить новый класс. Второй вариант это скорее для DI (один класс в который передаются разные настройки) - фабрика в общем там лишняя. > "инверсия управления" это что то иное Инверсия управления это когда ты напрямую не управляешь порядком выполнения кода, а просто хуяришь отдельные обработчики, а они уже вызываются фрейморком когда нужно.
Аноны, помогите понять порядок решения задачи про калькулятор из гайда. Задачу-то я решил быстро, при помощи регулярок: https://ideone.com/zlq51o Вполне рабочий калькулятор. Но потом вернулся к условию и попробовал решить по ТУ, т.е. через посимвольный разбор строки. Калькулятор-то я написал: https://ideone.com/YqedpG да вот только мой калькулятор не работает, если первым действием идет деление (почему так? В голове крутится, что я проебал какую-то очевидную, мелкую, но важную деталь в процессе построения цикла) и работает только с целыми числами. И как при посимвольном разборе строки ввести поддержку дробных чисел без костылей, лишнего дроча, и самозапутывания, в виде нескольких конвертаций строки в разные типы данных?
Смотрите, такая задачка. Есть список дат, нужно прогнать их через функцию, которая возвращает список вида [item1 => val, item2 => val2], и в конце записать csv вида item,date1val,date2val,date3val... Не могу придумать структуру, чтобы последовательно наращивать эти данные для последующей записи.
>>1965999 Пока я придумал только два варианта: - сохранять по датам, а потом дополнительный цикл, чтобы из этого построить новую подходящую структуру - передавать результат в саму функцию и возвращать обратно с добавлениями, ну или через global Оба хуевы.
>>1958281 (OP) Аноны: 1) Можно ли будет перекатиться из php в frontend если что или опыт php не будет учтен для frontend? 2) Какой из PHP фреймворков легче учить Symfony, Laravel или Yii2? И за сколько? 3) Нужна ли математика или знания алгоритмов для разработки и поддержки highload проектов и участия в проектировании архитектуры проектов? 4) До чего нужно дойти в php и MySQL, чтобы спокойно пойти на джуна?
Если ты решил спроектировать что-то, то ты должен ответить на вопрос: зачем нужен тот или иной класс? Не проще ли без него?
Вот например, зачем ты сделал фабрику логгеров? Что тебе мешает сразу создать логгер через new MonlogLoggerService?
> Если абстрагироваться от контейнеров и сервис локатора - такой подход адекватен? Я не понимаю, зачем ты сделал фабрику.
> Фабрика возвращать должна один и тот же экземпляр одного конкретного класса - просто с разными настройками? > Или фабрика может возвращать экземпляры разных классов , объединенных общим интерфейсом или абстрактным классом? Бывает и так, и так. Фабрику обычно добавляют для решения таких проблем:
- чтобы не копипастить в несколько мест сложный код создания объекта - в библиотеках, чтобы пользователь бибилиотеки мог повлиять на процесс создания объекта, подменив в ней фабрику на свою
Ну и вопрос: чем тебе не подходит DI? То есть, просто передавать логгер в конструктор твоего класса? Зачем ты начал изобретать какие-то странные решения?
> 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 или нет. На первый взгляд, он зависит, так как требует его передачи в конструктор.
Решение с регулярками довольно оригинальное. Но хорошо ли оно находит ошибки в входном выражении? Можно ли добавить в него проверки и гарантировать, что любая ошибка в выражении будет обнаружена?
Мне кажется, что можно, но не нравится некоторая хрупкость кода, который полагается на то, что цифры в одном массиве и операции в другом строго соответствуют друг другу.
Если уж использовать регулярки, не лучше ли использовать preg_match_all с регуляркой такого вида:
число | знак операции | любой другой символ
Она разобьет строку "2 + 2 / error" на массив строк [2, +, 2, / , e, r, ,r ,o ,r]. И уже обходя этот массив, мы можем легко выделить из него числа, операции и ошибочные символы.
Мне такой подход нравится тем, что тут у нас один входной массив "токенов", а не два, которые вроде как связаны, но неизвестно, надежно ли.
> да вот только мой калькулятор не работает, если первым действием идет деление С виду код выглядит верно. Попробуй найти ошибку, выводя значения всех переменных на каждом символе и отслеживая, какие ветки if выполняются.
> И как при посимвольном разборе строки ввести поддержку дробных чисел Я думаю, можно собирать цифры в строку, а когда мы доходим до знака операции, вызывать функцию преобразования строки в число.
>>1966092 Основная проблема в том, что генерируем мы по датам, а выводить потом надо по айтемам. В принципе я уже решил с дополнительным циклом после каждого вызова, но думал может есть какое-то элегентное решение.
>>1958281 (OP) Есть 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
Нихуя не понял, как решить задачу про банкомат из гайда. Жадный алгоритм зделол, а как заставить работать эту хуйню с усложнением условий (выдача минимальным числом купюр 6600)- хуй знает. В подсказке к задаче ебаный матан, а я не люблю математику, где букв больше, чем цифр. Я тупой? Выкатываться из треда?
Что-то не могу найти курсов по Магенте 2. Как будто никто не работает с ней. На курсхантере пусто, ютуб разрозненные видео выдает. Подскажите, кто что знает
>>1966204 > А зачем сделали что php из коробки без шаблонизатора в хтмл лезет? YAGNI + KISS PHP это все-таки бэкенд и шаблонизатор там нужен не всегда (например, если ты только принимаешь данные с формы и выдаешь в ответ какой-нибудь JSON). А если нужен - есть много сторонних решений, используй любое. Зачем разрабам ПХП заниматься шаблонизаторами, если им нужно сам язык развивать и поддерживать.
>>1966063 >>Вот например, зачем ты сделал фабрику логгеров? Что тебе мешает сразу создать логгер через new MonlogLoggerService?
Изначально вообще у был некий общий сервис логгеров, а в нем в конструкторе был захардкоден вызов конкретного допустим MonlogLoggerService. Идея была в том что бы я в общем сервисе логинов мог менять конкретный логгер, а так как в клиентском коде везде вызывается общий сервис - то можно было поменять логер в одном месте. Фактически как в контейнере хранить сервис. Но прочел что не комильфо в конструкторе определять зависимости и родилась идея передавать конкретный сервис в конструктор. Более того - если в ходе выполнения программы мне нужно что бы в одном случае один сервис логгинга вызывался, а в другом другой - то вариант захардокоденного вызова конкретного сервиса не даст это сделать в принципе.
>>Бывает и так, и так. Фабрику обычно добавляют для решения таких проблем: >>Ну и вопрос: чем тебе не подходит DI? Я в первую очередь решал такую для себя проблему - получить возможность быстрой замены конкретной реализации какого то сервиса во всем клиентском коде в приложении. И я специально не пользуюсь DI - контейнерами, или банальным сервис-локатором. Хочу лучше прочувствовать что дает не правильный подход. Мне как то проще сделать криво, столкнуться со всеми минусами кривого решения, и тогда я по настоящему понимаю реальные плюсы правильного подхода.
>>Не видя кода ServiceFabric, нельзя сказать, зависит он от MonologLoggerService или нет. На первый взгляд, он зависит, так как требует его передачи в конструктор. А как же в таком случае должен выглядить полностью не зависимый ServiceFabric?
А как поправить мой пример кода так что бы стало более правильно?
И вот вопрос тогда, вот в DI контейнере я определил сервис, LogService::class. И в клиентском коде я получаю этот объект из контейнера. А после я решил что в контейнере LogService::class должен быть иной логгер, не монолог. Я просто руками в контейнере меняю Монолог на что то другое, и все? Или есть иной вариант.
Сорр если туплю, я Зандстру начал читать , разделы про ООП, пока что все немного в кучу. У него сервис локатор это класс, который через статические методы получает и возвращает какие то объекты - паттерн Регистр примерно так.
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 р за раз (сэкономленных на школьных завтраках). Вопрос, когда он избавится от долга? Во сколько школьнику обошелся айфон?
https://ideone.com/PpCkDJ Пожилой круг написал на костыличах тупа, остался ряд вопросов: нахуя нужны были $toAngle и $fromAngle? Как напечатать злоебучий пробел, если до него нет других символов? На ideone нельзя кодировку менять? Пришлось английский алфавит выводить.
>>1966840 Спасибо огромное и вообще спасибо тебе за этот Гайд, я давно хожу около этой темы и ты сделал просто супер толчок, именно этого мне не хватало, чтобы дальше изучать самому, ещё раз спасибо, уверен что задам ещё много тупых попросив, но зная что есть такие люди - не страшно делать ничего, редкость в нашей стране
>>1966059 1. Можно, но придется изучать новые темы: работу браузера, верстку, жс, жс фреймворки (они работают немного по другим паттернам, нежели бек) 2. Laravel для простого старта. Yii2 устарел. Symfony может показаться переусложненным. За сколько - от тебя зависит. 3. Математика не нужна. Алгоритмы только основы чтобы не делать запросы к базе в цикле и потом удивляться, а че так медленно. Higload больше про оптимизацию узких мест, про инфраструктуру, про хитровыебанные запросы в бд, про кеширование и т.д. 4. Быть в состоянии запилить CRUD приложуху (на подобии задачи про студентов) на одном из современных фреймворков >>1966088 Ларакасты глянь например
анонсы, я немножко в ступоре. подскажите один момент. вот есть класс с 4 протектед методами. и есть паблик метод который является аналогом конструктора (класс используется для рендера форм). и вот такой вопрос: мне сверху приходит айдишник формы от 1 до 5 если что, и в зависимости от него я должен дернуть соответствующий protected метод чтобы он отрендерил нужную форму. как такое провернуть с максимально нормально кодстайлом? а то сейчас на ум приходит только тыкать пять if где внутри будет тупо return $this->renderFormName();
есть база данных с графами "ингридиенты" "блюда" например, одна строка из базы данных: лук укроп картошка мясо = пюре зразы котлеты картошка есть кнопка "поиск" за сколько анон готов сделать поиск по бд?: 1) Вбиваешь "картошка" - выводятся все результаты, где "картошка" хоть слева, хоть справа 2) Вбиваешь в поиск "картошка = " и он искал картошку только в ингридиентах 3) Вбиваешь в поиск "= картошка" и он искал картошку только в продуктах И если находится такое слово, то выводятся пользователю все строки из базы данных в изначальном формате: "лук укроп картошка мясо = пюре зразы котлеты картошка" на биржи не иду, хочу поддержать нашего анона
>>1967801 чи шо совсем долбоеб? Гуглится за 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/ сюда например с пруфом (чеком) или попущен.
всем привет, собираюсь вкатиться в пыху. несть несколько вопросов. буду благодарен, если ответите. 1. Что почитать из русской литературы? Пока склоняюсь к Котерову + параллельно гуглить 2. В книгах сейчас в основном пыха 7-ая, как потом свитчнуться на 8? 3. мне 25 (не поздно вкатываться?) и я манагер, собираюсь учиться по 2-3 часа по вечерам и на выходных по 5-6. это очень хуево?
>>1968598 Начни дрочить как хобби, и выкинь нахуй далеко маня мечты про вкат, про тыщи денег и маня успех. Если ты сейчас по жизни сосешь хуй, то дело в первую очередь в твоей личности и образе мышления и привычках. И поверь - ты так же будешь учить пхп как живешь - через пизду. И работать будешь также, если дотянешь до этого - через пизду и за три копейки. Начни лучше с личных качеств. А прогинг как хобби - это может и не зайти нихуя.
Ставлю жирный плюс под словами этого анона, сразу после универа хотел вкатиться в фронт энд, были манямечты и все такое, думал, что я смогу зарабатывать и съехать на хату, что мне опмогут курсы на котрые я отходил и что я буду просто супер. Но по факту работал в калл центре, потом переводчиком в брачке и потом в говнофирме, начал работать над мировосприятием( это алкашка, наркота, работа с психологом) сразу вспомнил как в детстве ездил на олимпиады и решал задачи и решил не то что вкатиться - а понять ПХП, понять интересно мне или нет и так же как в детстве порадоваться от решения задач. Сейчас четко понимаю, что тут поможет только упорство и ответственность, других путей нет. Но надежны на перекат в эту сферу как работу я даже не строю, все так же варюсь в менеджерской среде, потому что нужно хавать за какие-то бабки и с этим поможет только имеющийся опыт. Так что ты не думай что все так просто, дело даже не в часах, которые ты потратишь, а будет ли тебе это хотеться
В чём может быть дело? На этом же хостинге лежит сайт на Laravel. C ним таких проблем нет. Если отредактировать blade-файл, то изменения подхватываются на лету.
начал учить пхп и решил окончательно перекатиться на линукс. как поднять свой сервер? поставил апач 2 и пхп 8.0.3 запускаю в терминале апач и по пути "/var/www/html/test " есть мой пхп файл, он и обрабатывается. пока на этом остановлюсь и буду так учить пхп. это правильно? (знаю про ламп и готовые сервера, но решил попробовать вот так по-деревенски)
>>1968897 Слушай, я столько это говна в своей голове перекрутил, что мне в пору в тиктоке блядь людей жизни учить я полу серьезно, я даже имею концепты и темы о чем говорить. Я на этой хуйне собаку сожрал. И полностью принял то что твой успех - это ты сам. Ты точка отсчета. А люди тащатся в прогинг как за серебрянной пулей что решит их все проблемы - хуй. Проблемы только сам человек может решить, когда осознает.
>>1968946 Да всего. Открываем справочник, веб из этого нужен только нескольким пунктам в конце, и то они решаются средствами фреймворка, поэтому учатся отдельно.
>>1968990 Тогда поднимай нжинкс, чтобы он при загрузке линя автоматом поднимал сервер. А потом упакуй это в докер и так же, чтобы автоматом поднимало. Только это путь в девопсы, а не бекендеры.
>>1968914 На stackoverflow посоветовали выполнить: php app/console cache:clear --env=prod.
Проблема в том, что в проекте нет ни app/console ни bin/console. Симфония как будто не установлена полностью. Composer install тоже не срабатывает (проблемы с совместимостью пакетов).
>>1968051 500 руб за код и ещё 500 если созвонимся в скайпе и расскажешь, как работает код и немного основных вопросов по пхп, но не дольше часа @Dima_Kedr
>>1969128 О да, коучем быть заебись - втираешь банальщину, еблом торгуешь. Ахуительно. Главное ебло построже делать, что бы окружающие думали что ты тайное знание открыл.
Анон, подскажи по доктрине. Есть джве сущности Tag и Post с отношением one to many. Нужно получить с помощью кверибилдера только те теги, у которых есть хотя бы один пост
>>1970145 > Самый быстрый вариант - снести папку кеша. Скорее всего это var/cache Я бы все-таки не сносил все, а ограничился только кэшем твига, а в идеале еще и забэкапить кэш. Особенно если это продакшн.
>>1970145 Я только сейчас понял, что сайт хостится на виртуалке, а те файлы, что я пытался редактировать вообще не задействованы. Забавно то, что сам хостинг представляет собой VDS (хост Fastpanel, ось Debian), и на нём зачем-то запущен VirtualBox.
Дайте совета. У меня кодерский стаж менее года, прохожу курсы и потихонечку изучаю бэк параллельно с фронтом, изучаю Laravel на ларакасте и еще материалы. Мне нужно сделать сайтец знакомому (Без тролинга, реально помощь нужна), там всё поставлено на OpenCart, вроде всё просто, только вот как ориентироваться в этом непонятно, документаций там нет ваще никакой, просто концепт MVC и всё. Вроде он тоже понятен, но! Как находить методы и переменные? Какой то плагин в редакторе использовать? ctags? Помогите пожалуйста.
>>1970192 >Так нужно сделать с нуля иди доделать/переделать готовое? Уже поставил базу данных и её заполняют, нужно добавить минимальный функционал и изменить шаблоны сайта чтобы нормально выглядели, для этого нужно передать в контроллер запрос с помощью модели, примерное представление как они работают есть, проблема в их определений, нужно файлы перебирать постоянно чтобы найти тот или иной метод и какие параметры он принимает. >Качаешь сайт себе на локальный сервер и открываешь в IDE ДА поставил давно уже, параллельно разбираюсь, не могу понять как методы искать. В Vim вроде есть CTRL+P плагин с ctags. Может еще какие советы есть как разбираться в непонятном коде?
Аноны, можете накидать пример моих действий, есть 3 паблик API с которых нужно получить данные, причём получить их в определённой последовательности, в приоритете 1 API, то есть если 1 API недоступно, вывести данные со 2 API, а если и оно недоступно или таких данных на нём нет, то запросить их с 3 API, на всё про всё секунд 10, дольше думаю юзер ждать не будет
Если я подряд вставлю 3 таких кода каждый на свой URL они будут исполняться по очереди ожидая окончания предыдущего или это всё работает в асинхроне и например с 3 API данные могут прийти быстрее чем с 1?
Надеюсь я понятно объяснил что хочу сделать, если коротко то выводить данные с запасных API если приоритетное не отвечает или тормозит
>>1970697 Чистый курл не нужен, юзай газл, твоя задача замечательно ложится на промисы
>Если я подряд вставлю 3 таких кода каждый на свой URL они будут исполняться по очереди ожидая окончания предыдущего или это всё работает в асинхроне и например с 3 API данные могут прийти быстрее чем с 1?
>>1970728 >В твоём коде выполнится последовательно То есть если 1 API не доступно весь скрипт будет висеть ожидая его ответа? Или у curl_init есть какой-то таймаут ожидания ответа после которого он дропает запрос и идёт дальше по коду?
>>1970780 >Это либа пхпшная Просто хотелось обойтись без костылей, чистой ванилой так скажем 1 файлов скрипта, но вообще у PHP получается только 2 способа загрузить данные с API - это file_get_contents и curl_init получается?
>Да, есть. И он настраивается Надеюсь не на сервере, а то с этим будет проблема
>>1970799 >Просто хотелось обойтись без костылей, чистой ванилой так скажем 1 файлов скрипта Использование библиотек - не костыль. Тем более настолько проверенных временем. К тому же на голом пхп в продакшене далеко не уедешь
>Надеюсь не на сервере, а то с этим будет проблема Почитай пхп доку по курлу - там все параметры описаны, задается это дело в коде
>>1970819 >>1970821 Cпасибо аноны, вроде стало яснее, мне не для чего-то серьёзного, для себя мелкие фитчи на сайт
Пока для меня загадка только в том в какой последовательности я получу ответы если сделаю запрос сразу на несколько API, я так понял что код будет идти последовательно без асинхрона, особенно благодаря CURLOPT_CONNECTTIMEOUT, чтобы читать следующий API, если предыдущий не дал ответ за указанное время, надеюсь всё так
15 лет сидим на Fedora. Лучший дистриб. Я даже домой себе поставил. Чё там осваивать? Ставишь по принципу next-next-next и у тебя просто всё работает. Были бы богатые, на RHEL бы сидели разумеется.
Аноны давно уже вывалился из темы, в PHP данные на страницу так и выводятся с помощью echo? Например я хочу сделать мелкое API которое просто пройдя через 7 кругов ада выдавало бы мне ссылку, я в него вывожу результат простым echo?
>>1971553 > от echo так и не ушли Куда уходить и зачем? Вместо echo сделать huecho? И что это даст? Если тебе нужна гибкость и удобство - обмазывайся любым шаблонизатором на выбор. В Си printf уже 50 лет используют и ничего.
>>1971554 Я только ЗА, просто что не возьми везде всякие пидоры-нигеры обязательно всё переделывают потому что НЕ МОДНО НЕ ТОЛЕРАНТНО, УСТАРЕЛО И НЕ ЕБЁТСЯ В ЖОПУ, НАДО ПЕРЕДЕЛОТЬ
>>1971559 1. У тебя же в ошибке все написано. В $_SESSION не получается найти ключ user_authed. Ты его сам туда пишешь или это какое-то стандартное значение?
2. Зачем ты этот ключ проверяешь двумя условиями, если можно воспользоваться одним с else?
>>1971570 >1. У тебя же в ошибке все написано. В $_SESSION не получается найти ключ user_authed. Ты его сам туда пишешь или это какое-то стандартное значение? На php 5 все работало, мне кажется тут неверный синтаксис для нового php >2. Зачем ты этот ключ проверяешь двумя условиями, если можно воспользоваться одним с else? Потому что я ничего не понимаю. Мне просто интересно почему это не работает сейчас
Как нормально писать на Laravel? В документации и на ларакастах всяких логика в контроллерах и фасады. Не пойму, это просто примеры для краткости, или действительно все так пишут? У меня почему-то такие вещи вызывают отвращение. Пока что делаю так: для каждой модели создаю сервис, который эту модель декорирует. Как логика, так и любые запросы к БД оборачиваются в сервис. В итоге контроллер непосредственно общается только с сервисом. Во избежание копипасты был создан базовый сервис с наиболее используемыми методами: create, find, delete, update, all и т.д. А чтобы не копипастить вообще любой понадобившийся метод из квери билдера в сервис, я просто сделал публичным метод, который возвращает билдер модели. Нормально делаю, или ненормально? Если ненормально, то как надо?
>>1971621 > Мне просто интересно почему это не работает сейчас Нет, ты просто хочешь чтобы из тебя наводящими вопросами выудили всю нужную информацию и написали тебе рабочий код.
Так это не работает, нужно и самому немного покумекать.
> мне кажется тут неверный синтаксис для нового php Раз кажется - берешь ошибку и копируешь ее в гугол. Вот что говорит документация по поводу функции которую ты пытаешься использовать https://www.php.net/manual/ru/function.mysql-query.php Нужно переделать код и использовать вместо неё другую
>>1971682 >смесь сервиса и репозитория Задумывалось это. Хотя, я так задумался, что для некоторых моделей у меня логика отсутствует, и эти "сервисы" действительно являются репозиториями. Причем вообще бесполезными, так как абстракции никакой по сути и нету. Надо будет удалить их. Только что вместо них использовать? Фасады богомерзкие? Внедрять инстанс модели в зависимость? Ох как же сложно с этим вашим актив рекорд. Вот в доктрине на тебе entity, на тебе entity manager, на тебе репозиторий. Бери и пользуйся. А тут уже какой день пытаюсь со всем этим говном совладать
>>1971121 Точно не арч, дебиан потому-что это системы для системных администраторов которым нужна система с минимальным набором стартовых программ. Даже не как новичку, но и профи бы посоветовал Fedora, Ubuntu (Мне не нравится) и это впринципе всё что требуется. Все системы на GNU+Linux похожи и разницы в них мало, в основном различия в сообществах, а так всё тоже самое. (Я бы посоветовал Fedora)
>>1972034 Я тоже нуб, думаю если опыта вообще нет, то во фриланс сразу нельзя, нужно портфолио стартовое сделать, щас этим занят. Пет проекты итд. Тоже интересно узнать как начинать.
>>1972034 Фриланс на пыхе это чаще всего задачи вроде "у нас тут есть куча говнокода, нужно добавить туда еще говнокода". Сомнительный способ научиться грамотно погромировать. Тем более если ты без опыта.
>>1972075 Пилишь проектики для себя. Например, в шапке есть задача. Сделал, показал анону, твой код обосрали, переделал. Потом берешься за проект посложнее. И так далее.
>>1972286 В той же ситуации. Я уже дальше пошел, решил оставить банкомат на потом. Тут https://php.ru/forum/threads/zadachki-po-php.46947/ кто-то что-то пытался объяснить, но на фразе >Поскольку мы номиналы банкнот храним в массиве a, естественно, что F(0) = 0, F(a[1]) = F(a[2]) =...= F(a[k]) = 1. ЯННП. Мне не естественно, например. Анончики, поясните кто-нибудь за логику решения банкомата.
Олсо, ононче, оцени мой вариант решения задачи на считалочку. Как всегда, стараюсь максимально комментировать, чтобы было легче читать мой говнокод:
>>1972205 >>1972196 всё, решил: благо легаси-классов в данном случае немного, пришлось прописать их composer.json/dump-autoload и полностью отказаться от старого загрузчика
Аноны, я достаточно хорошо понимаю как работают потоки в node.js. А точнее речь о файлах которые загружает браузер в форме с типом multipart/form-data. А с пхп что то я запутался. Хотя на пхп много больше написал. В пхп все автоматом из коробки делается, файл попадает в $_FILES , а сам сохраняется где то в temp. А как мне непосредственно а пхп получить доступ к потоку запроса. Я допустим каждые 1000 байт входящего файла хочу подергать?
>>1972286 >>1972296 Я посмотрел по ссылке, вроде несложно там обьяснено. Строим табличку, сколько нужно купюр для каждой суммы от 0 до нужной, если есть вариант с меньшим числом большими купюрами, то заменяем. Ну и потом раскручиваем обратно, отнимая наибольшие от суммы. https://ideone.com/cO6Pdf
В жадном алгоритме мы идем от старших купюр к младшим. Для каждой купюры вычисляем кол-во, вычисляем остаток не выданной суммы и идем дальше.
В общем случае этот алгоритм не работает. Что можно придумать? Можно начать с подхода "в лоб":
- перебирать все возможные комбинации купюр (то есть брать кол-во каждой купюры от 0 до максим. возможного) - для каждой комбинации считать сумму - делать так, пока не получим нужную сумму.
Это довольно неэффективный алгоритм (требуется перебрать очень много комбинаций), но он гарантированно найдет решение.
Дальше алгоритм можно оптимизировать. Например, если сумма равна 1200, и у нас есть купюра номиналом 500, то имеет смысл брать только 0, 1 или 2 экземпляра этой купюры, а 3 и больше можно не проверять.
Или еще оптимизация: если у нас сумма равна 1200, мы решили брать 1 купюру по 500 и перебираем кол-во купюр номиналом 200, то можно начать с числа (1200 - 1 x 500) / 200 = 3 и затем проверять остальные варианты (2, 1 и 0 купюр номиналом 200).
---
Что касается алгоритма в интернете, он работает с неограниченным кол-вом купюр. Если вы хотите его использовать, его надо модифицировать для работы с ограниченным кол-вом купюр, и проверить, возможно ли это вообще.
Аноны, дайте совет - как правильно проверять загружаемые пользователем на сервер файлы? Мне нужно только картинки загружать. Сначала я проверяю exif_imagetype(), после is_uploaded_file(). Это нормальный вариант?
Есть еще функция mime_content_type(), она в принципе равнозначна exif_imagetype()? exif_imagetype - вроде читает сигнатуру из первых байт файла, определяя какая это картинка, и картинка ли вообще. По идее mime тип в этих первых байтах и хранится.
А как мне ограничить размер файла? Что бы если мне не залили гигабайтное кино, например. В ноде просто считаешь поток request,часть где multipart-form-data, и если он слишком большой - перестаешь из него читать. В пхп только через настройки php.ini? Я так понимаю что если файл попал в $_FILES -то он уже залит, значит ограничения где то выше должны быть. Я в .htaccess установил директивы
Привет, аноны. Недавно вкатился. Пилю сайт с базами данными, чисто потренироваться. Может кому встречалась какая-нибудь супер классная и полезная статья, про то, как отсанитарить инпут правильно? Английский свободный. Какие-то статьи читал по теме, но они касались этой темы довольно поверхностно. Пока пользуюсь пикрилейтед, но подозреваю это не самый лучший способ.
>>1972942 Лол, какая-то дедовская хуйня. Для базы есть prepared statements, которые решают проблемы с эскейпингом и иньекциями, дальше можно заэнкодить через htmlspecialchars, чтобы избежать всяких xss.
Аноны, что нужно использовать в пхп для работы с изображениями? Мне нужно приводить все загружаемые картинки к одному размеру. Так я понял по документации для этого используются три варианта пакетов: GD , Gmagick , ImageMagick. Какое из них нужно выбрать? Или еще варианты есть?
Нужно вместо случайного перебора делать последовательный перебор всех возможных комбинаций купюр.
То есть, берем все возможные количества первой купюры, для каждого количества перебираем все возможные кол-ва второй купюры, для каждой пары первых двух количеств перебираем все возможные кол-ва третей купюры и тд.
>>1973009 >ImageMagick Я вот это использовал, очень удобно, можно использовать готовый пример. Использовал это для генерации картинок для мобильной версии сайта, чтобы ускорить загрузку сайта для телефонов, там же все равно маленький экран
>>1972942 Чем что-то запрещать в логине, проще что-то разрешать. Сделать регулярку на лат.буквы и цифры. А для пароля сделать ввод чего угодно. Ты ведь все равно прогонишь это через htmlspecialchars, PDO, плюс пароль наверняка захэшируешь с солью. Никакая гадость не пролезет.
Анон, помоги! Не могу понять, в чем я ошибаюсь. Решаю задачу про написание текста по кругу. Вроде все сделал верно, но при написании теряется первый символ введенной строки: https://ideone.com/t381vz А еще мой круг кажется мне кривоватым, как бык поссал. А еще поясни, пожалуйста, в чем сакральный смысл переменной $height и почему она у нас равна именно 30?
>>1958281 (OP) Анончики помогите. С меня - нихуя. На диске лежит файл image.png, размер 20000 на 20000. Вывести картинку как баннер размером 200 на 100 пикселей.
>>1973774 Думаю, при наполнении данными и применении кеширования эта разница нивелируется. Но если просто нужна причина не учить сложную симфони -- то да, можно опираться и на этот тест.
>>1974408 Легаси евривеа. Даже 7 то не везде используется (тут вот недавно был анон с говнокодом, который работал только в 5), а 8 и подавно. Смотри мануалы по 7, а про 8 разве что для общего развития можешь почитать.
>>1958281 (OP) Хочу устроиться на работу PHP джуном, но до этого я готовился на frontend (js). Можете подсказать короткий путь, как подготовиться к собесу за 18 дней? Я учился по книжке ОПа, но дошел до ООП, да и все забыл уже по PHP. Но что такое циклы, условия и ООП в целом я знаю. Сейчас уже нет времени решать задачи про банкомат и расчет маршрута как же я с ними марался. Может подскажете видео курсы или книгу? Так же нужно выбрать фреймворк, который легче и быстрее учится. И если можно по нему тоже курс какой-нибудь. Вот требования вакансии: Знание PHP, ООП, MVC Опыт написания SQL запросов Опыт использования хотя бы одного из популярных PHP фреймворков (Symfony, Laravel, Yii2)
>>1974498 > 18 дней > Сейчас уже нет времени решать задачи
Ну тебе тогда нужна книга PHP for dummies in 18 days
> Вот требования вакансии: Сомневаюсь что ты за 18 дней наберешься таких знаний. Скорее всего у тебя просто каша будет в голове. Мне кажется лучше пока забить на фреймворки и сконцентрироваться на самом PHP + MYSQL. Сами фреймворки просто базово изучить, а на собеседовании так и сказать что ты опыта работы с ними не имел, но очень хочешь и готов быстро во все вникнуть в боевых условиях.
>>1974498 >Хочу устроиться на работу PHP джуном, но до этого я готовился на frontend (js). Можете подсказать короткий путь, как подготовиться к собесу за 18 дней? Ждем через 18 дней пост у мобильщиков/датасаентистов с аналогичным содержанием
>>1974553 >>1974565 Господа, в моей мухосрани мало вакансий (на джуна только вот эта). Я согласен, очень глупо метаться с фронта в бэк, но там и зп белая, а горький опыт показывает, что зп в черную это не всегда хорошо. Короче компания вроде приличная, судя по отзывам знакомого знакомых. Плюс там знания js тоже желателен. Нуууу, не знаю короче, я так долго вкатывался, уже не знаю что делать
>>1974498 Ну ты охуевший это не плохая характеристика на самом деле, такие люди и добиваются успеха. Я вот почти год как вкатываюсь, все задачки из ОП-поста сделал. Перед этим 4 года вышки писал на всем на чем только можно, помимо кодинга там хорошо выучил сети и базы данных, и всё равно не считаю что я уже готов к работе. Я ж еще столько всего не пробовал: API, реактивные фреймворки, докер, тесты ( всегда впадлу было их делать ) и прочее. Да и вообще себе много чего не представляю о реальных веб-приложениях.
>>1974634 >Я вот почти год как вкатываюсь, все задачки из ОП-поста сделал. Перед этим 4 года вышки писал на всем на чем только можно, помимо кодинга там хорошо выучил сети и базы данных, и всё равно не считаю что я уже готов к работе
Как перестать орать? Вкратце о ситуации: в самом аналоговнетном фреймворке пхп-мира есть строка, обнуляющая дробную часть float при отправке запросов в БД.
Как же я охуел блять, это просто пиздец. $eloquent->insert (3.14); // 3 is precise enough!
>>1974746 Пора высунуть голову из песка и сходить по собесам. Сейчас даже на джунские ваки требуют знаний архитуктуры и хуйлоада, не говоря уже про всякие докеры
Я сделал кнопку, которая уменьшает на 1 значение одной из переменных в массиве $_POST: <input type="submit" name="warmday" value="<?= ($_POST['warmday'] - 1) ?>"> Проблема в том, что при нажатии этой кнопки все остальные значения удаляются и остаётся только эта изменённая переменная. Как сделать так, чтобы остальные значения сохранялись?
>>1975142 Нужно просто вывести значения массивов? Или тут какая-то более глубокая задача? Ну вот тебе первая строка: echo $word1[3]. ' ' .$word2[0]. ' ' .$word3[3]; Остальные строки по этому принципу
>>1975112 >все остальные значения удаляются и остаётся только эта изменённая переменная Это происходит, т.к. ты при новом запросе посылаешь новый пост, в котором есть только твоя переменная. Вообще $_POST - это те данные, которые пришли из текущего запроса. Она не хранит данные из прошлых запросов. Хочешь хранить данные дольше одного запроса - используй другие хранилища, например куки, файл или бд
>>1974795 Недавно, кстати, попробовал Lumen вместо лары. И чет не понял, а нахуя нужна лара? По ощущениям, люмен - то, чем должна быть лара, просто без нескучных обоев.
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 = [ [слово, другое, третье], // варианты для первого слова [слово, еще, слово], // варианты второго слова ... ];
И затем проходишь по нему циклом и на каждом шаге выбираешь один из вариантов и выводишь его или сохраняешь куда-нибудь, чтобы вывести позже.
>>1975272 Вообще наоборот, зачем нужен люмен когда есть лара? В этом люмене постоянно что-то работает не так как в ларе, пакеты часто несовместимы. То, что могло занять 5 минут, может затянуться на пару часов, вот и вопрос, в чем ты выигрываешь выбирая более легкий фреймворк? Я думаю точно не в производительности, шо то шо это ну такое, и явно не в dx. Тогда в чем?
>>1975689 Вардамп поставь на каждой строчке в пхп и консол лог на каждой строчке в жс - поймешь, где данные теряются. Пора учиться самостоятельно дебажить
Посоветуйте пожалуйста, книги для backend разработчика. В частности интересуют сети, базы данных итд. В целом, фундаментальные основы. Без привязки к языку программирования.
>>1975846 Не всё изучал, только начал. Почему книги спрашивал, потому-что. Возможно придётся свалить, в родную мухосрань, где нет интернета. И нужно учебный материал приготовить. Ну это, при худшем раскладе
Кто-нибудь пользуется Heroku для развёртки сайтов? Хочу туда закинуть своё тестовое на ларавеле, но столкнулся с проблемой конфигов. У хероку, насколько я понял, два варианта: либо автодеплой с гитхаба, либо ручной коммит через хероку CLI (ещё есть докер, но я в нём ни ухом, ни рылом). Но конфиги-то коммитить нежелательно, .env у гита должен быть в игноре. Плюс, мне нужно И показать код на гитхабе, И развернуть готовое приложение на хероке, И иметь возможность работать с проектом локально.
Пока что придумал такой велосипед: - Делаю коммит изменений, пушу на гитхаб. - Меняю в .env параметры доступа к БД с локальных на хероковые, убираю из гитигнора этот конфиг. - Коммичу, пушу на хероку. - Откатываюсь на предыдущий коммит, грохаю из истории коммитов всё, что выше.
И так при каждом коммите. Это норм вообще? Или я делаю нечто странное?
И ещё проблема: нет картинок. Они у меня в /public/storage, который слинкован командой php artisan storage:link. Но, во-первых, линковка работает только пока я подключён (если перелогиниться и проверить - в /public каталога /storage не будет), а во-вторых, даже после линковки, все картинки 404. Я было на права подумал, но нет, у соседних css файлов права ровно такие же. Как починить?
Аноны, подскажите, приложение на slim4. Возникла трабла с 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);
тоже это варнинг отловить не могу. Откуда он сука лезет.
>>1975847 Скачиваешь OpenServer (он говно и с него придется слезать в будущем, но для начала более чем пойдет), любой текстовый редактор и вперед и с песней.
>>1975953 п.с. чето не пойму а с какого хера этот вэрнинг вообще сыпется? По идее если файл слишком большой - то ошибка эта будет в $_FILES, разве нет?
Проверь, что именно отдает сервер в ответ на запрос. Для этого ты можешь открыть средства разработчика в браузере (F12 или Ctrl + Shift + I) на вкладке Network перед отправкой запроса. И посмотреть, что приходит с сервера и с какими заголовками.
Ты, конечно, все делаешь неправильно. Для облачных платформ обычно параметры передают через переменные окружения, которые можно задать где-нибудь в админке. Ну или, как вариант, можно иметь отдельный .env вне репозитория и как-то попробовать его загрузить на Heroku в обход гита.
По-видимому, варнинг выдается до того, как запустится твое приложение и потому перехватить ты его не можешь.
Ты можешь сделать такие вещи:
- отключить 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 для преобразования массива в строку вместо цикла.
>>1976176 Как доказать, свой знания в линуксе? Если, с программированием понятно, можно ссылку на github предоставить. То с линуксом, приходит на ум, только принести ноут, с установленным, и настроенным линуксом... Я правильно, понимаю?
>>1976227 > Как доказать, свой знания в линуксе А их будут проверять? Скорее всего зададут вопросы какие-нибудь. Или ты думаешь тебе скажут "ВОТ ТЕБЕ КОНСОЛЬ - УДИВИ НАС ЗА 5 МИНУТ"?
>>1975473 Вот я как раз о том же, на простом коде без цикла я задание выполнил, но вот с перебором массивов мозг вырубается, спасибо за подсказку большое, буду копать дальше, уже что-то получается)
У тебя ответы и время прохождения теста привязаны к пользователю. Но это неправильно. Что, если пользователь попытается несколько раз пройти один и тот же тест? Как ты поймешь, какой ответ к какому прохождению относится?
Правильнее сделать сущность "попытка сдачи теста" или "сессия" и привязывать ответы и время прохождения к ней.
Не хватает комментариев к полям БД. Например, непонятно, что значит поле done в тесте и в answers.
В questions поле type логично было бы сделать типом enum, а не string.
/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}/ - один конкретный тест.
Также, этот контроллер очень толстый. Функцию поиска/отбора тестов можно было бы поместить в модель или в сервис. То, есть там мог бы быть просто вызов:
$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) {
Расчет пагинации можно было бы вынести в какую-нибудь утилиту (а может, уже есть что-то готовое). Чтобы можно было написать что-нибудь вроде
Так как завтра алгоритм подсчета суммы баллов может как-то поменяться, и придется лазать по коду и искать все места, где он был реализован.
> 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. В твоем коде вообще нет проверки, что такой юзер существует, а ведь в куке может прийти любое число.
> 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
> public function changeOrderOfQuestionNumbers(Request $request) Тут не видно никакой авторизации и проверки, что пользователь имеет право редактировать тест.
Что касается тестов, хорошо, что они есть. Но они проверяют в основном базовые вещи: то, что определенная страница открывается. Хорошо бы еще проверять более тщательно особенности работы той или иной страницы, например:
- что при создании теста не только возвращается 200, но и появляется новый тест - что при добавлении вопроса в тесте появляется этот вопрос - что правильный ответ засчитывается как правильный, а неправильный как неправильный - что в решенном тесте правильно проставляется сумма баллов - что при создании теста правильно определяется макс. кол-во баллов - что счетчик прошедших тест увеличивается после прохождения - что тест можно найти по названию - что тест можно найти по тегу - ...
В общем, что надо доработать:
- сделать везде безопасную и надежную авторизацию - получше изучить предоставляемые Laravel возможности и использовать их - научиться не писать бизнес-логику стеной в контроллере, а писать его в моделях и сервисах. Это не значит, что контроллеры должны быть пустыми, просто надо научиться понимать, что куда относится. - более тщательно покрыть тестами
Аноны, как называется шаблон/паттерн когда ты в допустим модель , которая уже с БД работает передаешь данные из $post не как массив, а данные из массива в специальный объект засовываешь, и этот объект уже в модель отправляешь. На меня снизошло откровение, и я до этого сом дошел.
>>1977032 Ты говоришь про DTO (data transfer object). Вообще эта история довольно широкая и неоднозначная. Все зависит от используемого стека, иногда DTO - это зло.
В первом посте есть задача про список студентов. Она хороша тем, что к ней идет большое пояснение, что и как лучше делать, чтобы не наступить на грабли.
С чего сразу DTO ? Если мы туда пихаем данные из формы, то это сразу DTO что ли? Может у чела обычный VO (Value Object) и модель просто агрегирует этой структурой
>>1977561 Ну примерный случай - это очень маленькие приложения, либо приложения с большим количеством маленьких сабмодулей, в таких случаях прибегают к использованию доменных объектов в обход посредников, если архитектура вцелом такое позволяет конечно, например не используется active record.
>>1977613 >сразу DTO >обычный VO (Value Object) Тебе нужно внимательнее почитать про эти паттерны, няш.
>>1977901 Чего сложного в Симфони относительно Ларавеля? В Ларавеле чтобы что-то написать нормально надо изучить как вся его долбанутая магия работает.
>>1977962 >В Ларавеле чтобы что-то написать нормально надо изучить как вся его долбанутая магия работает.
А о какой собсна магии речь идет? Я постоянно слышу про магию в ларавеле, я знаю что там есть свои приколы с Eloquent и магическими геттерами и сетерами, всё настолько тут запущено что даже плагина нормального нет который бы парсил это говно в автодополнение. А кроме ормки что еще то?
>>1977962 >Чего сложного в Симфони относительно Ларавеля? На симфони довольно сложно писать плохой код. На ларавеле же можно наговнякать всё что угодно вообще не задумываясь, и это будет работать. >В Ларавеле чтобы что-то написать нормально надо изучить как вся его долбанутая магия работает. Это чтобы нормально написать. Вот только нормально на ларавеле никто не пишет, не для этого он создан. >>1977963 >всё настолько тут запущено что даже плагина нормального нет который бы парсил это говно в автодополнение Есть платный плагин от Аделя Файзрахманова
>>1978028 >На симфони довольно сложно писать плохой код. На ларавеле же можно наговнякать всё что угодно вообще не задумываясь, и это будет работать.
На Симфони тоже можно говнякать как хочется, ну лазай в контроллере сырыми запросами с инъекциями, кто тебе помешает. И данные принимай как json_decode() от raw body.
Что можно написать новичку на PHP?
Аноним26/03/21 Птн 17:00:34№1978201532
Я вообще из полезного и легкого ничего не писал. Хочу попробовать написать что-то классное. В интернете не нашел идей
>>1978201 Чтобы написать что-то классное нужен опыт, погружение в предметную область и знание хотелок юзеров. Всего этого нет у новичка, поэтому бери и пиши что-то простое и известное борду/галерею/файлопомойку
Где именно в энтерпрайзе используется пхп? Используется ли? Я слышал, что симфони - это примерно то же самое, что джавовский спринг. Составляет ли симфони в таком случае реальную конкуренцию джаве? И еще, пхп ругают за всё, за что только можно, порой пхпшников за программистов не считают, но почему в таком случае есть банки, чьи сайты написаны на битриксе?! И это не единичные случаи. Уж битрикс-то ругают вообще просто 99 человек из 100. Но ведь банки - это как раз и есть самый что ни на есть энтерпрайз! Выходит, битрикс не так плох, как все говорят? Или плох? Банки ведь не дураки, и не стали бы использовать что-то плохое и дырявое для своих сайтов.
>>1979585 > пхп ругают за всё, за что только можно Любой популярный ЯП ругают
> но почему в таком случае есть банки, чьи сайты написаны на битриксе Если это по сути сайт-визитка, его можно и на вордпрессе сделать. Весь финансовый функционал в банках уж точно не на ПХП крутится.
>>1979626 Ругают любой, но одно дело, ругать популярную джаву или сишарп, которые являются столпами рпомышленной разработки, другое дело - выслушивать такие же упреки в адрес пхп. Отсуда у меня и возникает вопрос, есть ли место в промышленной разработке для пхп.
>Я слышал, что симфони - это примерно то же самое, что джавовский спринг. Я такое тоже слышал. Может кто-то расскажет, зачем тогда нужна симфони? Просто чтобы в два раза меньше разработчикам платить, чем на спринге?
>>1958281 (OP) Аноны, какой сложности алгоритмы вам приходилось использовать? Как хорошо нужно знать алгоритмы? Я просто помню когда решал задачу про банкомат в ОП мануале чуть не офигел (не помню сколько недель я потратил на ее решение). А это задачи для новичков, что дальше будет я боюсь представить. Ну и с матаном аналогично?
Сап двач! Планирую вкатываться в бэк на пыхе. Но для начала, хочу освойть фронт стек. Какому фреймворку уделить внимание? Vuejs? Или также нужен react?
>>1980159 Нужно основать профсоюз пыхарей и бороться с этой хуйней. Если взлетит, то язык наконец-то умрет, так как пропадет его последнее преимущество
Вопрос к опытным разработчикам, которые пишут тесты на Laravel. Какую БД используете для тестов? MySQLi и гоняете тесты в памяти? Или же создаете отдельную тестовую БД и там тестируете?
>>1980252 И в каком месте он сложнее стал по сравнению с каким-то 5.6? По моему всё легче и легче: тайпхинты, всяческий синтаксический сахар и прочие вкусности.
>>1980391 Возможно они таким образом держат у себя стек недорогих стажеров-разнорабочих, которых выпиннывают через месяц и нанимают новых. 15к в ДС это пиздец вообще, наверное на проезд только хватит.
>>1979699 >ругать популярную джаву или сишарп А пхп непопулярный?
>есть ли место в промышленной разработке для пхп Открой вакансии, да посмотри, где пхп используют инб4: там, где не захотели переплачивать сишарп/джава-пидорам
>>1980405 Тоже так думаю, бизнес по-русски... И какой вариант тогда, как вкатиться в пых? Может напрямую компаниям писать? Сорян, за глупый вопрос. В отчаянии немного...
>>1980419 >как вкатиться в пых? Как и в любой другой макако-стек: выучить платину вопросов на собесы, сделать спиздить пет, нарисовать опыта в резюме, апплаиться на удаленку на вакансии мидла
>>1980376 >>1980391 >Опыт работы с 1С-Битрикс / Wordpress / Laravel / Symfony. >Это говно-вакансия? Хмм, ну даже не знаю.... >>1980405 >15к в ДС это пиздец вообще, наверное на проезд только хватит. Неделю назад на dou висела эта же вакансия на удаленку, описание один в один. Для интереса только что нашел в архиве - пишет 350-600$. Джуны из украинских деревень стоят дороже, лол?
Сап двач. Уже полтора года работаю на дно работе, стек жиквери вордпресс. Пошел туда по финансовым причинам, но у меня сильная тревога от этой работы. После работы прихожу, и с настроеним "Фух, ну можно и отдохнуть" начинаю пилить что-то на ларавеле и вью. Может прозвучит самоуверенно, но я знаю кодить, и знаю как вникнуть во что-то относительно непростое за пару дней(наверное у меня такое ощущение просто на фоне тех, кто со мной работает, и ничего не понимает в принципе), и начать что-то делать. Проблема в том, что у меня 0 релевантного опыта. Полтора года назад я себе накинул год опыта ларавела в выдуманной студии, но на собесах сразу понял что это всё хуйня, все понимают кто я есть на самом деле буквально за пару минут. И дело даже не в этом, я сам понял что в случае с опытом никакие углы не срезать, это реально просто нужно иметь, и это мне нужно. Я даже свой текущий опыт не могу назвать коммерческим, потому что мой код никто никогда не проверял, никто не говорил как можно сделать по-другому. У меня уже просто была мысль никому не врать, сказать как есть и надеяться что кто-то в меня поверит. Я даже не знаю как себя охарактеризовать, наверное я джун, с потенциалом в мидла спустя месяца 3-4 в нормальной фирме. Ну и проблема еще в технологиях, вроде имею опыт со многим, но на каких-то вообще минимальных уровнях. Редис? ну как kv хранилище использовал, всё, больше юзкейсов не было. Эластиксерч? Ну как-то настраивал индексацию с заумными фильтрами по доке, ну и всё на этом, больше не трогал никогда. В последнее время вообще очень много фронтом занимался, хоть там меня не ограничивают в стеке особо, понял как относительно правильно писать на вью, попробовал даже новые хуки, очень понравилось. Короче вроде уже и проработал, и денег заработал, и даже апнул софтскиллы некоторые, но сейчас как будто снова вкат как в первый раз будет. Еще постоянная тревога, что я не стою тех денег, которые мне платят. Мне даже как-то неловко штуку просить, хотя понимаю что это обычная зарплата и всем ок.
>>1981069 >Полтора года назад я себе накинул год опыта ларавела в выдуманной студии, но на собесах сразу понял что это всё хуйня, все понимают кто я есть на самом деле буквально за пару минут Ну так нужен хоть какой-то опыт работы с ларой. Молодец, что пет на ней пишешь.
>Я даже свой текущий опыт не могу назвать коммерческим, потому что мой код никто никогда не проверял, никто не говорил как можно сделать по-другому. Коммерческий код - который крутится на продакшене и приносит прибыль. Это может быть и вылизанный на код ревью и залитый по фтп код.
>У меня уже просто была мысль никому не врать, сказать как есть и надеяться что кто-то в меня поверит С текущими реалиями рынка маловероятно. Вкатунов толпы. Апай скилы, пили пет на ларе, штурмуй собесы
Аноны, кто как вкатился? Прокомментируйте мой роадмап. 1. Дрочу по верстку по хтмлакадемии - интерактивный курс за 600р на месяц + пиздженные курсы (м.б. барбик сверстаю). 2. Пижжу курсы Кудлая по пхп, смотрю их, дрочу книгу Скляра по пхп. 3. Наворчиваю Кантора по жсу. 4. Решаю задачки ОПа вплоть до списка студентов. 5. Пижжу курсы Кудлая по ларе и MySql, ларакасты, пишу борду/магазин/блог/рсс-читалку 6. Хожу по собесам, принимаю струи мочи на лицо 7. Вкатываюсь 8. Работаю год, дописываю пет из пункта 5, монетизирую, вывожу на IPO, становлюсь миллиардером Думаю все займет месяцев 8-9 фултайм учебы. Что скажете, что язабыл? Надо ли вью.жс задрачивать для первой работы? На чем чаще джуны срезаются? Что по советуете?
>>1981226 ну проблема в том, тчо ты задаешь эти вопросы аа не делаешь, я сам вот вкатываюсь, но блять тебе отвечаю, чем трачу свое время, так что пищи код молча и работай
>>1979883 > Я просто помню когда решал задачу про банкомат в ОП мануале чуть не офигел Я чет совсем обмяк от нее, даже желание пропало что-то делать (жадным алгоритмом сделал почти сразу, а вот дальше...)
объясните, пожалуйста, зачем нужна перезагрузка страниц (формы) после отправки товара в корзину?
есть корзина, все в одно, где и товар и финалка заказа можно нажать на плюс в товаре и добавить вторую копию, js покажет новые данный, но вот форму уже выслать не получаеться, пока не сделать релоад страницы.
почему так? и если ли варианты как это переделать?
сама страница корзини не обрабатывает заказ, это делает другой файл на бекенде, но корзина обрабатывает товар, чтобы правильно показать конфигурацию, допустим когда собираешь себе комп
>>1981422 > зачем нужна перезагрузка страниц Сейчас есть возможность вообще сделать весь твой сервис без единой перезагрузки (SPA), например, посмотри как работает ВК.
В твоем случае скорее всего не стали заморачиваться с аяксом и сделали по старинке. Перезагрузка страницы при отправке формы это стандартное поведение.
> если ли варианты как это переделать? Скорее всего да, но не видя как у тебя там реализовано - сказать трудно.
Если кратко, ты вместо дефолтного экшена формы делаешь этот экшен аяксом. Через JS сериализуется форма, отправляется запрос и принимается ответ. Потом уже исходя из ответа ты совершаешь какие-то действия, показываешь уведомление что все ок, либо ошибку. На бэкенде соответственно должен быть обработчик, который будет возвращать респонс, например в JSON формате.
товар летит с сесия[корзина] на странице корзины все товары загружаються, но только более скожно. ибо есть разные товары и конфигурации товаров. но, суть в том что з сесия[корзина] прилетает имя, и уже на странице корзины по этому имени все подружаеться с базы и собираеться в один товар. ну и дале готовые товары летат в джейсон.
дальше стандартная форма пхп на "куда доставить и что написать".
и все операции на показ товаров производит вю, но задача вю только в том чтобы правильно показать товац, цену и походные. сам вю может только аяксом выслать в сесия[корзина] еще один такой товар (или отнять) и все. и при этом отнят товар можна без перезагрузки, почему так? и все рабатет.
дальше обычная кнопка в форме высылает товар на бекенд, который уже и проводит все проверки и все что нужно для заказа.
ну вот и вроде сама корзина ничего не делает, а перезагрузка страницы очень напрягает. а как сделать я хз. опыта не хватает чтобы понять в чем суть.
>>1981502 > странице корзины по этому имени все подружаеться с базы Чего? Т.е. ты выборку не по ID делаешь, а по названию товара?
> при этом отнят товар можна без перезагрузки Видимо, потому что функционал удаления товара из корзины без перезагрузки сделать гораздо проще чем добавление. Кинул аяксом запрос на удаление и удалил строку с товаром. А вот чтобы добавить - это уже сложнее. Нужно кинуть запрос, обработать ответ, сформировать код для вывода и собственно вывести его, плюс, навесить обработчики действий для новой строки с товаром.
Короче, смотри куда ведет форма добавления товара и по аналогии с удалением сделай добавления. Т.к. у тебя там вью, я хз как правильно это сделать, к сожалению с вью не работал почти.
>>1981483 Похуй-не похуй. Разрабу нужна практика, чтобы на собесе было о чем поговорить. Спросят так: Сыч, а как бы ты сделал хуйню_нейм? А ты её уже делал и рассказываешь.
>>1981523 > Сыч, а как бы ты сделал хуйню_нейм? А ты её уже делал и рассказываешь. В идеале ты должен рассказать несколько способов как можно сделать хуйню_нейм и пояснить достоинства и недостатки каждого способа. Тогда к тебе точно вопросов не будет.
>>1975462 >1) сделать по принципу работы счетчика за электричество. Как он работает? Изначально все цифры на нем равны 0, например 0000. Затем увеличивается последняя цифра, когда она доходит до 9, она сбрасывается в 0 и увеличивается предыдущая (получается 0010). И так далее, до комбинации вроде 9999. Ты можешь точно так же увеличивать число купюр.Сначала увеличивать самую младшую, потом сбросить ее в ноль и увеличить следующую, итд. Только разница в том, что максимальное число купюр будет не 9, а какое-то другое число, и для каждой купюры свое. То есть, начать с комбинации 0 0 0 0 и идти до максимально возможной.
Вот кто-нибудь вообще внятно может объяснить как это сделать и в чем тут прикол? Увеличил последнюю, занулил, дальше следующую, также зануляется, в итоге приходим к числу 1 0 0 0, и что дальше с этим делать? Как-то не доходит до меня уже который день, вот в моем случае решением является комбинация 0 3 0 3, как мне ее получить если решать "счетчиком"?
>>1981514 да, по названию, как-то так работает вся система, но там специфика такая.
я немного посидел, и получилось так, что все работает с добавлением товара, тоооолько, форма принимает токен вначале создания файла. а когда добавляешь новый новар, то токен сесии уже другой получаеться, что логично.
я попытался после аякс поста сделать запрос на доп станицу по новый токен сесии, ну и подставить сразу новый токен в форму. и все, валидация на заказ прошла успешно по стороне бекенда.
только льзя ли так? вроде все просто? но каженться, что это очень дырявая система получаеться, или нет?
Немножко оффтоп, но спрошу тут. Появилась задача написать ТЗ для некоего сервиса, где будут регаться пользователи с разными ролями и совершать различные действия. Я пока пишу все текстом, но возможно есть какой-то инструментарий для визуального проектирования? Типа тут у нас вот такие сущности, тут другие, это все вот так то связано. Как вообще принято проектировать и описывать сложные системы? Я сам ни разу не занимался таким, что-то даже непонятно с какого бока подойти. Текстом то вроде получается описать все, но целостной картины как все должно работать из текста не возникает. Либо, может я тупой такой.
Аноны, начал для себя путь изучения этого вашего пхп, прошел книгу опа до регулярок и решил установить себе на комп апачи и пхп, смотрю сейчас мануалы и как начал понимать как эти ваши серверы работают, такого свинячего удовольствия не испытывал уже с детства, дай бог здоровья каждому анону в этом треде за подсказки и поддержку, всех обнял
Мы начинаем с комбинации 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. После этого мы перебираем такие комбинации:
Тут мы переходим к комбинации 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. Хотя у нее и немало плюсов, например, богаче синтаксис, быстрее скорость работы. Недаром в Андроиде много кода написано на яве.
>>1982404 >в PHP легко вернуть из функции 4 значения разных типов через массив: [$a, $b, $c, $d]= some_func() Часто такое на проде видел? Выглядит как попытка заменить объект массивом К слову в го возврат нескольких значений - та еще залупа
>>1982418 Лол, ну ты бы хоть ошибку показал, а не эту хуйню. Ты нахуй апач как службу то поставил? Не еби мозг поставь openserver, laragon или denwer какой-нибудь. А в идеале вообще лучше в виртуалке это все делать, чтобы свою систему не засирать.
Можно попробовать поискать подробности в журнале (он находится где-то в настройки ->администрирование -> журнал событий).
Скорее всего, не хватает какой-то библиотеки, которая нужна Апачу для работы. Например, Microsoft VC Runtime. Там, откуда ты скачал Апач, может быть точное название библиотеки.
Проверить, что какой-то DLL не хватает можно с помощью программы вроде Dependency Walker, загрузив в нее exe-файл Апача и посмотрев, что она покажет.
Также, если ты редактировал конфиг Апача, возможно, ты сделал в нем какую-то ошибку и из-за нее Апач не стартует. Можно проверить, правильный ли синтаксис в конфиге, с помощью комадной строки, команда выглядит так:
httpd.exe -t
(если Апач не прописан в PATH, тебе может понадобиться указать полный путь к httpd)
>>1982423 >В Го как раз сделано удобно, на уровне языка Это неудобно, когда тебе нужен 1 из этих параметров, а другие нужно куда-то деть. Получается простыня кода, либо куча _, что снижает читабельность
>>1982418 >ставить апач на винду Ты не туда воюешь. Большинство серверов - линух. Соотв либо бери линь, либо линь в виртуалке, либо как посоветовали xamp/openserver
>>1982450 Удвою этого господина, добавлю что есть еще вариант с Docker. По ценности навыка - будет наверное лучшим вариантом. Почти любой относительно серьезный бэкендер сегодня должен уметь в докер.
>>1982523 В 2к21 по сути стандарт - отдельный фронт-фрэймворк. Шаблонизаторы в более менее серьезных проектах используют обычно максимум для почтовых рассылок и всякой админской мелочевки. А вцелом, есди надо быстро и на коленке - тот что во фрэймворке есть и используют, разница не существенная.
>>1982392 В Laravel можно заполнять нужными данными во время теста и тестировать. Можно сделать также, чтобы после каждого тестирования база очищалась. Тестирование в памяти кажется как будто бы удобнее, но наверно лучше и правда на нормальной БД проводить тесты, так как это ближе к реальным процессам.
>>1982559 >В 2к21 по сути стандарт - отдельный фронт-фрэймворк. Я читал, что 95% сайтов - это шаблоны на пиэйчпи CMS-ках или на крайний случай на пиэйчпи фреймворках. А весьма маленький процент - это веб-приложения с отдельным фронт-фреймворком.
>>1982568 Абсолютно прав. 95% либо сделано на коленке, либо легаси. Поэтому я и написал: >в более менее серьезных проектах А если пилится что то сложнее, чем портал для парикмахерской ромашка с тремя кнопками - врядли ктото всерьез будет использовать шаблонизаторы. Есть еще приложения с сервер-сайд рендерингом, но там опять же используются js-фрэймворки обычно.
>>1982570 Они оба решают одинаковые задачи, для которых нужны, не более. Это больше вопрос привычки и привязки к фрэймворку, а не популярности.
Фронтенд-фреймворк это серьезное увеличение объема работы, надо делать не одно приложение, а по сути два. Это нужно только в каких-то особых случаях (сильно интерактивный сайт, работа в оффлайн-режиме).
Плюс обычно SPA тормозные и глючные, долго грузятся, особенно если их делает средний фронтендщик, а не супер-профессионал из яндекса. Плохо работают в старых браузерах. Зачем делать такой сайт, если можно сделать нормально?
Потому, если у тебя типичный сайт фирмы по продаже гвоздей оптом, лучше использовать традиционный подход и формировать страницы на сервере. Не думаю, что SPA сегодня это "стандарт". Разве что там, где разработчики плохо разбираются в разработке и не думают своей головой.
>>1982647 Непонимаю к чему ты эту простыню написал. Просто открываешь браузер и любой портал, более-меннее крупной компании, там js-фрэймворк. Про гвозди оптом я писал. Если потолок писать такое - ну ок наверное, выбор каждого. Стандартом, как мне кажется все же лучше считать best-practices, а не сайты для ашота за 5к. И с чего бы вдруг js-фрэймворк == спа я вообще не понял, у тебя траблы с матчастью.
>>1982660 >Просто открываешь браузер и любой портал, более-менее крупной компании Зависит больше не от крупноты компании, а от того, что им надо от сайта. Если компании нужен просто сайт компании в виде блога, то там и вордпресса хватит.
А если им нужен личный кабинет для большого количества пользователей с кучей всякого разного функционала. То тогда, да, там будет фреймворк.
>>1982661 Зависит от статуса я бы сказал. А статус почти всегда имеет прямую финансовую зависимость. Бизнес уже давно прекрасно ориентируется в интеренете и хочет как минимум не хуже, чем у конкурентов. И если бизнес устраивает вордпресс - либо это вышеупомянутые ромашки, которые платят копейки и работают с васян-студиями, либо конторе повезло наткнутся на лоха. Но я за 4 года лохов не встречал чот.
>>1982700 Не приходилось ни разу пилить ничего, сложнее верстки шаблонов документов для печати или формочки письма. Для фронта есть фронтендеры, если контора не веники вяжет.
> И с чего бы вдруг js-фрэймворк == спа я вообще не понял, у тебя траблы с матчастью.
Это что-то новое.
Если это не SPA, тогда зачем вообще нужен рендеринг на клиенте? Это никому не нужное усложнение на ровном месте. Какая выгода при загрузке страницы грузить тяжелый многомегабайтный JS-код (спасибо вебпаку) и ждать, пока он будет делать какие-то аякс-запросы? Если можно просто отдать HTML со всеми данными, который рендерится с помощью Twig? Это и грузится быстрее, и поисковым машинам больше нравится.
Зачем ориентироваться на то, кто как делает и какие-то мифические best-practices, неизвестно кем написанные? Среди разработчиков, особенно фронтендщиков, куча неучей, вкатышей, просто глупцов. Даже именитые разработчики могут защищать глупую идею просто потому, что они ее сами придумали. Давай объективно искать плюсы и минусы, а не ссылаться на то, что кто-то где-то так делает.
>>1982769 Ну если банальный реакт с сервер-рендерингом для тебя что то новое, я вообще хз в какой дыре ты инфу черпаешь. Про многомегабайтный код - вообще пушка, чекай свой storage, там и реакт и все его друзья давно загружены.
Ориентироваться я буду на то, за что платят хорошо. А хорошо платить люди готовы за чистый бэкенд и нормально распределенный код, а не за фуллстак макакенов, которые всех, не согласных со старперскими фантазиями считают неучами и советуют клепать бложики из 2000х.
>>1982647 > SPA тормозные и глючные, долго грузятся Вот пример новостного сайта на реакте https://meduza.io/ он летает и грузиться первый раз моментально. А теперь открой свое говно на каком-нибудь битриксе или жумле
Я вам уже писал пару месяцев назад с вопросом, сколько гривен возьмете за мои хотелки, но потом идею оставил. Решил опять вернуться к вопросу. Набросал что-то вроде тз, что мне нужно, напишите плиз сколько шекелей возьмете за это, примерные сроки и контакты для связи.
Я бы хотел, чтобы это было в виде каких-то модулей на веб-сайте. Ну типа загружаешь туда файлик еxcel или csv, нажимаешь кнопку, и комплект документов генерируется, либо отправляется рассылка по номерам из примера 2.
Ну вот как раз для медузы, тебе не кажется, что у них все переусложнено? Я когда-то видел там в исходниках следы реакта, не знаю, что сейчас.
Это же просто новостной сайт, который отдает почти статические странички (изредка обновляющиеся). Зачем тут вообще фронтенд-фреймворки? Просто с сервера отдай список статей, либо страницу статьи и все. А они зачем-то наворотили там навороченный фронтенд. Я не вижу, какие плюсы дает тут сложный фронтенд и считаю, что сайт переусложнен на ровном месте.
Не нравится перезагрузка страницы? Есть pjax - очень простое решение (перехватывается клик по ссылке, шлется запрос и HTML на странице заменяется HTML на полученный от сервера). pjax вообще не требует никаких доработок, его можно почти на любой сайт добавить без изменений в коде.
Я помню еще, как-то со смартфона зашел и удивился, как много трафика (несколько мегабайт при начальной загрузке) ест такой простой сайт.
Ну и SPA, по моему опыту, долго грузятся. Сбербанк - там есть заставка и надо ждать. Киви - тоже торможение заметно.
Не надо ссылаться, что кто-то где-то использует реакт. Это ничего не значит. Давай объективно рассуждать, какие есть плюсы и минусы от такого решения.
Если есть люди, которые готовы на ровном месте усложнить проект, не получая никаких преимуществ, утяжеляя сайт и платить x2 за разработку - тут я ничего поделать не могу.
Хотя подозреваю, эти люди просто введены в заблуждение ловкими фронтендщиками, которые верстать сайт для IE не способны, а навешать лапши на уши умеют.
Я не спорю, что SPA хорошо подходит для приложений, которые должны поддерживать офлайн-режим, или которые в высокой степени интерактивны (всякие редакторы). Но тащить эту технологию на каждый сайт просто потому что на Хабре много статей про реакт - глупо.
> вообще пушка, чекай свой storage, там и реакт и все его друзья давно загружены.
Вообще, localstorage презназначен для хранения данных, а не использования как кеш. Это уже само по себе неправильно и негативно говорит о том, кто так делает. Далее, кеш этот принесет мало пользы, так как код постоянно релизится, а значит, его надо загружать с сервера заново.
>>1982850 >которые верстать сайт для IE не способны Я другой анон. А реакт библиотека - это типа новый жиквери? Такая библиотека для кроссбраузерности и библиотека чтобы она сама под капотом считала виртуальный ДОМ - как оптимальное отрендерить настоящий ДОМ.
>>1982832 Я тут вмешаюсь в ваш диалог. Значится это мой звездный час. Потому что вы же все богатые 300к наносеки. И у вас компы ахуенные с интернетом быстрым.
А я нищук с юсб модемом и некропекой. Значится медуза у меня за джве секунды загрузилась, судя по вкладке Network. Ну, по мне, это достаточно быстрый результат. Там картинка почему-то долго не показывалась.
Далее я нашел топ 50 сайтов на вордпрессе, на первый сайт перешел. Тоже примерно столько же грузится, пару секунд. Тоже не сразу все отобразилось.
>>1982850 > верстать сайт для IE Благо, на дворе не 2010 год и с кроссбраузерностью нужно не так сильно заморачиваться, благодаря стандартам и спецификациям. Да и движок то по сути остался лишь один (ну ладно, два). Короче если у тебя не какой-то йоба проект с миллионами хитов каждый день и у тебя не pixelperfect верстка, то никаких серьезных проблем с кроссбраузерностью у тебя не будет.
> тащить эту технологию на каждый сайт просто потому что на Хабре много статей про реакт - глупо Согласен, шутка про домашнюю страничку с миллиардом файлов зависимостей уже давно перестала быть шуткой.
Реакт это не jQuery. Это библиотека для рендеринга шаблонов на клиенте с поддержкой data binding ("реактивность").
То есть, у тебя в JS коде будет шаблон, ты его рендеришь, передавая в него данные. Если данные изменились, то ты снова вызываешь рендеринг и данные на странице обновляются.
>>1982843 А если нужно дополнительно пилить апишку для агрегатора, мобильного приложения и прочей хуеты, тогда как? На мой взгляд все просто и лаконично этот бек можно использовать и в других местах, а фронт что в шаблонах верстай, что компоненты для реакта разницы особой нет, остаётся только роутинг прикрутить и ещё пару мелочей. Плюс на бек можно взять более легковесный фреймворк и не париться о роутах и вьюхах, тут больше не усложнение, а перенос части кода и логики на клиентскую часть. А Сбербанк и прочие банки это совершенно другая история, там есть помимо рюшек-менюшек много логики и всякой специфичной хуйни для безопасности, можно даже понаблюдать как оно работает в консоли и на вкладке network.
А вот и нет. Сейчас куча людей ходит со старыми телефонами. У многих уже стекло разбито, но они не меняют телефон. И в этих телефонах есть встроенные браузеры, которые никто никогда не обновит.
А современные фронтендщики умудряются верстать так, что во встроенных браузерах несколько летней давности сайт не работает. Так-то.
Это надо постараться, чтобы сломать сайт в Хроме нескольколетней давности. Я когда-то в IE6 скругленные инпуты делал, вот там пришлось заморачиваться. А эти неучи под хром сверстать не способны.
>>1982874 Это надо быть совсем уже долбоебами чтобы при наличии полифилов и бабелей что-то не работало в старом хроме. Что-то из CSS криво, вполне возможно, но вот все остальное должно прекрасно работать даже на ие 11
>>1982874 >Я когда-то в IE6 скругленные инпуты делал, вот там пришлось заморачиваться. А эти неучи под хром сверстать не способны. Не думаю, что это то, чем стоит гордиться.
По моим ощущениям, API для сторонних сервисов и API для сайта не одинаковые и лучше сразу делать два разных API. Ибо на сайте тебе нужны одни поля и свойства, а сторонним партнерам совсем другие.
Для мобильного приложения - да, API будут похожи, если оно похоже на сайт (но зачем оно тогда нужно? хотя делают же. Наверно, чтобы можно было спамить нотификациями и получать геолокацию. Ради этого тратится куча труда).
Это только для сайтов уровня туду-листа можно обойтись одним общим API.
> Плюс на бек можно взять более легковесный фреймворк и не париться о роутах и вьюхах,
В классической схеме тебе нужно вывести на странице данные A, B, C . В SPA тебе нужно отдать через API эти же A, B и C. и хорошо еще, если одним запросом, а не несколькими (это будет медленней). По моему, затраты тут примерно одинаковые.
Конечно, если у тебя какой-то тормозной шаблонизатор, может быть разница, но тот же Twig компилирует шаблоны в PHP код и работает быстро. И мощному серверному процессору наверно проще отрендерить страницу, чем дохлому сяомишному ARM (если конечно заказчик не сэкономил на хостинге).
По моему, скорость отдачи ответа будет примерно одинаковая. Только в одном случае ты отдаешь готовую страницу, а в другом - всего лишь ответ на аякс запрос, к которому надо прибавить время загрузки JS бандла, и может быть время отправки других запросов. Есть конечно варианты встраивать JSON прямо в страницу, но тут возникает вопрос, почему бы не встраивать сразу HTML-код.
> остаётся только роутинг прикрутить и ещё пару мелочей
Да нифига не пару мелочей. Надо сделать, чтобы кнопка назад работала как хочет заказчик, надо разбивать JS на бандлы, надо заморачиваться с SSR, подставлять ранее введенный емейл в формы, обрабатывать авторизацию и так далее. Тут именно что гора работы возникает на ровном месте.
Кстати, по поводу производительности. Я как-то букинг открывал со смартфона, он чуть ли не минуту грузился и все тормозило. Может, конечно тут еще виновато медленное соединение, но мне кажется, сайт на HTML и с минимумом JS работал бы куда быстрее на дохлом телефонном процессоре.
>>1982874 > Я когда-то в IE6 скругленные инпуты делал, вот там пришлось заморачиваться Без border-radius заморачиваться приходилось во всех браузерах. Инпуты еще ничего, а вот попапы это да.
А для телефонов один хуй показывается адаптивный вариант верстки, более упрощенный. Те же флексы работают даже в бородатых андроидах.
>>1982887 Ну как: раньше еблись с кроссбраузерностью, теперь ебутся с адаптивом. С одной стороны стало легче (то что делается за три секунды при помощи флексов и гридов раньше приходилось городить костылями и кучей оберток, иногда даже при помощи js), с другой стороны появились новые проблемы в виде мобил и экранов с высоким ppi.
>>1982892 >Есть конечно варианты встраивать JSON прямо в страницу, но тут возникает вопрос, почему бы не встраивать сразу HTML-код.
Вставлю свои пять копеек, в последнее время так сложилось что 90% времени пилил на вью а не на пхп. Реакт или вью(чуть в меньшей степени) это прежде всего тулинг. Разбиение на микрокомпоненты(даже на кнопки и инпуты) дает чувство как бы так сказать cohesion(?). Те же CSS-in-js пакеты(не фанат), или цсс модули. Каждая магическая строка превращается в определенную сущность, без которой твоя сборка не соберется. Это добавляет строгости не на уровне согласованности, а на уровне конфигурации. Если ты делаешь проект один, то ты можешь вспомнить при рефакторинге удалить из фронта какой-то класс и т.д. Но на потоке это 100% не выйдет. Со временем всё начнет разбухать. Не зря говорят что тот же CSS unmaintainable в обычном виде. В том же вью, обычно принято писать цсс под шаблоном и логикой компонента. Если ты не используешь компонент в проекте, то ты одновременно не используешь и его логику, и его стили. А потом у тебя получается ситуация, что часть написана на пхп, а часть на вью. Ты начинаешь задумываться, копировать весь компонент на пхп, или просто вставить жсон и использовать уже готовое. Тебе начинает нравится вся эта строгость, ты можешь крутить свой проект как хочешь, и тебе ничего не сделают, ведь ты в другом городе. Абсолютно согласен, что клиент на жсе добавляет хороший такой оверхед при разработке.
По поводу медузы, у них вообще своя история и свой путь. Всё сделано на реакте, потому что так тупо удобнее. Не знаю что у них там за редактор статей, свой какой-то написали, но как я понял там можно буквально для каждого параграфа задавать разные стили и отступы, это всё передается в виде жсона, который потом хавает реакт или флаттер и превращает в компоненты, для мобильного приложения такая же история. Основной аргумент главного по ит из медузы был в том что они так сделали, чтобы в случае чего не обновлять каждый раз приложение, это ведь не веб всё таки. Я с этим согласен, когда у тебя есть какой-то блочный редактор, в котором есть различные компоненты так сказать кастомные, то это всё дело банально удобнее делать на каком-то клиентском фреймворке, потому что часто компонент это не только разметка, а еще и стили и поведение. Как я уже писал выше, отсутствие вот этой связности(? русский язык сложно) приводит к беспорядку спустя время
>>1982952 >редактор статей, свой какой-то написали, но как я понял там можно буквально для каждого параграфа задавать разные стили и отступы Я другой анон. И мне кажется, что реакт может быть удобен тем, что если писателей у медузы много, то можно каждому из них на комп загрузить SPA-редактор на реакте. Они там напишут статью, красиво все отступы и прочую красоту расставят. И отправят все на публикацию.
>>1982640 проверил DLL все в здании, все ровно, да и в целом не хочу тратить время на копание, если это все решается гораздо проще, но спасибо за поодержку)
Объясните, пожалуйста, что мне делать? Я изучаю вордпресс. И решил углубиться в РНР. И я читал в шапке РНР-треда, что надо уметь работать с сервером Apache и с операционной системой GNU/linux.
Далее я натянул верстку на вордпресс. И пришло время закинуть мою тренировочное говно на сервер. Я завел на таймвеб новый акк. Там дают 10 бесплатных дней поиграться с хостингом.
И короче, я нихуя не понял, а где там Apache и GNU/linux? Там в таймвеб просто интерфейс предоставлен, что вот сюда файлы загружай.
Я нихуя не понял, а че куда там и где требуется применять познания в Apache и GNU/linux?
>>1983062 В общем случае подключиться по ssh к консоли сервера и делать там свои дела. Можно через sftp менеджер файлы закинуть по старинке, либо через гит (хаб/лаб/си/хуяй)
>>1982869 Ну, я читал про все эти стэйты и просы, что данные изменились, реакт считает виртуальный ДОМ, а потом оптимальным образом рендерит настоящий ДОМ.
Просто я имел ввиду, что реакт - это новый жиквери. Что это модная библиотека которую теперь будут везде пихать.
Начал пилить приложение на симфони, офк нужен был вебпак. Установил Symfony Encore, сразу вопрос: что за stimulus и нахуй он мне нужен вообще? Какие-то контроллеры, они издеваются? Это кто-то юзает вообще?
Сап, анон. Делал тестовое задание для одной конторы, отправил вовремя, по итогу просто молча отказали, позже аргументировав тем, что все сделано через жопу. Если есть свободное время и желание - можешь посмотреть и дать совет, что не так? git: https://tinyurl _ com/2y7xnv3t test: https://tinyurl _ com/axw27xpa
Вопрос по Ларавелу 8. Я пытаюсь словить ModelNotFoundException, который выдаёт Model::findOrFail. Исключение выдаётся, но игнорируется обработчиком и потом превращается в другое исключение. Почему?
>>1984735 Сам ты еблан. Эти ссылки могут содержать что угодно, они не просто так в спам-листе, блять. Конечно нормальным людям на линуксе похуй на всякие вирусы, но тем не менее. Еще и заставляешь уважаемых господ копировать мышкой это дерьмо, вставлять в строку и заменять символы. Нахуя тебе это вообще? Боишься что твой никнейм будет в поисковиках индексироваться? Да на здоровье.
https://github.com/rscugh/ - Неуравновешенный человек, сидит на сайтах для анонимных анимешников-педофилов, называет незнакомых людей ебланами. Да и код такой себе пишет.
Есть вопрос с возвратом html вместо json, error пишет Ошибка AJAX: parsererror | SyntaxError: Unexpected end of JSON input. Если изменить dataType на html то в консоль выводит дату как пустой объект. Собственно что я делаю не так?
Аноны, вчера почитал про работу с файлами и загорелся сделать себе для своего сайта костыль в 1 файл скрипта, который просто будет встроен в страницу например с товаром и будет записывать в текстовый файл с новой строки какие товары пользователи сегодня смотрели, а затем на специальной странице выводить эти товары типа как "сегодня смотрели", и у меня встал вопрос, сильно ли это плохо использовать для этого текстовый файл? Подключать майскьэль не хочется, но есть уже встроенный лайтскьэль, я немного встрял с логикой скрипта, подскажите правильное движение
Пользователь заходит в товар, срабатывает скрипт который открывает файл для записи, помещает каждую новую строчку в отдельную переменную массива и в итоге я имею массив товаров которые вообще сегодня смотрели, затем я ищу в этом массиве тот товар который пользователь открыл сейчас, и если он там уже есть, я его удаляю и добавляю в начало массива, а если его там не было, то просто добавляю в начало массива и потом начинаю запись всего массива обратно в текстовый файл помещая каждый товар с новой строки, но обрезаю количество например до 100, чтобы в итоге этот файлик не весил миллион гигабайт, ну а потом на специальной странице просто фаршу обратно этот файлик в массив и вывожу на странице списком, правильная логика действий?
Смущает что если страницу откроют одновременно 2 пользователя или больше, то актуальная версия файлика будет только та которая после прокрутки скрипта будет записана последней, то есть просмотренный товар 1 пользователем будет просто затёрт, ведь они были загружены одновременно, я же правильно понимаю логику? И насколько вообще быстро исполняется такой скрипт с чтением файла, парсингом в массив, поиск наличия текущего товара, добавление его в массив, запись обратно в файл построчно, например в 100 строк, или для этих целей лучше ебаться с лайтскьэль?
Или вообще записывать всё это не в текстовый файл, а в json файл где каждый товар будет в виде ассоциативного массива и просто парсить этот json файл, искать в нём текущий посещённый товар, если найден удалять, если нету до добавлять и обратно всё это сохранять в json файл? А на странице вывода просмотренных сегодня товаров просто парсить этот файл и выводить через цикл на странице, я в правильнмо направлении?
Соответственно, PHP выводит этот BOM, а после вывода чего-либо нельзя отправлять заголовки, о чем тебе и написано в ошибке.
Проверить, есть ли BOM в начале, можно, открыв PHP-файл с помощью hex-редактора вроде HxD или с помощью онлайн-hex-редактора (работает в браузере, до чего дошел прогресс): https://hexed.it/
Советую проверить, заодно узнаешь, как твой файл устроен и из каких байтов состоит.
Чтобы убрать BOM, пересохрани файл в кодировке utf-8 без BOM.
Что касается вопроса "какой вариант быстрее": надо тестировать. Сделай несколько функций (для каждого способа сохранения) и замерь, за сколько времени в них обработается, допустим 100 000 товаров.
Я могу предложить еще один вариант для сравнения: использовать redis. Redis хранит данные в памяти, не сохраняя их на диск, и поддерживает работу со списками (добавление, обрезание). За счет того, что все происходит в памяти, производительность должна быть очень хорошей.
Также, если тебе не хочется использовать redis, есть еще один вариант: shared memory. Это кусок памяти, который выделяется и не очищается между запусками скрипта. Можно в нем хранить список товаров. Это тоже должно быть быстро. Работать с shared memory можно как напрямую, так и через расширение вроде apcu.
Надо понимать, что БД вроде sqlite - это по сути и есть работа с файлами, только они имеют более сложную структуру (отдельно лежат строки таблицы, отдельно индексы). Иногда это дает плюсы, иногда минусы.
Также, в твоей идее есть проблема. Если на сайт зайдет бот-поисковик, то он начнет смотреть все страницы подряд и замусорит тебе список товаров. Надо исключать ботов.
> Смущает что если страницу откроют одновременно 2 пользователя или больше, то актуальная версия файлика будет только та которая после прокрутки скрипта будет записана последней, то есть просмотренный товар 1 пользователем будет просто затёрт, ведь они были загружены одновременно, я же правильно понимаю логику?
Да. Ты можешь решить эту проблему, используя обязательные блокировки, но тогда все станет работать медленнее (второму скрипту придется ждать, пока первый завершит работу с файлом. То есть работа с файлом будет последовательной, а не параллельной). БД, кстати, тоже используют блокировки, но более эффективно.
>>1985925 Получается анон концепцию я правильную придумал? Доступа к Redis и shared memory у меня нет, хостинг очень кастрированный в этом плане, по этому хочу просто костыль в 1 файл, про ботов не подумал кстати, но пока просто потестировать хочу посмотреть как будет работать, но раз ты советуешь на 100к тестировать, то думаю с 100 записями php справится как нехуй делать, в мгновение, тогда затестирую и файловый метод, и джсон, я так кстати понимаю они будут одинаково работать по скорости, ну и дальше затестирую с скьэльлайт
Тогда пишу такую логику, смотрю есть файл json, если нет - создаю и записываю в него массив с айди товара, названием и ссылкой, если есть, то паршу json в масссив, проверяю есть ли в нём материал с таким айди, если есть - то удаляю его и записываю заново в начало массива, потом обрезаю массив до 100 переменных, паршу обратно в json и записываю всё это дело в файл, на странице со списком промотренных сегодня товаров просто паршу этот json с помощью js и рисую его на странице, надеюсь я правильно нафантазировал
Я имел в виду, не заполнять файл 100 000 товаров, а, например, 100 000 раз сымитировать "заход на страницу товара". И померять, сколько это займет для каждого способа.
Посоны, открываю json с помощью fopen(), декодирую его с помощью json_decode() в массив, работаю с массивом, кодирую его с помощью json_encode() в строку, записываю в файл json с помощью fwrite() и закрываю файл с помощью fclose(), всё правильно?
>>1986695 >Зачем именно 8? Там что-то революционно новое ввели? Ну лучше сразу последнюю версию начинать изучать, в идеале же.
>Заходишь на официальный сайт и изучаешь. Я сейчас это делаю, тамошний мануал это нихуя не учебник для новичка. Это вообще не учебник, а справочник какой-то. У меня небольшой опыт в джаваскрипте есть, есть у PHP что-нибудь подобное вот этому https://learn.javascript.ru/ учебнику?? Я по нему жс учил, после него оффициальный мануал пхп это херня от которой голова болит.
>>1986692 Не учи подумой. Меня тоже здесь предупреждали, я не послушал, теперь жалею. Пыха болото ебаное. Потом времени, потраченного на нее, слишком жалко чтобы учить что-то другое.
>>1986749 Спасибо. Оглядел быстренько, че-то как-то это тоже не для вкатуна материал. Похоже на полировку для того, кто уже выучил синтаксис.
>>1986759 Я не для вката в IT (на галеру) учу. У меня планы замутить свои проекты, и самому их полностью поддерживать. Большинство самых популярных CMS на пхп (WordPress итд), плюс даже если сам с нуля пишешь бэк для небольшого проекта, то пхп как понял наилучший выбор. Так что буду учить по-любому.
>>1986785 А, ну тогда пых самый лучший вариант >>1986791 Если в нормальном городе живешь или рассматриваешь переезд в ближайшее время то что угодно, к чему душа лежать будет. В обратном случае вакансии нужно смотреть, чтобы борщи не хлебать в будущем. Что бы ты не выбрал, если это тебе нравится и это не пыха, то выбор правильный.
>>1986819 >>1986825 Еще не стоит пытаться вкатиться во фронтенд и серьезно изучать жс с фреймворками, там вкатунов как грязи и на собесе требования очень серьезные.
>>1986833 Да эти вкатуны и сами по качеству как грязь. Уважающий себя человек во фронт-энд не пойдет. >>1986825 Где как. В крупных городах бывают, но как я понимаю, долго не задерживаются. Это топ 1 язык для вката всё же, все инфоцыгане в первую очередь его рекламируют. Алсо, довольно часто такие вакансии никуда не выкладывают, охуеешь в говне копаться. Меньшие компании по знакомым ищут, большие выращивают с курсов. А так, основные языки бэкэнда: нода, питон, джава, сишарп, голанг ( для джуна сомнительно ), ну и php конечно. Если ты еще студент или просто РННщик, то большие компании проводят бесплатные курсы по всем языкам из списка кроме пыхи. Конечно нужно знать основы. Просят уделять обучению по 8 часов в день. Если ты в итоге выжил, через несколько месяцев после курсов часто зовут трудоустраиваться. Да даже если не позовут, опыт бесценный. >>1986850 Ты бот чишо? Тебе уже пояснили всё сверху.
>>1986971 Очень даже используют, если это вписывается в архитектуру. Иногда комбинируют даже оба типа. Но чаще это оверкилл, особенно при наличии больших данных.
>>1986880 >Уважающий себя человек во фронт-энд не пойдет. Ты просто кукаректнуть или есть манядоводы? >через несколько месяцев после курсов часто зовут трудоустраиваться Ну зачем ты пиздишь на анонимном форуме? Из яндекс практикума например попадают на оффер меньше процента прошедших весь курс и те по-большей части отлетают на испытательном.
>>1987034 >Ты просто кукаректнуть или есть манядоводы? Ну это имхо конечно, но ведь фронтенд как и QA - скукота полная. Я сам люблю отвлечься от бэка и что-то поверстать ( отдых - это ведь смена вида деятельности ), но заниматься только этим - ебануться можно. Когда-то пытался вкатиться во фронт, меня хватило на две недели. >Ну зачем ты пиздишь на анонимном форуме? Из яндекс практикума например попадают на оффер меньше процента прошедших весь курс и те по-большей части отлетают на испытательном. Говорю просто по опыту знакомых. В компании по типу яндекса конечно кого-попало не берут, я вообще-то имел в виду большие аутсорсные галеры.
>>1987106 Фронтенд это не обязательно верстка. Есть галеры, где версткой занимаются спецом обученные версталы, а жс-ники к ней уже прикручивают свой функционал.
>>1987195 Ну некоторые их курсы действительно дают весьма полезные, даже иногда уникальные по меркам СНГ навыки, в сравнении с откровенным наебаловом, которого 95% рекламируемого. Но я рассматриваю курсы лишь как возможность для повышения квалификации или расширения кругозора,чтобы не тратить время на поиск инфы, когда у тебя есть достаточно денег и база. Опять же далеко не все их курсы хороши, всякие пистон-джс-околоайти откровенное наебалово, как и везде, только дороже и пафоснее. Имхо, если тебе нужны курсы, чтобы вкатится - нахуй тебе не надо вкатываться, раз с гуглом на старте справиться не можешь.
>>1987196 На других языках - почему бы и нет, если есть возможность. На пыхе - однозначно нет. Если контора ищет PHP Trainee, то это 99% чтобы вырастить битриксоида/вордпресовщика, или в самом лучшем случае поддерживальщика легаси на CodeIgniter/CakePHP/Zend/Нэйтив пхп в процедурном стиле.
>>1987211 Работаю в галере на пыхе, симфони/люмен, частично go и ts. Зп процентов на 50-70 ниже для чисто пыхарей, как я вижу, в отличии от джавистов(но их итак полтора человека на всю контору) и тайпскриптизеров. Но это отчасти из-за того что большая часть пыхарей сидит на поддержке легаси 10 летней свежести и никуда не рыпается, да и дохуя их просто в конторе.
>>1987230 Питон в вебе ведь особо не популярен, и также с руби, его популярность спадает. Если я не прав, поправь меня анон. Так мне питон нравится очень. Ну похоже это, вспомогательная технология.
>>1987237 на нем написано большинство цмс-ок самых популярных, битриксы, вротпрессы, шопифай и иже с ним. Он всегда будет нужен как средство поддержики этих платформ. Но денег таким образом не заработаешь.
>>1987235 Питон в вебе нормально популярен, особенно в штатах/европе. Инста как популярный пример. Рубисты - до сих пор топ по зарплате, на днях рейтинг всплывал на хабре. Как первый язык - питон неоч, но это мое мнение. Я придерживаюсь мнения, что учиться нужно на статической типизации все таки, чтобы снизить шансы стать макакой в перспективе.
>Зп процентов на 50-70 ниже для чисто пыхарей Но ты со своим "частичным go и ts" к ним не относишься, верно? Если так, то по-моему довольно справедливо, если те пыхари не хотят даже частично освоить другую технологию.
>>1987237 Никуда он не помирает, как клепали средний и лоу ценовой сегмент, так и будут, ибо дешево и бьыстро, плюс он развивается хорошо. >>1987239 Есть, но чаще это переписывание легаси в ооп код под симфони и иногда новые сервисы, но на ts нового конечно побольше, хотя это наверное больше из-за специфики основного направления.
>>1987252 Карьерный рост, если можно так сказать, у пыхеров есть? Т.е топовый разраб может сравниться, например с джавистом, по деньгам, или интересным задачам.
Насчет руби, расскажу хохму. Недавно вижу от лица softserve, одной из топовых аутсорсинговых айти галер Украины, объявление по поиску Senior PHP Developer. Думаю ну нихуя себе, компании такого уровня уже лет 15 php же не используют. Открываю, а там оказалось что они ищут php-разрабов с опытом 5 лет и больше, чтобы переучить их на руби. Опыт с самим руби не требуется, вот вам и перспективы роста.
>>1987248 На самом деле не отношусь буквально месяц как, подняли зп после того как сдали микросервис на ts, который писали три месяца почти и даже сильно провалили дедлайны, но видимо старания оценили, лул. А так у меня тоже есть свой кусок легаси, на который попал, придя два года назад в контору и с ним приходися ебаться изрядно, как камень на шее.
>>1987253 На руби разве что дрочить английский и искать забугорные стажировки за нихуя, либо пытаться неуклюже комитить в опенсорс, параллельно изучая их свистелки. На пистоне даже не знаю, разве что могу сказать: был недавно пример - знакомый очень хотел на питон, еще и в нейросети, но в результате, попав на испытательный в контору с нейронками- отлетел на испытательном, когда ковид ебнул. Сейчас на джанге за 50к что то ковыряет на галере.
>>1987254 Я бы сказал, что есть движение. Среди активных мидл+ разрабов есть текучка, одни уходят, другие приходят, свапаются между проектами, ктото техлидом становится, ктото в джаву или ts уходит, кто то сеньорит на симфони. Но вцелом все это все равно происходит вокруг пыхи. То есть вырастают именно энтерпрайзные такие типичные кодеры.
Аноны, что лучше использовать для ебли одного .json файла? Конструкцию fopen() fwrite() fclose() или file_get_contents() file_put_contents()?
И использовать параметр 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 больше, проще их найти.
Страшно чёто стало какая там очередь может образоваться с LOCK_EX, сейчас сделал просто file_put_contents с FILE_APPEND чтобы вообще посмотреть сколько там запросов сыпит, и уже за 2 часа насыпало 5 тысяч строк, интересно до сколько там время ожидания может дойти, надеюсь по секунд 20 не будет очереди лол, а то хотер сразу заноет
Мне просто нужно не только айди хранить, но и название, урл и прочую хуйню, потом всё это парсить, удалять повторы и выводить уникальные
Аноны, есть сервер на php 5.2, создаю массив $info = ["Абу" => "Хуй"] а он в ответ тишину, это значит что он просто не поддерживат такой способ создания массивов ввиду своей древности? С $info = array() работает
Квадратные скобки появились в PHP 5.4. Также, PHP должен был выдать ошибку и записать ее в лог ошибок. Стоит смотреть лог ошибок, а не пытаться угадать, в чем может быть проблема.
>>1987823 >Ты бы сравнил плюсы и минусы каждого подхода. Имеется ввиду время выполения каждого из способов? Короче мне надо написать 2 скрипта и тестировать сегодня один, завтра другой, засекать время выполнения и выбирать что быстрее?
>>1987915 Да, гораздо лучше работать на сервере, где у разраба нет нужных доступов, старый пых и рядом еще куча говна крутится. Багов не будет, атвичаю. По ftp код заливаете?
Нет, я имел в виду вообще, какие есть преимущества и недостатки. В случае с fopen, по моему просто больше кода придется писать, чем в случае с file_get_contents(). fopen/fwrite нужен, когда ты открываешь файл и потом пишешь по частям.
>>1987928 Этот >>1987862 шиз еще и не знает, для чего микросервисы используют, описывая случай неправильного применения микросервисов (микросервисный монолит) и почему-то у него один чел отвечает за несколько микросервисов
>>1987941 Да на количество кода пофигу, лишь бы не было километровых очередей на чтение/запись, короче надо постестировать оба варианта, хотя я наверно и не узнаю что очередь на пределе, так как сервер после какого-то там таймаута просто дропает выполнение скрипта лол
Кстати, а очереди на чтение и запись - это 2 разные очереди или одна и та же? Пизде столько нового узнаю для себя, раньше только с js приходилось ебаться, там такой хуйни и близко не предвещало
>>1987941 Кстати анон ты писал нужно будет дропать запросы от ботов, а их с помщью юзер агента вычислять? По сути получается будем дропать только яндекс и гугл, а боты от васянов и дальше будут наполнять json мёртвыми запросами маскируясь под обычный юзер агент?
Привет анончеки. Пишет вам воннаби крутой арбитражник. Хочу попробовать лить креативы через апи, на бирже мне дали ссылку на такое вот https://github.com/kadam-official/php-sdk Как мне запускать это вот все и допустим лить тизеры/баннеры? Что такое композер и почему питон с джавой настолько проще?
Ананы, захотел залогировать всех посетителей на сайте чтобы посмотреть их юрезагенты и что вообще за живность такая водится, нашёл вот такие варианты https://forum.antichat.ru/threads/68692/ и http://usefulscript.ru/log_info.php это нормальные варианты сделать такую приблуду для себя? Может есть что-то ещё гениальнее? Или всё это так и делается?
>>1988063 А зачем мне опечаток браузера? Я просто хочу собрать список юзерагентов и посмотреть что посещает сайт, варианты с записью в файл которые я кинул выше и используются для таких целей?
>>1988110 Аноны мы походу друг-друга не понимаем, я знаю что юзерагент можно выдернуть с помощью $_SERVER['HTTP_USER_AGENT'], я просто хотел узнать как аноны собрали бы список юзерагентов, судя по ссылкам что я дал все это делают просто записью результата кода $_SERVER['HTTP_USER_AGENT'] с новой строки в обычный текстовый файл, как-то слишком просто получается, может кто-то что-то хитрее и лучше подскажет
>>1988161 Ты серьезно или прикалываешься? Тебе нужно собрать юзер агенты, пусть в текстовый файл. На каждый запрос ловишь юзер агента из суперглобального массива HTTP, добавил в файл строчку с ним. Всё. Да, это делается в несколько строк. Пока мы тут беседуем, ты бы уже мог всё это дело написать и протестить.
>>1988161 Я бы помимо юзер агента собирал полный фингерпринт и запихнул в всё бд, если понадобится какая-то дальнейшая обработка этой статистики. Потом можно будет графики строить или еще какую аналитику производить
"Очереди" в явном виде нет, она получается сама собой. Если ты берешь эксклюзивную (полную) блокировку на файл, ты как бы ограничиваешь доступ к этому файлу. Если другой скрипт попытается взять блокировку, он остановится до того момента, пока блокировка не будет снята. То есть доступ к файлу идет по очереди, а не одновременно.
То есть, при наличии блокировки только один скрипт (который ее взял) может работать с файлом в один момент времени. Другие скрипты будут ждать снятия блокировки.
Эксклюзивная блокировка берется для записи в файл. Это защищает от ситуации, когда другой процесс попытается прочитать не до конца записанный файл и получит некорректные данные. А с блокировкой он получит доступ к файлу только после того, как тот полностью записан.
Бывает еще разделяемая (shared) блокировка (на чтение). Она позволяет только читать файл любому количеству читателей, но запрещает запись в него для всех. То есть, два скрипта могут владеть разделяемой блокировкой и читать одновременно, но если кто-то попытается взять эксклюзивную блокировку (для записи), он будет ждать до снятия всех разделяемых блокировок. Такая блокировка используется, чтобы гарантировать, что в процессе чтения никто не заменит содержимое файла.
Тебе, кстати, для чтения файла как раз подошла бы разделяемая блокировка - она не мешает другим процессам читать файл, но останавливает (блокирует) их, если они пытаются взять эксклюзивную блокировку.
Блокировки важны при параллельной работе множества скриптов с одним и тем же файлом. Иначе можно при чтении получить мусор или записать в файл мусор.
----
Важный момент: блокировки в PHP не принудительные, а добровольные. То есть, они действуют только на тех, кто их явно использует. Если ты не используешь блокировку и читаешь файл через file_get_contents, то все блокировки игнорируются. Зато эти блокировки работают на любой ОС.
На уровне отдельной ОС, например, Линукс, есть и принудительные блокировки, которые ставятся на уровне ОС и которые действуют на все программы.
Кстати, есть альтернативный способ для Линукса, который без блокировок гарантирует целостность чтения и записи.
Что значит целостность чтения:
- что никто не подменит файл, который мы читаем, посередине чтения - что никто не будет читать не до конца записанный файл (в который сейчас пишет другой процесс)
Что значит целостность записи:
- что 2 процесса не будут писать в один файл одновременно, перемешивая данные друг друга.
Способ такой:
- при чтении просто читаем файл, например, goods.json - при записи создаем новый файл со случайным именем, например, goods.json.12846464. Пишем в него данные, когда закончим, переименовываем его в goods.json.
Как это работает?
- так как мы пишем данные в файл со случайным именем, никто оттуда не прочтет не до конца записанные данные. По сути, об этом файле знает только скрипт, который его создал и никто другой его не откроет.
- если кто-то читает файл goods.json, а другой скрипт вызывает операцию переименования, то происходит следующее: старый файл goods.json теряет свое имя, но не удаляется и первый скрипт (который его открыл) продолжает читать старый файл. Он будет удален только когда первый скрипт закончит с ним работать и закроет файл. Таким образом, целостность чтения не нарушается. А скрипты, которые откроют файл после переименования, получат доступ к новому файлу.
То есть, операция переименования атомарна. Она отбирает имя goods.json у старого файла, делая его безымянным и невидимым (но все еще существующим), и присваивает это имя новому файлу.
Получается, что в goods.json всегда будут полностью записанные данные и чтение из него будет всегда давать корректный результат.
(получается, с помощью переименования файла можно создавать невидимые файлы? можно, но они удалятся, как только их закроет программа, которая их открыла).
>>1988214 Спасибо анон за пояснение, с 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(), чтобы узнать, сколько памяти съел текущий скрипт, и померяй.
>>1988253 >Используй функцию memory_get_usage() 1 строка памяти до создания массива, 2 строка памяти после создания массива из 20 000 строк, 3 строка время выполения скрипта, как думаешь нормальные показатели? И насколько плохо обстоят дела с памятью? Я так понимаю по умолчанию занято 200 мегабайт, после создания такого массива все 400 мегабайт? Или это килобайт?
>>1988328 скорее всего в настройках интерпритатора отключены короткие теги.
призываю опытных анонов в тред. полтора года греб в мелкой галере фулстаком на всяких битриксах, вордпрессах и тп шлаке. и так вышло что каждый из тимы (нас было всего 4 разраба) зачастую работал только с одним проектом и был сам себе и бэком, и фронтом, и тестером, и девопсом. сейчас свалил в другое место уже на ларавель. и тут всплыли проблемы уже. то девопс почему то снихуя выебывается и посылает меня нахуй отказываясь выполнять команду в контейнере по специфике таски ее надо было запустить один раз, то теперь выясняется что гендир дс2 офиса какой то ебанутый наглухо неадекват который требует фиксов нашей внутренней CRM над которой я собсно щас и работаю при этом давая 0 нахуй инфы, и при попытках спросить и уточнить он полыхает и чуть ли нахуй тебя прямым текстом послать может коллеги вообще на полном серьезе рассказали что у него там сидит тима фронтов которых он натурально любит попиздить иногда палкой, из за чего и остальные разрабы/девопсы/менеджеры перед ним ходят на задних лапках. и вот интересует вопрос: это вообще норм ситуация в конторах или я попал в какое то исключительное место и надо все таки бежать оттуда ?
Пиздец аноны, на сервере php 5.2, когда кодирую кириллицу в json у меня выдаёт кракозябры, а параметр JSON_UNESCAPED_UNICODE не работает потому что php древний, как ещё можно обойти эту хуйню?
Это неправильный подход. Зачем так делать? Можно подумать, пропустив данные через strip_tags, они волшебным образом станут "безопасными" и все уязвимости исчезнут?
Нет. Например, от SQL-инъекции это не защитит.
Данные надо экранировать там, где они используются. Например, при подстановке в SQL-запрос - по одним правилам, при выводе в шаблоне - по другим, при подстановке в регулярку - по третьим. Так мы, глядя на код, сразу видим, что он безопасный.
А если экранировать в одном месте, а использовать данные в другом, то непонятно сразу, безопасный код или нет. Надо его весь от начала до конца изучить сначала. А кода может быть 100 000 строк. И даже если он безопасный сегодня, завтра кто-нибудь допишет пару строчек и, не зная того, создаст уязвимость.
Плюс, для подстановки данных в БД и в шаблон нужны разные типы экранирования. А ты хочешь один универсальный метод.
Вот пара статей про то, как избежать уязвимостей и правильно экранировать данные:
Конечно, данные из POST можно "очищать", если для них есть какие-то ограничения. Например, если параметр это целое число, можно принудительно преобразовать строку в число через intval().
А вот лепить функции наугад не надо. нет волшебного способа сделать данные безопасными.
>>1988357 >Это не кракозябры, а допустимый для JSON синтаксис Просто хотел по красоте чтобы всё было если смотреть JSON файл глазами, а там это >\u0234
>>1988357 >там не 400 000, а 4 миллиона Всё уже в глаза ебусь, там не id пишется, а строка массив где хранится название, айди, урл и т.д. и таких строк было 20 000, да получается 4 мегабайта всё это дело занимает, а если одновременно запустит 10 человек то уже все 40 наверно будет
Кстати анон, я данные в этот файл передаю с помощью post и думаю хранить в json же, а мне надо эти данные в виде айди, названия, урл и т.д. как-то фильтровать прежде чем записывать в новую переменную в массиве или в новую строку в файле? Ведь я потом всё это буду на другой странице парсить и выводить на странице с помощью js, не сможет ли какой-нибудь хуй передать туда например html и при отрисовке страницы с результатами хранящимися в json или файле вывести свой произвольный код который выполнит его js скрипт или прочую хуйню?
>>1987862 >Тут пошли какие-то вредные советы. Как усложнить разработку в убыток бизнесу. >И программистов на PHP больше, проще их найти. Лол, так в этом и вся суть. Малому и среднему бизнесу пыха выгодна, но только из-за того, что к разрабам на ней можно относится как к рабам и платить миску риса в день. Для большого бизнеса это не приоритет. И даже не пытайся это отрицать, ведь ни одна большая контора php не использует. Совсем ни одна. Фейсбук и вк используют свои модификации, у которых путь кардинально отличается от пути современного php.
>Наверно старшим программистам стало скучно и они от скуки решили поменять язык разработки. При этом нанося ущерб бизнесу. С php уходят исключительно из-за престижности и оплачиваемости труда на других языках. Думаешь, очень сильно хочется людям после 8 часов работы придти домой и учить новый язык, просто потому что прикольно? Да нет, жизнь заставляет. Ну а потом можно уже и подискутировать, насколько микросервисы лучше за монолит, насколько язык_нейм лучше за пых и прочее. Каждая свинья свое болото хвалит, сам знаешь. Алсо, очень забавно как ты сильно за барина переживаешь. Два раза про убыток для бизнеса написал.
>Еще небось и фронтенд на реакте или вью делают вместо серверного рендеринга. В итоге разработка занимает еще больше времени, приложение получается тяжелое и тормозное, долго грузится, долго делает кучу аякс-запросов. >Нет ничего лучше и проще монолита на PHP, с шаблонизатором Твиг. Получил запрос, обратился к БД, отрендерил шаблон - все это просто пишется и просто отлаживается. Не, ну это уже святая толстота. Написать конечно может и проще, вот только поддерживать красивый структурированный код на Vue и какой-то пиздец на jQuery или нативном js - это уже принципиально разные вещи. Про удобство разделения команд фронтовиков и бэкэндеров при этих подходах я совсем молчу.
>>1988566 пчел я сам учусь но у тебя пиздец дичь а не код, ты же не принимаешь данные посланные формой, у тебя персон и меседж даже не созданы, они пустые
>>1988786 >>1988798 Чо блять? Вы хотябы свою неграмотность не выставляйте как чтото хорошее. Это обычный семантический формат для html с микровставками php, который работает везде по-дефолту. Использовать или нет - ну дело каждого. Но к чему тут кукареканье про древность я вообще хз.
>>1988838 Ок, покажи современный проект на пхп, где этот формат используется. Я прошел через пару десятков проектов, нигде этого не встретил. Либо используется .php, либо шаблоны twig, blade
>Но к чему тут кукареканье про древность я вообще хз. Пикрил
Аноны, подскажите насчёт многомерных массивов, в JS если добавлять в массив другой массив со своим цифровым ключём то эти массивы в массиве сортируются по порядку ключа, то есть если я добавлю массив с ключём 5, потом другой с ключём 3, то массив с ключём 3 переместится вверх, хоть я его и добавил позже, в PHP так же или порядок добавления сохранятся? Хочу сделать поиск по массиву с массивами по цифровому ключу массива чтобы быстрее делать поиск, но мне нужно чтобы новые добавляемые элементы добавлялись в конец массива и не сортировались автоматически по номеру ключа, надеюсь вы поняли о чём я, в PHP есть такой косяк?
В мою поехавшую голову пришла такая идея, ведь многие сайты наверняка филтьруют ботов, тем самым не отслеживая такие хосты или не учитывают их в статистике и т.п., они же это делают с помощью анализа юер агента, так? А что если замаскировать свой браузер под бота выдавая их юзер агент, считайте минус процент тотального анального контроля и ебли с рекламой, нет?
Блять говно короче, если в массиве массивы с рандомными цифровыми ключами, то чтобы добавить новый массив в начало нужно использовать array_unshift(), а это говно стирает все рандомные ключи и сортирует массив с 0 до количества массивов, можно это как-то обойти?
То есть у меня массив примерно такого вида [ 5 => ["id" => 26, "title" => "Название 1"], 10 => ["id" => 64, "title" => "Название 2"], 1 => ["id" => 43, "title" => "Название 3"], ]
И мне надо добавить новый массив 14 => ["id" => 82, "title" => "Название 4"] В начало, как это сделать чтобы ключи не стирались и не сортировались с нуля?
>>1958281 (OP) В вакансии написано >Опыт использования хотя бы одного из популярных PHP фреймворков (Symfony, Laravel, Yii2) Я глянул краткий курс по Laravel, думаю сейчас написать задачу про студентов. Как думаете - этого хватит, если вакансия на Джуна или под опытом подразумевается что-то большее? Вообще не понятно если честно как использовать документацию Laravel. Вот откуда мне узнать есть ли нужная функция в Laravel...
>>1988898 Рендеринг страничек на пыхе - это вообще охуеть как современно. А раз тебе не нравится, что ФОРМАТ ФАЙЛА добавлен не вчера, так не используй его, я так и написал, можешь вообще не юзать ничего, что придумано не в этой версии языка, древнее говно же. В спецификации он есть, не deprecated. Выше вы до чела доебались за то что у него 'кривой' формат файла, хотя он использовал его как раз по назначению, а то что тебе некоторые вещи незнакомы - ну бывает, лул.
>>1989192 >Я глянул краткий курс по Laravel, думаю сейчас написать задачу про студентов. Как думаете - этого хватит, если вакансия на Джуна или под опытом подразумевается что-то большее? Для начала пойдет, но на собесе могут завалить вопросами по кишочкам лары (di контейнер, елоквент, фасады). Так что советую и их пощупать + подключить парочку популярных либ в свой проект.
>Вообще не понятно если честно как использовать документацию Laravel. Вот откуда мне узнать есть ли нужная функция в Laravel... Гуглить laravel feature_name
>>1989202 >Рендеринг страничек на пыхе - это вообще охуеть как современно. Не везде нужны реакты с твигами
>А раз тебе не нравится, что ФОРМАТ ФАЙЛА добавлен не вчера, так не используй его, я так и написал, можешь вообще не юзать ничего, что придумано не в этой версии языка, древнее говно же. В спецификации он есть, не deprecated. То, что он придуман давно роли не играет. А то, что выпал из употребления минимум намекает на то, что новые разрабы на проекте будут смотреть на это с мыслью WTF
>Выше вы до чела доебались за то что у него 'кривой' формат файла, хотя он использовал его как раз по назначению, а то что тебе некоторые вещи незнакомы - ну бывает, лул. Если бы он использовался чаще чем никогда, то претензий не было б
Повторяю реквест: доставь актуальную пхп либу или проект, где такой формат используется
>>1989192 У меня смежный вопрос: если в вакансии джуна есть вот такое требование: >Опыт использования хотя бы одного из популярных PHP фреймворков (Symfony, Laravel, Yii2) Понятное дело что везде по разному, но, скорее всего, как будут обстоять дела в конторе? Придется по ходу работы учить все фреймы и понемногу пилить на них разные проекты, или же меня будут садить на проекты на выбранном фрейме? А то не очень хочется лишний раз тратить свое время на Ларавел или, упаси Б-же, Yii.
>>1989214 С мыслью WTF будут смотреть только вчерашние вкатуны, но они много на что так смотрят. А свой манямирок про ненужность стандартных опций языка можешь в psr направлять, там твое мнение очень важно. Вообщем когда формат объявят deprecated - тогда и приходи со своими претензиями. Про либу с версткой - ну вообще пушка, я с cmsками не работаю, сам ковыряйся в этом.
>>1989223 Ну вакансия через 2 дня должна закрыться. А я много чего не знаю. Я просто хочу попытаться пойти на собес, но ссыкотно, вдруг я ничего не отвечу
А у тебя включен показ ошибок или запись их в лог ошибок? Тогда бы по тексту ошибки можно было понять, в чем дело. Почему не смотришь логи и не включаешь отображение ошибок?
Также, у тебя код странный. Ты используешь переменные $message, $person, а где задаются их значения? Они автоматически из POST-запроса в переменные не подставляются.
Также, у тебя тут дикая уязвимость. Ты полученные от пользователя (или хакера) данные записываешь в файл и затем иклудишь этот файл (то есть, если в нем содержится PHP код, он выполнится). Есть другая, безопасная, функция, которая выводит содержимое файла, но не выполняет код в нем.
Надо настроить права доступа к папке и файлам, возможно, поменять владельца файлов или группу владельца. Почитай про права файлов в линукс (rwx, владелец, группа владельца, chmod) и подумай, что надо поменять. Ну или пиши сюда, если не додумаешься.
Кстати, у тебя еще одна проблема. Ты не делаешь redirect-after-POST и если после добавления сообщения обновить страницу, то запрос отправится снова и добавится еще одно сообщение. Надо делать редирект после обработки запроса. Можешь почитать это: https://github.com/codedokode/pasta/blob/master/forms.md
Массивы в 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 ключи не обязаны идти по возрастанию и могут идти в произвольном порядке, например:
Рекламу тебе будут показывать, просто не будут засчитывать просмотры. А вообще, попробуй, посмотри, может какой-то сайт тебе что-то интересное и покажет.
Каким образом добавляют на сайт первого юзера-админа? В ларавеле есть seeders, а в симфони, например? Голыми SQL-запросами, с захешированным вручную через консоль паролем и его же ручным экранированием? Топорно как-то. На ум приходят фикстуры, но они же для тестирования предназначены.
На днях начал штудировать php вместе взятыми его symfony фреймворками. Но задаюсь вопросом. Почему много аннотаций нужно писать? Я честно начинаю заёбываться этим фактом. Такое ощущение я не код пишу. А только аннотации/комментарии. Я конечно понимаю, что эти аннотации преобразовывается как-то потом в при компиляции. Но зачем так много аннотации нужно писать ебать? Вообще ахуеваю от этого. Почти вся логика контролеров пишется в аннотациях. Что за хуйня вообще? Мимо вкатыш из питона/js.
>>1989477 Ну не прям задрачивать, но вцелом ориентироваться будет не лишним, уметь wpsку настроить, nginx поднять, права и порты раскидать. Вообще для этого девопс есть, но пугаться при виде терминала тоже не солидно. >>1989644 Ну это путь симфони, какой уж есть, более того весь php в 8+ версии к этому идет, там аннотации по типу симфони на уровне языка прикрутили уже. Вообще в симфони часто можно их избегать, например мапить доктрину мне удобнее через xml, особенно сложные структуры.
>>1989734 Наверно непонятно объяснил, как они формируют ответ, выводят его построчно или кодируют массив и выводят это через echo
Вот например паблик API https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY как они сгенерировали весь этот текст, выдернули из базы, собрали в массив, обработали, кодировали в json формат и тупо echo? Как вообще в основном это делают, ведь способов нарисовать этот текст много, но мне кажется 2 вариант что я описал нормальный и им можно пользоваться
>>1989734 Не хранят же они всё это в файлах, ни же это генерируют когда ты запрашиваешь ответ с этого API, вот мне интересно как они его собираюь в кучу и отрисовывают на странице которую ты запрашиваешь
>>1989711 Не знаю просто взял симфони. По ларавелу мне показалось слишком много мусора. Мусор как мусор, куча прям. Надеюсь ты понимаешь что я имею ввиду.
>>1989819 > Какие обычно задачи выполняет junior на работе? Запилить небольшую фичу, исправить какой-нибудь баг. Миддл уже делает более глобальные задачи с серьезным функционалом.
> И еще: мидл проводит код ревью джуну, а сеньер мидлу? Везде по разному.
>>1989819 Вообще это сильно зависит от конторы. Вцелом джун обычно пишет круды, делает мелкие фиксы, либо пилит какие то новые модули под контролем куратора, если контора может себе такое позволить. Мидлы и сеньоры уже самостоятельно решают задачи в командах или поодиночке и вцелом могут делать вообще все что угодно. Грань между 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$"}} И каждый раз расспаршивать его в массив и отрисовывать
Или вообще в базе данных? Или тут по сути без разницы и выбирать то что нравится или то что занимает меньше времени на отрисовку, меньше оперативной памяти и меньше места на диске?
>>1989364 >Ты путаешь большие реальные проекты (где используют twig/blade) и учебный проект на 10 строчек (где оправданно использовать нативный шаблонизатор). Вот, на большом проекте будет шаблонизатор. На учебном .php Зачем брать неиспользуемое расширение?
>Так, по твоей логике, ему надо эту форму на Симфони что ли переписать, с dependency injection и доктриной? Где я такое писал?
>Я кстати, встречал большой проект с использованием нативного шаблонизатора. Во времена Zend Framework так делали. + к тому, что это устаревший формат. Неоффициально, но из бестпрактис он выпал
>>1989644 Вдохновлено джавой, как и все остальное в Симфони. Причем названия аннотаций и параметры зачастую те же. Джависты вон уже давно шутят про Annotation Oriented Programming. А вообще, так просто удобнее. Когда есть выбор между php кодом и конфигом, аннотации часто вбирают в себя все плюсы этих двух вариантов.
>>1989701 > например мапить доктрину мне удобнее через xml, особенно сложные структуры. Больной ублюдок. XML же вообще не ориентирован на удобство записи и чтения человеком, это ж язык разметки для машин по большей части?
>>1990000 Ну это само както пришло, сперва был проект на симфони, который дописывал на аутсорсе - там было много сложных связей, большие таблицы и ебейшая вложенность сущностей, в аннотациях все по самые гланды, разбираться было невозможно, потому что банально десяток файлов листать и искать поля в объекте - та еще ебля. Вот и пришлось все в xml переписывать. Потом на мэйн работке, когда стали симфони использовать тоже приняли xml как дефолт.
>>1990012 Ну так не юзай, раз в твоем проде это не используют, тебе так и сказали с самого начала. Зачем ты доебываешься до людей в треде со своими фантазиями?
>>1990020 Ты неправильно понял. Получать данные можно в разном виде: набор переменных, массивы, объекты, коллекции и т.д. Отдавать тоже можно по разному: json, xml, html, просто текст, csv, бинарные данные и т.д.
>>1990029 Не, меня интересует именно json, получается все json API достают данные из базы данных, помещают их в массив и в конечном итоге кодируют в json и выводят его через echo, буду тогда по такому принципу делать
В туториале ZF1, например, PHP-шаблоны используются с расширением phtml. Логично, что для шаблонов используется другое расширение. Так что это не малоизвестный формат, просто ты с таким не сталкивался и не знаешь.
Код, где ты по частям собираешь JSON из строк, неправильный. Ты не экранируешь содержимое строк. Например, если в строке встретится двойная кавычка, ее надо корректно заэкранировать, а ты это не делаешь.
Для вывода логично использовать json_encode. Не забудь только отдавать правильный HTTP-заголовок content-type.
Не опасно ли начинать учить php сейчас и как первый ЯП? Постоянно натыкаюсь, что пишут, что через 5 лет он уже будет вообще неактуален. И ещё если его брать как первый ЯП, то всё по пизде пойдёт, потом никуда не свитчнешься.
>>1990077 Неактуален - это слишком расплывчатое понятие. Работа на пыхе еще долго будет, если ты об этом. Как первый язык, зависит от того, какую цель ты преследуешь в изучении языка. Если цель именно стать программистом и тебе интересно само программирование - то это один из худших вариантов например, слишком велик риск нахвататься фатальных привычек. Если быстро вкатиться и начать что то зарабатывать этим - отличный вариант, лучше только js наверное и то спорно.
Хочу сделать товары популярные за 24 часа, всё что я придумал это делать проверку есть текущий товар в массиве или нет, если есть - увеличивает ему количество просмотров на 1, если нету - то добавляем товар, плюс сохраняем дату, и обновляем её каждый раз когда этот товар посмотрели снова, и если дата последнего просмотра уже больше 24 часов - то удаляем этот товар из массива
Но сука меня ждал подвох, а как быть с просмотрами, как посчитать столько их было за 24 часа, ведь товары которые могут посмотреть сегодня 1000 раз могут ещё неделю висеть в топе просмотров, хоть их уже и не смотрят вовсе, но они там потому что когда-то у них набило большое количество просмотров, можно обнулять количество просмотров в 12 ночи, но это же не вариант, в 1 ночи там уже будет количество просмотров за 1 час, а не за 24 часа
Пока в голову приходит только сохранение количества просмотров в массив из 24 значений в каждом товаре и допустим в 1 ночи перезаписывать 1 значение, в 2 значение 2 и т.д, но как это сделать без затирания новых просмотров х.з., а чтобы узнать общее количество просмотров нужно будет сложить все эти 24 значения из массива просмотров в этом товаре, в общем надеюсь я понятно объяснил, подскажите как ещё можно это сделать и лучше чтобы за зря не напрягать сервак
Коротко: Как сохранять количество просмотров за 24 часа? Чтобы просмотры которые добавлись 25 часов назад удалялись из общего числа просмотров в текущем товаре
>>1990216 > Хочу сделать товары популярные за 24 часа Очевидно что товары из блока "популярные" будут иметь больше просмотров чем другие. Я бы не выебывался и просто раз в неделю вручную чекал топ просмотров и вручную же обновлял товары в популярном (алсо, туда же можно пихнуть не популярные товары, а те которые ты хочешь продвинуть). Если у тебя там конечно не овер сто позиций в популярном.
>>1990222 Я хотел не блок, а отдельную страницу и там постранично выводить то что больше всего посмотрели за 24 часа, и чтобы самые популярные были имеено вверху, и вот мне интересно а как остальные считают количество просмотров за 24 часа, я пока придумал только записывать количество просмотрво за каждый час и складывать их чтобы узнать общее количество при сортировке товаров, а через 24 часа тупо удалять 1 значение и писать новое, то есть удалять значение которому уже 25 часов, надеюсь понятно изъесняю лол, просто я думаю наверняка есть способ проще ведь наверняка многие с этим уже сталкивались и придумали то до чего я не догадался, а составлять топ самому лень, хочу чтобы юзеры сами его составляли своими просмотрами
Аноны, распишите, плиз, ваши впечталения от обновления с 7.4 до 8. Что стало лучше? Что хуже? Что нужно было сделать, но не было сделано? Поделитесь своими мнениями.
>>1990246 Подозреваю что у остальных "популярное" это далеко не то что смотрят пользователи, а скорее то что хочет продать маркетолух.
> хочу чтобы юзеры сами его составляли своими просмотрами Если у тебя магазин, то логичнее топ составлять не по просмотрам, а по продажам.
> можно обнулять количество просмотров в 12 ночи, но это же не вариант, в 1 ночи там уже будет количество просмотров за 1 час, а не за 24 часа Не вижу проблемы, ты в 0:00 смотришь количество просмотров за прошедшие сутки (а не за час) и составляешь топ, просмотры же обнуляешь. Через сутки делаешь тоже самое.
Если тебе нужно именно строго за последние 24 часа, то нужно в лог или таблицу БД писать и id товара, и точное время просмотра. То есть, на каждый просмотр создается новая запись, и удаляются записи старше 24 часов.
Так в таблице или файле быстро наберется куча записей. В принципе, БД не умрет от этого, а вот вручную возиться с файлом на 10 000 записей будет довольно неэффективно.
Можно сделать такой трюк для уменьшения числа записей: группировать вместе просмотры одного товара внутри одного часа. То есть, записи будут такого вида:
товар1,10,2021-01-01 12:00:00
Так мы получим чуть меньшую точность (будет браться число просмотров примерно за последние 23-24 часа, а не точно за 24), но зато надо будет меньше записей.
>>1990216 А зачем тебе явно хранить кол-во просмотров? Логай куда-нибудь просмотры товаров с датой и временем просмотра. Потом по логам сможешь посчитать кол-во просмотров за нужный промежуток времени. И пересчитывать топ раз в N времени
>>1990253 >а скорее то что хочет продать маркетолух Мне нужно именно по количеству промотров, товары я привёл для примера
>Через сутки делаешь тоже самое Тоже самое, хочу чтобы список обновлялся в лайве, а не раз в 24 часа, по этому и нужно придумать или узнать как делают другие чтобы считать количество просмотров за последние 24 часа в любое время суток, а не только в 12 ночи
>>1990273 Вот по этому я и ВСТАЛ, всё занимает много места и будет много крутиться за зря увеличивая очереди на запись, так как храниться всё будет в json файле
Я придумал немного компактнее твоего, хотя может и нет, в общем в ключе просмотре писать массив с 24 массивами где хранится час от 1 до 24 и рядом дата, когда дата равна 24 часам значит эти данные в этом часу уже старые и их нужно затереть и выставить свежую дату и начать запись просмотров с 1, то есть у нас есть предыдущие 23 часа и текущий час обнулился и начал записываться заново, походу так и придётся ебаться, просто много циклов получается пиздец, зато самый компатный вариант на выходе, интересно сколько по времени это будет обрабатываться и занимать оперативки
>>1990301 Можешь посмотреть в сторону хранения связок событий и uuid товаров в оперативке с ограниченным сроком жизни. Ну это если есть возможность redis или memcache накатить. Работать быстро будет. Всякие озоны похожий подход используют для некритичных данных.
>>1988780 окей, тогда очевидный вопрос: стоит ли в резюме указывать что вот 3 месяца работал там то там то на таком то стеке? с одной стороны это для меня плюс тк люди видят что есть коммерческий опыт в ларе, а не только на пэт проектах, но с другой стороны минус в том что в новую будет тяжело залететь тк будут думать мол что это я какой то ебанутый/джампер и тд и тп
>>1988898 магенто2 его использует. так что где он -там и этот формат. съебался с галеры как раз когда к ним прилетел проект на этом говне, спустя месяц связался с бывшими коллегами и они говорят что это кал и боль лютая так что да, говно, старо - тут ты прав, но то что нигде не юзается - тут ты не прав
>>1990393 И каким образом формат файла доставляет боль ты сможешь придумать? Он во всех интерпритаторах php работает. Может кал и боль это сама ебучая цмс?
>>1990315 Походу придётся не выёбываться и просто выводить собранные данные за вчера, а то что соберу сегодня показывать завтра
Аноны, а такой вопрос, вот я хочу в 12 часов ночи обнулять все просмотры в масиве, как по быстрому это сделать? Только через цикл? Типа крутить в цикле $order[key]["view"] = 1;? Или есть какая-то специальная функция для таких задач? Поиска нужного ключа в ключе и его сброс на нужное значение?
>>1990449 это фреймворк , а не цмс я тоже с этого прогорел лол сам не работал, но по словам бывших коллег проблема в том что там часть вьюх в phtml, а часть в xml. на мой вопрос почему нельзя гонять просто json и посадить на фронт нормальный js фреймворк был такой ответ: структура и ядро слабо под это подготовлены, сами разрабы вот вот только начали пилить такие фичи туда + у заказчика куплен готовый модуль для этой платформы который является краеугольным камнем во всей системе последнее также звучало объяснением для того почему они проект с симфы переписывают на магенто2 лол
>>1990472 Ну значит у них точно такие же проблемы с .php. Я не вижу корреляции с конкретно .phtml. А переписывать с симфони на магенто - это новости из параллельной вселенной просто.
Рассматриваю фриланс, как вариант получения опыта (бэкенд, пых). Но, не совсем понимаю. Какой тип заказов нужно выполнять? Я правильно понимаю, это сайты под ключ?
Аноны не могу разобраться, вывожу дату в таком виде date("dmY"), она выводит мне 08042021, что мне сюда дописать чтобы оно вывело вчерашнее число 07042021? Попробовал date("d-1mY") но сразу же соснул, как и с date("dmY") - strtotime('yesterday')
>>1990474 >А переписывать с симфони на магенто - это новости из параллельной вселенной просто. трустори, я не троль. как мне сказали проще было взять магенту с готовым модулем и перекинуть старый функционал туда, чем на симфонии пилить новый функционал тот что в том модуле есть
>>1990907 Может потому что используют все ее как цмс, вообще фрэймворком назвать можно даже wordpress, если очень захотеть, а лара со всеми модулями и обмазками - почти готовая цмс сейчас. Вот только если называть говно шоколадом, вкуснее оно от этого не станет.
>>1990373 Много мест по паре месяцев не очень выглядит в глазах херки. То ли ты мешкаешься, то ли тебя выгоняют. Лучше это объединить в одну фирму, пусть и приврав
> гонять просто json и посадить на фронт нормальный js фреймворк
Я не понимаю, чем JSON и "нормальный фреймворк" лучше, чем рендерить шаблоны на сервере.
На сервере ты имеешь объекты вроде Product, Order, Category, ты можешь посмотреть, какие у них есть свойства и методы. К ним есть комментарии и документация.
На фронтенде ты имеешь никак не типизированный и не документированный JSON - просто помойка, свалка из случайных данных. Причем вполне возможно, что, например, одно API отдает одни данные о товаре, а другое - немного другие. Это же JSON-помойка без типизации.
Неправильно. В документации написано, что функция сравнения должна вернуть -1, 0 или 1. У тебя она возвращает true либо false. Почитай про оператор <=> (spaceship) и переделай.
>>1991064 >Я не понимаю, чем JSON и "нормальный фреймворк" лучше, чем рендерить шаблоны на сервере. Вчера ебался с багом как раз с рендером шаблонов на сервере. Проблема была в том, что сервер не знает текущего состояния на фронте и тупа шлет новую верстку, жс и стили, которая ломает текущий жс функционал. Был бы фронтенд фрейм - такой хуйни не было б
>>1990867 >Это может быть из-за старой версии PHP? 5.2 Эту версию перестали поддерживать 10 лет назад. Задумайся, 10 лет. За эти 10 лет фронтенд перевернулся с ног на голову
>>1991064 Для тебя наверное лучше, если ты вкатыш или клепаешь магазины для ашотов. Если попадешь в нормальную продуктовую компанию - сам все поймешь довольно быстро. Я боюсь представить, что с твоим мирком будет, когда c graphql или протобафом столкнешься.
>>1991075 Я понимаю, но админам похуй на это, я её поменять не могу, так почему ошибку выдаёт? Значит эта версия не поддерживает анонимные функции внутри системных функций?
>>1958281 (OP) аноны, учу laravel, возникла проблема скорее по js ну да и похуй - собираю через npm run dev в app.js весь жс. Проблема в том что все что я туда импортирую вне скрипта недоступно, а я хочу в onclick в html повесить медтод импортируемого класса. Как фиксить?
>>1991148 Vue чем то схож по назначению с ларой. Простой, дружелюбный, идеален для среднемелкого софта. Плюс легкий и приятный вкат, в отличии от того же ангуляра. Ну и анон выше написал еще.
Посоны, проверяю наличие файла в каталоге функцией file_exists() и если его нет - то создаю его, у меня такая хуйня что когда размер файла доходит до 500кб или когда много запросов внезапно всё содержимое удаляется, это может быть из-за этой функции? Мои шерлокофантазии говорят мне что возможно в момент записи файла другим скриптом этот пытается проверить его наличие и получает отрицательный результат и в итоге создаёт новый затирая старый, может такое быть? Какую тогда функцию для проверки наличия файла использовать? Записываю файл с помощью file_put_contents("hui.json", $array, LOCK_EX)
>>1991285 Или это то о чём предупреждали выше? Что один поток перебивает другой, то есть пока 1 поток считывает содержимое файла, другой начинает запись и предыдущий получает данные не до конца? А как защить его во время считывания? В file_put_contents() есть метод LOCK_EX, а вот в file_get_contents() такого нет, или переписать всё на fopen() fwrite() fclose()?
>>1991258 Симфони - это про другое, больше про интерпртайз или чтото масштабное, мощный, гибкий, при этом сложный достаточно. Но на нем вцелом и зарплаты самые высокие в php. Doctrine - вообще отдельный каеф, очень похожа на Hibernate из java, при наличии прямых рук позволяет творить прям очень мощные штуки. Но как первый фрэймворк - имхо лара все таки лучше.
Как можно предотвратить переполнение целых чисел? Если число больше чем PHP_INT_MAX или меньше чем PHP_INT_MIN оно преобразуется во float. Но если этот float преобразовать обратно в int через intval, то возвращается 0.
>>1991285 >>1991302 Блин аноны происходит какая-то коллизия когда в массиве собирается от 1000 значений или много запросов одновременно, я не разобрался, в один момент файл в который всё сохраняется становится просто пустым, я так понимаю один из потоков просто не может записать файл или загрузить его до конца из-за прерывания другим потоком, интересно что это на самом деле и поможет ли замена file_get_contents file_put_contents на fopen fwrite fclose, сейчас уже просто нет сил всё переписать чтобы проверить, всё происходит рандомно через несколько минут или часов
Посоны, короче проблема повторяется раз за разом, я храню в файле массив из просмотренных товаров, каждый раз при вызове скрипта он подгружается, обрабатывается, изменяется или дополняется и снова записывается
Я правильно понимаю что из-за нескольких потоков происходит то что во время считывания один из потоков начинает запись обработанного файла и предыдущий поток не дочитав файл до конца теряет его часть и в иторе происходит ошибка и он сохраняет только тот товар при просмотре которого он был вызван и затирает собой старый файл с 1000 товаров записю с 1 текущим просмотренным товаром?
Выход из этого проверять перед загрузкой размер файла и проверять его после окончания загрузки? И если он меньше то скачивать его снова? А может быть что во время проверки размера файла он тоже попадёт на момент записи другим потоком и считает не тот размер что должен был быть?
Или я так понял ещё вариант это при записи сохранять файл под другим названием и в конце записи просто переименовывать его в то название что должно быть? И в таком случае другой поток во время считывания прочитает файл до конца хоть он уже и будет заменён путём смены имени? Верно?
Ну или какие ещё способы обхода этого есть? Могу только сохранять в файл, БД нету, размер его получается при 1000 товарах около 250кб, и походу этого размера хватает чтобы один из потоков не успел его скачать до конца как другой поток начинает его затирать записью в него
>>1991654 Или может файл открыть с помощью fopen, блокировать, читать, разблокировать, закрывать, потом обрабатывать, опять открывать fopen, блокировать, записывать, разблокиивать и закрывать? Так получится избежать коллизий с перезаписями друг-друга?
И что будет делать другой поток если ему встретится блокировка другим файлом? Он будет ждать или выдаст ошибку и прекратит работу?
Во многих случаях фронтенд-фреймворки не нужны и удобнее сразу на сервере генерировать и отдавать HTML, чем грузить мегабайты JS кода, делать кучу аякс-запросов и тд.
Блокировки в PHP добровольные (я писал выше), то есть LOCK_EX действует только на операции, которые используют блокировку (через LOCK_EX или fcntl). Например, если ты читаешь заблокированный файл через file_get_contents без блокировки, то поставленная блокировка игнорируется и читается не записанный полностью файл.
То есть, чтобы блокировки работали, все (читатели и писатели) должны их использовать. Так как они добровольные, и процесс должен явно проверять наличие блокировки, чтобы они работали. Если он не проверяет блокировки, то ему никто не помешает писать или читать файл.
Смотри мануал по функции flock(). Она как раз позволяет проверять наличие блокировки.
У int чисел есть ограничение на макс/мин. Ты не можешь преобразовать в int число, которое выходит за пределы допустимого диапазона. Потому что под int выделено ровно 4 (в 32-битных) или 8 байт (в 64-битных системах) и в них нельзя впихнуть произвольно большое число.
Если провести аналогии, представь, что у тебя на листке в клеточку выделено 4 клеточки, и в каждую можно запихнуть только одну цифру. Ты не сможешь так записать число больше, чем 9999.
Потому число преобразуется в float, возможно с потерей точности (то есть может немного отличаться от правильного числа).
Чтобы работать точно с произвольно большими числами, используй расширения bcmath или GMP. Они хранят число в виде строки.
>>1991443 Ну так я ее перезаписываю одним и тем же значением. Ты поясни нормально. И почему в условии цикла присваивание блядь? Как это обрабатывается, истинность чего проверяется циклом? И вообще цикл должен быть бесконечным или вообще не выполнится, так как ни $row, ни значение функции не меняется в теле цикла.
> Я правильно понимаю что из-за нескольких потоков происходит то что во время считывания один из потоков начинает запись обработанного файла и предыдущий поток не дочитав файл до конца теряет его часть и в иторе происходит ...
Если ты используешь JSON, и прочитал файл частично (так как другой процесс еще не дописал его), то ты не сможешь декодировать этот JSON - функция json_decode вернет null вместо массива. JSON можно декодировать только если он целый. Если ты пишешь кривой код и не проверяешь результат на null, то наверно твой кривой код думает, что массив пустой, добавляет в него свой один товар и записывает это назад на диск.
> Или я так понял ещё вариант это при записи сохранять файл под другим названием и в конце записи просто переименовывать его в то название что должно быть?
Это работающий вариант.
> И в таком случае другой поток во время считывания прочитает файл до конца хоть он уже и будет заменён путём смены имени? Верно?
Да. При переименовании ОС просто отбирает имя у старого файла и присваивает его новому файлу, но сам старый файл остается на диске в неизменном виде (хоть и без имени), и ты сможешь без ошибок его дочитать до конца.
> Могу только сохранять в файл, БД нету
Вообще, есть встраиваемая БД SQlite, она работает с файлами и она умеет делать блокировки при чтении и записи. БД решает проблему блокировок за тебя.
> Или может файл открыть с помощью fopen, блокировать
Можно, но в промежутке между открытием и блокировкой другой процесс может тоже успеть открыть файл на запись и обнулить его, прежде чем упрется в блокировку. То есть, возможно, будет так:
Процесс 1 открывает файл на чтение Процесс 2 открывает файл на запись и этим обнуляет его Процесс 1 успешно берет блокировку LOCK_SH Процесс 2 пытается взять блокировку LOCK_EX и ждет снятия блокировки первым процессом Процесс 1 читает обнуленный файл
Хотя я на 100% не уверен. Возможно, открытие файла (fopen) на запись не обнуляет его содержимое, а файл обнуляется только при попытке что-то записать (fwrite). Тогда все будет работать как надо. Можешь проверить это экспериментально, сделай скрипт, который просто открывает файл на запись (fopen с 'w') и закрывает его и проверь: обнулится ли открытый файл или нет.
> И что будет делать другой поток если ему встретится блокировка другим файлом? Он будет ждать или выдаст ошибку и прекратит работу?
Если поток попытается взять блокировку на заблокированный файл, то он остановится и будет ждать снятия блокировки. А если он не пытается взять блокировку, а просто делает file_get_contents или fwrite, то операция выполняется, игнорируя блокировку. Так как блокировки в PHP добровольные, а не принудительные.
- выполняется $x = func() - проверяется: если $x равен null, 0, "", "0", [] (лживенькие значения, false values) то условие считается не выполненным, иначе условие считается успешно выполненным и цикл продолжается.
Аналогично работает конструкция вроде while($x) или if ($x): если в $x лживенькое значение, то условие не выполнено, а если что-то другое (например: не пустой массив) то условие успешно выполнено.
>Выбирает одну строку данных из результирующего набора и возвращает её в виде массива, в котором индексы элементов соответствуют номерам столбцов (начиная с 0). Каждый последующий вызов функции будет возвращать массив с данными следующей строки набора или null, если строки закончились.
Так уже яснее стало. Перечитывание документации помогает.
>>1992145 Спасибо анон пока решил проблему с переименованием, вроде всё работает, хотя в временной папке появились пустые файлы которые не удаляются, сдаётся мне где-то проскакивает ошибка даже во время переименования которая ломает сам php что он оставляет нулевые файлы, завтра попробую их удалить ещё раз может какой-то кеш их защищает, а так да придётся склайт освоить, есть какой-то хороший русский гайд с простейшими примерами без ООП? Быстрый поиск выдал какие-то куски информации
Нормальная практика использовать Inheritance Mapping в Доктрине для хранения изображений для разных сущностей? Просто странно немного создавать пять пустых классов, которые просто будут наследовать Image.
Посоветуйте, для какого сайта парсер написать можно, чтобы было полезно. Какой-нибудь контент собрать. Я уже написал себе один, но там домен .onion и незаконные вещи. Хочу для портфолио что-то в ГитХаб добавить (на Хекслете еще обучаюсь, оттуда проекты тоже есть там, но хочу еще своё что-то сделать).
Для Двача уже есть такое ? Допустим, чтобы можно было все картинки/видео с треда скачать или с раздела (единственное, я хз, как это к браузеру прикрутить в виде расширения, я во фронте не бум-бум, поэтому буду просто скрипт на Убунте пилить).
Еще думаю, мб классификатор написать, чтобы собранный контент по папкам сам распределялся. У Яндекса или Гугла же сервисы для этого должны быть ?* Правда эт уже сложновато будет, но можно попробовать.
>>1982834 короче я заебался ждать от вас каких-либо контактов. с предложениями пишите в телегу @mrzpdr
Если коротко, то нужна йоба, которая построчно будет подставлять данные из таблицы (exсel, csv) в документы, готовые к печати (пдф). то есть на входе табличка с данными, на выходе - пак документов с подставленными данными количество документов соответствует количеству строк.
учтите пацаны, если я начну в итоге делать это сам, то я вас заебу вопросами. подумайте
>>1993589 >Ебушки воробушки, миллион лет ждал эту хуйню! Вот это двачую конечно, хотя восьмерка как мажорный релиз всё равно хуйня унылая. >Если когда-нибудь добавят дженерики и алгоритмическую либу под них, пых станет ультра-имбой и начнет теснить даже яву и си шарп на их поле. А это к сожалению нет. Современный пых уже давно далеко не похож на тот, каким он был в нулевых. Вот только видишь ли ты изменение его репутации с того времени хоть чуточку в лучшую сторону? Я не вижу. По-моему, единственной надеждой на спасение этого языка ну или последним гвоздем в крышку гроба, что не сильно хуже был P++, да только все интерналсы проголосовали против, включая автора RFC. Попахивает заговором
Надо смотреть логи ошибок, чтобы увидеть их причину, а не гадать. Что касается трюка с переименованием, он работает только в Линуксе. В Виндоуз, например, так сделать может не получиться.
Файлы остаются скорее всего из-за того, что программа падает с ошибкой где-то до переименования.
А мне не нравится. Это провоцирует написание кривого кода, где любая переменная может быть пустой из-за того, что корректно не проверяются ошибки. Вместо того, чтобы проверять ошибки, будут лепить эти null-safe операторы и в коде невозможно будет разобраться.
>>1993708 >Это провоцирует написание кривого кода Странная претензия чот. ТО есть if (!_is_null(huinya)) {} не провоцирует? По такой логике, все кроме простейших конструкций провоцирует. Просто сахар для сокращения и удобочитаемости же.
>>1993770 Они отличаются только классом, с которым у них отношение, ну и видом отношений ( One-To-One или One-To-Many ). И как ты предлагаешь это реализовать в одном классе с доктриной? Будет допустим таблица, в ней поля url и imageable_id. Ну допустим даже накостылил бы я поле "imageable_class" и буду вручную его задавать. Доктрина ж никак не поймет что при обращении к $post->images нужно искать в таблице images записи, где imageable_class = App\Entity\Post. Лучше уж тогда просто inheritance mapping использовать.
>>1993890 У тебя есть класс Image, он замаплен на таблицу images, а в нужной сущности есть поле Image/Images и связь с таблицей images по айди, ну либо таблица связей. Зачем тебе разные классы тут я не понимаю.
>>1958281 (OP) Пацы, у кого есть опыт собесов по скайпу? Меня прогоняли по тому, что было на прошлой работе, что знаю, что использовал и всё такое и назначили собес по скайпу. Как это происходит, будем мило болтать с тимлидом за чашечкой кофе, задачи через share-screen, гонять по теории или что? Как у вас было?
Есть данные, сохранененные в сессию, стоит session.gc_maxlifetime ебовый и лайфтам сессионной куки ебовый, около недели. Данные из сессии выводятся на форму. Вижу, что PHPSESSID в куке остается тем же, но данные на форме через некоторое (рандомное) время исчезают. В какую сторону копать?
>>1993890 >Доктрина ж никак не поймет что при обращении к $post->images нужно искать в таблице images записи, где imageable_class = App\Entity\Post. Нихуя не понял, что ты делаешь. У самого примерно такая же структура, все заебись ищет. Из сущности делаешь запрос ->getImage() и всё ок. Там же по id связь.
>>1994035 По опыту моих нескольких собесов: - будут херочка и кто-то из менеджеров спрашивать базовые вещи и с чем работал, что писал, могут попросить примеры кода. - будет тимлид или ЧСВшный синьор-помидор, будет спрашивать и качать головой типа какой ты убогий. Спрашивать будет примерно ту же хуйню что и верхние, пояснять почему ты убогий тоже не будет - он сам не знает и делает это чтоб продавить тебя по зарплате. - будут левые пацаны, которые замутили бизнес на коленке и пока сами ещё не знают что спрашивать. Ждать можно что угодно - от нормальных вопросов, до в стиле "почему крышки люка круглые?"
>>1994035 И самое главное - собес не означает трудоустройство. Будь на похуе и даже не думай волноваться - это просто досужий пиздёжь, по большому счёту. Как пройдёшь с десяток таких, то сам поймёшь.
>>1994511 >>1994510 Спасибо большое, анон! У меня очень слабые нервы. После съёба со старого места работы всегда несколько месяцев отдыхаю чтоб нервы восстановить. Мне всё равно сейчас, попаду я на эту должность или нет, но страх обосраться никак не исчезает.
>>1994514 >Мне всё равно сейчас, попаду я на эту должность или нет, но страх обосраться никак не исчезает Скорее всего нет - первый собес почти всегда провальный. Посмотришь просто, что ничего особенного.
>>1994517 В том то и дело, что собес не первый, я до этого несколько раз обосрался ну и несколько раз прошёл, поработав по стеку год, а страх так никуда и не девается. Видимо, пора к психиатру.
>>1994520 Видимо недостаточно собесов было. После пары десятков собесов в основном провальных уже на похуях прохожу или не прохожу. Начал относится к собесам как к игре. Планирую, на что и как отвечать, какие вопросы задать, как себя повести.
>>1993975 >ну либо таблица связей. Точно, почитал доку, вспомнил что можно городить One-To-Many-Unidirectional связь через костыль как Many-To-Many с уникальными id изображений в промежуточной таблице. Но как-то муторно это. С inheritance-mapping то же самое в два клика делается, еще и красиво это всё по-моему, в одной таблице концентрируется, а не по всей базе размазано. Но я так понимаю, на практике все делается предложенным тобой способом.
>>1994737 Лара это вообще почти как CMS считай. Можешь столкнуться с болью, пытаясь применять нормальные паттерны и практики в среде ебанутых антипаттернов ларки и таких же ебанутых кодеров на ней. у меня такая детская травма присутствует Если уж к тебе во сне пришел Иисус и сказал что нужно стать пыхарем или ты умрешь через год, то может все таки Симфони? Зайдешь как по маслу: те же концепции, те же аннотации с теми же названиями и параметрами, те же принципы и т.д. Хотя, лучше всего выбей дурь из головы и уходи из треда. Если начальство вынуждает или еще кто-то, шли их нахуй.
>>1994805 Два чаю этому >>1994776 господину. Если проект позволяет, можешь хотябы прикрутить на лару Doctrine, она больше похожа на Hibernate. Но от некоторых подходов лары, после спринга у тебя все равно шары на лоб полезут.
>>1994805 Лол, а говорят рынок перегрет, хуе мое, требования космические, специалистов имея в виду не вкатывальщиков с курсов, конечно, их то достаточно в тыщу раз больше чем вакансий и прочее. Хуй там правда, джуна на лару найти не могут.
>>1994896 Это как раз нехороший знак, что спеца с норм стека пересаживают на стек похуже. Сначала ухудшаются условия работы, а следом пойдут снижения зп и сужение рынка вплоть до битриксов
>>1994954 Ну с битриксами ты конечно загнул. Уже даже в провинциях понемногу переходят на что то более вменяемое, это говно могло расти только в условиях тотальной безграмотности кабанчиков.
>>1994896 >джуна на лару найти не могут Не "не могут", а "не хотят". У некоторых контор требования как к иному мидлу не прёдъявляют. Меня лично какой-то важный и опытный опущ спрашивал про опыт с высокими нагрузками, когда я к ним на джуна шёл. Порой пишут стек 100% твой, и даже предлагают типа "мы научим и покажем как и куда, только хотя бы азы знай и куда там эту sql-строку пихать", пишешь им - "сам знаю куда строку пихать, писал то-то и то-то, вот вам пример моей работы, вот исходники - смотрите, буду радостно развиваться и даже денег много просить не хочу" и тишина блядь. У других висит вакансия - нужен разработчик, пишите на мыло. Стек мой - пишу, что умею, пруфы даю и тоже, сука, мороз. Со всей этой индустрией что-то сильно не так.
>>1995132 Уже мысли с лары на битрикс\вордпресс перекатываться т.к. там кабанчики в личку регулярно пишут с предложениями. Давно бы перекатился, да не нравится мне там код и подходы.
>>1995180 >Гит, sql, сервера Я сперва написал всё, что пробовал и игрался, но писали не очень активно. Сократил до 10 именований где-то совет увидел - стали писать активнее, но всё какое-то левое. А так конечно - гит даже на своих проектах юзаю гениальная штука, sql умею, но всё больше на ОРМ последнее время, сервера - апач, нжинкс. SSH, Ubuntu server норм знаю - на ноуте игрался полгода с ней ещё до вката в ПХП. Хз что не им так. На собеседованиях не матерюсь и мамок не ебу. Может стоит начать?
>>1995190 Без понятия чесно говоря почему так. У нас приходили джуны, незнакомые с ООП практически даже, зато с миксом разной херни на гитхабе, брали на испытательный, один из двух выреб даже, второй по учебе слился. Единственное может скажу, не бойся писать в крупные галеры, даже если стек не совсем подходит а то вдруг стесняешься и пишешь откровенным васянам в студии онли. Ну и на гитхаб что нибудь по алгоритмам например залей для солидности, а не онли бложики на ларе.
>>1995203 >У нас приходили джуны, незнакомые с ООП практически даже Вот и я в ахуе от ситуации. Может это из-за того, что на удалёнку лезу? Попробую алгоритмов в гитхаб накидать - не проблема.
Такой вопрос ньюфажный. Так или иначе, сейчас почти весь современный веб на реактивных фреймворках. И хоть тут бывает начинаются холивары о том что они не нужны и twig с jQuery удобнее, но против тенденций не попрешь. Так вот, изучаю тут Симфони, уже убедился что Symfony Forms воистину очень крутая и мощная вещь. Но... Как эти формы вообще комбинируют с фронтендом на каком-нибудь Vue? Упустим простые примеры, рассмотрим более-менее сложную форму с CollectionType'ами, несколькими уровнями вложенности сущностей и т.д. Вот я ее прописал на бэкенде, отправил в twig, в шаблоне написал {{ form(form) }} и все, у меня все готово. Ладно, на самом деле нет, надо еще прототипы вывести и на jQuery с их помощью сделать кнопочки удаления и добавления элементов в коллекцию. Но всё равно работы на 5 минут. А что люди делают если весь рендеринг на джаваскрипте? В доке этому, блин, ни слова не уделено. Ввел в гугл "symfony forms vue", что-то мне увиденное не понравилось. В основном советуют выводить по api на фронт уже отрендеренную на бэкэнде форму. Как-то не очень это, фронтовик получается никакой власти над этой формой не имеет, на каждый пук приходится в php лезть. А в таких случаях это ведь два разных проекта. Еще и, получается, все вокруг на фронте реактивно и завязано на объектах, а добавление/удаление элементов в форме внезапно осуществляется старым дедовским способом через прямую работу с DOM-деревом, лол. Еще прочитал статью от чела который тонну костылей на бэкэнде нагородил, чтобы отдавать эту форму в виде адекватного JSON, и еще тонну костылей на фронте, чтобы слепить с этого JSON форму во вью компоненте. Похвально конечно, но я уверен что больше никто таким не занимается. Пока что мне таки кажется, что самым нормальным решением в таком случае будет лепить такую форму на фронтенде с нуля. Хотя подводные камни есть, и времени это тоже много займет. Такого кстати совета я в интернете не встретил.
Так вот, мудрые аноны, у вас на реальных проектах были такие проблемы? Как решали?
>>1995343 >twig с jQuery удобнее, но против тенденций не попрешь Нет никаких тенденций - есть бюджеты и требования к проекту. Пилить полноценные микросервисы нет никакого смысла для простых сайтов без сложного взаимодействия на клиенте. Тот же двоч - без фронтенд-фреймворков работает, если ты не заметил, как и подавляющее большинство интернета. По моим наблюдениям есть некоторый избыток фронтенд-разработчиков уже - общался с некоторыми начинающими студиями и вот там всегда есть фронтенд, а то и не один, уже со старта, при отстутсвии всех остальных.
>>1995544 >Зарплатные вилки Потому, что нужны только в больших конторах, а у тех деньги есть. А в мелких студиях больше мешают со своим Vue - мне предлагали микросайты за 5к на этом Вью пилить, в другом месте "фронтенд-разработчик" себе отдельно верстальщика требовал, потому, что не умел верстать - он дескать погроммист у мамы, и не для того его роза цвела. Кстати частое являние у макак. Если же рассматривать фронтенд-разработчика как универсала, которому можно отдать клинетскую разработку в любом виде, то да - везде нужны и цены будут расти.
>>1995623 >он дескать погроммист у мамы, и не для того его роза цвела. Кстати частое являние у макак. Ну это охуевший в край бездарь просто. Странно что держат вообще. Везде, где я знаю фронта за такие заявления выкинули на мороз бы сразу.
>>1995168 >>1995190 Довольно средний стек средненького кодера :) Извини, но чтобы доказать компаниям, что ты достоин рабочего места, нужно нечто большее, чем быть просто средненьким специалистом :) HR-тян
Аноны, васяню приложуху за деньги лол, короче суть такова что архитектура у меня чет не получается. Не очень пойму как по сервисам раскидывать нужно. Если просто - есть у меня в контроллере ( понятно что бизнес-логика не в контроллере, а в каком нибудь классе который в общем описывает то что должно твориться по этому роуту ) нужно вызывать "сервис" генерации отчета exel. Суть в том что этот сервис у меня из разных контролеров может вызываться. Сам сервис в каталогк "сервисы" сидит. Но чето у меня оч высокая и кривая связность всего этого.
Если в общем - мне какой то приближенный к реальности пример нужен, а то у меня чет какая то хуита выходит.
>>1995343 >Как эти формы вообще комбинируют с фронтендом на каком-нибудь Vue? Я с Symfony не знаком, но скорее всего никак. Разве что оставляют валидацию входящего запроса. UI отрисовывается полностью на фронте. >В основном советуют выводить по api на фронт уже отрендеренную на бэкэнде форму Мне приходилось быть по обе стороны баррикад, и я делал и бэк, и фронт, и с точки зрения фронтера могу сказать, что за такое надо по рукам бить. >Еще прочитал статью от чела который тонну костылей на бэкэнде нагородил, чтобы отдавать эту форму в виде адекватного JSON, и еще тонну костылей на фронте, чтобы слепить с этого JSON форму во вью компоненте. Только вот какой вообще в этом смысл? Единственное применение этому, которое я вижу, это если у тебя какая-то охуенно сложная динамическая форма, состав полей которых фронтеру заранее неизвестен. Но такое редко случается.
>>1995419 >Нет никаких тенденций - есть бюджеты и требования к проекту. Ну ок, допустим бюджет хороший, из требований - шобы все было модно стильно как у других кабанчиков, перед пацанами не стыдно. Тебя если такое попросят, ты с работы уволишься и будешь искать веб студию где позволят на jQuery писать? >Тот же двоч - без фронтенд-фреймворков работает, если ты не заметил, как и подавляющее большинство интернета. Подавляющее большинство интернета - это магазины на CMSках. А я написал "почти весь современный веб". >>1995668 И я о том же самом
>>1995648 >Странно что держат вообще. А они по-корешам с организатором вроде как были. Когда он мне начал диктовать - на чём апишку и админку делать, то был послан в пешее. Но было забавно смотреть как он пытался завязать на себя разработку, ничего не умея по-сути и всё дико усложняя, только чтобы ему таски перепадали. У них так и не вышло ничего вроде как. Я, наверное, про таких и писал в посте - пиздос у меня тогда от него пригорело. Но таких уебанов и потом ещё встречал и всегда были без работы.
В гитхабе не забудь про РИДМИ с картинками и поясняющим текстом. Рекрутеру шлют по 100 гитхабов в сутки, ему некогда там в твоем коде самому выискивать подробности.
Есть такой вариант: преобразовывать форму в JSON, там клиент ее отрендерит и пошлет на сервер данные аяксом, эти данные на сервере запихиваются в форму, проверяются и клиенту шлются ошибки.
Минус в том, что надо писать преобразователь формы в JSON (со всеми подробностями) + на клиенте надо писать построитель формы из JSON. Плюс в том, что если форм много, то тебе не надо будет их делать руками.
Можно сделать частично: в HTML форма рисуется руками, а данные на сервере проверяются с помощью формы из Симфони. Так не придется делать преобразователь и построитель. Но будет много рутины по программированию инпутов и селектов.
Есть и другие варианты. Отказаться от форм и использовать Symfony Validator, который может валидировать произвольный объект по правилам в аннотациях. Данные, пришедшие аяксом, с помощью какого-нибудь Serializer преобразовывать в объект, и валидировать его. Но я не уверен, что делать, если при валидации надо обратиться к какому-то сервису из контейнера.
Так или иначе, если форм много, то нужен будет какой-то построитель, либо на основе Symfony, либо на JS фреймворке. Иначе нарушится принцип DRY.
> Похвально конечно, но я уверен что больше никто таким не занимается.
Не надо смотреть, кто чем занимается. Особенно если речь о фронтендщиках - это специалисты по переизобретению велосипедов и наступанию на грабли. Надо выбирать то, что больше подходит под задачу. Сравнивать плюсы и минусы.
Ну и по моему, "реактивный" фронтенд мало где реально нужен. В какой-нибудь админке (а где еще бывает куча форм?) он даром не нужен.
Если ты хочешь взять, например, букву номер 20, но в строке всего 10 букв, надо выводить пробел вместо нее. А ты ничего не выводишь, и от этого строки съезжают влево.
Также, не забудь убрать из кода магические числа вроде $i < 33.
В сервисы помещается бизнес-логика. То есть, действия, для выполнения которых написано твое приложение, но без взаимодействия с пользователем. То есть в сервис мы не передаем POST, GET (или их заменитель Request), не генерируем там HTML-страницу.
Если, например, у твоего сервиса генерации отчета есть какие-то параметры, то ты не бросаешь ему весь массив POST со словами "сам ищи свои параметры", а передаешь их отдельно или даже делаешь для этого специальный объект.
Сервис может использовать другие сервисы (обычно через dependency injection). Ну например, если для генерации отчета надо получить какие-то данные, он может обратиться к другому сервису.
> а в каком нибудь классе который в общем описывает то что должно твориться по этому роуту
Сервис ничего не должен знать о роутах, это забота контроллера.
> Но чето у меня оч высокая и кривая связность всего этого.
> Разве что оставляют валидацию входящего запроса. UI отрисовывается полностью на фронте.
Это плохой подход, если форм много, так как при добавлении поля в форму надо лезть в фронтенд и там руками добавлять инпуты.
> Только вот какой вообще в этом смысл? Смысл в том, что ты описываешь форму один раз на сервере и не пишешь руками однотипный HTML для каждой новой формы.
>>1996219 >Это плохой подход, если форм много, Это плохой подход для твоих микропроектов, которые полтора васяна-оркестра лепят, не проецируй его на всю индустрию плз. >Смысл в том, что ты описываешь форму один раз на сервере и не пишешь руками однотипный HTML для каждой новой формы. Вообще ахуеть. Про банальные компонентны ты видимо не слышал. В любой уважающей себя продуктовой галере тебя с такими историями отправят чистить древнее легаси вилкой и к нормальной разработке близко не подпустят. А ты еще без стеснения такое втираешь тут, пздц.
Я искренне непонимай, откуда вы блядь лезете постоянно такие пещерные? Из 2005го?
>>1996240 >проецируй его на всю индустрию Ты сейчас сам проецируешь свой подход на всех остальных. Кто сказал, что подход помойной галеры на пару сотен сотрудников есть смысл использовать вообще везде?
>>1996252 >Не могу, у меня культ лучших практик головного мозга. Тогда лучше закрой этот тред навсегда. Тут такие best practices советуют каждый день, что понять где жирнота, а где необучаемость тяжело. >>1996261 Где ты видел фулстак-макакенов, кроме веб студий сейчас? Или вебстудии у нас на острие индустрии для тебя? Разделение фронтенда и бэкенда произошло еще в начале десятых, а ты неможешь этого принять и живешь в манямирке, еще и сюда свою шизофазию постишь. Не хочешь учиться и развиваться - смирись и оставайся на обочине, это айти 2020х, дедушка.
Что скажете за использование Vue не для SPA? Например, там, кнопку лайка на нем сделать, добавления в избранное, прогрузку комментариев и т.д. Вью вроде как намного меньше весит чем тот же jQuery, легко интегрируется в проект на Симфони и Ларе. Прикольная концепция хранения скриптов и стилей в одном файле с компонентом. Читать и расширять vue-компонент намного легче, чем лапшу на jQuery. Могу тут до бесконечности продолжать, но это всё лишь мои фантазии, а мне интересно ваше мнение послушать. Покрывает ли Vue достаточное количество случаев, чтобы использовать его вместо jQuery? Видели ли где-то такое на проде?
>>1996219 >Это плохой подход, если форм много, так как при добавлении поля в форму надо лезть в фронтенд и там руками добавлять инпуты. Так это вообще можно сказать про любой запрос к API, лол. Добавилось/поменялось какое-то новое поле в ответе — надо лезть во фронт и менять его логику. Только плюсов реактивного SPA это не перекрывает. И тебя как бэкендера вообще не должно волновать, чо там на фронте, даёшь им документацию к API на каком-нибудь Swagger и пусть там ебутся как хотят :)
>>1996274 Звучит как какой-то костыль. Если у тебя сложный фронт и тебе уже не хватает JQuery, то стоит задуматься, чтобы сделать полноценный фронт на SPA-фреймворке.
Ты пишешь какую-то ерунду. Чтобы провалидировать форму, мы создаем ее описание на стороне сервера. Дальше, нам надо отобразить ее на клиенте. Это можно сделать двумя способами: а) получить с сервера описание формы (которое там уже есть) или б) повторно описать форму руками на стороне клиента. Вариант б) предполагает двойную работу, и требует обновлять обе версии формы (на сервере и на клиенте) при изменениях, в то время как вариант а) не требует что-то менять на клиенте.
При чем тут какие-то "мои" "микропроекты" и какие-то мифические "best practices", я не понял.
Мне кажется, что ты описал, как раз проще будет сделать на jQuery. или каком-нибудь его более легком заменителе, чем делать полноценный клиентский рендеринг и целое клиентское приложение. Также, ты думаешь, что вью "легкий", а какого размера получится бандл после вебпака? Наверно, не такой и легкий.
Подгрузка комментариев с сервера на jQuery займет строк 20, и это с обработкой ошибок (а делают ли правильно обработку ошибок все, кто тут советует везде пихать SPA? Уверен, что нет, ведь в best practices об этом забыли написать).
Вью нужен там, где есть сложный интерактивный фронтенд (построитель чего-нибудь, редактор чего-нибудь), или там, где нужно сделать что-то похожее на приложение (например, чтобы была работа при перебоях со связью). В блоге или интернет-магазине он даром не нужен, на мой взгляд (усложняет разработку, утяжеляет фронтенд, замедляет рендеринг сайта).
Если где-то так делают, это не значит, что это правильно. Когда форм много, гораздо разумнее настроить автоматическое отображение форм на основе конфигурации с сервера (кстати, ее логично не запрашивать аяксом, а вшить в фронтенд-приложение).
Пасаны, вот я хочу проверить если ли слово в строке с помощью strstr(), а как проверить несколько слов без запуска цикла? Есть функция в которую можно передать строку и проверить в ней наличие нескольких слов? Здесь подойдёт только preg_match()?
>>1996313 >Вью нужен там, где есть сложный интерактивный фронтенд (построитель чего-нибудь, редактор чего-нибудь), или там, где нужно сделать что-то похожее на приложение (например, чтобы была работа при перебоях со связью). В блоге или интернет-магазине он даром не нужен, на мой взгляд (усложняет разработку, утяжеляет фронтенд, замедляет рендеринг сайта). В этом параграфе написан полный бред. >Вью нужен там, где есть сложный интерактивный фронтенд SPA-фреймворки убирают необходимость манипуляций с DOM, автоматически обновляя его при изменении состояния приложения, и нет, это полезно не только в охуенно сложных приложениях. >или там, где нужно сделать что-то похожее на приложение То есть 90% современных проектов? Потому что уже давно трендом в UX является предоставление пользователю опыта, близкого к использованию нативных приложений. >например, чтобы была работа при перебоях со связью То есть, опять же, подавляющее большинство современных проектов, потому что сейчас бОльшая часть трафика веб-приложений идёт с мобилок, где со стабильностью связи всё очень не очень. Конечно, обеспечение полноценной работы в оффлайне — это довольно редкий кейс, но вот показать юзеру надпись "Вы оффлайн" и отображать данные из последнего состояния приложения при навигации — кейс вполне себе актуальный. >усложняет разработку Усложняет разработку только на начальном этапе, потому что тебе придётся учить новую технологию. Как только освоишься, то ничего оно не усложняет, наоборот, поддерживать и разрабатывать SPA намного проще, чем лапшу на JQuery, потому что там есть устоявшаяся архитектура, паттерны и best practices. >утяжеляет фронтенд, замедляет рендеринг сайта Ты упускаешь охуенно важную деталь: это актуально только при первой загрузке приложения либо при выпуске обновления. Если у тебя на серваке нормально настроено кэширование или если ты используешь service worker, то при дальнейших загрузках приложение будет загружаться очень быстро. Также есть разбиение приложения на чанки и ленивая подгрузка модулей, а ещё есть SSR.
>>1996313 >Если где-то так делают, это не значит, что это правильно. Когда форм много, гораздо разумнее настроить автоматическое отображение форм на основе конфигурации с сервера (кстати, ее логично не запрашивать аяксом, а вшить в фронтенд-приложение). Бумер, ты реально в 2006м застрял? Сейчас фронт это отдельное приложение в отдельном репозитории, которое деплоится на отдельный сервак отдельным CI/CD пайплайном. Ну какое нахуй вшитие конфига с бэка на фронт? Уже давно в тренде полное разделение бэка и фронта. Мухи — отдельно, котлеты — отдельно.
>>1996408 Ты на тролля похож, смысл тебе отдельно разжевывать? Хотя ладно: >Развек что в твоем манямирке Читай выше, магазины на CMSках к современному вебу я не отношу. >Ты вопрос нормально задай. Как вью конфликтует с формами симфони? Ну видишь, после моего вопроса тут у одного молодого человека с не очень молодым возникла дискуссия насчет разных подходов к решению этой проблемы. А ты похоже самый умный, раз никакой проблемы не видишь и всё очевидно. Может быть поделишься мудростью? Или я это все зря пишу?
>>1996430 Зачем ты ему пытаешься доказывать что то? Там чел кроме любимой цмсочки ничего не видел уже лет десять. jQuery блять в 2021, jQuery карл! Этот объёбыш даже про современный js не слышал, о чем ты ему рассказываешь. CI какой то, пайплайны блять, с таким же успехом можешь еще про контейнеризацию и событийную модель своей бабушке рассказать. Я не удивлюсь, если он еще и процедурно свое говно хуячит и нахваливает.
>>1996430 >Ты на тролля похож, смысл тебе отдельно разжевывать? Мне тебя и твоего дружка искренне жаль, честно. Зашел глянуть как тред поживает, а тут такое.
> Хотя ладно: Ладно что? Ты либо вопрос нормально формулируешь - либо нахуй идешь. Так не только на дваче, привыкай
>Ну видишь, после моего вопроса тут у одного молодого человека с не очень молодым возникла дискуссия насчет разных подходов к решению этой проблемы. Ты сюда зачем пришел? Кому то что то доказать? Нахуя мне гора бесполезного текста? Мне ебать что ты там думаешь, и в каком современном мире ты живешь. Если не умеешь мысль адекватно выражать - бери своего дружбана-студента, который брызжа слюной метает слова аля "ci, пайплайны, контейнеризация", не понимая что это вообще такое, связано ли это с сабжем, и сталкивался со всем этим разве что у очередного блогера на ютюбе, и идите оба нахуй отсюда
>А ты похоже самый умный, раз никакой проблемы не видишь и всё очевидно. Может быть поделишься мудростью? Или я это все зря пишу? Проблемы запихнуть вью в твиг? не вижу. Как это мне мешает выводить формы? Ты хочешь формы кастомизировать? Это делается стилями и жсом. Что еще тебе нужно? Я не вижу проблемы от слова совсем. Если у тебя спа-админка на реакте, о каких симфони формах речь может идти?
>>1996464 >Мне тебя и твоего дружка искренне жаль Еще и уровень дискусии прямиком из одноклассников. >Мне ебать что ты там думаешь Ну бывает, тебя просто пару раз мокнули в твою же неграмотность, чтобы другие аноны всерьез твои шизодные высеры не воспринимали. > и идите оба нахуй отсюда Нихуя начальник двача разбушевался.
Дед, проснись, у тебя джиквери из вордпреса опять протекает, иди чини.
>>1996464 Пиздец у тебя мозги отсохли, завязывай лучше с CMSками, это действительно приводит к деградации. Ощущение что ты вообще вопрос не читал и сам с собой разговариваешь сейчас. Я прямо спросил, отдают ли люди форму с бека на фронт и каким образом. Два нормальных человека вопрос поняли и начали обсуждать плюсы и минусы данных подходов. А тут ты, словно король заваливаешься, и выдаешь перл >Проблемы запихнуть вью в твиг? не вижу. Как это мне мешает выводить формы? Ты хочешь формы кастомизировать? Это делается стилями и жсом. Что еще тебе нужно? Я не вижу проблемы от слова совсем. Просто пиздец, у меня слов нету. Я уже молчу о том, что ты вопрос мой не понял. Но какой нахуй TWIG вообще? Ты знаешь хоть что такое Vue? Ты знаешь что такое SPA? Да ты вообще похоже даже представить себе не можешь, что фронт и бэк могут быть разделены, это за гранью твоего понимания.
Пиздец, мне плохо уже, нахуй я в этот ебучий пхп подался? Предупреждали же меня не раз. Таких как ты ведь тысячи, у вас мозги от маразма поплыли, вы уже не понимаете какой на дворе год и не помните как вас зовут, зато ваши закостенелые пальчики еще как-то по инерции пишут хоть и плохой, но как-то работающий код. Я просто боюсь, что когда в моем городе появится вакансия для джуна на симфони а таких уже пол года не было, я туда приду и встречу в команде таких же идиотов как ты, которые будут меня жизни учить. Конечно же сразу уволюсь и буду еще пол года ждать следующую.
>>1996464 Чувак, я с этим сталкиваюсь не у блоггеров на Ютубе, я с этим сталкиваюсь на работе постоянно. Я хз, может мне повезло попасть в компанию, в которой это всё реально применяется, но я так не думаю. Открой любую вакансию на фронтера и я почти уверен, что в требованиях ты найдёшь там вовсе не JQuery, а React / Angular / Vue, какой-нибудь стейт менеджер и опыт работы с RESTful API / GraphQL. Конечно, есть вероятность, что они все врут и на самом деле тебя посадят ковырять говно на JQuery, но что-то мне подсказывает, что это не так.
Не понимаю, почему бумер так копротивляется за формы и шаблонизаторы? С точки зрения бэка это же наоборот круто, когда ты просто отдаёшь фронтеру API и тебе вообще не надо с фронтом ебаться, тупо чиллишь.
>>1996503 Видимо когда десяток лет клепаешь шаблонную хуйню - мозг атрофируется и перестает воспринимать новую информацию. Таких и называют веб-макаками и негативное отношение комьюнити к вебу, пыхе и джсу сформировалось на фоне именно таких формошлепов.
>>1990077 PHP будет актуален, и для РАБоты это заебись
Но как первый язык, конечно, печальный вариант. Если нужны прям настоящие знания -- начинай с C. Если только прикладные для работы -- бери РНР и не парься.
>>1996479 >Я прямо спросил, отдают ли люди форму с бека на фронт и каким образом. Отдавать форму с бека для спа на реакте? Чёт даже не смешно уже
>Пиздец у тебя мозги отсохли, завязывай лучше с CMSками При чем тут cms. С чего ты думаешь что я с ними работаю? Ты правда ещё не понял, что с двумя разными людьми общаешься? Пиздец развелось вас
>ты знаешь хоть что такое Vue? Ты знаешь что такое SPA? Я то знаю и работаю с этим, а вот у тебя, видимо, провал в этом. С каких пор любой приложение с использованием vue должно быть spa? Это тебе кто такое сказал, или где это написано? Если это спа, то как и для чего тебе формы с бека отдавать. Пойди в жс тред и спроси у ребят, которые на реакте работают - как им такая идея.
>Я просто боюсь, что когда в моем городе появится вакансия для джуна на симфони а таких уже пол года не было, я туда приду и встречу в команде таких же идиотов как ты, которые будут меня жизни учить. Не напрягайся ты так, лучше на манерами поработай. Если ты прочитал что такое spa и как это в двух словах работает - не стоит говорить об этом так, будто это единственный и верный вариант. Ведь в большинстве случаев ты сядешь жопой в лужу (например, как сейчас).
Я весь тред не читал, но заходит ли Оп? И тот ли ОП это?
>>1996283 >а больше это сколько Неебу - из описания задачи мало конкретной информации. Что за модули? На сайт какой-то или что? Интерфейс нужен или нет? Ещё пачка уточняющих вопросов по ходу дела. Никакой кастомный код не стоит 20$ - 1500 рублей. Это цена одной копии плагина, который продают сотнями штук.
>>1996360 >позвонили, позвали в относительно крупный проект, приложение для таксы. На Симфони нахуй, хотя я даже Yii не трогал. Мне тоже пишут такие, но там нужны мидлы и синьоры на тот стек, где я не работал почти. Последнее предложение даже ножкой топнули и требуют ответа, но там требуют переезда и я не готов внезапно сорваться куда-то в даль пока что.
>>1996501 >любую вакансию на фронтера и я почти уверен, что в требованиях ты найдёшь там вовсе не JQuery, а React / Angular / Vue, какой-нибудь стейт менеджер и опыт работы с RESTful API / GraphQL. jq не для фронтендеров, а для бекендеров, которых посадили ажакс на фронте дёргать и шаблончики натягивать. Действительно - требовать жиквери от фронтендера это ебануто и слишком просто, это уровень веб-мастера из прошлого десятилетия, если человек кроме этого ничего не знает.
>>1996503 Просто тупых хипстеров почти нигде не любят. Дело не в технологиях, а их бездумном использовании без оглядкина целесообразность. Ты - тупой хипстер от фронтенда.
>>1996787 Ты старый пердун-бумер. KEKW. Не шаришь за ci, контенеризацию, паплайны. GraphQl.Тебе о чем нибудь говорит? Нет, конечно. Вы старые никчемные говнокодеры. Я - умный и прогрессивный. Смотрите еще че могу: синглтон, тайп скрипт, кубернетс, дженкинс. Видали? Так че, как там симфони формы моему ручному 200k/nansec фронту отдавать? А то он на ангуляре пишет (мертвый фреймворк, вообще все мои хоуми юзают vue.), сидит чета дрочит, мямлит - не выходит у него, в общем. Ну я ему и говорю: "Забирай свои формы и сьебывай. А я пойду на дваче в пхп треде спрошу, как их кастомизировать на этих ваших жс фреймворках". В современном мире, вообще то, все сайты так работают. Это у вас в ваших отстойниках цмс одни на жквери лол! И вообще жквери это так, прошлый век. Кореш у меня есть один - серьезный фронтендер, даже тайпскрипт знает. Помню рассказывал он мне, что взяли его стажироваться в одну галеру, а там проект - ну пиздец 19век. Админка, которой 15 человек пользуются, да и на шиблонизаторе ебаном, прикиньте? Ну типа тоже js,css, html, местами компоненты вью, но это же не spa-ебана рот. Ну он дело в свои руки взял, прошелся с вопросом о переписывания админки на spa по всем: от местных джунов до пмов других проектов. Ну его короче выгнали вы поняли да? Тупые старые пердуны-бумеры-цмсники не захотели переписывать админу, которой 1.5 года на новое современное спа приложение, я ебал почему они такие упертые?
>>1996479 >Пиздец, мне плохо уже, нахуй я в этот ебучий пхп подался? Предупреждали же меня не раз. Да, зря. На скольких проектах не был, везде либо олдскульный фулстек на пхп+жиквери с фреймворками офк, либо то же самое, но с разговорами и тщетными попытками перехода на SPA.
>>1996793 Помню когда вкатывался только, то тоже так же себе всё представлял - всё будет модно-современно, весело, чисто и красиво. А когда с реальными проектами поработал - теми, которые людям деньги приносят, и порой неплохие, то сразу эта дурь из головы вышла. Неофитов на этом легко спалить - они из детских туториалов не выросли ещё и не видели некоторого дерьма, и поэтому прибывают в стране радуги и поей. Почти как таксисты, когда думают, что программисты за нажимание кнопок деньги получают.
>>1996803 У меня была админка на реакте. Кончилось жуткой хуйней и жопоеблей.
Когда начали вылезать кейсы типа "юзер вбил хуету, нельзя сохранять в БД, нужно написать ему жирно-красным цветом наверху что он долбоеб и пытается провести неоплаченный документ" (к примеру), реакт показал свое истинное лицо и начал ебать. Когда полезли массовые обновления стейта с бека начался пиздец.
Реакт - это не волшебный мир розовых единорогов, это достаточно ёбнутый фреймворк с которым нужен крайне продвинутый опыт разработки. Если ты крутой опытный разработчик, детально представляющий себе бизнес-процесс задач и паттерны проектирования, то он принесет тебе больше пользы чем вреда. Вкатыш, научившийся делать на нем тудушки, со 100% гарантией сотворит на нем ад который придется потом выкидывать целиком.
>>1996845 Хз, я начал работать с 2019 года и сам лично никогда с шаблонизаторами не сталкивался даже, кроме случаев, когда надо было с бэка посылать отформатированный email. На моей памяти, у нас в компании было только 2 или 3 проекта, где делали "по старинке", во всех остальных проектах с клиентской частью бэк давал REST API, фронт был SPA. Единственное плохое с точки зрения технологий, с чем я лично сталкивался, это SOAP-сервисы в паре проектов.
>>1996849 Вангую, ты писал логику прям в компонентах, поэтому у тебя всё и посыпалось. Надо использовать стейт-менеджер (я, например, люблю MobX) и всю логику выносить туда, а копмоненты делать тупыми.
>>1996479 всем положить на твои петушиные маняфантазии и дроч на %библиотекинейм%, бизнес-заказчику нужен рабочий продукт за приемлемую цену и в кратчайшие сроки
>>1996919 >Ашоту нужен магазинчик за 30к Даже для битрикса похоже на сказку. Больше поверю в какой-нибудь конструктор магазинов, который за 30к тебе только развернут, а всякие доработки и поддержки пойдут отдельным чеком
> SPA-фреймворки убирают необходимость манипуляций с DOM, автоматически обновляя его при изменении состояния приложения, и нет, это полезно не только в охуенно сложных приложениях.
В тех случаях, когда манипуляция с DOM сводится к "вставить HTML, пришедший с сервера" или "раскрыть скрытый блок" выгоднее использовать jQuery, чем писать полноценное фронтенд-приложение.
Вот пример: показать первые 10 комментариев и сделать кнопку "показать следующие". Здесь выгоднее рендерить комментарии на сервере и подгружать их через JQuery (или его облегченный аналог). Это будет 20 строк на jQuery. При этом страница будет загружаться уже с отрендеренными первыми комментариями. Просто и удобно. Ты можешь при рендере шаблона вызывать вспомогательные функции из серверного кода. В то время как с фронтенд-фреймворком тебе надо будет переносить шаблоны на клиента, переносить все вспомогательные функции на клиента, загружать огромный бандл JS кода, делать аякс-запросы, чтобы отобразить первые комментарии. С Vue ты потратишь больше труда и получишь более тяжелый и медленный сайт.
Другой пример: форма, где при выборе опции надо показать/скрыть часть полей, сделать аякс-валидацию по мере заполнения. Опять же, решение на jQuery здесь более простое. Так как на сервере форму может рендерить фреймворк, а на клиенте пришлось бы ее руками составлять из элементов и удваивать объем работы.
> То есть 90% современных проектов? Потому что уже давно трендом в UX является предоставление пользователю опыта, близкого к использованию нативных приложений.
Ты опять вместо объективного рассмотрения плюсов и минусов (инженерный подход) смотришь на какие-то мифические тренды. Откуда ты взял эти 90%? Из своей головы? И даже если бы эти 90% были правдой, это ничего не значит, так как есть много некомпетентных разработчиков и глупо на них ориентироваться. Есть компании с жирными бюджетами, которые могут позволить тратить на разработку больше, чем она стоит. И так далее.
> Усложняет разработку только на начальном этапе, потому что тебе придётся учить новую технологию.
Неверно. Усложняет разработку, так как в итоге требуется написать больше кода для решения той же самой задачи.
> это актуально только при первой загрузке приложения либо при выпуске обновления.
Это актуально, если ты, например, из Гугла переходишь на сайт впервые. У многих сайтов не постоянные посетители, а именно случайно приходящие с других сайтов люди. А обновления сейчас принято делать непрерывно и каждый день.
> если ты используешь service worker,
Это одна из самых уродливых и кривых фронтенд-технологий. Ради кеширования тратить большой объем памяти на отдельный постоянно запущенный JS-процесс.
> есть SSR.
Это вторая уродливая и кривая технология. Как ты сделаешь SSR, если разным пользователям надо показывать разные страницы? Например, в интернет-магазине пользователю показывают стоимость и сроки доставки в зависимости от его города, выбранной валюты. SSR это нерабочая кривая фигня.
Выше я уже все расписал: >>1996297 . Либо ты автоматически конвертируешь и встраиваешь формы с сервера в фронтенд, либо ты делаешь двойной объем работы.
> Уже давно в тренде Зачем смотреть на тренды? Есть некомпетентные разработчики, есть компании, сорящие деньгами. Есть еще какие-то факторы, которых нет у тебя. Глупо на них ориентироваться.
Глупо ориентироваться на других. Вот кто-то пишет код на Си++. Значит ли это, что мы должны отказаться от PHP, и перейти на Си++? Вряд ли.
Ты написал какую-то фигню. "фронт и бек разделены" это не абсолютная истина, а один из возможных подходов. То, что кто-то где-то разделяет фронт и бек и потом делает в два раза больше работы при выводе формы, не значит, что остальные должны так же делать.
Что касается "разделения фронта и бека", я когда-то генерировал классы-модели в JS на основе классов в PHP. Так как у меня был редактор кое-чего и мне надо было работать с документом и на сервере и на клиенте. Чтобы с ним работать, надо было его представить в виде дерева объектов. Но не хотелось делать двойную работу и делать по две версии каждого класса (в JS и в PHP). Этот подход упростил мне жизнь.
Раз уж зашла речь про фронтенд, давайте еще объективно поговорим про их убогие технологии (или их неправильное использование). Какое-то время у фронтендщиков модно было использовать LESS и подобные препроцессоры. В них они пишут такой код:
.product { &__price { color: red; } }
Который компилируется в такой CSS:
.product__price { color: red }
В чем тут убожество? Умный анон уже наверно догадался, а если не догадался, то при такой записи, если мы захотим поиском по файлам найти, где задан идентификатор product__price, то мы ничего не найдем. Поиск по коду перестает работать. Я видел это убожество в нескольких проектах.
Поэтому я очень скептически отношусь к так называемым "фронтенд-специалистам" и их "best practices". Они пишут плохой код и не видят его недостатки.
>>1996876 Я её оттуда вытаскивал, лол. Делал не я, а какой-то хуй который так-же лечил про SPA, и съебался раньше чем все распидорасило. С тех пор у меня глаз и дергается при рассказах о том как это заебись.
В компонентах там не сильно много логики было, вполне терпимо. Гемморой возникал от того, что был рассинхрон того, что на клиенте и того, что на сервере - бекенд мог решить что так делать нихуя нельзя и зарезать любую операцию, после чего приходилось стейт компонента откатывать взад.
Стейтменеджер и использовался, но там был адовый говнокод (в значительной степени от меня, лол). Когда тебе там надо хранить штуки 3 формы которые могут менять друг-друга все перестает напоминать лаконичные примеры из документации.
Я реакт изучал по ходу дела, добил этот проект и съебался назад на няшный пых. Учитывая, что у наших фронтов регулярно всплывают проблемы на чем-то сложнее формочки быстрого заказа которые они решают с умным видом, заимел привычку травить эту публику в интернетах.
>>1997034 Та как бэ принцип "нормально делай - нормально будет" везде применим. Сам же пишешь, что на фронте говнокод был. Бек на пыхе тут принципиально мало чем отличается, разве что количеством вкатунов
>>1997031 >если мы захотим поиском по файлам найти, где задан идентификатор product__price, то мы ничего не найдем
Аргумент уровня б. Когда так пишут, то ОБЫЧНО есть конвенция что это лежит в файле _product.scss или чем-то подобном, поэтому ты не ищешь по всему проекту, ты знаешь в каком хотя бы файле это находится. Конечно, если ребята работали на отъебись, то будешь два дня искать где поправить, но это не значит сам подход плохой.
>>1996991 >Это вторая уродливая и кривая технология. Как ты сделаешь SSR, если разным пользователям надо показывать разные страницы? Например, в интернет-магазине пользователю показывают стоимость и сроки доставки в зависимости от его города, выбранной валюты. SSR это нерабочая кривая фигня.
Абсолютно так же, как это делается и на пхп, сср фронтенд фреймворков "уродливым" можно назвать потому что иногда нужно понимать где ты находишься, на клиенте или сервере, получается такой гибридный ком кода.
>>1996991 >SSR это нерабочая кривая фигня. Двачую. Сами сделали проблему и сами же её решили технологически-всратым велосипедом. Всё ради SPA даже тогда, когда оно не нужно и создаёт проблемы.
>>1997006 Всегда сперва проектируется. Херачить что получается это детский садик - штаны на лямках. Вернее даже - сперва неделю ходишь задумчивый и смотришь аналоги, выписывая идеи себе. Потом следующую неделю прикидываешь общее приложение и пилишь архитектуру нормальными словами технический проект или как-то так, на этом этапе всплывают почти все подводные, которые не заметил. Ну а когда всё расписано, то на код положить любая макака сможет с закрытыми глазами.
>>1996642 >Отдавать форму с бека для спа на реакте? Чёт даже не смешно уже > Если это спа, то как и для чего тебе формы с бека отдавать. Каком реакте, дед? Ты опять сам с собой разговаривать начинаешь, таблетки выпей Ну ведь ОП прямо здесь в треде отстаивает такую точку зрения, что это все дело нужно автоматизировать при большом количестве форм. А индусы на стакере советуют просто форму отрендеренную отдавать. Я решил спросить на любом анимешном форуме мнения людей. Почему я это всё повторяю специально для тебя, человека неспособного прочитать вопрос, зато громче всех смердящего? >Ты правда ещё не понял, что с двумя разными людьми общаешься? Пиздец развелось вас Это ты похоже не понял, что с двумя разными людьми общаешься. Что за бред шизоидный? >С каких пор любой приложение с использованием vue должно быть spa? Это тебе кто такое сказал, или где это написано? Не должно. Но когда голова твоя отойдет от пивасика, почитай хоть раз мой вопрос, не позорься. А пока что, пока ты не в состоянии, еще раз разжую: > Вот я ее прописал на бэкенде, отправил в twig, в шаблоне написал {{ form(form) }} и все, у меня все готово. > А что люди делают если весь рендеринг на джаваскрипте? Что ты отвечаешь? >Да засунь весь этот рендеринг на джаваскрипте в твиг, тю ебать, дурачок. И после этого ты спрашиваешь, почему я думаю что ты работаешь с CMSками? >Не напрягайся ты так, лучше на манерами поработай Ты свои то посты перечитай, неадекват. >>1997019 >Ты написал какую-то фигню. "фронт и бек разделены" это не абсолютная истина, а один из возможных подходов. >То, что кто-то где-то разделяет фронт и бек и потом делает в два раза больше работы при выводе формы, не значит, что остальные должны так же делать. Слушай, ну я в вопросе написал про "что люди делают если весь рендеринг на джаваскрипте". Это уже не вывод шаблонов в твиге, чего персонаж, которому я ответил выше, не понимает. И про то что это "абсолютная истина" я нигде не писал, возможно ты меня с кем-то спутал. Наоборот, я полностью поддерживаю твои слова о том, что моднявые технологии даром не нужны, когда заказчику нужно максимально быстро и бюджетно выполнить какой-то сайтец, на который будут заходить по 3 человека в день, без амбиций на дальнейшее расширение и поддержку. Но зачем мне равняться на худших, если можно на лучших? Чем плоха продуктовая компания, "сорящая деньгами"? Это мечта любого кодера, ты разве не в такой работаешь?
Читаешь тред и вахуе с этих гнилозавров. Пишут на всратом языке, который славен своими жуткими практиками, но вроде начинают появлятся адекватные инструменты, язык понемногу выходит на рынок серьезной разработки, веб становится живым и интреактивным, зарплаты на этом растут и все вроде хорошо. Но заходишь сюда и видишь типичного пыхера из мемасов просто. Визгливый, токсичный и неспособный выучить ничего больше того, что узнал в 2010 году, при этом с громким воем отстаивающий свою отсталость, как чтото хорошее, но ради чего? Выпендрится перед нубами на анонимном форуме для девочек?
>>1997338 Чаю. Они же когда-то были молодыми и шутливыми, доказывали другим дедам о преимуществах ООП, MVC, фреймворков и т.д., на что те деды плевались и отвечали: >Мань, то что ты начиталась умных книжек про всякие ООП не значит, что бизнесу это нужно. Пойми, они в твой код заглядывать не будут, бизнесу нужен только результат. >Процедурный стиль выигрывает по всем параметрам. В нем быстрее писать, вот "хуйня_нейм" у меня в процедурном стиле занимает 20 строчек. Ты бы эту же вещь написал в четырех классах, миллениал ебучий. >Эти же 20 строчек легче читать, и они все в одном файле, что немаловажно. Не нужно по классам бегать, искать кто кого вызывает, кто с кем общается, всё как на ладони. Зачем утяжеление на ровном месте? >Вот тебе бенчмарк: вызов глобальной функции и вызов метода класса. Вы же просто вставляете палки себе в колеса, делая код более медленным. >То что кто-то выводит html не через echo, а как шаблон, еще не значит что так должны делать все.
>>1997338 Просто никто не собирается подмахивать фронтенд-макакам, которые кроме SPA ничего не знают и знать не хотят. Такая-то детская маняпопытка всех построить и оправдать своё существование.
>>1997394 У тебя просто горит жопец, от того что у так называемых фронтед-макак зарплата больше, а за твой говнокод в 2021 не хотят платить столько же. Sad but true.
>>1996362 >SPA-фреймворки убирают необходимость манипуляций с DOM, автоматически обновляя его при изменении состояния приложения, и нет, это полезно не только в охуенно сложных приложениях.
Вот тут дико дваждую, васянил нативный JS для формы в которой много всяких AJAX списков + некоторое количество условно появляющихся полей. Как же меня заебала возня с DOM это пиздец просто. За неделю освоил вью по верхам - задышал просто пиздец как по другому. Стало приятно писать клиентские формы и логику в них.
>>1997464 пс вообще не понимаю прям батхерта от изучения react|angular|vue - что бы по верхам хрюкнуть - неделя, и вперед. Мне вью реально жизнь облегчил. И что важнее- я начал удовольствие от дрочки с написанием клиента получать.
>>1997476 Просто ты либо молодой, либо не сидел всю жизнь на жопе без амбиций в региональной веб-студии, выполняя ту самую работу и смотря сериалы по выходным, а шевелил мозгами. Те, кто бугуртят от необходимости изучения новых технологий и оправдывают это НИНУЖНОСТЬЮ - это просто несчастные люди у которых атрофировались соответственные участки мозга. Да, такое не только у заводских рабочих всяких бывает, сам в ахуе.
>>1997330 >Каком реакте, дед? Ты опять сам с собой разговаривать начинаешь, таблетки выпей Фреймворк такой, почитай на досуге. >Ну ведь ОП прямо здесь в треде отстаивает такую точку зрения, что это все дело нужно автоматизировать при большом количестве форм. >гррряяя вы старые и не прогрессивные, в моем современном мире все пишут спа на жс фреймворках >фронт не может написать форму на фреймворк-нейм, давайте будет отдавать ее с бека? >ой а как он с ней работать то будет((( Ну че, как? Сходил в жс-тред как я советовал? Сколько человек тебя послали нахуй?
>Пиздец развелось ВАС >Это ты похоже не понял, что с двумя разными людьми общаешься Ок, клоун
>почитай хоть раз мой вопрос Я прочитал твою кашу говна, и посоветовал тебе научиться формулировать вопрос нормально. Если же нет - дело твое, будешь послан нахуй любым адекватным человеком. Никто в здравом уме не захочет разбираться в маня-фантазиях вайтишников без опыта работы, которые эти маня-фантазии нормально сформулировать и структуризировать не могут.
>>Да засунь весь этот рендеринг на джаваскрипте в твиг, тю ебать, дурачок. >И после этого ты спрашиваешь, почему я думаю что ты работаешь с CMSками?
Проиграл с этого дегенерата. По этой причине я и писал, что соболезную тебе. Тяжело, наверно, делать вид что ты в чем то разбираешься, а на деле собеседников тупостью троллить
>Ты свои то посты перечитай, неадекват. Вполне адекватное послание тебя нахуй. Любой уважающий себя и своих коллег человек так поступит. Анскильный, необразованный, невоспитанный еблан без опыта, залетевший на борду и начавший раскидывать на борде говно аля " ну короче вы все цмс-говнокодеры, сейчас в современном мире все на спа, все юзер интерфейсы рендерятся на жаваскрипте епта. Шаблонизаторы прошлое столетие, сейчас они нахуй никому не нужны. Что? Отдавать приложение отрендеренное на жсе с сервера? Лооол, кек, лмао. Я же говорил что вы цмс-говнокодеры, да? Пиздец убогие. А че думаете, если короче нанять фронтенд-макаку, посадить его писать приложение на реакт/вью/ангуляр (хотя реакт и ангуляр ты видимо не выкупаешь что такое, блогер-ютюбер рассказал только про обоссаный вью, да?), а короче формы (пиздец рофл) мы будем отдавать с сервера. Ну типа автоматизация. Мне так индусы на стаковерфлоу написали. А вот писать код на том же vue и отдавать его отрендеренным с сервера можете только вы - ебаные цмс бумеры-деды (22y.o)
>рендерить приложение на сервере НЕ ОК >нанять макаку чтобы он нихуя не делал?? ОК >рендерить формы на сервере и отдавать их макаке ОК >макака ахуела, просит вернуть ему привелегию написать ебаную форму ручками с использованием нормальной технологии для этого предназначенной ОК >анон в шоке, а как же маня-автоматизация макак в природе?
Очень смешно. Большое спасибо. Нужно чаще в тред заходить, а не раз в пол года.
>>1997476 > изучения react|angular|vue А как же разделение ответственности. Ах ты старый цмс-разработчик с 2010 года. Сам что ли будешь вот это все трогать? Шок, эти вебмастера вонючие как же меня от вас тошнит. Вылечить бы вас >И что важнее- я начал удовольствие от дрочки с написанием клиента получать. Нахуя, если можно написать спа на вью, а потом с сервера html код отдавать и рендерить его в этом же вью? Ну не гениально ли? Почитай как нибудь, indus.stackoverflow
>>1997476 >vue Норм тема, прекрасно мешается с jquery, применяется в конкретных местах и здорово облегчает жизнь там где надо >angular не сталкивался с проектом, где бы он был прям так оправдан, обычно это оверкилл, но он неплохо форсит архитектуру диким фронт макакам. >react Спидозное говно говна. Самое популярное ко всему прочему. 1001 способ сделать всё через жопу, практики, меняющиеся каждые полгода (как раз когда сойбои выясняют, что залупа с которой они бегали полгода назад - кусок говна).
Ты написал длинный и плохо понятный пост, но мог бы просто написать, что не знаешь, что делать с формами и как избежать двойной работы (описания формы на бекенде и на фронтенде).
Кстати, генерация форм нужна не только когда хочется избежать двойной работы. Бывает, что формы вообще генерируются динамически (а не описаны где-то в коде). Пример: бизнес-процессы. Пользователь создает новый бизнес-процесс (закупка офисных принадлежностей), описывает какие у него есть свойства (товар, цена), какого они типа и где-то должна появиться форма с соответствующими полями.
>>1997521 Нихуя тебя порвало, иди валерьяночки выпей. Выдал просто поток сознания несвязный, тут нету даже что цитировать чтобы тебя, собачку глупую, мордой в говно макнуть, ты сам себя в говно макнул глубже некуда. Мой тебе совет: если ты не умеешь отличать людей в потоке сообщений без аватарок и никнеймов, лучше не сиди на дваче. Ну очень убого смотришься. Ты даже в этом посте под меня приписал посты половины треда, при том что я только спросил у людей как они используют формы при условии разделении бэка и фронта, ну и непосредственно с тобой в нескольких постах поигрался. Наверное тебе так удобнее, из-за того что я заявил о своем сравнительном ньюфажестве. Тут-то появляется что ответить, вместо реальных аргументов можно просто заявить что ты уже два с половиной года интернет магазины на битриксе делаешь, а потому лучше меня не меня во всем смыслишь.
>>1997622 А хуй его знает, просто увольняемся с работы когда появляется проект на Vue/Angular/React и ищем нормальную веб-студию без всей этой пидорской хуйни.
>>1997510 >Просто ты либо молодой мне 34 >либо не сидел всю жизнь на жопе без амбиций в региональной веб-студии Я вообще в студиях не сидел - самозанятый типа + госшарага.
>>1997521 Че ты несешь, поехавший? Я в вашем сраче вообще не участвовал. vue и в меньшей степени реакт ( потому что в нем нет на сколько я понял альтернативы директивам для уже существующего хтмл) изучил для своих нужд пока что на уровне своих нужд за неделю. Доволен. >>А как же разделение ответственности. Разделения чего? Разделения куда? Меня тошнило от возни с DOM, ща на вью васяню свои условные пагинаторы и получаю удовольствие от того что на клиенте и бэке пишу приятный для меня код. Меня не ебут экзистенциальные вопросы нубарей "какой вэб-фреймворк выбрать" с абсолютным не пониманием зачем эти фреймворки вообще нужны.
Бля, это ж насколько ебанутым нужно быть чтобы на самоподдуве закатиться в тред бекенда и навязывать свои хипстерские тренды, нихуя толком ещё не сделав либо работая тупорылой однобитной обезьяной на одной технологии. Ещё токсичность эта зашкаливающая - безработного за версту видать т.к. с таким говном никто работать не будет. Либо возьмут на позицию хуесоса у джунов, откуда эта обида ёбаная.
CMS у него, видите ли, говно и вообще для дидов, а модные-молодёжные все даже сраные визитки на SPA пилят с сотнями эндпоинтов. Сразу видно идиота не умеющего подбирать инструмент под задачу.
>>1997510 А кто говорил что js нинужон и все будем писать хуй пойми как? Завтра выпустят новый функциональный вантуз для унитаза - ты им вместо унитаза жопу свою чистить будешь?
>>1997708 >vue и в меньшей степени реакт А laravel в меньшей степени yii? Попробуй посмотреть что то кроме ролика "vue за час" или "реакт для чайников"
>Разделения чего? Разделения куда? Пиздец, ты ироничный рофлан над лохами-джунами, которые symfony формы на spa присылают не выкупил?
>>1997803 >>1997855 Дед, ну хватит тебе позориться, все хорошо, и твои cms хорошие и ты умница, они маленькие еще прост, непонимают. Давай, таблеточку выпей и баиньки, а то уже вон ручки трясутся видимо, постов не видишь.
>>1997937 Это исключительно вопрос вкуса и привычки. По количеству всяких свистелок полезных наверное все таки шторм, но подглючивает и обновы корявые часто. Плюс, если разные языки используешь приятно по Intelij идешкам скакать. В VS можно плагинами вцелом поднастроить и будет не хуже, но при этом стабильнее и легковесней. Остальное не юзал особо.
>>1997943 Вот привыч нащадно к Шторму, но он стал жрать под 90% проца при печати, я и переустанавливал разные версии и на новом проекте пробовал - не помогает. Поэтому решил свитчнуться в VSCode и теперь страдаю от непривычки.
Не понимаю зачем нужен Сваггер. Ну да, типа, красивенькая документация и всё. По факту оно ничем не отличается от рукописной - зачем везде пердят про автоматическую, если разработчик вынужден поддерживать её вместе с кодом? Реально двойная работа получается - пишешь код для АПИ, а потом то же самое для документации этого АПИ.
>>1997944 С памятью кстати ни разу не было проблем, открыто несколько инстансов из их семейки - жрут стабильно вцелом, хотя коллеги иногда жалуются на похожие косяки. Я пользуюсь VS на ноуте иногда, тоже сначала привыкал долго и плевался. Через месяц +- попривык. >>1997945 Ты уже реально заебал со своей шизой, иди в срачетред. Я сомневаюсь, что в треде одновременно заспавнилось несколько таких долбоебов.
>>1997956 Ну в первую очередь он нужен там, где большие команды и есть нормальный QA, чтобы не шарить постмановские коллекции и не мучится с их актуальностью. Если у тебя небольшое публичное апи - обычной доки за глаза хватает.
>>1997961 > Пишет индусокал на cms и джиквери в 2021 >Ни учите миня ПРИЛАЖЕНИЯ писать!! Мань, приложение тут только моего хуя к твоему тупорылому еблету.
>>1997855 Траллируй - траллируй >>1997938 А чем условные cms плохи? В рамках своей ниши? Хочет кабанчик у которого два-три ИРЛ магазина по продаже плинтусов и фурнитуры выйти в интернет, он хочет масимально типовую поебень, с каталогом и номером телефона. Бюджет 30 тыщ максимум - и хуле? На реакте + нода + деплоить в облаках + личный дизайн тыщ за 400 ему предложишь? И этот рынок существует, и не такой уж он узкий. Другой вопрос что на говне уровня вордпресса писать противно.
Но я для своих быстрых нужд хочу Октябрь освоить, что бы и я не страдал, и быстро/просто реализовывал типовые проекты. У меня есть круг знакомых, мелких коммерсов, которым такой вариант очень подойдет.
>>1997982 Да ничем они не плохи, нишевое решение, магазинчики нужны всегда, просто местный шиз, из за своей ограниченности продвигает ебанутые походы оттуда, как стандарт в индустрии.
>>1997982 >хочу Октябрь освоить С Октябрём сложно всё - у него скоро будет версия 2, которая платная будет и бесплатная какая-то. Часть разрабов прихуела от таких раскладов и сделала Винтер.цмс на базе первой версии. Они там год-полтора только бурлить в говнах будут без явного результата.
>>1998010 >версия 2, которая платная Если у них получится сделать аналог Битрикса, но с нормальным кодом внтури первый Октобер вполне годный, то вообще заебца будет. Правда Битрикс только для рашкинских бизнесменов, а тут глобально.
>>1998011 >первый Октобер вполне годный Там же лара с eloquent под капотом? Не сказал бы что в ларе прям очень годный код. Хотя конечно в сравнении с битриксом все равно победа.
>>1998019 >нечно в сравнении с битриксом все равно победа. Ну да - Ларовские Элоквент, Роутер, вместо Блейда - Твиг, Контейнер с зависимостями и поддержка композера из коробки. Но там не вся Лара, а некоторые компоненты только + они свои понапилили вполне удобные. В принципе, на уровне разработки плагинов всё пишется в стиле фреймворка - с контроллерами, маршрутами, моделями и их отношениями. С вордпрессом тем же не сравнить, да и много из коробки уже нормально работает без танцев с бубном и установки ёбаных сотен плагинов.
>>1998031 >конкуренты сейчас есть популярные у нее? Вроде как конкуренцию вордпрессу хотели сделать, но тут без вариантов - эту гору закаменевшего векового дерьма уже не сдвинуть. На ней веб-студии среднего ценового диапазона любят работать, по моим наблюдениям, да и удобен он в штамповке типовых сайтов - понаписал плагинов по частые кейсы и только собирай из них сайты.
>Может на симфони чот похожее наклепали уже? Друпал на симфони переехал давненько уже.
Во-первых, она отличается от рукописной. В рукописной документации ты замучаешься рисовать все таблички, которые тебе предоставляет swagger.
Во-вторых, можно не писать swagger файл руками, а писать в коде аннотации, из которых потом генерируется swagger. Так документация хранится радом с кодом и ее легко поправить при исправлениях кода.
Тебе в любом случае надо как-то описать API для фронтендщиков. Лучше сделать это нормально, а не как попало.
Также, теоретически можно бы использовать swagger-описание для автоматической валидации приходящих параметров, но я не сталкивался с библиотеками, которые это реализуют.
>>1998091 >В рукописной документации ты замучаешься рисовать все таблички, которые тебе предоставляет swagger. Кроме красивых вьюшек - я сразу сказал.
>можно не писать swagger файл руками, а писать в коде аннотации, из которых потом генерируется swagger Что как бы одно и то же по-сути и от дублирования работы не избавляет.
>Лучше сделать это нормально, а не как попало. Какая разница где править документацию - в файле кода или разделе документации? И там - и там проебаться можно по чисто человеческим причинам.
Как минус получаем добавление очередного синтаксиса в проект, довольно всратого при этом, и увеличение объёма работы т.к. описывать он требует очень досконально.
>>1998010 >>С Октябрём сложно всё - у него скоро будет версия 2, которая платная Нихуя се, жаль. >>Они там год-полтора только бурлить в говнах будут без явного результата. Это да. Попридержу коней тогда.
>>1958281 (OP) Анончики. Я очень не шарящий в кодинге и тем более в пхп. Есть один магазинчик wordpress+woocommerce+astra theme. Я хочу изменить какое-то свойство товара прямо в БД вордпресса. Но, когда я меняю значение (цена или название товара или наличие) в соответствующей таблице бд, сохраняю. На сайте оно не обновляется. Поясните мне балбесу, как это работает и как сделать, чтоб значение внесенное руками в бд отображалось на сайте?
>>1998258 Сколько пользователей? Вообще-то этот довольно простой запрос база должна быстро выполнить, если у тебя структура не въёбана. Или там таблица терабайт на 5? Тогда хуйле тебя на этот проект посадили, ёбу дали штоле?
>>1997855 >Пиздец, ты ироничный рофлан над лохами-джунами, которые symfony формы на spa присылают не выкупил? Красавчик, два года назад задачку для дэбилов про айфон в кредит решить не мог, а теперь ОПа джуном называешь, лол
>>1997803 >на самоподдуве закатиться в тред бекенда Лол, какой тред бекенда? Здесь большинство - такие же пхп жиквери фулстек макаки как ты. А теперь зайди к чистым бэкэндерам: к гоферам, джавистам, нодистам или еще куда хочешь, и расскажи им свою позицию. Хотя ладно, ничего интересного с этого не выйдет, тебя там с твоими охуенными идеями за такого толстяка примут что даже нахуй не пошлют.
Аноны, я довольно уважаемый миддл-программист, работаю в банке, и вот начальство поставило задачу типа сделай простенькую авторизацию, а то зачет не поставлю. Ну я такой ну ок. Погуглил про авторизацию и возник вопрос безопасности. Подскажите пожалуйста, как быть с сессией? Вот кусочек алгоритма, который смущает: -Показываем пользователю форму логина -Получаем от него пароль -Проверяем пароль на наличие в базе данных -Если пароль есть - генерируем хеш, сохраняем хеш в таблицу сессий, и вместе с айдишником пользователя записываем в сессию. -После этого на каждом важном действии сверяем айди и хеш текущего пользователя с табличным. А вот вопрос: что если хакер украдет текущий хеш из сессии браузера клиента? Это можно вообще сделать?
>>1998407 >Проверяем пароль на наличие в базе данных Проверяют не пароль, а хеш пришедшего пароля с хешем пароля в БД. Обязательно посолить - соль тоже хранить в БД.
>После этого на каждом важном действии сверяем айди и хеш текущего пользователя с табличным. Не обязательно - можно просто первым делом запрашивать на каждой защищённой страничке пользователя из БД по хешу сессии. Если не пришёл, то редиректи на страницу логина.
>если хакер украдет текущий хеш из сессии браузера клиента? Это можно вообще сделать? На https все данные шифруются и их перехват ничего не даст.
Хуевасто как-то для миддла у тебя, через постель на работу попал?
>>1998419 >На https все данные шифруются и их перехват ничего не даст. Спасибо за ответ, аношка. Но что если есть только http? Гипотетически хакер может как-то украсть данные сессии и использовать их? Или не беспокоиться?
>>1998423 Если тебе для зачёта, то не трахай мозги и делай хоть как. Если для реального дела, то обязательно https и никаких велосипедов - бери проверенный фреймворк и делай на нём. Начальству скажи, что по требованиям безопасности обязаны предоставить https - это не прихоть.
Если HTTP, то данные передаются в открытом виде. В том числе данные из формы логина, а также кука с идентификатором сессии. Соответственно, все, через кого проходят данные (роутер, который может быть заражен, провайдер, который сохраняет весь трафик по закону, сервера) могут их видеть и использовать. Потому надо использовать HTTPS.
Аношки, этот тред закончился, для продолжения холиваров создан новый тред >>1998470 (OP)
Если вам не ответили, или вас забыли, можете напомнить о себе в новом треде.
А я напомню, что в нашем треде есть заказчик >>1982834 Вы можете не только решить его интересную задачку, но и даже получить за это деньги (но это не точно).
Парни, у меня вопрос по поводу регулярных выражений. Конкретно интересует группа символов \D. Как помнят многие отсюда - это группа символов, которая включает в себя какой угодно символ, кроме цифр(!).
Но я столкнулся с непонятной проблемой. По какой-то причине в моём коде \D меняет лишь буквы, и при этом не затрагивает, как и положено - цифры, но в то же время и специальные символы, пример: #, |, ~ и так далее.
Я понимаю что есть квадратные скобки и всё такое, но меня интересует сугубо данный вопрос: что здесь не так? Почему \D вместе с цифрами не трогает и специальные символы?
>>2038183 Блядь, я долбоёб тупой. Там же начало и конец подстроки не подпадают под регулярку. Нужно чтоб было вначале 'a', потом в конце 'b', а у меня в примере со спец. символами не так. Сорян, в глаза ебусь.
Господа, ситуация такая, устроился в стартапчик с стеком Vue + Laravel, но пыху знаю на джуновском уровне, что уж говорить про ЛарОчку.
Вопрос такой: где можно почитать/посомтреть в кратце про ларку (документация мимо), что бы за пару дней влиться и спокойно на ней писать? Учитывая тот факт, что мне нужно освоить ее синтаксис, так как я шарю в беке и понимаю принципы его работы.