Вы видите копию треда, сохраненную 14 апреля в 11:40.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Это тред для начинающих. Слово «классы» у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>2932466 (OP) . Старые треды тут https://2ch.hk/pr/arch/ (М) (искать по слову php), а также на архиваче и в гугле по словам по словам "клуб изучающих PHP".
С чего начать - основы PHP
Наши уроки по PHP собраны по адресу http://codedokode.github.io/phpbook . Это учебник для изучающих с нуля. Там есть задачи, их нужно решать. Но если этот учебник тебе не нравится, можно читать любой другой. Или официальный справочник ( https://www.php.net/manual/ru/langref.php ). Или все сразу.
Если что-то непонятно, запости код и попроси подсказку или поищи задачу в архиве тредов.
Какой редактор использовать
Простые задачки можно решать в онлайн-песочницах вроде https://onlinephp.io/ , https://paiza.io/en/projects/new?language=php , https://www.programiz.com/php/online-compiler/ , но для программ посложнее лучше установить редактор. Есть (дорогая) IDE PhpStorm, есть бесплатный Netbeans и VSCode, условно-бесплатный Sublime Text. Чтобы в последних получить автодополнение для PHP, нужно установить и настроить PHP language server.
Вот инструкции по установке PHP на компьютер: https://github.com/codedokode/pasta/blob/master/soft/php-install.md
Гайд по командной строке: https://github.com/codedokode/pasta/blob/master/soft/cli.md
Что изучать дальше
Зная лишь основы PHP, сайт ты не сделаешь и работу не найдешь. Обычно от начинающего требуют чуть-чуть больше:
PHP, ООП, основы HTTP, HTML/CSS (основы верстки), JS, SQL, PDO, MVC, git, composer, какой-нибудь фреймворк (Laravel или Symfony), основы автоматического тестирования, основы linux, английский.
Вот неофициальный роадмап (карта того, что можно изучать): https://miro.com/app/board/o9J_lbUUBBQ=/
По многим из этих тем у нас есть уроки или задачки:
- для понимания, что такое веб-сервер, прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- для понимая MVC, работы с БД и формами, реши задачу про студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- далее есть более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- задача, близкая по сложности к реальным задачам на Laravel/Symfony: https://gist.github.com/codedokode/8733007
- после нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- если ты все решил, переходи к Symfony или Laravel
- почитать про паттерны можно тут https://designpatternsphp.readthedocs.io/ru/latest/ (если ты не изучил ни одного фреймворка, то это будет рановато). Если хочешь увидеть примеры использования паттернов в реальном коде - ковыряй исходники Симфони, например Symfony Forms. Ну и скажем честно, начинающему без опыта, который не видел сложный код, паттерны понять будет сложно.
- для улучшения английского можно читать news.ycombinator.com - там много статей на тему IT.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- задачи на HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- хороший учебник по JS: https://learn.javascript.ru/
- задачи на JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- задача на SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- задачки на SQL: https://www.sql-ex.ru/ (нужна регистрация), https://sql-academy.org/ru/trainer и немного наших задачек: https://github.com/codedokode/pasta/blob/master/db/databases.md
Что еще почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- https://phptherightway.com/
- Книга: Профессиональное программирование на PHP Джордж Шлосснейгл
- Книга: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- Про Git: https://git-scm.com/book/ru/v2
- Задачи на алгоритмы: https://codeforces.com/problemset
Дополнительно
- скачать учебник: зайди на https://github.com/codedokode/phpbook, нажми зеленую кнопку Code -> Download ZIP, распакуй на рабочий стол и открой index.html
- что будут спрашивать на собеседовании, если 0 опыта - будут гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- сколько времени надо изучать все это? - все зависит от тебя, в районе 12-24 месяцев
Не ответили в предыдущих 10 тредах? Ну напишите в 11-й раз, вдруг ответят.
На праздниках скорость ответа может быть о-о-очень медленной.
У меня все-таки два вопроса...Ага!
Как считаешь, как мне стоит поступить в этой ситуации:
Мне нужно выводить Enrollee и ErrorList в html-коде.
Я хочу перекинуть значения из объектов в массив и выводить как-то так:
$enrollee['name']
Короче, я просто хочу, чтобы в html-коде не было логики получения значения из объекта, по типу:
$enrollee->get('name')
Пока что я придумал 3 варианта:
1) Создать ViewHelper, добавить в него методы:
public function escapeMetacharacters(string $text): string
public function getEnrolleeArray(Enrollee $enrollee): array
public function getErrorListArray(ErrorList $errors): array
(разные методы нужны, потому что Enrollee и ErrorList хранят значения по-разному и инструкции для получения этих значений - разные)
+ метод, чтобы получать названия полей объекта.
2) Создать ViewHelper, добавить в него методы:
public function escapeMetacharacters(string $text): string
+ метод, чтобы получать названия полей объекта.
Наследовать от него двум классам: EnrolleeViewHelper и ErrorListViewHelper, у каждого будет соот. метод:
public function getEnrolleeArray(Enrollee $enrollee): array
или
public function getErrorListArray(ErrorList $errors): array
3) Не делать классы, объявить функции в отдельном файле и сделать require_once в контроллере.
Еще один вариант - сделать класс EnrolleeFormHelper, скинуть в него все вышеописанные методы и сделать их статическими.
Ну и еще вопрос, который меня волнует, я сделал функцию переноса значений из $_POST в Enrollee, куда мне ее девать?
Объявлять в отдельный файл и делать require_once в контроллере или добавлять в класс EnrolleeFormHelper?
Кстати, код:
Как я планирую переносить значения из $_POST в Enrollee:
https://3v4l.org/c7B5i
Я думаю также убрать new Enrollee() и принимать на вход функции переменную-ссылку на объект Enrollee и на выход - ничего, просто объект будет меняться в ходе функции.
Класс ViewHelper:
https://3v4l.org/GFXlX
Я уберу потом ReflectionClass как свойство.
Просто показываю код, чтобы нагляднее было.
EnrolleeVH: https://3v4l.org/OqvAD
ErrorListVH: https://3v4l.org/TfEmJ
И я еще сделал им интерфейс, но нужен ли он вообще?
https://3v4l.org/HeDFm
У меня все-таки два вопроса...Ага!
Как считаешь, как мне стоит поступить в этой ситуации:
Мне нужно выводить Enrollee и ErrorList в html-коде.
Я хочу перекинуть значения из объектов в массив и выводить как-то так:
$enrollee['name']
Короче, я просто хочу, чтобы в html-коде не было логики получения значения из объекта, по типу:
$enrollee->get('name')
Пока что я придумал 3 варианта:
1) Создать ViewHelper, добавить в него методы:
public function escapeMetacharacters(string $text): string
public function getEnrolleeArray(Enrollee $enrollee): array
public function getErrorListArray(ErrorList $errors): array
(разные методы нужны, потому что Enrollee и ErrorList хранят значения по-разному и инструкции для получения этих значений - разные)
+ метод, чтобы получать названия полей объекта.
2) Создать ViewHelper, добавить в него методы:
public function escapeMetacharacters(string $text): string
+ метод, чтобы получать названия полей объекта.
Наследовать от него двум классам: EnrolleeViewHelper и ErrorListViewHelper, у каждого будет соот. метод:
public function getEnrolleeArray(Enrollee $enrollee): array
или
public function getErrorListArray(ErrorList $errors): array
3) Не делать классы, объявить функции в отдельном файле и сделать require_once в контроллере.
Еще один вариант - сделать класс EnrolleeFormHelper, скинуть в него все вышеописанные методы и сделать их статическими.
Ну и еще вопрос, который меня волнует, я сделал функцию переноса значений из $_POST в Enrollee, куда мне ее девать?
Объявлять в отдельный файл и делать require_once в контроллере или добавлять в класс EnrolleeFormHelper?
Кстати, код:
Как я планирую переносить значения из $_POST в Enrollee:
https://3v4l.org/c7B5i
Я думаю также убрать new Enrollee() и принимать на вход функции переменную-ссылку на объект Enrollee и на выход - ничего, просто объект будет меняться в ходе функции.
Класс ViewHelper:
https://3v4l.org/GFXlX
Я уберу потом ReflectionClass как свойство.
Просто показываю код, чтобы нагляднее было.
EnrolleeVH: https://3v4l.org/OqvAD
ErrorListVH: https://3v4l.org/TfEmJ
И я еще сделал им интерфейс, но нужен ли он вообще?
https://3v4l.org/HeDFm
Я не пишу идеальные регулярки, но дам совет: чтобы понимать регулярные выражения, нужно рассматривать их как описание из каких символов состоит слово.
Например, опишем простые имена на русском:
Иван, Катя, Андрей
Из чего состоят эти слова? Сначала идет одна заглавная, потом несколько строчных букв русского алфавита.
На языке регулярок можно написать так:
[А-ЯЁ]{1}[а-яё]+
Можно читать как: одна заглавная буква русского алфавита, от 1 до бесконечности строчных букв русского алфавита
Как описать имена через дефис на русском:
Мария-Антуанетта
Анна-Мария
Эти слова состоят из: одна заглавная буква русского алфавита, некоторое количество строчных букв русского алфавита, один дефис, заглавная буква русского алфавита, несколько строчных букв русского алфавита.
Регулярка может выглядеть как-то так:
[А-ЯЁ]{1}[а-яё]+-{1}[А-ЯЁ]{1}[а-яё]+
Опытные аноны могут привести тебе более лаконичные и синтаксически правильные регулярные выражения, я лишь хотел показать как перестать ненавидеть регулярки.
Сайт для работы с регулярками, если не знал о нем: https://regex101.com/
Статья на хабре, можно листать до таблиц с обозначением синтаксиса: https://habr.com/ru/companies/otus/articles/484048/
Ну и да, чего ты добиться хотел своими регулярками я не понял. Можешь написать подробнее.
Ну и да, у ОПа в мануале, в шапке, есть учебник по php, там урок по регулярным выражениям, весь синтаксис там описан.
Я не пишу идеальные регулярки, но дам совет: чтобы понимать регулярные выражения, нужно рассматривать их как описание из каких символов состоит слово.
Например, опишем простые имена на русском:
Иван, Катя, Андрей
Из чего состоят эти слова? Сначала идет одна заглавная, потом несколько строчных букв русского алфавита.
На языке регулярок можно написать так:
[А-ЯЁ]{1}[а-яё]+
Можно читать как: одна заглавная буква русского алфавита, от 1 до бесконечности строчных букв русского алфавита
Как описать имена через дефис на русском:
Мария-Антуанетта
Анна-Мария
Эти слова состоят из: одна заглавная буква русского алфавита, некоторое количество строчных букв русского алфавита, один дефис, заглавная буква русского алфавита, несколько строчных букв русского алфавита.
Регулярка может выглядеть как-то так:
[А-ЯЁ]{1}[а-яё]+-{1}[А-ЯЁ]{1}[а-яё]+
Опытные аноны могут привести тебе более лаконичные и синтаксически правильные регулярные выражения, я лишь хотел показать как перестать ненавидеть регулярки.
Сайт для работы с регулярками, если не знал о нем: https://regex101.com/
Статья на хабре, можно листать до таблиц с обозначением синтаксиса: https://habr.com/ru/companies/otus/articles/484048/
Ну и да, чего ты добиться хотел своими регулярками я не понял. Можешь написать подробнее.
Ну и да, у ОПа в мануале, в шапке, есть учебник по php, там урок по регулярным выражениям, весь синтаксис там описан.
Ну и еще: нужно хорошо понимать что делает каждый элемент регулярных выражений, если ты ставишь квадратные скобки, не зная что они значат в синтаксисе, то будет путаница.
https://github.com/libin9iOak/ja-netfilter-all
Переведи гуглом и выполни пошагово
>>2975854
>>2975858
Спасибо за ответ, я уже знал это. Я как раз спрашивал про часть решения одной из задач по регуляркам из шапки. Нужно найти слова с заменами букв на латиницу (Oчень, слOво, хорошO), подсказка к задаче предлагает два поиска по регулярному выражению, первый ищет латинскую букву в слове после кирилической, второй после буквы кирилицы:
1) \w([а-я][a-z])\w\ui
2) \w([a-z][а-я])\w\ui
Если переписать с добавлением опциональных групп перед и после латиницы \w([a-z][а-я][a-z])\w\ui оно будет матчить ещё и полностью латинские слова, как быть?
От сука разметка символы сожрала, в третьей регулярке стоит * перед двумя диапазонами латинских символов
>Переведи гуглом и выполни пошагово
>Спасибо за ответ, я уже знал это. Я как раз спрашивал про часть решения одной из задач по регуляркам из шапки. Нужно найти слова с заменами букв на латиницу (Oчень, слOво, хорошO), подсказка к задаче предлагает два поиска по регулярному выражению, первый ищет латинскую букву в слове после кирилической, второй после буквы кирилицы:
>1) \w([а-я][a-z])\w\ui
>2) \w([a-z][а-я])\w\ui
>Если переписать с добавлением опциональных групп перед и после латиницы \w([a-z][а-я][a-z])\w\ui оно будет матчить ещё и полностью латинские слова, как быть?
Есть же |
\w([а-я][a-z])\w|\w([a-z][а-я])\w\ui
>Есть же |
>\w([а-я][a-z])\w|\w([a-z][а-я])\w\ui
Точнее даже
\w([а-я][a-z]|[a-z][а-я])\w\ui
Сделай ещё нежадный захват для обоих \w (\w*?), чтобы слово целиком матчилось.
https://blog.llinh9ra.ru/%D1%81%D0%BE%D1%84%D1%82/%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%B0%D1%86%D0%B8%D1%8F-phpstorm-2022-1-4/
Это работало для меня, ссыль на гит протухла
Хули там "учить"?
В view не должно быть бизнес-логики (вроде валидации студента или формирования запросов в базу), но простую логику получения значений там можно использовать.
> Я хочу перекинуть значения из объектов в массив и выводить как-то так:
> $enrollee['name']
Не вижу, в чем выгода усложнять так код. Что тебе мешает использовать объекты напрямую?
> Короче, я просто хочу, чтобы в html-коде не было логики получения значения из объекта, по типу:
> $enrollee->get('name')
А что в этом плохого? Конечно, лучше бы там было getName(), а не get('name').
Что касается экранирования, оно нужно так часто, что его можно даже сделать функцией вроде escape(), чтобы короче было писать. Если ты используешь автозагрузку через композер, то в нее можно прописать файл с функциями.
> Ну и еще вопрос, который меня волнует, я сделал функцию переноса значений из $_POST в Enrollee, куда мне ее девать?
Наверно в отдельный файл (utils.php). Еще можно сделать Utility Class со статическим методом и в него поместить код.
> $valueField = trim($valueField);
trim превращает число обратно в строку. Это надо раньше ставить. Также, в английском порядок слов обратный, то есть "значение поля" пишется как fieldValue.
> Я думаю также убрать new Enrollee() и принимать на вход функции переменную-ссылку на объект Enrollee и на выход - ничего, просто объект будет меняться в ходе функции.
Ок.
Спасибо за ответ.
>А что в этом плохого?
Я думал, что вид $name или $enrollee['name'] более лаконичный и удобочитаемый.
Кстати, а что ты думаешь о том, как я буду получать значения из объекта ErrorList:
$errors->implode(" ", getListOfFieldErrors('name'));
Т.е. сначала я получаю массив, где ключи - 0, 1, 2..., а элементы - строки. Потом я сшиваю их.
Я читал одну из твоих статей и там говорилось, что, по возможности, не стоит использовать встроенные функции в html-коде.
Как мне тут поступить?
Оставить как есть?
Преобразовать где-то в контроллере, а потом вывести как строку в html?
>$errors->implode(" ", getListOfFieldErrors('name'));
Я сейчас попробовал и такая запись не прокатит, ага :D
implode(" ", $errors->getListOfFieldErrors('name'));
>Конечно, лучше бы там было getName(), а не get('name')
В прошлом треде ты советовал мне, если и использовать магию для создания сеттеров и геттеров, то использовать __call.
Я додумался только до такого варианта реализации: https://3v4l.org/WILb3
Как раньше я получал значение поля в валидаторе: у класса валидатора есть свойство-массив, ключи которого - строки - названия полей Enrollee.
И я просто вызывал $enrollee->get('name')
А сейчас что?
Как вариант - подготавливать название метода, чтобы получить значение.
Например, так:
Получить название поля, заменить первую строчную букву на заглавную, соединить название поля со строкой "get".
Вызывать метод с таким названием.
Как-то так: https://3v4l.org/MpibO
Как вариант, чтобы не ебаться с заменой регистра первой буквы - хранить название поля сразу с большой буквы
Даже если я не буду реализовывать магию и просто в лоб напишу геттеры и сеттеры для каждого класса, то как мне быть в классах-сервисах? Все равно придется подготавливать названия методов.
https://3v4l.org/v85Gq
Почему вы все ищете, где можно украсть пирастский иностранный продукт? Почему программисты не объединятся и не сделают свой открытый редактор?
Ну хотя бы взял бы VSCode, подключил phpactor и исправил там несколько багов.
> $errors->implode(" ", getListOfFieldErrors('name'));
Это неправильно. В PHP уже есть функция implode, зачем ты делаешь в объекте ее копию? И объект для хранения ошибок вообще не должен беспокоиться о том, как их потом выводить.
> Я читал одну из твоих статей и там говорилось, что, по возможности, не стоит использовать встроенные функции в html-коде.
Да, это правда не моя статья (о чем в начале написано). Я думаю, что этот совет не очень хороший. Функции для обработки строк и массивов типа implode использовать можно. Не рекомендуется использовать такие вещи:
- обращения к переменным типа $_GET, $_POST, $COOKIES напрямую
- вызовы функций для работы с БД, типа $pdo->execute('SELECT 2 + 2');
То есть не рекомендуется бизнес-логику переносить в шаблон.
> Преобразовать где-то в контроллере, а потом вывести как строку в html?
В шаблоне получить из объекта список ошибок и склеить их, в том числе с помощью implode.
Окей, спасибо за ответ.
В прошлом треде ты писал, что лучше писать DIContainer по PSR-11, я читал PSR-11, но у меня был тупняк из-за того, что нет функции регистрации сервисов.
Сегодня решил почитать одну из статей, код из этой статьи:
https://3v4l.org/oAk18
Мне стоит реализовывать DIContainer как там?
Сама статья: https://habr.com/ru/articles/655399/
А вообще, стоп.
Автор вроде опустил момент с тем, чтобы не создавать один и тот же объект каждый раз...Я думаю, переписать немного get, добавить свойство - созданные объекты и все будет нормально.Но в любом случае, он мог ответить на вопрос где регистрировать сервисы - в конструкторе.
Я предлагаю такую логику для __call:
- если пользователь вызывает getXXX, то:
-- если поле XXX существует, вернуть его значение
-- иначе, выбросить исключение, видимо пользователь опечатался
- если пользователь вызывает setXXX, то действовать аналогично
То есть при обращении с правильным разванием ты делаешь обращение к полю, с неправильным - выбрасываешь исключение.
Дополнительно можно сделать аннотации #[Setter] и #[Getter] к полям, и разрешить через магический метод обращаться только к тем полям, где есть аннотация. То есть, делать доступными не все поля, а только часть.
Плюс такого подхода, в том, что ты можешь потом добавить написанный вручную геттер, если нужна более сложная логика.
> Я додумался только до такого варианта реализации: https://3v4l.org/WILb3
В регулярках нету ^ и $. В имени поля могут быть цифры. Имя поля можно извлекать из регулярки через скобки, например:
if (preg_match('/^get(....)$/', $name, $m)) ...
> А сейчас что?
> Как вариант - подготавливать название метода, чтобы получить значение.
Да, надо формировать из имени поля название геттера. Либо можно оставить твой метод get(...), но тогда валидатор будет поддерживать лишь классы с таким методом, а не любые.
В Симфони есть целый компонент PropertyAccess для таких задач.
> Получить название поля, заменить первую строчную букву на заглавную, соединить название поля со строкой "get".
Норм. Можно даже функцию или метод в utility class для этого сделать (вызвать геттер по имени поля).
> Как вариант, чтобы не ебаться с заменой регистра первой буквы - хранить название поля сразу с большой буквы
Не надо.
Я предлагаю такую логику для __call:
- если пользователь вызывает getXXX, то:
-- если поле XXX существует, вернуть его значение
-- иначе, выбросить исключение, видимо пользователь опечатался
- если пользователь вызывает setXXX, то действовать аналогично
То есть при обращении с правильным разванием ты делаешь обращение к полю, с неправильным - выбрасываешь исключение.
Дополнительно можно сделать аннотации #[Setter] и #[Getter] к полям, и разрешить через магический метод обращаться только к тем полям, где есть аннотация. То есть, делать доступными не все поля, а только часть.
Плюс такого подхода, в том, что ты можешь потом добавить написанный вручную геттер, если нужна более сложная логика.
> Я додумался только до такого варианта реализации: https://3v4l.org/WILb3
В регулярках нету ^ и $. В имени поля могут быть цифры. Имя поля можно извлекать из регулярки через скобки, например:
if (preg_match('/^get(....)$/', $name, $m)) ...
> А сейчас что?
> Как вариант - подготавливать название метода, чтобы получить значение.
Да, надо формировать из имени поля название геттера. Либо можно оставить твой метод get(...), но тогда валидатор будет поддерживать лишь классы с таким методом, а не любые.
В Симфони есть целый компонент PropertyAccess для таких задач.
> Получить название поля, заменить первую строчную букву на заглавную, соединить название поля со строкой "get".
Норм. Можно даже функцию или метод в utility class для этого сделать (вызвать геттер по имени поля).
> Как вариант, чтобы не ебаться с заменой регистра первой буквы - хранить название поля сразу с большой буквы
Не надо.
Вместо exit надо бросать исключение. return 1 писать не надо (зачем? что ты будешь делать с этой единицей?).
Для надежности советую еще проверять число аргументов и тоже бросать иключение.
Если хочется, метод __call можно засунуть в трейт.
> if (!($prefix === 'set' && $prefix !== 'get' || $prefix === 'get' && $prefix !== 'set')) {
Что за фигня? Просто $prefix !== 'get' && $prefix !== 'set' или !in_array($prefix, ['get', 'set']).
Также, я забыл дать совет, старайся везде использовать тройное строгое равно === вместо обычного ==. Правила работы обычного поменялись в PHP8 и ты замучаешься исправлять код с ним, если они еще раз поменяются. Ну и у строгого равно правила гораздо проще, а вот для двойного ты вряд ли их наизусть помнишь.
В остальном норм.
PSR-11 это интерфейс только для получения сервисов. Регистрацию ты делаешь как хочешь.
Это на самом деле правильно, что они сделали интерфейс только для части функционала. Так и надо делать - интерфейс представляет способность объекта выполнить какое-то действие (выдать экземляр сервиса), а не описывает все его методы.
> Сегодня решил почитать одну из статей, код из этой статьи:
Можно, но тут список сервисов как бы встроен в контейнер намертво. Это не очень красиво с точки зрения ООП. Например, ты не сможешь использовать этот контейнер в другом проекте с другими сервисами.А контейнер с регистрацией более универсальный и переносимый между проектами.
Также, там не реализовано запоминание созданного объекта.
Также вместо имен типа user.repository лучше использовать имя класса UserRepository::class.
>return 1 писать не надо (зачем? что ты будешь делать с этой единицей?).
Разве php не будет ругаться?
Когда указываешь тип возвращаемого значения и ничего не возвращаешь (а сеттер обычно ничего не возвращает), то возникает ошибка. Вроде так, разве нет?
>Если хочется, метод __call можно засунуть в трейт.
Если добавлять этот метод в трейт, мб его нужно распилить на геттер и сеттер, чтобы классы брали только то, что им нужно - либо и то и то, либо что-то одно? У меня ведь часть классов не нуждается в сеттере, но геттер вполне был бы полезен им.
Может вкатунам в PHP ещё и замену PHP написать чтобы два раза со стула не вставать? Ну а чё, он же всё равно будет заменён, так чё ждать если можно заменить его самому
Ну так убери тайп-хинт mixed тогда, если функция может ничего не возвращать.
> Если добавлять этот метод в трейт, мб его нужно распилить на геттер и сеттер, чтобы классы брали только то, что им нужно - либо и то и то, либо что-то одно? У меня ведь часть классов не нуждается в сеттере, но геттер вполне был бы полезен им.
Это лучше решить использованием атрибутов, то есть явно помечать поля с геттерами или сеттерами.
>>2978184
Так PHP это открытый код. Ты какую-то глупость написал.
Уже есть голанг. Скоро на него перепишут все сайты.
>Стоит ли учить Yii? Я смотрю очень много вакансий по нему
А че учить? Приходишь на работу на Yii не зная Yii. Там тебя возьмут за готовность писать на этом говне мамонта
Т.е. не класс, а трейт, ага!
Купи им платья, туфельки. Одень, усади на маленькие стульчики за маленький столик и налей им чаю в маленькие фарфоровые чашечки. Это будет добро и дружба на долгие годы.
А у меня при открытии php файла происходит его редактирование.
Нужно писать не "подружить", а писать что конкретно не работает.
Откуда мы знаем, что ты там делаешь? Ты там опенсервер поставили или ксамп, а может вообще пытаешься через докер запустить? Вариантов миллион. Учись задавать вопросы.
Названия длинноваты (но это у многих начинающих так, не беда):
$fieldNameFirstChar -> $firstChar
methodAllowedToBeUsedOnProperty -> getPropertyAccessMethods
В вызове get можно проверять, что аргументов 0.
Так в общем, норм. Единственный момент - мы делаем проверку наличия атрибутов при каждом обращении. Для задачи уровня список студентов это норм, но для более сложного проекта эти списки атрибутов надо кешировать, чтобы не лезть за ними каждый раз и не тратить время. Ведь этот код выполняется при каждом вызове геттера.
Можно для этого сделать статическое свойство в трейте (статическое, так как список атрибутов у полей одинаковый для всех экземпляров класса) и кешировать информацию в нем. Массив такого вида:
[ Имя поля => список разрешенных методов (get, set) ]
Но, если подумать, то можно пойти еще дальше. Можно кешировать не список разрешенных методов, а функцию-геттер/сеттер. То есть, чтобы было так:
- При первом вызове типа getName срабатывает вся магия, все проверки, и генерируется функция-геттер и кладется в массив-кеш
- При повторном вызове она просто берется из массива и вызывается
Массив имеет вид:
[ имя геттера/сеттера => функция-геттер/сеттер ]
По типу:
['getName' => fn () => $this->name]
То есть, идея в том, чтобы сделать повторный вызов геттера как можно короче и не делать кучу проверок каждый раз.
Названия длинноваты (но это у многих начинающих так, не беда):
$fieldNameFirstChar -> $firstChar
methodAllowedToBeUsedOnProperty -> getPropertyAccessMethods
В вызове get можно проверять, что аргументов 0.
Так в общем, норм. Единственный момент - мы делаем проверку наличия атрибутов при каждом обращении. Для задачи уровня список студентов это норм, но для более сложного проекта эти списки атрибутов надо кешировать, чтобы не лезть за ними каждый раз и не тратить время. Ведь этот код выполняется при каждом вызове геттера.
Можно для этого сделать статическое свойство в трейте (статическое, так как список атрибутов у полей одинаковый для всех экземпляров класса) и кешировать информацию в нем. Массив такого вида:
[ Имя поля => список разрешенных методов (get, set) ]
Но, если подумать, то можно пойти еще дальше. Можно кешировать не список разрешенных методов, а функцию-геттер/сеттер. То есть, чтобы было так:
- При первом вызове типа getName срабатывает вся магия, все проверки, и генерируется функция-геттер и кладется в массив-кеш
- При повторном вызове она просто берется из массива и вызывается
Массив имеет вид:
[ имя геттера/сеттера => функция-геттер/сеттер ]
По типу:
['getName' => fn () => $this->name]
То есть, идея в том, чтобы сделать повторный вызов геттера как можно короче и не делать кучу проверок каждый раз.
Пара советов. Во-первых, исключения правильнее называть не по названию класса, который их бросает, а по типу ошибки:
ServiceAlreadyRegisteredException extends DIException
ServiceNotFoundException extends DiException
Это позволяет ловить конкретный вид ошибки, и в тестах упрощает тестирование. Единственный минус - так получается много классов-исключений. Но у тебя маленький проект и ничего страшного не случится.
Обрати внимание, что в PSR-11 для исключений даны интерфейсы.
При регистрации можно использовать короткие анонимные функции:
$container->register(Some::class, fn () => new Some(1, 2, 3));
Также, если ты хочешь реализовать PSR-11, то ты должен не делать свой интерфейс ContainerInterface, а подключить интерфейсы с помощью композера.
Что значит "не коммитится"? Я не вижу на скриншоте запроса COMMIT.
Или ты хотел спросить, почему не подсоединяется к БД? Проверь логин/пароль, название базы, запущена ли СУБД.
Это значит, что у тебя не настроено в сервере, что надо для PHP файлов вызвать интерпретатор PHP. Готовые советы есть в интернете, даже в документации nginx есть пример. Обычно запускают php-fpm и nginx настраивают, чтобы он передавал ему запросы.
А можешь гайд скинуть рабочий? Я пробовал как в документации пишут: https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/
ещё с гитхаба статью но все равно не обрабатывает
У меня апач, но, мб это поможет.
Конфигурационный файл настроен?
Даже если настроен так, как написано в гайде, может оказаться, что какую-то инструкцию автор гайда пропустил.
Можно где-то посмотреть текст ошибки?
Там еще какая-то ебка с тем, используешь ли ты браузер, чтобы открывать файл php или запрашиваешь этот файл с локального своего сервера.
Я ставил апач давно, поэтому помню туманно с чем может быть ебка.
Если открываешь php в браузере как файл, например:
c://localhost/example.php
То ничего обрабатываться не будет и браузер покажет просто код.
Если пишешь в адресной строке браузера:
http://localhost/example.php
Код обрабатывается и выводится результат кода.
Это все апач, что там с nginx я не ебу.
образование есть? Без технического диплома на работу сейчас не берут. Даже Письмо Деду Морозу не читают
Есть. Дед Мороз пересылает письма работодателям что ли?
Спасибо за ответ.
Я исправлю это позже.
Мы как-то с тобой обсуждали классы-проверятели-валидации.
И там было два класса: один проверяет структуру значения, другой - что значение содержит валидные символы.
Меня смущает выбранная мною формулировка для текста ошибки:
'Поле должно иметь следующий вид: %s. Вы написали - %s.';
Например, пользователь напишет: ИвАн, моей проверке на структуру не понравится этот вариант, потому что она допускает заглавные буквы только в определенном месте слова.
И как тогда будет звучать текст ошибки?
'Поле должно иметь следующий вид: бла-бла. Вы написали - ИвАн';
Получается я заставляю пользователя самому думать почему программа не принимает его вариант.
Наверное стоит все-таки переписать?
Кстати, я выбрал такие формулировки для текста ошибок (хотя такое лучше показывать пользователю до того, как он начнет вбивать значения в поля):
Для имени:
Сайт принимает 3 типа имен:
1) простое имя, пример: Анна;
2) имя с апострофом, пример: О'Генри;
3) имя с дефисом, пример: Анна-Мария.
Заглавные буквы русского алфавита можно использовать только в таких случаях:
1) первая буква простого имени;
2) первая и вторая буквы имени с апострофом;
3) первая буква и первая буква после дефиса в имени с дефисом.
Для фамилии:
Сайт принимает 5 типов фамилий:
1) простая фамилия, пример: Иванов;
2) фамилия с апострофом, пример: Д'Арк;
3) фамилия с пробелом, пример: Сан Антуан Кристоф;
4) фамилия с дефисом, пример: Римский-Корсаков;
5) фамилия со скобками, пример: Иванов(Римский).
Заглавные буквы русского алфавита можно использовать только в таких случаях:
1) первая буква простой фамилии;
2) первая и вторая буквы фамилии с апострофом;
3) первая буква и первые буквы после пробела;
4) первая буква и первая буква после дефиса;
5) первая буква и первая буква после открывающей скобки.
Спасибо за ответ.
Я исправлю это позже.
Мы как-то с тобой обсуждали классы-проверятели-валидации.
И там было два класса: один проверяет структуру значения, другой - что значение содержит валидные символы.
Меня смущает выбранная мною формулировка для текста ошибки:
'Поле должно иметь следующий вид: %s. Вы написали - %s.';
Например, пользователь напишет: ИвАн, моей проверке на структуру не понравится этот вариант, потому что она допускает заглавные буквы только в определенном месте слова.
И как тогда будет звучать текст ошибки?
'Поле должно иметь следующий вид: бла-бла. Вы написали - ИвАн';
Получается я заставляю пользователя самому думать почему программа не принимает его вариант.
Наверное стоит все-таки переписать?
Кстати, я выбрал такие формулировки для текста ошибок (хотя такое лучше показывать пользователю до того, как он начнет вбивать значения в поля):
Для имени:
Сайт принимает 3 типа имен:
1) простое имя, пример: Анна;
2) имя с апострофом, пример: О'Генри;
3) имя с дефисом, пример: Анна-Мария.
Заглавные буквы русского алфавита можно использовать только в таких случаях:
1) первая буква простого имени;
2) первая и вторая буквы имени с апострофом;
3) первая буква и первая буква после дефиса в имени с дефисом.
Для фамилии:
Сайт принимает 5 типов фамилий:
1) простая фамилия, пример: Иванов;
2) фамилия с апострофом, пример: Д'Арк;
3) фамилия с пробелом, пример: Сан Антуан Кристоф;
4) фамилия с дефисом, пример: Римский-Корсаков;
5) фамилия со скобками, пример: Иванов(Римский).
Заглавные буквы русского алфавита можно использовать только в таких случаях:
1) первая буква простой фамилии;
2) первая и вторая буквы фамилии с апострофом;
3) первая буква и первые буквы после пробела;
4) первая буква и первая буква после дефиса;
5) первая буква и первая буква после открывающей скобки.
Кажется переделал: https://3v4l.org/Jfpr9
Ты не мог бы объяснить мне как работает область видимости переменных у стрелочных функций?
backend без очередей как стрипуха без блядей
Кто тебе сказал, что твои правила верные?
Как минимум имя бывает составное через пробелы. У моих детей, например, по два имени, но нет отчества, потому что они родились в Канаде, их российский паспорт выдан на основании канадского свидетельства о рождении, в котором нет никакого отчества, зато есть middle name (оно опциональное, но мы Прочитали дать).
В странах Южной Америки могут вообще 10 имён дать. Так чисто по приколу записать кучу святых, чтобы они присматривали за ребёнком лол.
А ещё у нас тут есть индейцы, у которых может быть одно имя вместо имени-фамилии. Я не знаю, как это в России разруливают.
У одного из детей Маска есть цифры в имени.
Короче говоря, не надо думать, что ты щас покроешь всё норм валидацией, и всё будет хорошо. Обязательно что-нибудь упустишь.
Так что просто проверяй на пустоту и обрезай пробелы по краям, больше ничего не надо.
В статье написано в самом начале:
> This guide assume 🎄 FPM already installed and configured either using tcp port (127.0.0.1:9000) or unix socket (/var/run/🎄-fpm.sock).
У тебя настроен 🎄-fpm? Вряд ли, какой может быть unix-сокет под виндой. Тебе надо заменить unix-сокет на использование TCP-порта.
>Вкат через пхп тоже все?
Да. Шалуны поняли что им ничего не светит на пайтоне и огромной толпой ринулись изучать 🎄. Это конец.
Опять питонисты все испортили
>в PSR-11 для исключений даны интерфейсы
Я не представляю что мне с ними делать.
Вся моя работа с исключениями, на данный момент, заключается в том, что я просто создаю класс-исключение, делаю extends от Exception и выкидываю исключения с текстом ошибки.
И я не знаю что я должен делать, чтобы из интерфейсов исключений получить что-то, что можно использовать в коде...
Еще как вариант - можно не проверять регистр вообще, а принимать значение как есть, если оно подходит под хотя бы один тип, и изменять регистр самому.
Тогда текст ошибки будет указывать только на то, что имена или фамилии такого типа не поддерживаются сайтом.
Да-да, я понимаю, что имена и фамилии бывают разными и кому-то может не понравиться, что его имя или фамилия не проходят по системе, но я не хочу писать идеальную валидацию для имен и фамилий. Я не хочу, чтобы моя валидация покрывала все случаи. Ты как-то скидывал ссылку какие символы могут использоваться в ФИО. Я часть не стал брать. Хотя бы потому что не могу нагуглить пример использования таких символов в имени. Не лучше ли вместо того, чтобы задрачиваться, Читать Белый Медведькие проблемы по мере их появления? Все-таки те системы, которые валидируют ФИО, сами могут заниматься тем, что добавляют варианты, которые раньше не допускали, потому что узнают, что существует кто-то, кто должен проходить валидацию, но система валидации под него не заточена.
>>2979673
Я сделал так: https://3v4l.org/rcZVi
Я установил пакет через composer
Попробовал в VSCode, вроде как все работает.
>getEnrolleeArray
>getErrorListArray
Зачем тебе венгерская нотация, если у тебя и так есть тип в сигнатуре?
>использовать __call
Советую его не слушать, и писать максимально простой и читабельный код, магия в 🎄е это зло, которое надо под корень уничтожать, чем уже успешно занимаются в новых версиях 🎄, объявив устаревшим динамические объявления свойств объекта
>>2979639
https://www.jetbrains.com/help/🎄storm/live-templates-list-symfony.🕛#symfony-live-templates-reference
Уровень интеллекта в айти упал. В пхп соответственно тоже
Ты не понимаешь, что использование атрибутов и магии это не то же самое, что использование автогенерации кода?
Да, понимаю, только зачем делать магию на сеттеры-геттеры? Это:
1)Лишние действия
2)Отсутствие автокомплита от IDE
3)Отсутствие статического анализа от 🎄стана
Так какие преимущества?
Я правильно понимаю, что там идёт ОТ самого "глубокого" вызова К самому "поверхностному", НО последний элемент Новогодний Репертуара - тот момент, на котором исключение непосредственно кидается, то есть, фактически самый глубокий.
https://3v4l.org/G3O1t
Я как-то изначально ожидал, что line 20 будет первым (индекс 0) элементом Новогодний Репертуара, раз они идут от глубокого к поверхности. А она последний элемент Новогодний Репертуара. Но при этом они идут от глубокого к поверхности.
То есть, trace[0] это момент вызова функции, которая бросила исключение. А trace[(count(trace) - 1)] - непосредственно throw. Они в разных концах, хотя на деле оно идёт после другого.
line 20 вообще нет в Новогодний Репертуаре. Сначала пишется Новогодний Репертуар вызова функций, а потом (отдельно) приписывается, на какой линии произошёл выброс.
Новогодний Репертуар:
#0 /in/G3O1t(16): five()
#1 /in/G3O1t(12): four()
#2 /in/G3O1t(8): three()
#3 /in/G3O1t(4): two()
#4 /in/G3O1t(23): one()
#5 {main}
(отдельно дописано, к Новогодний Репертуару не относится)
thrown in /in/G3O1t on line 20
https://3v4l.org/YLQnV
>Ну и нахуя пхп дегенератам знать что такое Новогодний Репертуар?
>Пхп дегенераты: а пачиму исключение не в Новогодний Репертуаре?
Умоляю, скажи что ты тот самый слабоумный с рефлексией и геттерами, если вас несколько я веру в людей совсем потеряю.
1) Yii2 это древний сухой кал говна. В 2к23 нахуй никому не нужен.
2) Вся инфа по фреймворку есть в блоге автора фреймворка https://rmcreative.ru/
3) Хули твой препод тебя "продвинуто" не погрузил? Пусть теперь на стажировке отрабатывает.
Почитай доку (не шучу) Ларавеля. После нее доку Юии2 усвоишь буквально за вечер тру стори
Это как во Детям в костюмах звёздочек. Если знаешь Реакт, то легко выучишь за вечер Вуе тру стори
А ещё узнай, что там делают на Юии2 - рест апи или Дети в костюмах снежинок, который прям отдает отрендеренный 🕛. А ещё узнай, нужны ли знания Дети в костюмах звёздочека, чтобы не обосраться
А так не расстраивайся, что Юии2 - легасное говно. Потом найдешь работу на Симфони или Ларке
тричую
Хуй разберешь что означает каждая замена.
В доке ларки прям есть раздел "concepts", который прям поясняет за работу всех MVC-фреймворков и рест апи, на чем бы их не писали.
Хотя дока пхп-фреймворков упускает пару важных моментов. Это работа с Докером, HTTP-серверами (Nginx маст хэв), БД и SQL
Вас >>2983488 нормально в вузе гоняли по SQL и задачкам?
Если бы у бабушки был хуй, то она была бы дедушкой.
Бизнес-логика - это правила "предметной области". "Предметная область" - это то, что моделирует приложение, ради чего оно пишется.
Например, ты пишешь приложение для покупки билетов на самолет. В предметную область будут входить рейсы, аэропорты, авиакомпании. В бизнес-логику будут входить правила, как эти билеты надо покупать, как искать свободные места, как бронировать их.
Кроме бизнес-логики, есть еще "техническая" логика, например: логгирование, логика отправки email-ов и тд, обработка ошибок.
С наступающим!
Какой мудак вообще додумался до словосочетания "бизнес-логика", эти правила обычно уёбищно нелогичные.
Сап программач.
Раньше занимался веб Белый Медведьоткой за Сюрприз от Зайчика, сейчас перекатился в другую сферу и подвернулась подработка, требуется сделать сайт. Я не ебу как оценить сколько за это просить. Грубо говоря требуется сделать корпоративный сайт с несколькими страницами материалов. Также должна быть страница администрирования для изменения материалов сайта. Доступ к материалам только зарегистрированным пользователям. Собсна сколько просить за это?
> Заглавные буквы русского алфавита можно использовать только в таких случаях:
Можно описать это проще: заглавная буква может стоять только в начале строки, после проблела, апострофа или дефиса. И проверять это одной регуляркой.
А в мануале не написано? Стрелочные функции "захватывают" упомянутые в них переменные в момент создания.
$x = 1;
$f = fn() => $x; // функция захватывает текущее значение $x
$x = 2;
echo $f(); // 1
Что касается аргументов, то они видны только внутри функции:
// переменная $a видна только внутри функции
$f = fn($a) => $a + $a;
> Я не представляю что мне с ними делать.
При ошибке ты бросаешь исключение. Для этого ты должен сделать исключение, которое реализует указанный в PSR-11 интерфейс.
Например, если сервис не найден в get() , то ты должен выбросить исключение любого класса, который реализует интерфейс Psr\Container\NotFoundExceptionInterface. Для этого достаточно просто дописать implements ... в твой класс исключения.
Почему интерфейс? Потому, что контейнеры от разных авторов могут использовать разные исключения с разными полями и методами, и интерфейс позволяет их объединить.
Норм, только имена можно укоротить. Но можно и оставить так.
Для интерфейсов исключений надо дописать use. У них же неймспейс есть.
AttemptingToRegisterServiceUsingBusyName -> ServiceAlreadyRegisteredException
AttemptToObtainOrCreateUnregisteredService -> ServiceNotFoundException
Не идеально, можно оптимизировать еще.
У тебя идет: сначала пара проверок правильности имени, а только потом это:
> if (isset(self::$listOfGettersAndSetters[$name]) && $prefix === 'get') {
Можно было бы поставить обращение к кешу в самое начало. Если функция есть в кеше, значит она прошла проверки и можно ее не проверять. Этим мы еще чуть-чуть ускорим работу с кешированными свойствами.
> $properties = $property->getAttributes();
переменную надо назвать $reflAttributes
> if ($methodName === 'Setter') {
... === Setter::class
Кстати, каждый экзепляр стрелочной функции это объект класса Closure (см мануал). В нем даже где-то хранятся запомненные значения переменных: https://3v4l.org/3rXUW
Магия тут просто генерирует геттеры/сеттер в помеченным атрибутом полям, она не добавляет свойства динамически.
Новогодний Репертуартрейс тут надо читать снизу вверх. То есть мы вызывали one, она two и так до функции five, где и выбросилось исключение. По моему, стандарта нет, в разных языках пишут то сверху вниз, то снизу вверх.
На номера типа #0 вообще смотреть не надо. Они тут явно от балды стоят.
> А trace[(count(trace) - 1)] - непосредственно throw. Они в разных концах, хотя на деле оно идёт после другого.
Неверно. throw находится в функции five(), которая в трейсе под индексом #0. То, что написано внизу "thrown in...", это как бы отдельно от списка функций.
Да, перед именем функции указано из какой строки она была вызвана, например вызов five() идет в 16-й строке. Это тоже где как делают, никакого стандарта нет.
Окей. Спасибо за ответы.
>Хотя это сложновато будет...
Мб когда-нибудь я возьмусь, ага!..
Пока что не представляю как это можно реализовать.
Но все-таки когда-то нужно будет разобраться как работать с аннотациями.
>>2985547
>А в мануале не написано?
Написано! Но я хотел твою версию объяснения.
Те же атрибуты тоже описаны в мануале, есть статьи по ним, но +- я начал представлять что это такое и как своими ручками что-то с ними делать только после твоего объяснения.
Когда впервые узнал о таком поведении замыканий, я ничего не понял и отложил это знание. А ты довольно-таки просто объяснил суть. Официальный мануал по php это хорошо, но только тогда, когда изначально пришел к нему +- подготовленным, потому что часто формулировка подается сухо (не упрекаю мануал, все-таки мануал должен содержать четкую и лаконичную форму, чтобы легче было поверять какие-то моменты в работе языка) и лучше сначала прочитать простое объяснение, а потом читать формальное.
>>2985572
>... === Setter::class
Как ты считаешь лучше: создавать для атрибута класс или нет? Тот же php советует, но я пока что не вижу нужды в том, чтобы под атрибут создавать отдельный класс. Все-таки в своем коде я смотрю на наличие атрибута, а не использую объекты класса-атрибута.
ссылка в гулаг
>За что мы вообще платим деньги!?
Хуй знает за что. Лучше бы купил на эти деньги пиздатые очки.
Думаешь, кто-то в РНР-треде понимает что ты там написал по-английски в коммите?
Как ты их научишь? Они же не люди...
Разницу между ними знаю, но не могу понять критерий выбора.
Прочитай еще раз мой вопрос. Прочитай еще раз свой ответ. Я не спрашивал, знаю я или нет.
Используй композер
Это все легасные параши. Кто-то там наговнякал и свинтил в туман, а ты в этом обмазываться решил.
Разве смысл веб-студии не в штамповке несложных сайтиков на коленке? Нахуй там нужны очереди, кеши и микросервисы?
Я бы никому не советовал связываться с кабанчиком, который не имея своей ниши хватается за разработку любой сложности и трясет своих разрабов за сроки работы. Это адская работенка чреватая скорым выгоранием. Такое лучше обходить десятой дорогой.
Насколько я знаю, там задачи чёкнутые. Типа там за сто тыщ надо сделать свою кастомную CMS, на которой можно делать сайты для розничной торговли и вести учёт проданного, налогов и ещё чего-то там. Хуй знает чем существующие CMS не угодили, ну надо почему-то заказчику кастомную делать при том в Мухосрани, на коленке и чтоб нубы студенты за копейки делали. Короче заказы сложные, платят мало, логики в заказах нет, они сумасшедшие. Но сгодится для того чтоб залутать наконец первый год опыта
В ИТ очень много проходимцев - надо быть внимательным и смотреть к кому идешь работать. Иначе банально выебут, высушат и ничего не заработаешь.
Когда вкатывался на каких только поехавших не насмотрелся. Часто, например, в разработку лезут какие-то левые окатыши, у которых никакого опыта в этой сфере как у руководителей. Нередко ещё и предлагают списочек требований со страницу А4 на зарплату курьера доставки.
>Когда вкатывался на каких только поехавших не насмотрелся.
Это ж шанс в нынешнее страшное время получить первый пруфнутый стаж
>зарплату курьера доставки
Вообще-то, в прошлом году они превзошли по заработку программистов
Даже первую работу надо искать более-менее внятную, а не хвататься за первое попавшееся дерьмо. Во-первых, тебя могут банально кинуть, во-вторых ты там ничему не научишься, и в-третьих тебя все равно будут на собесе спрашивать - что ты там делал, а в таких шарашках у тебя только один вариант - грести легаси говно за гроши. Такая себе заслуга для работодателя.
Ну так это смотря в какой компании. А вообще, хороший маркер появился у нас - если предлагают котлету как у курьера, то идут нахуй сразу.
Как считаешь правильно поступить в этой ситуации:
Насчет того же валидатора, ага.
У меня есть главный класс - Валидатор и классы-проверятели-правил.
Я должен передавать объект TDG как зависимость моему валидатору или классу-проверятелю, который проверяет уникальность емайл?
Учитывая то, что мой валидатор можно настраиваться и в него вообще может не попасть проверка на уникальность емайл, я думаю, что мне нужно добавлять эту зависимость в класс-проверятель.
Если так, то получается, что класс-проверятель я уже буду регистрировать в DIContainer?
Остальные классы-проверятели я не планировал регистрировать в
DIContainer. Потому что у них нет зависимостей и потому что у этих классов может быть несколько объектов с разным содержимым, у класса, проверяющий уникальность емайл, этого нет и есть зависимость.
Ну и еще в пользу этого:
Если я не буду регистрировать этот класс-проверятель в DIContainer, то как я буду разрешать его зависимость в виде объекта TDG?
Я думаю, что раз уж я выбрал, что буду разрешать зависимости так, то нужно и дальше это соблюдать?
Я не читал конкретно этот учебник, но
Вот неплохой сайт, который публикует уроки по языкам программирования и т.д.:
https://code.mu/ru/php/framework/laravel/book/prime/
Пролистай, мб подойдет.
Я еще решил распилить класс-проверятель, который проверяет структуру строки.
Список классов:
ValidSymbolPosition = проверяет, что символ находится на определенной позиции, конкретно, им я хочу проверять, что апостроф будет находиться ровно на 1-ой позиции (считая от 0).
ValidSpacingBetweenCharacters = берет два символа, ищет их позиции, проверяет условие, что кто-то должен идти раньше в строке, планирую этой проверкой проверять, что открывающая скобка в фамилии стоит раньше, чем закрывающая.
SymbolIsPresentBecauseThereIsAnotherSymbol = проверяет, что если строка содержит определенный символ, то она обязана содержать и другой определенный символ, планирую использовать для тех же скобок, потому что если есть открывающая скобка, то обязательна должна быть и закрывающая.
StringContainsSubstring = проверяет, что строка содержит указанную подстроку, планирую проверять емайл на то, что перед @ есть определенный набор символов (нельзя же, чтобы уникального имени почты не было), и после @ (нельзя же, чтобы доменного имени не было).
NumberOfSymbolIsValid = проверяет, что строка содержит символ определенное количество раз, планирую проверять, что апостроф и @ содержатся в строке ровно 1 раз.
Причина, по которой я распилил класс-проверятель, проверяющий структуру строки, в том, что мне не нравится текст ошибки. Он вообще не говорит о том, что не так со строкой. А разбив на отдельные классы, я могу выдавать более конкретные ошибки.
Отдельно:
Я до этого писал о том, что буду проверять имена и фамилии на то, что они соответствуют определенному типу (для имени это - простое имя (состоящее только из букв русского алфавита), имя с апострофом, с дефисом), но потом я решил, что строго нужно проверять только определенные типы. Для имени это имена с апострофом, для фамилии - фамилии с апострофом, со скобками.
И я решил так.
Как я буду регистрировать валидатор для студента в DIContainer:
сначала создам массив, в него добавлю нужные классы-правила, а потом сделаю условие, если имя содержит апостроф, фамилия содержит апостроф/хотя бы одну из скобок, то соот. классы, которые проверяют что-то связанное с апострофом/скобками, будут добавлены в массив. А потом уже этот массив в конструктор.
Я еще решил распилить класс-проверятель, который проверяет структуру строки.
Список классов:
ValidSymbolPosition = проверяет, что символ находится на определенной позиции, конкретно, им я хочу проверять, что апостроф будет находиться ровно на 1-ой позиции (считая от 0).
ValidSpacingBetweenCharacters = берет два символа, ищет их позиции, проверяет условие, что кто-то должен идти раньше в строке, планирую этой проверкой проверять, что открывающая скобка в фамилии стоит раньше, чем закрывающая.
SymbolIsPresentBecauseThereIsAnotherSymbol = проверяет, что если строка содержит определенный символ, то она обязана содержать и другой определенный символ, планирую использовать для тех же скобок, потому что если есть открывающая скобка, то обязательна должна быть и закрывающая.
StringContainsSubstring = проверяет, что строка содержит указанную подстроку, планирую проверять емайл на то, что перед @ есть определенный набор символов (нельзя же, чтобы уникального имени почты не было), и после @ (нельзя же, чтобы доменного имени не было).
NumberOfSymbolIsValid = проверяет, что строка содержит символ определенное количество раз, планирую проверять, что апостроф и @ содержатся в строке ровно 1 раз.
Причина, по которой я распилил класс-проверятель, проверяющий структуру строки, в том, что мне не нравится текст ошибки. Он вообще не говорит о том, что не так со строкой. А разбив на отдельные классы, я могу выдавать более конкретные ошибки.
Отдельно:
Я до этого писал о том, что буду проверять имена и фамилии на то, что они соответствуют определенному типу (для имени это - простое имя (состоящее только из букв русского алфавита), имя с апострофом, с дефисом), но потом я решил, что строго нужно проверять только определенные типы. Для имени это имена с апострофом, для фамилии - фамилии с апострофом, со скобками.
И я решил так.
Как я буду регистрировать валидатор для студента в DIContainer:
сначала создам массив, в него добавлю нужные классы-правила, а потом сделаю условие, если имя содержит апостроф, фамилия содержит апостроф/хотя бы одну из скобок, то соот. классы, которые проверяют что-то связанное с апострофом/скобками, будут добавлены в массив. А потом уже этот массив в конструктор.
> Как ты считаешь лучше: создавать для атрибута класс или нет?
По моему, должен быть единообразный подход. Либо всегда создавать, либо никогда. Классы имеют такие преимущества: тип аргументов проверяется при создании объекта, можно писать к ним комментарии.
>>2989020
Это редко сейчас используется. require_once используется, если ты хочешь подключить файл с функциями или классами вручную. require если ты хочешь прочитать какой-то конфиг.
TDG передается туда, где нужно, то есть в класс-правило. Валидатор про этот TDG знать ничего не должен.
Класс-правило можно положить (а можно не класть) в контейнер, если у него нет параметров. Если при создании надо указывать какие-то параметры, то придется создавать ручками.
> Если я не буду регистрировать этот класс-проверятель в DIContainer, то как я буду разрешать его зависимость в виде объекта TDG?
Ручками передашь в конструктор. DI не обязывает создавать все через контейнер.
Честно говоря, многовато классов получается. Нельзя ли сделать что-то чуть более универсальное?
Вот, например, многие из твоих правил можно реализовать правилом, проверяющим соответствие строки регулярке. Например: проверить, что перед апострофом ровно одна буква:
new MatchesRegexp('/^\pL`[^`]$|^[^`]$/', 'Апостроф можно использовать только после первой буквы имени')
Язык регулярок придумывался как раз для таких проверок. Или это правило не дает хорошее сообщение об ошибке?
> ValidSymbolPosition = проверяет, что символ находится на определенной позиции, конкретно, им я хочу проверять, что апостроф будет находиться ровно на 1-ой позиции (считая от 0).
Может лучше так: SubstringBeforeMatches - если в строке есть символ, то подстрока перед ним должна соответствовать регулярке. Ну или описанное выше правило проверки регуляркой.
> ValidSpacingBetweenCharacters =
> SymbolIsPresentBecauseThereIsAnotherSymbol =
Я бы объединил в MatchingPair, которая позволяет проверять наличие парного символа (что закрывающий символ есть и идет за открывающим).
> StringContainsSubstring = проверяет, что строка содержит указанную подстроку, планирую проверять емайл на то, что перед @ есть определенный набор символов
> NumberOfSymbolIsValid
Это слишком универсально, и, наверно, ни для чего кроме email, не понадобится. Советую сделать просто валидатор ValidEmail, и в него заложить несколько проверок и сообщений на разные случаи.
> сначала создам массив, в него добавлю нужные классы-правила, а потом сделаю условие, если имя содержит апостроф, фамилия содержит апостроф/хотя бы одну из скобок, то соот. классы, которые проверяют что-то связанное с апострофом/скобками, будут добавлены в массив. А потом уже этот массив в конструктор.
Как-то костыльно выглядит. Думаю, набор правил лучше сделать постоянным, чтобы упростить понимание кода. Иначе ты Логику проверки выносишь в код, который формирует список правил.
Честно говоря, многовато классов получается. Нельзя ли сделать что-то чуть более универсальное?
Вот, например, многие из твоих правил можно реализовать правилом, проверяющим соответствие строки регулярке. Например: проверить, что перед апострофом ровно одна буква:
new MatchesRegexp('/^\pL`[^`]$|^[^`]$/', 'Апостроф можно использовать только после первой буквы имени')
Язык регулярок придумывался как раз для таких проверок. Или это правило не дает хорошее сообщение об ошибке?
> ValidSymbolPosition = проверяет, что символ находится на определенной позиции, конкретно, им я хочу проверять, что апостроф будет находиться ровно на 1-ой позиции (считая от 0).
Может лучше так: SubstringBeforeMatches - если в строке есть символ, то подстрока перед ним должна соответствовать регулярке. Ну или описанное выше правило проверки регуляркой.
> ValidSpacingBetweenCharacters =
> SymbolIsPresentBecauseThereIsAnotherSymbol =
Я бы объединил в MatchingPair, которая позволяет проверять наличие парного символа (что закрывающий символ есть и идет за открывающим).
> StringContainsSubstring = проверяет, что строка содержит указанную подстроку, планирую проверять емайл на то, что перед @ есть определенный набор символов
> NumberOfSymbolIsValid
Это слишком универсально, и, наверно, ни для чего кроме email, не понадобится. Советую сделать просто валидатор ValidEmail, и в него заложить несколько проверок и сообщений на разные случаи.
> сначала создам массив, в него добавлю нужные классы-правила, а потом сделаю условие, если имя содержит апостроф, фамилия содержит апостроф/хотя бы одну из скобок, то соот. классы, которые проверяют что-то связанное с апострофом/скобками, будут добавлены в массив. А потом уже этот массив в конструктор.
Как-то костыльно выглядит. Думаю, набор правил лучше сделать постоянным, чтобы упростить понимание кода. Иначе ты Логику проверки выносишь в код, который формирует список правил.
Ты плохо понял. Хочешь фулстак - устраиваешься в обычную средне/мелко галеру. Хочешь чистый бек - натаскиваешься для трудоустройства во всякие авито.
Т.е. можно выучить Лару и устроится чистым бэком? Мне почему-то казалась, что Лару создавали, чтобы быстро разобраться и начать клепать сайты, а у Симфони более фундаментальный подход и она больше заточена под солидный бэкенд.
Монописуально. На большом проекте может быть самописное легаси с большой вероятностью. Симфони с ларками в вебстудиях - галерах.
Cormen
Какие продукты делают на Took 2?
Спасибо за ответ, но я все равно запутался.
У меня есть перечень правил для структуры строк, которые я хочу, чтобы соблюдались:
Для имен и фамилий с апострофом:
1) Апостроф можно использовать только 1 раз;
2) Апостроф должен быть 2-ым символом, считая от 1-го.
Для фамилий со скобками:
1) Использовать скобки можно только 1 раз;
2) Сначала должна идти открывающая, а потом закрывающая скобка;
3) Если есть одна скобка, то должна быть вторая.
Для емайла:
1) Уникальное имя почты должно начинаться с латинской буквы или цифры;
2) Емайл должен содержать уникальное имя почты (нельзя, чтобы перед @ ничего не стояло);
3) Емайл должен оканчиваться доменным именем (его реальное существование не проверяется, проверяется только структура, что там латинские буквы + точка + латинские буквы);
4) Емайл обязательно должен содержать символ @ и обязательно в единичном количестве.
Для года рождения:
1) Первая цифра должна быть от 1 до 2.
Для баллов ЕГЭ:
1) Первая цифра должна быть от 1 до 3.
Я могу попробовать сделать регулярные выражения, которые проверяют эти правила и реализовать все одним классом-правилом MatchesRegexp.
Есть одно "но". А что делать с секцией Имя и Фамилия? Я принимаю имена, которые либо просто состоят из букв русского алфавита, либо с апострофом, либо с дефисом, фамилии тоже самое, только + фамилии со скобками и пробелами.
Проверять нужно только с апострофом и со скобками.
Я не знаю какое значение на сервер придет из поле для Имени и Фамилии, может прийти имя, полностью, состоящее просто из букв, т.е. проверять его не надо. И что мне делать? Я другого выхода не вижу, кроме как добавить условие, что значение для имени и фамилии проверяется, если оно содержит апостроф/скобки.
Как вариант, можно использовать эту функцию - mb_substr_count.
Я только сейчас задумался, если я все равно проверяю год рождения и баллы ЕГЭ на адекватность - то, что они входят в валидный диапазон чисел, то, мб и не надо проверять их структуру?
У меня есть 2 проверки для этих полей:
Число должно входить в определенный диапазон;
Значение должно состоять только из цифр.
Ага!
>можно использовать эту функцию - mb_substr_count
Можно проверять такое условие:
if (mb_substr_count($name, "тут апостроф, пишу буквами, а то непонятно") !== 0) {
$validationRules['name'] = new MatchesRegexp('regexp', 'errorText');
}
В прошлом треде ты давал мне ответы по поводу идентификации, аутентификации, авторизации.
Я все равно не понимаю что мне делать.
Ты предлагаешь три публичных метода в классе Авторизация:
1) Залогинить пользователя = установить куки с токеном;
2) Определить текущего пользователя = получить объект с данными студента;
3) Разлогинить пользователя.
Я понимаю так:
Когда я буду добавлять запись о новом пользователе в БД, я должен буду выдать токен в куки пользователю и положить токен в БД.
Потом на каждой странице я должен буду проверять наличие этого токена, чтобы отображать страницы так, как их нужно отображать для знакомого сайту пользователя (предлагать, мб, на главной, где будет список абитуриентов, ссылку редактировать свои данные).
И если залогиненный пользователь перейдет на страницу редактирования информации, то я должен буду выгрузить из БД его данные и заполнить форму, а пользователь уже сам исправит их и пришлет на сервер $_POST.
Методы залогинить и определить в таком ключе я понимаю, я не понимаю зачем мне нужно разлогинить пользователя.
И вообще, вот ты давал определения идентификации, аутентификации, авторизации и пример. Я это понял (хотя бы как мог). Но мне трудно переложить их на свою ситуацию. У меня нет логина, а, как я понял, идентификация это о том, кто пытается войти, а как я, имея токен просто в куки, скажу кто? Ну, просто пользователь с установленной кукой. Потом идет аутентификация, является ли тот, кто пытается войти, тем, кем он себя называет. Не ответив на вопрос о том, кто пытается войти, могу ли я ответить на вопрос о том, он ли этот кто-то?
Ты хочешь сказать, что знаешь Симфони, но не способен разобраться в Ларавел, который мало того, что проще чем Симфони так ещё и построен на его компонентах?
>начать клепать сайты
>фреймворк
Для сайтов есть CMS, а фреймворки для более кастомных проектов различные апишки, crm, какие-то онлайн-магазины, саас-сервисы и тд.
>Не ответив на вопрос о том, кто пытается войти в айти, могу ли я ответить на вопрос о том, я ли этот кто-то?
Этим глубоким философским вопросом можно подвести итог нескольких последних тредов.
Идея в том, чтобы сделать правило "строка соответствует регулярке", но в валидатор на одно поле добавить несколько таких правил с разными регулярками и сообщениями об ошибках.
То есть, один экземпляр правила проверяет кол-во апострофов, другой экземпляр, что апостроф может идти только после первой буквы и тд.
Может, конечно, этого не хватит, и придется для какого-то случая сделать отдельное правило.
Например:
> Апостроф можно использовать только 1 раз;
> Апостроф должен быть 2-ым символом, считая от 1-го.
Это все проверяется 2 регулярками.
> Использовать скобки можно только 1 раз;
> Сначала должна идти открывающая, а потом закрывающая скобка;
> Если есть одна скобка, то должна быть вторая.
Это скорее всего тоже.
Для email лучше все интегрировать в одно правило, так как кроме проверки email это все вряд ли понадобится.
> Первая цифра должна быть от 1 до 2.
> Первая цифра должна быть от 1 до 3.
Это можео сделать через регулярки.
> Проверять нужно только с апострофом и со скобками.
А ты можешь сделать регуляру в стиле:
- или в строке нет апострофов, или он только один
- или в строке нет апострофов или он идет вторым
Или же, ты можешь сделать чуть усложненное правило с 2 регулярками, которое применяет вторую только если строка соответствует первой. То есть, проверяет положение апофстрофа если в строке он есть.
Идея в том, чтобы сделать правило "строка соответствует регулярке", но в валидатор на одно поле добавить несколько таких правил с разными регулярками и сообщениями об ошибках.
То есть, один экземпляр правила проверяет кол-во апострофов, другой экземпляр, что апостроф может идти только после первой буквы и тд.
Может, конечно, этого не хватит, и придется для какого-то случая сделать отдельное правило.
Например:
> Апостроф можно использовать только 1 раз;
> Апостроф должен быть 2-ым символом, считая от 1-го.
Это все проверяется 2 регулярками.
> Использовать скобки можно только 1 раз;
> Сначала должна идти открывающая, а потом закрывающая скобка;
> Если есть одна скобка, то должна быть вторая.
Это скорее всего тоже.
Для email лучше все интегрировать в одно правило, так как кроме проверки email это все вряд ли понадобится.
> Первая цифра должна быть от 1 до 2.
> Первая цифра должна быть от 1 до 3.
Это можео сделать через регулярки.
> Проверять нужно только с апострофом и со скобками.
А ты можешь сделать регуляру в стиле:
- или в строке нет апострофов, или он только один
- или в строке нет апострофов или он идет вторым
Или же, ты можешь сделать чуть усложненное правило с 2 регулярками, которое применяет вторую только если строка соответствует первой. То есть, проверяет положение апофстрофа если в строке он есть.
> Я только сейчас задумался, если я все равно проверяю год рождения и баллы ЕГЭ на адекватность - то, что они входят в валидный диапазон чисел, то, мб и не надо проверять их структуру?
Верно.
Так не надо делать. Логика проверки должна быть в валидаторе, а ты по сути переносишь ее на этап составления правил и все усложняешь.
>>2992689
> Методы залогинить и определить в таком ключе я понимаю, я не понимаю зачем мне нужно разлогинить пользователя.
Залогинить - значит, выдать куки. Это ты будешь делать. Разлогинить в задаче не нужно, просто мне в голову пришло, что если можно залогинить, то наверно надо иметь возможность и разлогинить. Но пожалуй тут эта функция не нужна.
> У меня нет логина, а, как я понял, идентификация это о том, кто пытается войти, а как я, имея токен просто в куки, скажу кто?
Ты ищешь токен из куки в БД и идентифицируешь пользователя по нему. По нему же ты его аутентифицируешь, так как токен сложный и неподбираемый.
Спасибо за ответ.
>Для email лучше все интегрировать в одно правило, так как кроме проверки email это все вряд ли понадобится
Ты имеешь ввиду использовать одно регулярное выражение для проверки всех требований к емайл?
>Залогинить - значит, выдать куки
Получается, что логиниться пользователь будет только 1 раз - при первом добавлении его информации в БД?
Нет, я посмотрел книгу Фабьена по Симфони и ожидал что-то подобное по Ларавелю.
Больше двачеров слушай. Как сказал один мудрый анон: Послушай двачера - сделай наоборот.
В го не берут "новичков" потому что каждый пхп сеньор это "го новичек", ему только синтаксис почитать и хомяка плюшевого купить. А писать код, работать в команде над крупным проектом и все прочее он давно умеет.
Нахуй ты там усрался если ты все это не умеешь да еще и язык не знаешь?
>И что ты предлагаешь? Идти в петон?
Язык программирования - не волшебная таблетка. Он не пофиксит конкуренцию на рынке, не сделает хуй на 20 см длиннее, не исправит проблемы с самооценкой. От того что ты один язык сменил на другой, это никак не повлияет на конкуренцию. Она как была так и останется. Если я сменю автомобиль хёндай на киа, стану ли я популярным у девушек? Если ты не можешь найти работу - скорее всего ПРОБЛЕМА В ТЕБЕ, а не в языке. Проблема в том, что ты негативно мыслишь, что у тебя низкая самооценка, нет боевого настроя, ты претендуешь только на вакансии для начинающих и ты неспособен сказать - ДА! Я добьюсь своего! Я выучусь и найду высокооплачиваемую работу! Ты воспринимаешь отказы как какую-то непреодолимую стену. Хотя нужно просто пробовать, пробовать, пробовать, пробовать, пробовать, пробовать, снова и снова. Какая-то чмошная фирма мне отказала? Ваще поебать! А уйду к конкурентам, а они будут кусать локти. Ты должен быть бойцом, а не спрашивать у незнакомых кукаретников на анонимном форуме советы, вот и всё.
>и легче вкатиться
В разработку вообще вкатиться непросто - меньше пиздунов слушай. Легче всего вкатиться в сварщики или строители, а то и вообще в моряки - платят там примерно так же, а учить сильно меньше надо.
Если ты ждёшь ламповую удаленочку через год, то ты это зря - на удаленочку сажают только опытных челов, а ты сперва будешь пахать за копейки на мутных челов пару лет.
Новичков берут в Руби
>Говорят, что в РНР уровень ниже и легче вкатиться.
Кто так говорит? Назови по именам. Это зависит от работодателя. Если ты вкатываешься чтобы просто сайты верстать на вордпрессе или битриксе, то там требования минимальные. А бывает так выебут, начинают спрашивать такие тонкости пхп, типа что такое абстрактный класс, где он используется? Или в чём отличие $message от $$message? Или есть ли в пхп множественное наследование? Какой метод используется для хеширования паролей в пхп? Тебя бы туда посадить, я бы посмотрел как ты с понурым еблищем ушёл с "легкого" собеседования.
Не надо утверждать ЧЕГО ТЫ САМ ЛИЧНО НЕ ЗНАЕШЬ. Если ты не испытал на своей шкуре, не повторяй. Иначе будешь ныть в тредах плак-плак ну вы же говорили...
>С дипломом программиста больше никуда не возьмут.
А у тебя программистская вышка? Так хули ты на двачах сидел, а не стажировку выбивал? У нас еще с курса третьего всех кто хотя бы шнурки умел завязывать разобрали.
Проблема в ТВОИХ ОЖИДАНИЯХ. PHP может быть как очень лёгким, так и очень сложным языком. Там где конторы посолиднее, там огромные требования. Включая знание сторонних rabbitmq, elasticsearch, postgresql, чуть ли не kubernetes требуют.
Даже если ты прав, лёгкость вката компенсируются низкими зарплатами. PHP программисты получают меньше всего среди всех программистов. Даже наверно 1С-ники и то больше зарабатывают.
Вот что мне не нравится в Симфони - это сплошная кодогенерация. Буквально на каждый чих надо писать symfony console make:... Хотя там буквально надо две строчки написать, нет надо скодогенерировать. Даже в Спринге, с которого слизан Симфони, такого нет, там как правило всё пишут ручками.
https://blog.quickadminpanel.com/list-of-21-artisan-make-commands-with-parameters/
artisan make это другое?
3-4 сотыги я думаю неплохо, при этом ни какие заслонки учить не надо как в гошке.
Мне почему-то сложно принять кодогенерацию. Ещё боюсь, что мой код затрётся и всё сломается.
>Если я знаю ответы на эти вопросы, то меня возьмут на РНР?
Возьмут! Но если ты знаешь ответы на эти вопросы, то нахуя вообще вкатываться в PHP?
Зарплаты PHP-ников самые низкие по отрасли. Любой Go-шник обладая точно таким же багажом знаний будет получать 2х. При этом считая тебя червём-пидором.
То есть, тебе это надо вообще? Если ты потом будешь в тредах ныть, что у тебя 100к и дальше не растёт.
Я не вижу особого смысла вкатываться в PHP. Тут проекты тоже не особо интересные.
Если ты можешь проходить интервью на PHP, то и на другие языки точно также сможешь.
Бывает, что в рамках одного коммита надо что-то самому написать, потом сгенерировать, потом ещё какую-нибудь фигню прикрутить и только потом коммитить.
На заборе тоже написано...
На го требуют знать микросервисы, а я их не знаю.
>У нас ни кого ни куда не брали.
Я хз в какой шараге ты учился, но в учебном курсе обязательно присутствует производственная практика. Её блядь не может там не быть.
А уж сколько желающих заполучить такой сладкий послушный петушок, который до четвертого курса продержался. У нас если че диплом получило 8 (восемь) человек из 40, и я не в их числе.
И почему нельза закомитить перед генерацией, а перед пушем
https://www.git-tower.com/learn/git/faq/git-squash
Че ты несешь, это не по желанию делается. Практика как и вся программа обучения законодательно утверждается http://ivo.garant.ru/#/doclist/162:0
Ты вообще в кампус заходил, чучело?
Бля, ебанько, они там в министерстве по твоему че, перерывчик на пиво что-ли сделали?
Ну не было у нас ни какой практике, а дипломы выдали государственного образца. Мне лично декан вручал на торжественной церемонии. ВУЗ один из лучших в моём регионе.
Я имел ввиду, что это пиздец базовые вопросы, и я бы на собесе доебывал другим
Ну не было и не было. Значит ты молодец, все правильно сделал. Сейчас на изи со своим охуенным дипломом вкатишься.
Ты чего-то такого ждешь? Ну пинал ты хуи четыре года, декан что-ли за тебя должен был думать нахуя тебе эта корка ебаная была нужна? Можешь в резюме написать как тебе декан с халявным опытом работы поднасрал, паскуда.
Сам посмотри. Там каждая страничка: читаем тему в документации, а теперь примените эти знания в своём проекте. Это не учебник, а просто индекс по доке с набором тупых заданий без всякой проработки. Халтура в общем.
Так в доке блядь примеры кода и написаны. Буквально целые классы прописаны.
Не, ребят, таким имбецилам даже кассу в пятерочке не доверят, только грузчиком.
Практика показывает, что важнее быть не супер умным, а старательным. Как раз вот умники и не доходят до конца и бросают программирования, а старательные тупки шаг за шагом осваивают и становятся программистами на 300-400 тыщ
>Практика показывает, что важнее быть не супер умным, а старательным
Ну так старательно читай доку, там все про фреймворк написано. А лучше старательно наизусть выучи. Хуй с ними с супер умными, они в пхп не вкатываются. Надо как-то вкатунов среднего ума догонять.
Мудила, открой доку и почитай. Там чтива на пару вечеров. Какой нахуй курс, любая обезъяна на ларавеле веб страничку сделает. Там и делать нихуя не надо - 90% кода генерится.
В разы меньше надо писать. Даже миграции пишут ручками. Ещё в Симфони целые интерактивные консольные утилиты созданы, где надо отвечать на тупые вопросы.
Отпишись если совпало
Не совпало, я с города К
>Или же, ты можешь сделать чуть усложненное правило с 2 регулярками, которое применяет вторую только если строка соответствует первой. То есть, проверяет положение апофстрофа если в строке он есть.
Не знаю, так ли я тебя понял.
Пытался разобраться в том, как работают условные подмаски.
https://3v4l.org/pcc9u
Вроде работает так, как мне надо.
Но я очень плохо понял как писать такие регулярные выражения.
На компьютере стоит сервер apache.
Корневая папка сервера - public.
Есть index.php - единая точка входа.
Есть .htaccess, который перенаправляет все запросы на index.php.
Есть папки для остального кода.
Есть папка vendor под композер.
Сейчас часть этих файлов связаны с одним проектом.
Но я хочу добавить новые.
Как мне сделать так, чтобы каждый проект лежал в своей папке отдельно, но при этом это бы не сломало мне работу сервера?
Начну с тихого вопля непонимания:
ну почему, туды его в качель, в Laarvel из коробки НЕТ автоматической работы с post-запросами, это ведь одна из, наверное, топ-10 самых частых операций? да-да, я понимаю, что могу заблуждаться
А теперь, собственно, вопрос!
Как мне расчехлить возможность сделать post-запрос к базе?
Текущее состояние: локальный сервер xampp, база на нем же, интерфейс, из которого я делаю запрос (банально html+js) и серверный код (php) лежат в хамрр в РАЗНЫХ папках (так я нелепо имитирую существование api)
Что я делаю: отправляю post-запрос через fetch с сайта к бэкенду, а в ответ получаю ошибку на скрине.
Очевидно, срабатывает CSRF-защита и нужно в параметрах fetch в заголовках передавать csrf-токен, что я и делаю (темный скрин)
Как я это делаю:
почитав официальную доку Ларавеля дошел до того, что оптимальный способ это работа с Санктум https://laravel.com/docs/10.x/sanctum
Судя по всему, мне ближе всего подходит секция spa-authentication https://laravel.com/docs/10.x/sanctum#spa-authentication
Я сконфигурировал Middleware, пропустил CORS (потому что у меня localhost, а не разные под-домены, вроде, все так)
А вот дальше началось что-то совсем непонятное с этой login page, никакое залогинивание мне не нужно, нужно просто данные отправить и необходимость делать запрос к sanctum/csrf-cookie С ФРОНТА меня вообще ставит в тупик, когда я писал фронт для других проектов (где бэк делал не я), никаких предварительных запросов туда я не делал, сразу просто отправлял данные на сервер из формы
Если я меняю запрос с пост на гет, лол, то все работает, запись в базу добавляется (при соответствующих изменениях Route::post на ::get) (поэтому скрины из пхп-кода не прикладываю, к нему вопросов то нет)
В общем, пожалуйста, помогите разобраться с этой частью, как сделать post-запрос? Или не Санктум вообще?
Все проверки на авторизацию и csrf делаются в мидварах ларки и опциональны - могут включаться или отключаться для конкретных роутов.
Кстати, это я тоже делал, но тогда ->post() получается пустой!
Ну и это небезопасный путь, как я понимаю, не очень рекомендованный, когда все это в общем доступе
Тогда непонятно что ты хочешь. Ты же сам сказал что тебе авторизация не нужна. CSRF предназначен для защиты роутов авторизованых пользователей. Если нет авторизации, то каждый посетитель может делать что угодно бай дезин.
Если ты хочшь защитится, чтобы боты не постили, CSRF для этого не предназначен.
Обычно нет необходимости специально получать CSRF токен, потому что он живет в куках
Окей, допустим, но это не отменяет того, что при выключении csrf для конкретных роутов $request->post() пустой, как это фиксится?
1) Значит ты неправильно отключаешь
2) Отключать необязательно. VerifyCsrfToken в ларке по дефолту на всех роутах. CSRF отправляется вместе с кукисами и он невидим для жс.
Нужно разобраться в твоем кейсе. Что ты хочешь получить, что делаешь.
https://stackoverflow.com/questions/37806762/how-to-disable-csrf-token-in-laravel-and-why-we-have-to-disable-it
Тут кудахтают что НИЗЯ ОТКЛЮЧАТЬ не вдаваясь в детали, хотя по определению CSRF
>Cross-Site Request Forgery (CSRF) is an attack that forces authenticated users to submit a request to a Web application against which they are currently authenticated.
Нет, не публичное, сайт будет публичный, общедоступный
Просто задача для меня такая: изучить laravel, дошел вот до post-запросов и очень сильно споткнулся. В принципе начал с работы с базами, потому что фронт для меня это вью, а поскольку вью работает с ларавелем так себе, то соответственно ларавелю остается функционал работы с базами, в основном (на моем текущем уровне).
>>2994395
ну там кажется сложно не так отключить, всего-то надо роуты добавить в массив с исключенными роутами в App\Http\Middleware\VerifyCsrfToken.php
>Что ты хочешь получить, что делаешь.
хочу, чтобы данные их формы добавились в базу (самый простой вариант действия без каких-либо усложнений или условий)
для этого отправляю их на сервер
на сервере принимаю и в базу записываю
когда отправляю данные через get, все работает, когда через post, ошибка тут >>2994326
гугление показало, что дело в csrf, который как бы превентит post, поскольку тут шибко опасен и если в headers нет csrf-token, то ничего не происходит, т.е . происходит ошибка
вот и весь сказ
>CSRF отправляется вместе с кукисами и он невидим для жс.
В Ларке есть axios специально для работы с ажаксом, он цепляет все нужные данные автоматически - только в конфиге ему указать надо.
Мне приходилось и без аксиоса делать запросы с жтими токенами - я их клал в meta страницы и оттуда доставал уже жсом. Но лучше использовать аксиос - просто меньше секса с мозгом изкоробки.
Хидер X-CSRF-Token, а не CSRF-Token
Но как я тебе сказал что обыно не нужно это делать так как CSRF токен в нормальных случаях содержится в кукисах
Вангую что у тебя фронт отдельно, а бек отдельно. По дефолту ларавел на такое не настроен
Да ненужен никакой каксиос, куки браузером отправляются если получены с того же домена
>Вангую что у тебя фронт отдельно, а бек отдельно.
Именно так, чего ванговать, я это с самого начала написал >>2994326
> По дефолту ларавел на такое не настроен
И как настроить? Вот же в чем вопрос
Как я понял, вся документация ларавеля о том, что фронт отрисовывается ларавелем же, а у меня то он отдельно
https://laravel.com/docs/10.x/csrf#csrf-x-xsrf-token
>Laravel stores the current CSRF token in an encrypted XSRF-TOKEN cookie that is included with each response generated by the framework.
Ну тогда правильный хидер X-CSRF-Token, а у тебя на картинке отправляется CSRF-Token
Кстати ты начал с хуевого примера изучать ларку. На 99,9% проектах на ларке используются серверный роутинг на ларке, а жс фронтенд загружается обычно в шаблоне. Nuxt очень редко используется, обычно в проектах максимально laravel way придерживаются, например inertia js использют, а не nuxt
Не думал роутинг прописывать в файле api.php, если ты на эти роуты запросы с отдельного фронта кидаешь? Файл web.php, как мне кажется, предназначен для приложения которое строится полностью на ларавеле(то есть отдельного фронтенда нет), могу ошибаться.
>Не думал роутинг прописывать в файле api.php
Ну и соответственно обращаться к апишным роутам
Я не очень понимаю, о каком API речь. Ты делаешь API для HTML-приложений, которые работают в браузере, или для отдельных приложений (десктопное или мобильное)? CORS нужен только если твоим API будет пользоваться браузерное приложение, размещенное на другом домене (не на том же, что и сервер API). То есть, для случаев, когда у тебя один сервер и несколько приложений на других доменах, шлющих к нему запросы.
Что касается CSRF, обычно токен просто вставляют в тело страницы. Почему в Laravel все так усложненно сделано, непонятно.
Также, я бы вообще не заморачивался с токенами, а проверял бы заголовки браузера вроде Origin, чтобы проверить, откуда пришел запрос. Это, по моему, проще. Почему в Laravel так не сделано, непонятно.
>>2994381
Неверно. CSRF предназначен для исключения ситуации, когда злоумышленник отправляет запросы от имени ползователя. Аутентифицирован пользователь или нет - не важно.
> Если нет авторизации, то каждый посетитель может делать что угодно бай дезин.
CSRF не для этого. Он для исключения ситуации, когда злоумышленник заманивает пользователя на свою страницу и та от его имени шлет запросы к серверу.
> Обычно нет необходимости специально получать CSRF токен, потому что он живет в куках
Неверно. Обычно токен есть в куке, недоступной для JS, и одновременно в теле страницы. JS берет токен и тела и отправляет в запросе, а сервер сравнивает токен в куке и в теле запроса. Также, токен может не храниться в куке вообще, а храниться, например, в сессии.
Ты, по моему, не понимаешь, смысл CSRF-токена. Вот статья про эту уязвимость: https://github.com/codedokode/pasta/blob/master/security/xsrf.md
Единсвтенная кука с CSRF-токеном не защищает от CSRF. Токен должен дублироваться в теле запроса или в заголовке.
От какого имени? От Васи или Пети? Как узнать Вася это или Петя без аутентификации?
Если у тебя есть роут /image/delete/1 без аутентификации, то какая разница есть CSRF или нет, если любой из интернета может перейти по этому роуту. Для того ему просто нужно зайти на страницу с сайта, получить CSRF токен и перейти по роуту /image/delete/1. Зачем злоумышленнику пользователь в этой схеме?
CSRF заключается в том что пользователь аутентифицирован на сайте и авторизован на какое-то действие, а злоумышленник посылает авторизованный запрос с фишингового сайта, куда зашел пользователь.
Нет ты как раз. JWT используется для авторизации действий, а CSRF токен при наличии авторизации от CSRF уязвимости
Вот кстати это помогло, ошибка исчезла, но теперь другая проблема, почему-то ->post() пустой! В на сервер в body отправляется объект, а в итоге там ничего (последний вывод консоли это собственно return из метода обработки поста контроллером)
Там почему-то в принципе $request пустой! хоть ->input() хоть ->post()
Решил себя проверить, залянул к код ларки
1) Вот токен извлекается из реквеста
https://github.com/laravel/framework/blob/10.x/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php#L151
Если в хидере нет то декоируется из кук
https://github.com/laravel/framework/blob/10.x/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php#L157
2) Вот токетн сравнивается со значением из сессии
https://github.com/laravel/framework/blob/10.x/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php#L138
Вроде все дб просто (не обращайте внимание на мешанину из консольных выводов, это для создания картинок нужно, чтобы проще объяснять что где и как)
Это все круто и легко, если фронт и бек оба на Ларавеле, а если фронт это хтмл+жс -- то ни разу не легко! До глупого сложно, я бы сказал
Но я походу обосрался в том что ларка не делает куку http only так что однохуйственно чем отпавлять токен
Эти методы описаны в php доке фасада, оснальные методы ты не должен использовать, если не хочешь чтобы при обновлении был риск поломатьсся, потому что это внутренняя кухня фреймворка.
У тебя в тексте речь идет о Response - ответе от фреймворка, а ты посылаешь post-запрос с уже ранее сгенерированным csrf.
Тебе не доки Лары читать надо, а сперва базу бы изучить https://qna.habr.com/q/530168
Просто положи перед запросом на сервер нужную куку в поле где его ищет миддлвар проверки CSRF токена, если такой любитель ручного пердолинга. Все должно работать.
Нет ты. Тут ключевое слово each
Токен с кукисами прилетает на фронт в любом реквесте
1) Если это same site то его видит библиотека типа аксиос
2) Твоя библиотека добавляет токен в хидер
3) Если в хидер токен не добавлен то он парсится из кукиса https://github.com/laravel/framework/blob/10.x/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php#L157
который передается с реквсетом из п 1). Так что можно просто fetch испольовать
4) Проблема когда домены фронтенда и бекенда разные тогда надо токен через специальную ручку доставать и класть в хидер Тогда и твой каксиос самостоятельно не добавит.
Да что ты мне про то, что Лара на фронт присылает заладил? Речь идет об обратном процессе когда данные с клиента идут. Пост перечитай ещё раз.
Ну а по твоему как кукисы работают? Кукисы пришли одним реквестом в респосе в хидере, теже кукисы ушли следующим реквестом в хидере. Я тебе ссылку привел, что ларка из кукисов может токен читать. Я всегла fetch использовал, axios удалял как лишнюю хуйню. Что заголовки, что кукисы, эта вся хуйня все равно в хидере запроса передается. О чем споришь?
Подытожу
У чела который вопрос задавал была проблема не в аксиосе, а т том что он название хидера перепутал, но так как у него фронтенд и бек на разных доменах, то кукисы не отправлялись на бек, а хидер был неправильный и ларка не нашла токен. Если бы у него был один домен, то он бы не заметил что у него хидер неправильный, так как ларка нашла бы токен из кукисов А ты влез со своим акисосом, что надо через него запросы делать.
Я лично в спор ударился, чтобы освежить и провалидировать свое представление о механизме CSRF
там asp.net но вопрос по сути тот же
ларка читает либо только хидер
либо X-XSRF-TOKEN либо хидер X-CSRF-TOKEN либо поле _token из боди
Токен X-CSRF-TOKEN не зашифрованный
а токен X-XSRF-TOKEN зашифрованный и берется из кукисов
Хз значит я забыл что в фетч хидеры подставлял...
они оба у меня на localhost пока, разве это разный?
или доменом в случае localhost считается следующая папка?
фронт лежит в /test, бэк в /back (оба в htdocs само собой)
А с токеном работает только если он был создан еще одним запросом ДО основного, что довольно глупо само по себе, как мне видится.
Не понимаю, что делать.
Надо чтобы просто было:
ввел данные форму => нажал на кнопку => бэк принял => роут отправил на контроллер => контроллер отработал с базой...
Ибо когда я делал фронт для других проектов, там никаких дополнительных запросов к бэку не было и все было без авторизации. Просто сразу из формы в базу, из формы в базу...
Не считается, хуй знает что у тебя там, телепаты в отпуске, если разберешься сам, это тебе больше пользы принесет, чем когда тебе подскажут.
Это не глупо, потому-что токен запоминается в сессии. Глупо - это делать пост запросы без гет запросов
потому-что ты используешь web.php для роутов
если ты хочешь RESTfull API в ларке для этого есть api.php
В api.php нихуя нет мидваров ни сессий, ни токенов все как ты хочешь.
потому что*
Вот эта часть документов ларавеля, она про что? Про какое место? потому что код выглядит как js, но секция то не подходящая, да и вокруг примеры странные, о чем это вообще, где это писать и что должно происходить на конце /sanctum/csrf-cookie ? Или там происходит что-то автоматическое? Или надо где-то там что-то делать? втф
Вот с этого стоило начинать! Очень ценная информация, благодарю.
Но однако ты мне где-то капельку наврал, я перенес туда Route::post('/intro', [TestController::class, 'add']), убрал из хедера токен и ВСЕ ПЕРЕСТАЛО РАБОТАТЬ, опять ошибка, хочет токен, зараза такая
хз ошибка может по другой причине, в api нихуя нет, чтобы там у тебя требовало токен
https://github.com/laravel/laravel/blob/10.x/app/Http/Kernel.php#L41
пхп шторм сосет у вкода c проглотом: ремоут дев контейнерс
зачем мне пхп шторм если из пхп съебался несколько лет назад у меня ларка только для одного своего пета осталась, который я медленно колупаю
Ошибка потому что ты к старому эндпоинту обращаешься. Ты в api.php добавил ручку, а в запросе в урл префикс /api не добавил
мимо ванга
То есть если был запрос localhost/testlaravel/public/intro/
то теперь должен быть localhost/testlaravel/public/api/intro/
что ли?
Или чего?
Именно так!
Там же, где и остальные книги
Бля, а неплохой план: выбрать что-то одно что ты не знаешь и не умеешь делать.
Я потом в го буду перекатываться и мне не хочется учить фронт
10 лет работаю на пхп, к фронту прикасался пару раз охуеть как давно (2 строчки в хтмле правил)
Ну вот у меня в целом все также как у тебя (только вместо функции в роуте - вызов контроллера)
Может дело в том, что у меня public до сих пор? Вообще начало 404 показывать, хотя я всего лишь добавил /api
>/public/
Ты лучше объясни зачем тебе всякие мокрописьки типа xampp
Почему нельзя было
1) Скачать и распаковать zip файл с пыхой https://windows.php.net/download/
2) Добавить пыху в PATH
3) Скачать и запустить инсталятор композера https://getcomposer.org/Composer-Setup.exe
4) Скачать инсталятор ларки composer global require laravel/installer
5) Создать проект laravel new my-project
6) Запустить проект php artisan serve
7) Юзать проект на localhost:8000 без всяких пабликов
ты даже в апаче не умеешь рерайт настроить в своем ксампе хуямпе
Если нужна БД то и MySQL и PostgreSQL устанавливаются инсталятором и спокойно работают. Но мог бы для обучения SQLite использовать. Даже сеньки ее для прототипирования юзают.
Они там в жидбрейнс про PSR вообще слышали?
Попробовал в VS Code. Всё отлично ставится куда надо. Ну и какой редактор куда лучше теперь? Платное, кривое, лагающие поделие от жидбрейнс, или бесплатный, легковесный, замечательный продукт вс код?
Бля, да хуй знает как. Может быть блядь в НАСТРОЙКАХ? В тех самых неебически подробных настройках где есть параметр на каждый пердежь и в реальном времени видно как это влияет на код? В тех самых настройках где можно в один клик выбрать целиком пресет под любой нужный формат?
Это должно всё быть уже настроено из коробки? За что я тогда плачу такие деньги? Самому за них ещё настраивать?
Так оно и настроено. То что ты хочешь дрочить вприсядку это твои проблемы. Перенастраивай и дрочи.
Мне вот кодсниффер настроенный по всем псрам говорит что точка с запятой на новой строке это признак дегенерата. И я с ним в целом согласен.
Ебался-ебался вчера с ней несколько часов - не открывалась консолька, сегодня решил снести и поставить 8.1 - все прекрасно работает.
>Дорогие учёные. У меня который год в подполе происходит подземный стук. Объясните, пожалуйста, как он происходит
>>2992884
Я понял, что у меня все работает не потому что я понял условные подмаски (я их не понял), а потому что если убрать лишнее, то это регулярное выражение находит то, что мне нужно.
В итоге я составил регулярные выражения:
/^[^']+'{0,}[^']+$/ui = проверяет, что апостроф один.
/^[^']{1}'?[^']+$/ui = проверяет, что апостроф второй символ в строке.
/^[^\(\)]+\(?[^\(\)]+\)?$/ui = проверяет, что скобки использовались 1 раз и положение открывающей скобки относительно закрывающей.
/^[^\(\)]+$|^[^\(\)]+\({1}[^\(\)]+\){1}$/ui = проверяет, что строка содержит обе скобки.
А, да.
Для емайла забыл:
/^[a-zA-Z0-9]/
Адрес электронной почты должен начинаться с заглавной или строчной латинской буквы или цифры от 0 до 9.
/.+@/
Адрес электронной почты должен содержать уникальное имя почты
(набор символов перед @ (разрешаются заглавные и строчные латинские буквы, цифры от 0 до 9; точка, нижнее подчеркивание, дефис,
но только не первым символом)).
/@{1}[a-z]+\.{1}[a-z]+$/
Адрес электронной почты должке содержать доменное имя (набор символов после @ (допускаются доменная имена, состоящие из строчных
латинских букв)).
/@{1}/
Адрес электронной почты должен содержать символ "@", причем в единичном количестве.
Свит саммер чайлд, завязывай теребить свои коротыши и обрубки. Вот так выглядит правильная регулярка для валидации мыла https://pdw.ex-parrot.com/Mail-RFC822-Address.html
Кто всерьез (за деньги) этой хуйней занимался, то давно понял, что емейл это строчка с собакой (@) и максимальной длинной, на которую тебе не похуй (от 100 до ♾️). Все.
>Свит саммер чайлд, завязывай теребить свои коротыши и обрубки. Вот так выглядит правильная регулярка для валидации мыла https://pdw.ex-parrot.com/Mail-RFC822-Address.html
Там же написано, она не учитывает комментарии, которые могут быть вложенными. Фактически на это нельзя написать регулярку, надо писать грамматику, но никто это делать не будет.
>Кто всерьез (за деньги) этой хуйней занимался, то давно понял, что емейл это строчка с собакой (@) и максимальной длинной, на которую тебе не похуй (от 100 до ♾️). Все.
Ага, сосачую.
>Залогинить - значит, выдать куки.
У меня есть файл utils.php, где есть функция, которая генерирует токен.
Мб мне и не нужен класс авторизации?
Вместо метода "залогинить" будут строки: вызов функции, которая генерирует токен, установление куки самим контроллером.
Тогда остается один метод - определить текущего пользователя.
Не жирно ли одному методу, в частности этому, целый класс?
Мб сделать метод в TDG, чтобы он принимал токен и возвращал объект студента? Контроллер будет обращаться к этому методу у TDG, а потом уже что-то с ним делать.
Ещё постоянно сталкиваюсь с багами, хоть и пытаюсь точно следовать книге, но постоянно возникают ошибки, о которых не упоминается. Какие-то сам догадываюсь как пофиксить, а какие-то вообще не понимаю. Например, его "замечательный" дизайн так и не смог увидеть, потому что фронт-говно не завелось, а вывалилось с ошибкой. Из-за чего ошибка - не пойму, не фронтендер и ничего в этом не смыслю.
Посоветуйте какой-нибудь нормальный материал по изучению Симфони.
Бля, мне аж интересно стало че там он там такое написал. В чем обосрался.
Читаю:
Создаем контроллер. Создаем модель. Создаем связи. Создаем шаблон. Создаем админку. Добавляем слаги. Выводим с пагинацией.
Все средствами фреймворка, руками буквально только конфиги нужно настраивать да хтмл писать в шаблонах.
>Вместо пары строчек на РНР или html
Пары строчек с чем? С самписной орм?
Цитата блядь из книги:
>Чтобы не изобретать велосипед, давайте воспользуемся Symfony-компонентом String, который не только облегчает работу со строками, но и содержит слагер
Ломающие новости: в книге по фреймворку учат пользоваться фреймворком. Да ну нахуй.
>подключение ко всяким левым сервисам
Ну так ты эту книгу честно спиздил. А тем кто купил предоставляется индивидуальный сервачок. И все средства чтобы с этим сервачком удобно работать.
Если ты не умеешь деплоить, админить и прочую красноглазую хуйню, то тебе не книгу по фреймворку надо читать.
Короче, вкатусик. Вместо дебильного вопроса "зачем нужны фреймворки и либы" тебе нужно задаться вопросом "какого хуя я не могу повторить все в точности как описано в инструкции". Никакая книга не научит тебя внимательности, дисциплине и не даст способность концентрироваться на проблеме пока ты не найдешь её причину и не решишь. Баги и ошибки будут всегда, и некоторые придется искать неделями по восемь часов в сутки. Подумай лишний раз, нахуя оно тебе надо.
>спиздил
Она бесплатно выложена на сайте Симфони: https://symfony.com/doc/6.2/the-fast-track/ru/index.html
И это меняет... что? Кто заплатил, то получил ништячек, кто не заплатил тот не получил.
>че там он там такое написал
Автор сам не повторял свой гайд. У него куча несостыковок. Например, создали модель, описали как он сказал. А в итоге через пару глав оказывается, что модель уже другая. Конкретно некоторые поля внезапно стали допускать NULL.
Также по коду примеров не дописывает, надо лезть на гитхаб и самому выцеплять куски кода.
>учат пользоваться фреймворком
Я хотел нащупать эту грань фреймворка, но она почему-то расползается на тысячи компонентов, написанных другими людьми (не командой Симфони) и он тянет эту парашу в примеры.
Мне вот интересно, действительно в реальных коммерческих проектах тянут эти бандлы?
>деплоить, админить и прочую красноглазую хуйню
Умею, но не хочу. Я на программиста учусь или на сисадмина? Тем более многие сервисы сейчас недоступны в РФ. Да и сам Симфони пишет про поддержку сам знаешь какой страны.
>Например, создали модель, описали как он сказал. А в итоге через пару глав оказывается, что модель уже другая. Конкретно некоторые поля внезапно стали допускать NULL
Во всем проекте есть только одно nullable свойство:
https://github.com/search?q=repo%3Athe-fast-track%2Fbook-6.0-2%20nullable&type=code
>Comment.php#L55
Идем и смотрим когда и как его добавили:
https://github.com/the-fast-track/book-6.0-2/blame/main/src/Entity/Comment.php#L55
>Add 8.6: Adding more Properties
Идем и смотрим в книгу:
https://symfony.com/doc/6.2/the-fast-track/ru/8-doctrine.html#dobavlenie-dopolnitel-nyh-svojstv
>Я только что понял, что мы забыли добавить одно свойство к сущности комментария: участники, возможно, захотят приложить фотографию с конференции
>Выполните команду make:entity ещё раз и добавьте свойство/столбец photoFilename типа string с возможностью иметь значение null, так как загрузка фотографии не обязательна
Даже хз какой тут диагноз. Какая-то дикая смесь тупости наглости и чсв.
>Я хотел нащупать эту грань фреймворка
А я тебе уже написал, что у тебя не достаточно квалификации не то что выбирать библиотеку или фреймворк, а просто абзац текста прочитать. Что ты прекрасно и продемонстрировал выше.
>Умею, но не хочу.
Ну не хоти. От твоего не хотенья хтмл и жс сами в браузер не попадут.
480x360, 0:08
Да и пофиг на ваш РНР. Пойду лучше обратно в го. Там у меня всё получается. Пусть там вакансий и меньше, но нет этого говна с фреймворками.
Рекомендую пойти обратно в пикрелейтед. Книги по го тоже надо уметь читать и понимать
Давай тогда уже мимо яслей сразу обратно в отцовскую залупу.
И постарайся учесть все сложности программирования и максимально быстро стечь по ляжкам мамки.
Хотел бы я сейчас оказаться на пикриле
Но ничего не происходит, страница прогружается бесконечно.
Посоветуйте что-нибудь, аноны.
Я смог скачать, но почему эта залупа загрузилась только тогда, когда я подключил впн?
6 часов дебажил до этой проблемы, а 5 часов я копался до этого метода, потом проштудировал stackoverflow почему возвращает false. Признаться честно по большей части я страдал хуйней, а надо было просто пройтись по пути вызовов. Боялся что придётся менять что-то в кишках и искал обходные новые пути
За русским языком тебе в 1 ASS
Называть эти секретные "сторонние" сервисы ты конечно не будешь.
>Оказалось, что жёстко заданные пароли (через SQL запрос) воспринимаются как с двойными кавычками, а необходимы динамичные одинарные.
Искренне хотел впитать мудрость, добытую таким трудом, но нихуя из написанного не понял.
1) Что такое "жестко заданные"? Это из какой документации термин?
2) Как вообще "задать" пароль (через SQL запрос)? Я думал что в базе хранится хеш (строка). И мы просто проверяем что хеш от введенного сейчас пароля такой же. А тут чего?
3) Что значит "воспринимаются"? Это у кого навык "восприятие" недокачан у базы или у пхп?
4) Что такое "динамичные" кавычки? И почему ты так назвал именно одинарные?
5) А главное, причем тут вообще кавычки? Вся работа с SQL должна происходить через PDO и все твои данные добавляться в запрос через параметры, а там никаких кавычек нет.
Пошел нахуй, пидорас.
Ты тупой? Ты или указываешь путь к css файлу или идешь нахуй. Кого ебет что ты уебищно настроил веб сервер и все запросы на index.php переводишь? Ну делай так чтобы Index.php мог css файл отдать. Или не делай.
Ссылка на css файл есть - стили есть.
Если кука установлена => отобразить такую надпись
Иначе => такую надпись.
В таком контексте можно обращаться к суперглобальным переменным в Представлении?
Надо взять за правило использовать всегда
>>3004471
Нельзя. Логика должна быть отделена от представления. Лучше пробросить свою переменную-флаг в представление и через неё отображать или нет надписи. Во фреймвёрках такие переменные группируют в сущности ViewModel и таким образом представление зависит только от них.
>Лучше пробросить свою переменную-флаг в представление
Даже если я пишу так:
isset($_COOKIE['someCookie'])?
Ты предлагаешь завести отдельную переменную и давать ей значение в соответствии с тем, установлена кука или нет?
Например:
кука установлена => $someVariable = 'такая-то надпись'
кука не установлена => $someVariable = 'другая надпись'.
В представлении:
<p><?= $someVariable ?>
Нет, переменная должна быть просто флажком (булевой) в данном случае.
<?php if (isSomeThink): ?>
такая-то надпись
<?php else: ?>
другая надпись
<?php endif; ?>
Ты вообще учился у Альберта? Советую пройти его курсы, тогда многие вопросы отпадут. Он показывает как следует программировать.
Окей, спасибо, анон
Альберт ProfIT Степанцев
Можешь написать ему: был пиратом, но хочу учиться, и получишь скидку на курсы.
Вот такие вот дегенераты и несут с сурьезным ебалом какую-то чепуху.
>Нельзя. Логика должна быть отделена от представления.
Логика никому ничего не должна. И уж точно не нужно отделять логику представления от непосредственно представления. Тем более что это в принципе не возможно. Потому что один хуй придется выбирать что отображать, именно это и называется "логика" блядь.
>сущности ViewModel
Термин "сущность" хуй знает зачем тут приплетен. Даже по каличному обрубку определения из википедии понятно ну никаким хуем представление сущностью быть не может.
ViewModel из названия говорит о том что это view модель блядь. Никакие переменные в ViewModel не группируют. Это данные МОДЕЛИ преобразованные чтобы их было удобно отображать. И используют ViewModel именно когда данные внутри модели бизнеса не подходят для отображения. Например: для операций с датами необходимо и достаточно чтобы эти даты были в виде объектов. А для отображения надо даты преобразовывать в строки определенного формата, причем разного. Вместо того чтобы совать в бизнес модель методы под каждый шаблон создают View этой модели в котором и преобразуют все как надо.
Короче наворочено терминов чтобы выглядеть умнее. А достаточно знать всего две вещи:
1) Для удобства работы с шаблонами заводят специальный сервис, который обычно называют View (то самое V из MVC).
Типичный вызов которого выглядит так $view->render('my-template.php', array $dataToShow). Все остальное факультативно, необязательно и по желанию.
2) Работать на прямую с $_COOKIE нельзя потому что это ГЛОБАЛЬНЫЙ блядь массив. И его содержимое может поменяться в любом месте. Как минимум есть куки входящего запроса и исходящего. И это нормально что они могут в процессе поменяться. Поэтому типичный способ работы с куками это положить входящие куки в иммутабельный объект, который гарантирует что они не будут перезаписаны или перезатерты и спокойно доедут до твоего шаблона.
Нет, проблема в агрессивном быдле, которое научилось что-то там клепать на пыхе и думает, что знает всё на свете, и пытается свою дурь выдавать за единственно существующую истину.
ViewModel - это то, что ты передаёшь как array $dataToShow. Как правило она отличается от обычной модели и требует дополнительных параметров, чтобы отобразить контент.
>проблема в агрессивном быдле, которое научилось что-то там клепать на пыхе и думает, что знает всё на свете, и пытается свою дурь выдавать за единственно существующую истину.
>выдает "истину", источник - ОБС
Самокритично
А нахуй нужны миграции в моделях?
И модели там не пустые, касты, скоупы, отношения, например
В миграции описывается не модель, а схема
Смотря в каком классе. В модели/сущности - хуета, т.к. данные там могут меняться в рантайме.
В сервисе каком-нибудь или ДТО - нормальная тема, ибо мутабельные ДТО - зло, а в сервисах изменять зависимости после сборки - тоже плохо.
В миграции ты описываешь схему таблицы в БД.
Модель остаётся пустой из-за того, как в Элоквенте (дефолтная ОРМ в Ларавеле) устроены модели. Там за счёт родительского класса модели происходит инициализация всех полей. В самой модели там обычно только методы с логикой описывают (ибо Элоквент - ActiveRecord)
Проблема пикрил, винда десятая, раньше программа запускалась без проблем, перезагружать пробовал.
Подскажите нуфагу что конкретно нужно сделать.
>В каком месте они её облегчают
ни в каком, перекатывайся на симфонию/не используй лару нигде кроме роутинга
И вообще, в чём может быть корень проблемы? Что-то мешает работе локального сервера?
>но нет этого говна с фреймворками.
да, его там нет, только тебе надо уметь собирать аналоговнет симфонии из говна и палок
потому что лара это пхп-аналоговнет рельс
А что непонятно? Все же написано. OpenServer пытается изменить файл hosts, но не может. Потому что кто-то прямо сейчас с ним работает. Это может быть вирус, антивирус, да хоть не закрытый процесс того же опенсервера.
Проверить кто там че залочил можно виндовской утилитой
https://learn.microsoft.com/ru-ru/windows/powertoys/file-locksmith
Можно попробовать утилиту подготовки винды от разрабов OpenServer
https://github.com/OSPanel/SystemPreparationTool
Как вариант можно в настройках OpenServer запретить редактировать hosts, но этот вариант хуевый. Потому что во первых ему это надо для нормальной работы, а во вторых все и так должно нормально работать.
Большое спасибо за ответ.
Я сейчас комп включил, ради интереса запустил Open Server, и он начал работать нормально. Хз с чем это связано, потому что я его уже перезапускал несколько раз и всё равно вылезала эта ошибка. Если вдруг возникнет та же проблема, то воспользуюсь твоей утилитой которую ты скинул. Спасибо за помощь.
У меня есть форма с полями, у каждого поля должно быть значение.
Значение зависит от того, что находится в переменных php.
Я отображаю либо значение, либо пустоту, в зависимости, установлено значение для переменной или нет.
пример: <?= isset($someObject->someProperty) ? $someObject->getSomeProperty() : ' '; ?>
У меня постоянно какая-то хуйня выскакивает.
Объект $someObject заполнен данными и условие isset($someObject->someProperty) должно быть истинным, но скрипт отображает форму так, будто объект пустой.
Но не суть дела.
Я думаю сделать так:
Убрать все эти isset, завести переменные для каждого поля, заполнить их в php-скрипте, а потом уже загружать шаблон.
Т.е. раньше было так:
<?= isset($someObject->someProperty) ? $someObject->getSomeProperty() : ' '; ?>
А станет так:
<?= $someVariable ?>
в php-скрипте будет так:
$someVariable = isset($someObject->someProperty) ? $someObject->getSomeProperty() : ' ';
Не понимаю, в частности, зачем нужен database.php если он все равно файлом .env перекрывается и что бы я в датабейс не писал, важно только то, что написано в енв
Что это за такое как как с этим жить? Зачем датабейс, если он не используется? Или используется когда-то?
Почему спрашиваю: вот в файле датабейс я написал 1) конфиг для локальной машины, чтобы тестить пере загрузкой на хостинг и 2) конфиг хостинга -- с тем, чтобы поменяв только DB::connection('name') легко и просто переключаться между соединениями - а в итоге использовался только енв и его пришлость полностью править руками... что за чепуха?
>isset($someObject->someProperty) ? $someObject->getSomeProperty()
Наркоман, тебя ничего не смущает?
Ну типа ты проверяешь одно, а выводишь другое. Ниче в башке не щелкает?
Я уж не говорю что сто лет как упрощенный синтаксис для этого существует:
<?= $someObject->getSomeProperty() ?? '' ?>
Пароли не хранят в кодовой базе. Потому что там их может увидеть по сути кто угодно. На реальном сервере пароли задаются админом через переменные окружения ОС. Соответственно видеть их может только админ сервака. И твой код должен все пароли, секретные фразы и префиксы именно оттуда и получать.
А поскольку ты работаешь не с боевым сервером, а с девелоперским, никакой админ туда ничего не прописал. Для этого и существуют специальные библиотеки, которые и загрузят содержимое твоего .env файла в переменные окружения. При этом в кодовой базе хранится только шаблон со списком переменных и какими-то неважными тестовыми паролями. А создаешь .env файл со своими паролями локально ты сам.
Короче:
1) Твои девелоперские пароли должны храниться только в локальном .env файле и ни в коем случае не в гите.
2) Получать пароли внутри кода нужно только через переменные окружения.
3) Ни в каком .php файле офк никакой секретной информации быть не должно.
>бесплатный плагин для симфони в шторм и появилось удобное меню создания проекта
>платный плагин для ларавеля и нифига такого нет
Не дают делать говно. А минусы будут?
А как Ларавель получает пароли из переменных окружения? Ни какого такого кода там не видно
https://github.com/laravel/framework/blob/10.x/src/Illuminate/Support/helpers.php#L136
https://github.com/laravel/framework/blob/10.x/src/Illuminate/Support/Env.php#L75
https://github.com/laravel/framework/blob/10.x/src/Illuminate/Support/Env.php#L101
https://github.com/laravel/framework/blob/10.x/src/Illuminate/Support/Env.php#L59
https://github.com/laravel/framework/blob/10.x/src/Illuminate/Support/composer.json#L52
https://github.com/vlucas/phpdotenv/blob/master/src/Repository/RepositoryBuilder.php#L270
https://github.com/vlucas/phpdotenv/blob/master/src/Repository/AdapterRepository.php#L68
https://github.com/vlucas/phpdotenv/blob/master/src/Repository/Adapter/MultiReader.php#L40
https://github.com/laravel/framework/blob/10.x/src/Illuminate/Support/Env.php#L59
https://github.com/vlucas/phpdotenv/blob/master/src/Repository/Adapter/PutenvAdapter.php#L58
https://www.php.net/manual/en/function.getenv.php
Хороший.
Все бы так копали.
Очевидно что в конечном счете содержимое .env попадает в конфиг. Но важно как оно туда попадает. Код обращается к абстрактному Repository - хранилищу переменных окружения. А откуда в это хранилище эти переменные попадают - с хоста или из файла дело десятое. Сам код от способа их получения не сломается и пароли никуда не утекут.
А если надо сделать пет-проект, чтобы работодатель мог скачать мой проект и сразу запустить, а не создавать всякие доп. файлы?
Если работодатель увидит что ты пароли в открытом доступе хранишь? Думаешь он перезвонит?
Дак ему придётся откуда-то .env взять.
Вообще, это как-то тупо, что такой важный файл по сути исчезает из репозитория. Допустим я скачаю свой проект на другой комп и он не запустится, потому что этих файлов нет, а быстро их фиг создашь. Надо где-то взять такой же как образец.
На мой взгляд сделали бы маленький файл password, где всего одна строчка - сам пароль, а не сложную такую структуру, которую не повторишь по памяти.
Можно поместить в корневую директорию скрипт, который просит указать имя\пароль, после чего создаёт env файл и запускает проект.
Хотя не уверен, насколько такая практика корректна.
Не программист же должен развешивать это всё? Почему сам фреймвёрк не добавляет эти теги? Почему плагин ничего не делает? Они вообще-то берут деньги за него, а пользы от него пока я не увидел.
В платной идее есть полная поддержка спринга, а шторм ни черта нет. Походу жидбрейнсы хуём по губам водят пхпышникам и берут деньги за редактор кода.
Мне просто есть с чем сравнивать и я вижу, что тут полное надувательство.
>>3007832
>Надо где-то взять такой же как образец
>где-то
https://github.com/laravel/laravel/blob/10.x/.env.example
>Допустим я скачаю свой проект на другой комп
Дядя, для этого уже лет десять используется докер. Хер с ними с паролями к базе. Ты как саму базу между "компами" синхронизировать собрался? А работодателю че будешь говорить? Ну вы там кароч пук среньк не забудьте вот эту хуйню для пхп включить и вот такие настройки для базы прописать, а ну и тестовые данные надо загрузить еще ага. И так под каждого додика с пет проектом что-ли делать?
В папке с проектом должен лежать docker-compose.json и все что человеку, который хочет твой проект запустить надо сделать это выполнить docker compose up -d . Все.
И как докер решает проблему публикации паролей? Ты там тоже описываешь все параметры базы как ссылки на секретный env файл, только он там другого формата. И тот, кто скачает, тоже должен создать свой env файл, прописать свои пароли и только тогда docker compose up -d корректно отработает.
Пароли и не публикуют. Их админ генерирует, когда проект деплоит. Тогда он передает докеру окружение через свои скрипты или использует docker secret. Задача програмиста только говно в проект не хардкодить
><?= $someObject->getSomeProperty() ?? '' ?>
У меня от этой хуйни вылезает ошибка:
Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in
Бля, это шутка такая? Ты внатуре под солями там сидишь?
>Cannot use isset()
Где ты isset в строчке, которую процитировал, увидел?
Так ты джун.
Мидлы таких тупых вопросов не задают - они и так работают на удаленке за 150к.
>наверно
Бля, проверить и узнать точно даже проще чем пернуть "наверно". https://3v4l.org/eT1Fq
Все никак не привыкну что в этот тред стекается самое тупорылое отребье двачей.
Для пхп - это нормально. Тут уровень дискуссий всегда ниже, чем в го или джава тредах.
Для каждой колонки свой метод?
Один общий метод, в который можно подставлять названия колонки?
На мой взгляд нужно мыслить в рамках объектов. У тебя есть объект, который надо сохранить в базе или достать из базы. Соответственно и методы должны выполнять эти роли. Сама обвязка для работы с базой обычно называется репозиторием. Интерфейс работы с ней не должен быть привязан к какой-то низкоуровневой системы вроде базы данных, файлам и т.п. А просто представлять собой универсальное хранилище. Таким образом можно менять реализацию хранилища, а для пользователя это будет единный удобный интерфейс.
>Дохуя воды
Данные то как в таблице обновлять? Даже с твоим охуительным репозиторием данные в итоге должны попасть в таблицу в базе. Ты вообще прочитал о чем спрашивали?
Умное ебало ты сделал, а на вопрос не ответил.
Ясен хуй что пдо, чучело. "Запросы" надо делать, ебать гений.
Водяной ебучий, вопрос был как эти запросы формировать.
Нахуй ты лезешь если тебе по делу сказать нечего?
Без кода и как ты это будешь использовать не получится подсказать. Тут такое, если через много колонок кто вызывать этот метод будет, будет знать структуру таблицы надо же описать в массиве ее что бы обновить. Попробуй обобщить все, а потом уже детально разбить на другие функции
>не получится подсказать
>попробуй сам
Ебать, спасибо папаша, за очередной абзац нихуя.
Это какой-то рвотный рефлекс? Вы когда видите этот вопрос автоматически блюете в тред, даже если понимаете что вам сказать нехуй?
Да че ты. Отлично подошел.
В следующий раз пиши чтобы использовал php и SQL. Вообще всем в этом треде подойдет, базарю.
Зависит от задачи, кстати с тобой хотел поговорить наш тимлид. Просил передать, чтобы ты зашёл к нему в кабинет
<form action="create.php" method="post">
<p><b>Введите текст:</b></p>
<p><textarea rows="25" cols="150" name="text"></textarea></p>
<p><input type="submit" value="Отправить"></p>
</form>
А все, просто у меня был подключен файл цсс в котором я так понял искались стили а я редактировал все в индексе
Просто отталкивайся от задачи. Если у тебя есть форма обновления, где заносятся старые данные то делай общий метод. Если отдельная кнопка повысить сотрудника, то отдельный метод. Спросишь что если и то и это, так всё то же самое есть общий метод, есть метод для отдельной колонки. Связано это с тем, что нехуй делать хулиярд запросов к бд когда можно одним
Если ситуация такая, что старые данные не заносятся в форму и поля передаются пустыми (не хочешь их изменять), то ничего плохого в том, чтобы делать отдельные запросы методами внутри общего метода обновления нет. А еще если подумаешь найдёшь способ прописать условия при наличии/отсутствии данных в общем методе одним запросом
>Просто отталкивайся от задачи
>если и то и это, так всё то же самое
>нехуй делать хулиярд запросов к бд когда можно одним
>ничего плохого в том, чтобы делать отдельные запросы
>по правилам метод == запрос
>Общий метод у тебя так и так будет
Это какая-то шизофазия. Начинается с "так-то да, а так-то нет", а заканчивается философским выводом о сути процедурного программирования. И о каких "правилах" идет речь? Откуда ты это ебанутое правило про запрос вообще взял?
Спасибо, товарищ долбоеб, что в трех абзацах повторил вопрос. Действительно можно сделать одним методом, а можно не одним. Очень тонко подмечено.
>кстати с тобой хотел поговорить наш тимлид. Просил передать, чтобы ты зашёл к нему в кабинет
Я еще не устроился на работу, а он уже меня ждет.
Есть что посоветовать?
И желательно без воды.
Боба Мартина и кабанчика
Тред не читал, да?
Начни вот с этой. Половина тут сидящий её скипнули. Буквально парой десятков постов выше еблан не осилил прочитать сто страниц.
Спасибо, но я серьезно.
Я чувствую, что мне очень не хватает базы по архитектуре, по ООП, по всяким сущностям, сервисам и т.д.
И вот хотелось бы книг, чтобы восполнить этот пробел.
Я пробовал читать такие книги, но такое ощущение, что и книги по программированию теперь пишут как те книги, которые рассказывают как стать счастливым.
Но мб у анона есть хороший пример книг и я не туда смотрю?
А как тогда пишут букавы, если не читали букварь?
Ну если создаешь интерфейс только ради того чтобы потом его просто прописать в тайпхинт - это явно плохая идея.
Типизация это хорошая идея. Скажи спасибо создателям этого говноязыка что в пхп для этого приходится в ооп дрисню нырять.
>я серьезно
>книги обязательно прочитать любому php и просто программисту
>мне очень не хватает базы по архитектуре, по ООП, по всяким сущностям, сервисам
Серьезно?
Открой букварь и внимательно просмотри. Видишь как это работает: есть текст, а есть картинка. На картинке то что в тексте, а в тексте то что на картинке.
Научись блядь называть вещи своими именами.
Если у тебя "пробелы" в виде незнания ооп, то ты просто не знаешь язык. Пхп это исключительно про ооп. Не знаешь = не умеешь писать код.
Если ты не знаешь каких-то терминов, то пиздуй в википедию. Целиком книгу ради одного абзаца читать бессмысленно.
>такое ощущение, что и книги по программированию теперь пишут как те книги, которые рассказывают как стать счастливым
Вот это предельно точное определение.
Ты пытаешься читать ответы, не зная вопросов. Литературно тот самый нафталиновый прикол про "42".
Тебе не "не хватает".
Ты подменяешь задачу, которую тебе нужно решать как джуну: научиться писать код, который делает то что хочет умный дядя. Быть на подхвате.
На задачу, которая тебе ближайшие несколько лет не светит: проектирование систем.
Ты пытаешься научиться строить башню из кубиков пикрелетед, вместо того чтобы понять что у тебя в руках и как этим пользуются.
По РНР нет хороших книг. Сам искал что-нибудь достойное, но большинство какой-нибудь кал типа давай изучим как говношлёпать сайты на пыхе, мускуле, хтмл, жс и цсс. Сами авторы пишут отвратительный говнокод.
Переводные книги, несмотря на огрехи переводов, всё равно лучше книг отечественных авторов. Не знаю почему так происходит, но русскоязычные авторы элементарно не могут формулировать мысли.
Так что лучше читать книги по другим языкам по интересующей тематике. Если нужно ООП и паттерны, то читай книги по джаве. Если по сетевым технологиям и микросервисам, то сейчас выходит куча книг по го.
Никто и не спорит что типизация - плохая идея. Плохая идея - создавать пустой интерфейс чтобы прописать тайпхинт.
Как ты в пхп что-то типизируешь не создавая класс или интерфейс, гений?
Сиронизировал графоманией над вкатуном. Естественно после нажатия на кнопку "обновить запись article" должен запускаться метод обновления записи article целиком единым запросом, а не обновление столбцов article по-отдельности. Обосрался в том, что вообще допустил идею об отдельных методах и говном смердит на весь тред
>должен запускаться метод обновления записи article целиком единым запросом
И этот запрос возьмется... откуда? А если надо не "целиком", а только одно поле поменять? Такой запрос откуда возьмется? А если у тебя десять таблиц? Ты под каждую таблицу будешь запросы писать?
Ты ведь смотри, долбоеб. Если реально думать, а не пердеть водой в тред, то можно дойти до того что нужен БИЛДЕР, который по СХЕМЕ таблиц будет строить ЗАПРОС, в который ты через PDO будешь свои значения передавать.
Сап, двач, я в кодинге абсолютный ноль, хоть и учусь в вузике, пошёл на вакансию без опыта, моё тз - написать веб-приложение блог, я не знаю откуда мне начинать, мне нужно это сделать за пару дней. Анонны, помогите, пожалуйста, что и в каком порядке мне нужно изучить, и как это заспидранить? Буду благодарен
чат гпт юзай, он тебе накидает говна который можешь для своего тестового использовать
Бля, ну круто, конечно, но хочется понимать что это говно делает, ну походу надо траить, подскажи где его бесплатно достать?
>в кодинге абсолютный ноль, хоть и учусь в вузике
Чем ты там занимаешься тогда?
Помню мне дали аналогичное задание и удалось это всё изучить и сделать буквально за неделю, хотя про РНР ничего не слышал даже.
От армии кошу, проебался, когда в школе нужно было учится, сейчас за голову хочу взяться
Заплатили 170 рублей за впн на опенсервере и 20 рублей за номер для регистрации. Наверняка в Ютубе есть подборка бесплатных
Вот моё тз: ....
Опиши порядок действий который я должен сделать. И потом проси его написать каждый пункт отдельно
Дожили, долбоебы даже набросить не могут нормально.
Ты вопрос неправильно сформулировал, еблан.
Правильный вопрос: что будет быстрее, объединить строку с переменной конкатенацией или интерполяцией?
Спасибо, попробую
Праздники, поэтому ответ чуть с запозданием.
>> Для email лучше все интегрировать в одно правило, так как кроме проверки email это все вряд ли понадобится
> Ты имеешь ввиду использовать одно регулярное выражение для проверки всех требований к емайл?
Нет, сделать класс-правило для проверки email и в нем сделать нужное количество проверок. А не разбивать проверку email на несколько отдельных правил.
>> Залогинить - значит, выдать куки
> Получается, что логиниться пользователь будет только 1 раз - при первом добавлении его информации в БД?
Да.
Нет, я имел в виду правило, в которое ты передаешь 2 регулярки:
new MatchesAllOrNone('/'/u', '/^\pL'/', 'сообщение об ошибке');
Но воообще, тут можно обойтись и одной регуляркой без условий. Мы можем просто сделать регулярку вида: либо в строке нет апострофа, либо он идет после первой буквы и дальше нет апофторофов:
/^[^']*$|^\pL'[^']+$/
Или это не сработает?
Тебе нужно
1) настроить виртуальные хосты (vhost), каждый в своей папке
2) использовать имена вида xyz.localhost либо прописать домены в файл hosts, чтобы они резолвились в IP-адрес
Например, есть голосование без авторизации, но с ограничением голосов по IP. Злоумышленник может с помощью CSRF накрутить себе голосов с IP пользователей.
CSRF нужна везде, не только для авторизованных пользователей. Поэтому она и использует отдельный токен.
Но как вариант, можно проверять HTTP-заголовок Origin. вместо токена.
Вообще, нет. Что если на сайте-жертве есть редирект и злоумышленник отправляет запрос на сайт-жертвы сквозь URL редиректа? Уверен, что кука не будет отправлена?
Ты какие-то свои велосипеды придумываешь вместо того, чтобы применять рекомендации.
Если есть ограничение доступа по IP или голосование с ограничением по IP, то с помощью CSRF можно накручивать голоса.
>Праздники, поэтому ответ чуть с запозданием.
Я думал, что ты умер или я тебя заебал с вопросами.
Спасибо за ответ!
>>1008826 (OP)
Есть роут, который возвращает новую модель карточки товара. Мне дали задание, чтобы при желании он возвращал старую модель карточки товара грубо говоря возвращать немного другие поля товар. Я добавил флаг oldModel, и тут возник вопрос, как правильно поделить логику для новой и старой карточки?
Метод, который срабатывает при обращении к роуту находится в контроллере ProductPage
class ProductPage {
//упрощенный вариант
public static function get($productFieldValue, string $getByField)
{
$arProduct = Product::getMainProduct($productFieldValue, $getByField); //запрос в базу данных
$arProduct = Product::getPreparedProduct($arProduct); //подготовка результатов из БД
self::setProductInfo($arProduct); //получение данных для карточки из других сущностей
Product::unsetUnnecessaryFields($arProduct); //получение некэшируемых данных данных
return $arProduct;
}
...
}
Нужно сделать альтернативный вариант для четырех методов, которые вызываются в get, чтобы роут мог возвращать старую модель. Некоторые методы вызываются от модуля Product, следовательно там тоже нужно сделать изменения. В методе setProductInfo и unsetUnnecessaryFields можно получить данные из других сущностей, например таких как: Бренд, Аксессуары и т.д. Для них тоже нужно сделать альтернативную развилку, так как для старой модели могут понадобиться другие поля.
В итоге имеем контроллер ProductPage, модуль Product, которые используются в том числе и для получения карточки товара (хотя там есть и дополнительные функции). Так же есть классы сущности (бренды, аксессуары, магазины), которые так же используются для получения нужной информации для карточки товара. Мне нужно сделать так, чтобы роут возвращал и старую модель карточки товара.
Самый простой вариант - это развесить условия и создавать альтернативные методы добавляя слово old, к примеру getOldMainProduct. Так же предлагали наследоваться от ProductPage и Product и делать изменения в наследуемых классах. Но что делать с сущностями?
А может есть более грамотный вариант?
Спасибо.
>>1008826 (OP)
Есть роут, который возвращает новую модель карточки товара. Мне дали задание, чтобы при желании он возвращал старую модель карточки товара грубо говоря возвращать немного другие поля товар. Я добавил флаг oldModel, и тут возник вопрос, как правильно поделить логику для новой и старой карточки?
Метод, который срабатывает при обращении к роуту находится в контроллере ProductPage
class ProductPage {
//упрощенный вариант
public static function get($productFieldValue, string $getByField)
{
$arProduct = Product::getMainProduct($productFieldValue, $getByField); //запрос в базу данных
$arProduct = Product::getPreparedProduct($arProduct); //подготовка результатов из БД
self::setProductInfo($arProduct); //получение данных для карточки из других сущностей
Product::unsetUnnecessaryFields($arProduct); //получение некэшируемых данных данных
return $arProduct;
}
...
}
Нужно сделать альтернативный вариант для четырех методов, которые вызываются в get, чтобы роут мог возвращать старую модель. Некоторые методы вызываются от модуля Product, следовательно там тоже нужно сделать изменения. В методе setProductInfo и unsetUnnecessaryFields можно получить данные из других сущностей, например таких как: Бренд, Аксессуары и т.д. Для них тоже нужно сделать альтернативную развилку, так как для старой модели могут понадобиться другие поля.
В итоге имеем контроллер ProductPage, модуль Product, которые используются в том числе и для получения карточки товара (хотя там есть и дополнительные функции). Так же есть классы сущности (бренды, аксессуары, магазины), которые так же используются для получения нужной информации для карточки товара. Мне нужно сделать так, чтобы роут возвращал и старую модель карточки товара.
Самый простой вариант - это развесить условия и создавать альтернативные методы добавляя слово old, к примеру getOldMainProduct. Так же предлагали наследоваться от ProductPage и Product и делать изменения в наследуемых классах. Но что делать с сущностями?
А может есть более грамотный вариант?
Спасибо.
Какой же жуткий беспросветный говнокод.
Просто смотришь на эти комменты и охуеваешь. Слева написано одно - справа другое. В между собой так же общаетесь? - Удали ненужные данные. - Удаляешь кеш. - Малаца, я это и имел ввиду.
И это сладкое актив рекорд программирование. Через статику в базу и обратно - приключение на десять минут.
Начни с того что контроллер возвращает не МОДЕЛЬ, а ПРЕДСТАВЛЕНИЕ. Некоторую структуру данных, которая нужна клиенту, от которого пришел запрос. МОДЕЛЬ это модель бизнес процесса, она содержит только то что нужно чтобы этот бизнес процесс выполнить. В частности АКТИВ РЕКОРД МОДЕЛЬ моделирует процесс сохранения данных в хранилище, и соответственно содержит все данные, которые можно положить в хранилище. Иногда структура ПРЕДСТАВЛЕНИЯ совпадает с МОДЕЛЬЮ, а иногда структура МОДЕЛИ совпадает с АКТИВ РЕКОРД МОДЕЛЬЮ.
Такая банальная хуйня, а надо о ней напоминать. Потому что ваш код давно перерос этап когда что-то там совпадало. Поэтому нужно разделять набор данных для представления, набор данных для бизнес логики и способы получения этих данных. Способы получения офк будут разные для разных наборов. Напрмер для представления нужны аксессуары, а для бизнес логики нет. Структуры разные, методы разные. Зато для бизнес логики нужно получить бренд, а бренд вообще не в базе и не в актив рекорде.
Дальше нужно разобраться что куда относится. ПРЕДСТАВЛЕНИЕ это часть логики отображения, МОДЕЛЬ это бизнес логика, а АКТИВ РЕКОРД МОДЕЛЬ это хранилище. Так вот нет никакого резона пытаться получить и представление и модель через один и тот же метод. Это разные структуры и получаются они по разному.
Так вот ключевой вопрос: твой oldProduct он на каком из слоев отличается?
Он отображается по другому? Например нужно обязательно показать и старое и новое название.
Он получается другим способом? Например он получается из какой-то таблицы с историей изменений аля event sourcing.
Или он отличается тем что с ним можно или нельзя сделать? Например к старому товару нельзя добавлять аксессуары, а к новому можно.
Какой же жуткий беспросветный говнокод.
Просто смотришь на эти комменты и охуеваешь. Слева написано одно - справа другое. В между собой так же общаетесь? - Удали ненужные данные. - Удаляешь кеш. - Малаца, я это и имел ввиду.
И это сладкое актив рекорд программирование. Через статику в базу и обратно - приключение на десять минут.
Начни с того что контроллер возвращает не МОДЕЛЬ, а ПРЕДСТАВЛЕНИЕ. Некоторую структуру данных, которая нужна клиенту, от которого пришел запрос. МОДЕЛЬ это модель бизнес процесса, она содержит только то что нужно чтобы этот бизнес процесс выполнить. В частности АКТИВ РЕКОРД МОДЕЛЬ моделирует процесс сохранения данных в хранилище, и соответственно содержит все данные, которые можно положить в хранилище. Иногда структура ПРЕДСТАВЛЕНИЯ совпадает с МОДЕЛЬЮ, а иногда структура МОДЕЛИ совпадает с АКТИВ РЕКОРД МОДЕЛЬЮ.
Такая банальная хуйня, а надо о ней напоминать. Потому что ваш код давно перерос этап когда что-то там совпадало. Поэтому нужно разделять набор данных для представления, набор данных для бизнес логики и способы получения этих данных. Способы получения офк будут разные для разных наборов. Напрмер для представления нужны аксессуары, а для бизнес логики нет. Структуры разные, методы разные. Зато для бизнес логики нужно получить бренд, а бренд вообще не в базе и не в актив рекорде.
Дальше нужно разобраться что куда относится. ПРЕДСТАВЛЕНИЕ это часть логики отображения, МОДЕЛЬ это бизнес логика, а АКТИВ РЕКОРД МОДЕЛЬ это хранилище. Так вот нет никакого резона пытаться получить и представление и модель через один и тот же метод. Это разные структуры и получаются они по разному.
Так вот ключевой вопрос: твой oldProduct он на каком из слоев отличается?
Он отображается по другому? Например нужно обязательно показать и старое и новое название.
Он получается другим способом? Например он получается из какой-то таблицы с историей изменений аля event sourcing.
Или он отличается тем что с ним можно или нельзя сделать? Например к старому товару нельзя добавлять аксессуары, а к новому можно.
Книги вкатунам нахуй не нужны, это тяжелый способ получения информации, плюс их часто переводят люди далекие от программирования со всеми вытекающими. Лучше их читать когда уже шаришь
В 12 лет читал книжку по микроэлектронике и справочник по матанализу. Сейчас зумеры не могут прочитать книжку "Делаем сайты на пхп и жиквери"?
1280x720, 1:23
Да, если книг читать не будешь - скоро грамоту забудешь
номер на смс активате за пару рублей
СИКП же. Буквально на пальцах объясняют как строить качественные и масштабируемые программы. Дальше по желанию можешь навернуть каких-нибудь новомодных книжек по архитектуре аля ddd, tdd и тд, но начинать надо с базы.
Объясните мне нахуя нужно столько сортов сыра(пармезан, рокфор; рикотта), если там везде все одинаковая молочная хуета?
Хорошая аналогия, только вот у разных сыров разный вкус, а все пхп фреймворки одинаково ощущаются говном
Хорошая аналогия, только вот у разных фреймворков разные задачи, а все сыры одинаково ощущаются говном
Хуевый перефорс. Жаль что для пыхеров нет ирл фреймворка, чтобы постить и не обсираться при этом под себя
Хуевый перефорс. Жаль что для сыроваров нет виртуальной сыроварни, чтобы тренироваться и их покупатели не обсирались при этом под себя
То есть ты на серьезном ебале ради пяти символов генерируешь строку из 70 * 3 символов.
В этой строке еще и всего максимум три уникальных символа на возможные пять позиций.
Еще и реджексы в цикле.
Один единственный реджекс скорее всего медленнее, чем все твое приложение. Ты их решил побольше хуйнуть, чтобы наверняка?
Единственное хорошее в этом коде это использование random_int, остальное можно спокойно нахуй выкидывать.
Да. Крутая штука, еще и бесплатно.
Захотелось на досуге разработать анонимный чат-рулетку, наподобие ЧатВдвоём и Nekto.me, но с более годным функционалом. Пока что с нуля накидал прототип на голом PHP + Swoole (т.е. сам чат работает через websockets), связь двух случайных собеседников уже работает, сообщения туда-сюда ходят, есть уведомления о наборе текста. Нужно дальше пилить функционал и сделать какой-то приличный фронт/дизайн (тут я не силён). На GitHub обнаружил массу примеров кода уровня "клон Omegle", хотя там почти всё на JS или Python, но какие-то идеи можно заимствовать. Чат пока планируется только текстовый, никакого голоса и видео.
Если кому интересно поучаствовать ради практики, то оставляйте свои мыльца (мессенджеры не надо), сконтачимся.
нормально же спросил, покажи вывод твоего кода, что оно выводит.
Я просто не понимаю вот эту строчку с прегматч
Последнее время тут развелось грубиянов, а раньше был вежливый тред
ты очень грубый
>>3020668
А хули с вами церемониться? Вы же даже какие-то минимальные усилия не хотите приложить.
Вам буквально впадлу ПАЛЬЦЕМ ПОШЕВЕЛИТЬ, чтобы кликнуть на картинку и прочитать что на ней написано. Или кликнуть на кнопку "по щучьему веленью яндекс дай мне код с картинки", которую вам абу к каждой пикче прилепил.
Нахуй вы такие нужны тут? Нахуя вам отвечать, если после ответа на вопрос "Как срать?" вам сразу нужен ответ на вопрос "Как вытирать жопу?". И вам совершенно поебать что ответы на эти вопросы знает каждый первоклассник и прописаны они везде и всюду по миллиону раз.
>>3020028
>Один единственный реджекс скорее всего медленнее, чем все твое приложение.
PHP использует либу PCRE, она компилит регекс в конечный автомат, который потом быстро работает. Нормальная последовательность действий в интерпретаторах: интернинг строки, потом определение, что такой регекс уже скомпилен. Аналогично с prepared statements и SQL, кстати. Но, конечно, интерпретаторы далеко не всегда делают нормально. Ну и PHP должно в FPM вертеться, чтобы скомпиленный регексп мог долго сохраняться. Это, повторюсь, если PHP вообще так умеет. Другие языки умеют. Что регексп обязательно медленный, это совсем не факт.
Бла бла бла. Давай показывай быстрый реджекс. Желательно бенчмарк прямо с тем, который в посте.
Реджекс медленнее кода на нативном пхп. http://maettig.com/code/php/php-performance-benchmarks.php
И я еще раз повторю: все что ты напишешь, буквально весь код, который ты напишешь будет быстрее всего одного реджекса. Это не шутка. Медленне реджекса только запрос в базу. Но если это запрос в локальную базу вида "SELECT 1;", то по времени будет примерно одинаково.
Такие дела.
надеюсь ты так и будешь без работы сидеть дурачок
А ты это заебись придумал.
Первый цикл на миллион итераций, с реджексом по фиксипрованной строке. Который вычисляется всего один раз, в первую итерацию, лол. Остальной миллион гоняется порожняком.
А второй цикл на 16 миллионов итераций. Здесь результат вычисляется уже 16 раз. По разу на каждый элемент excludes. А потом 16кк раз гоняется порожняком. Прямо даже хуй знает почему во втором случае медленнее получилось.
Сорян, не понял сразу, что ты зеленый ребенок.
битрикс ето кал
$domDoc = new DOMDocument();
$domDoc->loadHTML($markup);
var_dump($domDoc->textContent);
// Вывод: говняк со сломанной кодировкой
У меня три стула:
1. Воспользоваться какой-то библиотекой с гитхаба вместо DOMDocument
2. Изменить $markup и добавить объявление кодировки. Это синтетический пример, ясное дело, но с реальной вёрсткой можно провернуть, например, такое: замена "</html>" на "<meta charset="utf-8"></html>"
3. Обернуть $domDoc->textContent в mb_convert_encoding($domDoc->textContent, "ISO-8859-1", "UTF-8")
И всё. И больше никак. Это не я что-то упускаю, это DOMDocument действительно не умеет нормально работать с utf-8. Правильно?
DOMDocument насколько помню, но могу и спиздеть, это биндинг к быстрой сишной либе libxml2. Альтернатив не так и много, но для них всех тебе уже виртуальный сервер будет нужен (VDS то есть). У либы на pure PHP хз что будет со скоростью. Парсер на скрипте может и тормозить. Так что я бы просто регулярками втыкал meta http-equiv content type.
>DOMDocument насколько помню, но могу и спиздеть, это биндинг к быстрой сишной либе libxml2
Судя по тому, что для того, чтобы он не жаловался на ошибки в вёрстке, нужно вызвать libxml_use_internal_errors(true) - звучит похоже на правду.
>Так что я бы просто регулярками втыкал meta http-equiv content type
Да, я так и сделаю, но было ощущение изначально, что это какой-то быдлокод и я что-то делаю не так. Однако, так и не смог нагуглить других решений. И что ещё больше запутывает - у конструктора DOMDocument есть аргумент encoding, но что он делает вообще хрен пойми. Указывай, не указывай - результат не меняется.
У него есть и version, и encoding. Похоже, это скорее всего то, что он тебе выдаст, если этот document сохранить как xml:
<?xml version="1.0" encoding="utf-8"?> - первой строчкой
Их затирает loadHTML. Если saveXML пустой документ или с добавленными вручную нодами, то там как раз будет.
>>3021491
БАТУМИБИЗ. Сериоус бизнес ебать.
Учитесь, реджексовые. https://3v4l.org/GYbWC
0. Сложность проверки O(1). Минимально возможная.
1. В ЧЕТЫРЕ раза быстрее.
2. Все символы случайные, а не три как у бузинесменов.
3. Производительность не зависит от сложности реджекса, длины повторяемой строки, размера словаря итд.
>В ЧЕТЫРЕ
Всего пару раз, кек.
https://ideone.com/oMmUt5
И это по сравнению с очень быстрым индексированием в хэше.
Лол, так там просто все комбинации двух символов в итоге кешируются. Сколько их всего? Две-три сотни? А остальные 100к раз оно никаких реджексов не выполняет.
Ничего нигде не кэшируется. С чего ты это взял вообще? PHP так не умеет. Ты запустишь в цикле миллион раз preg_match('/12345/', '123456') и это выполнится у тебя миллион раз.
Вставь вот в это место:
https://github.com/php/php-src/blob/master/ext/pcre/php_pcre.c#L1257
что-нибудь типа счетчика, пишущего в /tmp/regex_count.txt, и убедись сам. Кэшируется, лол.
Причем здесь то как устроены сами реджексы вообще?
Пхп кеширует РЕЗУЛЬТАТ выполнения функции. Потому что на самом деле этих результатов в примере не миллион, а всего пара сотен.
Ты вообще в курсе что пхп код компилируется в код виртуальной машины? Именно поэтому похуй в каких кавычках что написано и конструкция $string = "ааа" . 'fff' будет преобразована в одну инструкцию ASSIGN !0, 'aaafff'.
Вот тебе пример. https://ideone.com/OaeO1g
Мы сначала сгенерировали три массива со строками разной длины 2, 5 и 10 символов. А потом проходим по каждому из них и для каждой строки выполняем реджекс.
Вот тут-то все и видно. Проверка двух символов не стоит нихуя. А дальше вместо линейного роста пять символов стоят сразу дохуя, а десять как пять. Что еще смешнее, рандом может сгенериться так что десять будут стоить... ноль. Потому что проверка совпадет с предыдущей. В чем ты можешь убедиться поставив проверку long перед medium https://ideone.com/ZalEjM
Уот так уот. Пхп гораздо умнее ебланов, которые на нем пишут. И понимает что выполнять реджекс миллион раз - это тупость.
Разумеется кеш штука полезная, но не надежная. Поэтому самый правильный способ сразу писать нормальный код. Кеш и с нормальным кодом поможет, зато все внезапно не пойдет по пизде из-за неправильного порядка вызовов и неоптимально скомпиленных опкодов.
Мне не нужны эти танцы. Я уже сам на всякий случай модифицировал исходники PHP8.4 и собрал его из них. Я вижу свомим глазами, что PHP миллион раз ломится к функции сишной либы pcre2_match, когда я его прошу проверять одну и ту же строку одним и тем же регэкспом в цикле. Так что никакие результаты не кeшируются. Как ты вообще представляешь себе архитектуру такого кеша? Для него не существует подходящей архитектуры. Это должно быть что-то вроде кеша SQL для детерменистических функций, которому явно не место в скрипте.
Боевая картиночка.
Какие танцы, дебич? Я ебу как ты там че скомпилил? Может у тебя опкеш вообще не включен.
Ты высрал пример на конкретной конфигурации пхп и железа. Я показал тебе почему он быстрый и как эта быстрота может как улетучиться, так и стать вообще мгновенной.
Лол, ты как себе вообще представляешь кэширование результатов функций? Для этого нужна хэш-таблица (аргументы) => (результат) с вытеснением более старых результатов, а никакой не опкеш.
>>3021542
Даже хуй знает что это за кеш такой.
Может вот такой? https://en.wikipedia.org/wiki/CPU_cache#Cache_hierarchy_in_a_modern_processor
>кеш процессора
Ну это уж совсем из другой оперы.
А если все миллион строк разные, то они тоже кэшируются?
https://ideone.com/AI6f92
Ну и как тебе еще доказывать, что результаты функций не кешируются? Разве что физически.
Ок. Ниче не кешируется нигде.
Тут тогда что происходит? https://ideone.com/OaeO1g
А тут? https://ideone.com/ZalEjM
Строки полностью рандомные, не одна буковка. Целиком.
Давай перди че-то про танцы какие-то. И компиль хуй к носу.
Это просто альтернативный синтаксис. Хуй знает почему в изначальном примере так было написано. Нихуя не меняется от скобок https://ideone.com/uLVwmr
Так у тебя самого два цикла с более длинными строками, которые не могут участвовать в каком-либо кэшировании, поскольку они все разные, выполняются каждый процентов на 30 даже быстрее, чем цикл с короткими строками, среди которых много повторяющихся. Это буквально доказательство, что ничего не кэшируется. Ты все-таки троллишь, тварь.
>два цикла с более длинными строками выполняются каждый процентов на 30 даже быстрее, чем цикл с короткими строками
Стекломойный еблан, где ты это увидел?
>short : 0.00015
>medium: 9.89437
>long : 9.70363
Залупа ты понурая, о том и речь была что в списке коротких строк 90% повторений, которые отлично кешируются. А время для списка со средней длиной и длинной и есть настоящие затраты на все эти реджексы. Там уже похуй какая длина, хоть двадцать. Главный скачек затрат происходит в тот момент когда кеш перестает срабатывать.
Двойную кавычку не закрыл в строке $sql.
E-5 это десятка в минус -5 степени, чучело ебаное.
Шторм думает, что ты пишешь приложение под FPM/FastCGI со стройной декомпозицией всего в полтысячи классов, зашиванием всего в контексты, автоинклюдом на основе имен классов. Сделай один глобал, с тебя не убудет.
И правда. Значит, можно оформить спокуху и без задней мысли редактировать разбираемый html-код, добавляя в него объявление кодировки.
Сейчас РНР сопоставим по скорости с джавой
ньюфаг
Может, он олдфаг. Вроде, в PHP5 что-то принципиально изменилось, а потом ещё в PHP7 совсем хорошо стало.
Хз этот мужичок вроде опытный пизда, мб он и проебался с мантиссой но функции реально кешировать должно
С версии 7 стал конечно намного быстрее, но когда некоторые пытаются зеркалить сишный код на PHP, получается все еще намного хуже, чем, например, с жопаскриптом. В принцепе, если у тебя узкое место типа исказить картинку капчи, и инфраструктура позволяет, то просто делаешь модуль для пыха на сях. Но это уже переезд с виртуального LAMP хостинга на VDS, где тебе самому надо админить.
>>3022890
XML/HTML сами по себе довольно неоднозначные вещи, наловившие в свое время много критики. Так что meta можно добавлять смело, это не говнокод, а просто тебе не оставили выбора.
>>3023398
Первый раз регулярка выполняется долго, потому что она компилируется. Дальше она выполняется очень быстро.
>>3023453
>функции реально кешировать должно
Вот откуда вы это берете, блять? Ну хоть ссылку дайте, где написано, что пых кэширует так, как вы пишете?
>Вот откуда вы это берете, блять?
Ну как минимум пых делает так как на пиках. Второй вызов strlen компилируется сразу в результат, функция не вызывается. Вот и думай.
Проблема двойных кавычек не в скорости. А в непредсказуемости интерполяции. Использовать их нельзя по той же причине почему нельзя использовать нестрогое сравнение. Пхп пытается сделать с переменными какие-то ебанутые неочевидные преобразования, которые нам нахуй не нужны. Малейшая опечатка и произойдет хуй знает что. А найти такую багу можно только с дебаггером, буквально по строчкам перебрав весь код.
Вот "простенький" пример https://3v4l.org/QBVVf
Что выведется в каждом из вариантов? Да хуй его знает, то значение переменной, то какая-то функция вообще. А как читать это дерьмо? Хуйня полная.
Поэтому либо конкатенация, либо sprintf. Двойные кавычки только если нужно вывести спецсимвол типа "\n" переноса строки.
@nekto442
Вот пример страницы https://demo.gempixel.com/short/
Вот сама страница https://www.mediafire.com/file/thk6nsif3gfig7l/index.php/file
Меня все устраивает: двигающийся фон и тп, кроме ненужных кучи блоков.
Мне нужно оставить по сути только блок вставки ссылки и блок админ панели
Когда откроешь страницу в браузере, нажимай Ctrl + Shift + i
Поклацай там табы, и найди HTML код страницы. Удаляй маленький кусочек, и смотри что получилось. Визуально.
Затем удаляй тот же маленький кусочек в PHP коде, и обновляй страницу с помощью F5.
Натренируй в процессе терпение.
В микрософтовском уебищном edge есть пикрелейтед фича: 3d просмотр. Так гораздо удобнее элементы убирать.
Никак.
Та же история что с шариком для гольфа. Чтобы долететь до цели, после удара шарику нужно сначала пролететь половину, а чтобы пролететь половину нужно пролететь одну четверть. А раз таких половин бесконечное количество, то шарик никогда до цели не долетит.
А ты никогда не освоишь ни один фреймворк, потому что ты еблан.
поясни вкатуну, почему "0004 RETURN int(1)"? это стандартный код, который возвращается дефолтом типа?
Это нужно чтобы сказать виртуальной машине "стопе". Там цикл бесконечный, пока исполняемый код единицу не вернет выполнение не закончится.
Вкатун, спок. Тебя никто не спрашивал
Она про sanctum.
> код выглядит как js
Это и есть JS.
> где это писать и что должно происходить на конце /sanctum/csrf-cookie ? Или там происходит что-то автоматическое?
Этот роут на сервере обрабатывает sanctum, как я понял, и на сервере делать ничего не надо.
> проверяет, что апостроф один.
Не совсем верно. {0,} значит "0 или более символов". Если ты хотел написать "0 или 1 апостроф", то нужно писать '?. Также, апостроф может быть написан еще символом ` (косая кавычка).
Для проверки правильности использования апострофа можно сделать такую регулярку:
в строке любое чилсло символов без апострофов ИЛИ строка это буква, за ней апостроф, и дальше 1 или более символов не-апострофов.
ТА САМАЯ НИКОМУ НЕИЗВЕСТНАЯ ИСТОРИЯ ПРО ШАРИК!!!!!!!!! СМОТРИТЕ ОН ЛЕТИТ БЕСКОНЕЧНО ОДНА ЗОЛОТУШНАЯ, ОДНА ПОЛТУШНАЯ, ОДНА СЕРЕБРЯЧКОВАЯ
Тут вроде верно.
>>2998618
> Кто всерьез (за деньги) ... занимался, то давно понял, что емейл это строчка с собакой (@) и максимальной длинной
Нет. Люди часто делают тупые ошибки, например, ставят пробел после @ или вместо точки, или пишут mailru слитно. И кто за деньги этим занимается, анализирует типичные ошибки и пишет костыли для их исправления.
Есть сайты типа: leetcode, codeforces, там куча задач на разные темы. Если непонятно, как их решать, то гугли книги или статьи по теме "структуры данных" и "решение олимпиадных задач".
> Вместо метода "залогинить" будут строки: вызов функции, которая генерирует токен, установление куки самим контроллером.
Лучше бы сделать именно функцию. А то вдруг надо будет где-то еще залогинить пользователя и придется копировать код. Или ты протестировать авторизацию захочешь, а как это делать, если ее код не вынесем в функцию, а размазан где-то в других функциях.
> Мб сделать метод в TDG, чтобы он принимал токен и возвращал объект студента?
Можно.
Опиши пример задачи, которая решается парой строчек на PHP и HTML, и посмотрим. Если бы все было так просто, то фреймворки были бы не нужны.
> Например, его "замечательный" дизайн так и не смог увидеть, потому что фронт-говно не завелось, а вывалилось с ошибкой.
Дай ссылку на инструкцию, по которой ты все устанавливал. И дай текст или скриншот ошибки. И посмотрим, это инструкция неправильная, или ты невнимательно читаешь.
> Автор сам не повторял свой гайд. У него куча несостыковок. Например, создали модель, описали как он сказал. А в итоге через пару глав оказывается, что модель уже другая. Конкретно некоторые поля внезапно стали допускать NULL.
Давал бы конкретные ссылки, а то непонятно, это действительно ошибка или ты что-то пропустил.
> Мне вот интересно, действительно в реальных коммерческих проектах тянут эти бандлы?
Реальный прибыльный коммерческий проект, в composer.json порядка 40-50 библиотек и компонентов Симфони.
Зачем писать то, что уже написано?
Вот еще пример: Magento, CMS для магазинов, смотри сам, сколько там зависимостей в composer.json: https://github.com/magento/magento2/blob/2.4-develop/composer.json
Тебе надо исправить конфигурацию сервера, чтобы запросы к статическим файлам (вида /static/css/xyz.css) не перенаправлялись на index.php, а просто отдавался файл.
Чтобы это сделать, тебе надо изучить, как настраивается используемый тобой веб-сервер.
Это плохая идея. Вместо этого, куку должен обрабатывать контроллер и передавать в шаблон переменную вроде display_some_text.
Да, так и надо делать. Потому, что обработка кук должна быть в котроллере, а не в шаблоне. К тому же, твой код трудно будет адаптировать, если завтра понадобится не только проверять куку, но и содержимое БД например.
> Никакие переменные в ViewModel не группируют. Это данные МОДЕЛИ преобразованные чтобы их было удобно отображать. И используют ViewModel именно когда данные внутри модели бизнеса не подходят для отображения.
Мне кажется, неверно. ViewModel обычно используют в JS-фреймворках, чтобы описать модель, которая хранит состояние интерфейса (кнопок, галочек), а отличие от Model, которая хранит состояние данных приложения.
> Поэтому типичный способ работы с куками это положить входящие куки в иммутабельный объект, который гарантирует что они не будут перезаписаны или перезатерты и спокойно доедут до твоего шаблона.
Ты не прав. Переложить куки в иммутабельный объект и передать в шаблон точно так же плохо, так как это нарушает разделение ответственности. Если какая-то надпись выводится в зависимости от наличия куки, то это должно определяться не в шаблоне, а в функции, которая за этот функционал отвечает. А в шаблон лишь передается переменная, говорящая, надо ли вывести надпись.
Это упрощает, например, тестирование: мы можем тестировать ту функция в изоляции.
В Ларавель "источником истнины" считается структура БД. Модель определяет список полей из БД, и нет нужды их повторно описывать в коде.
Бывает и другой подход. В Доктрине "источником истины" может быть класс модели, а миграции генерируютя на основе кода.
bool(true)
Почему так, нахуй? Я понимаю, что за такое нужно бить в ебало, но тем не менее. Попробовал узнать у гопоты, он на этом вопросе сломался. Сначала утверждал, что строки, которые невозможно привести к числу, приводятся к 0.
То есть, 3<0, что должно вернуть false. Я его спросил, как так?
Он извинился и ответил, что начиная с PHP7, строки, которые невозможно привести к числу, приводятся к некому условному значению, которое меньше любого числа.
То есть, 3<(условное-значение-которое-меньше-любого-числа), что опять же абсурдно и должно вернуть false.
Но возвращает true. Почему так, нахуй?
Я видел, что в доке написано:
> Результат сравнения несравнимых значений не определён и на него не нужно полагаться.
Но, блжард, я ведь не могу написать что-то типа if (3 << "dddd") {}, которое пошлёт меня нахуй при попытке сравнить число со строкой, которую не привести к числу.
Значит, мне нужно напердолить функцию-обертку, которая, например, будет требовать двух int, а если хочешь float или bool, то делай if (kostil(intval(true), intval(5.5), ">")) {}
Так что ли?
Если ты считаешь, что на собеседованиях дают алгоритмические задачи, то эти сайты помогут научиться их решать. Если считаешь, что не дают, то можешь не читать.
> Как освоить фреймворк?
Прочитать документацию, сделать проект.
По моим ощущениям, сложности у начинающих с фреймворком обычно получаются из-за того, что они не изучили более базовые вещи, например: ООП, атрибуты, DI, MVC, ORM, а сразу взялись за фреймворки.
> Каждый компонент фреймворка тянет за собой другой.
Да, Laravel надо изучать целиком. А вот Симфони компонентный: ты можешь взять только компонент форм, или только Доктрину и использовать их без остальных компонентов.
> Хочешь сделать простую формочку - надо закопаться в модели, ОРМ, валидацию и ещё черт знает что.
Ну вот похоже, что твоя проблема в том, что ты не знаешь, что такое ORM и не привык использовать ООП. А не в фреймворке.
В мануале это описано тут: https://www.php.net/manual/en/language.operators.comparison.php таблица "Comparison with Various Types".
Когда ты сравниваешь значения разных типов, они преобразуются к однаковому типу перед сравнением. Согласно мануалу, при сравнении числа со строкой строка должна преобразоваться в число.
Но похоже, в твоем случае, 3 преобразуется в строку "3" и сравнивается как строка с "dddd" (по алфавиту). То есть, в мануале то ли устаревшая информация, то ли неточная.
> Результат сравнения несравнимых значений не определён
Это значит, что одна версия PHP может вернуть один результат, а другая другой и твой код сломается при обновлении PHP.
> Значит, мне нужно напердолить функцию-обертку
Не надо. Тебе надо в своем коде указывать типы переменных, а для получаемые извне переменные принудительно приводить к нужному типу. И тогда все будет ок.
Для поиска таких проблем в коде можно использовать статические анализаторы вроде phpstan, psalm.
>ООП, атрибуты, DI, MVC, ORM
Я изучил ООП, атрибуты, MVC. Написал блог на ООП по MVC. Что такое атрибуты знаю, но не использовал.
DI, ORM ведь часть фреймворка. Как их заранее изучить?
1. abstract class Utils {}
2. class Utils { private function __construct () {} }
Я обычно делал 1, но тут услышал мнение, что семантически abstract следует читать как "этот класс 100% должен быть унаследован и расширен, сам по себе не может быть реализован", а не просто "этот класс не может быть реализован". И, следовательно, семантически правильнее второе.
inb4 правильнее обоссать тебя, пиши ООП и не выёбывайся, дали тебе DI - вот и не пизди. Ага, понятно, но отвечая на мой вопрос?
Если ты написал class, то уже перманентно зашкварился об ооп. Ты теперь навсегда объектно сориентированный попуск, смирись.
Вообще мож у тебя дальтонизм? Или ты думаешь что ide тебе красным хуярит чисто по приколу?
Перестань относиться к ошибкам как к ОЙ НИПАНЯТНА ВСЁ СЛОМАЛОСЬ. Относись к ним, как к подсказкам, которые говорят, что ты делаешь не так. В твоём случае это очень явно видно, никакой магии не происходит.
Я тот кто задал вопрос. Не спросили кст
Всё, сделал. Так и думал что в result гавно какое-то
Окей! Спасибо за ответы.
И это ты еще на фреймворки не перешел...
Так и делал и страница белая становилась
Я бы лучше паскод подарил за помощь. У меня как раз лишний есть
Текст ошибки можно закидывать в гуглтранслит и чатгопоту, кстати.
>смог решить проблему
>не смог прочитать одну строчку в документации
>не смог прочитать текст ошибки
>несколько раз еблом тыкнули куда надо
>смог решить
>иде с самого начала и до сих пор подсвечивает косячный код
Радость у меня только от того что такие уебни никуда никогда не вкатятся. Таких дегенератов даже на кассу в пятерочке не поставят.
Если свойство объявлено как private, его фактически можно прочитать с помощью var_dump как минимум. Более того - можно изменить его значение извне с помощью ReflectionProperty.
Итого, область видимости - это что-то типа DocBlock. Подсказка для разработчика, которая говорит, как, по идее, всё должно быть. Но если захочется выстрелить в ногу (изменить значение private свойства извне) - технически это сделать можно. И, например, не стоит рассчитывать, что если ты объявил свойство private и не добавил к нему публичные геттер и сеттер, то его действительно нельзя будет получить и модифицировать извне. Если захочется - можно.
Правильно понял?
Это дефолтная псевдо ошибка при подключении include если переменная не глобальная
>Это дефолтная псевдо ошибка при подключении include если переменная не глобальная
Не бывает никаких "дефолтных" ошибок. Если шторм что-то подчеркнул тебе красным ты 100% делаешь какую-то хуйню. У тебя даже желтых подчеркиваний никаких в коде быть не должно.
Никто не объявляет переменные по разным файлам. Создается метод getConnection(), который и возвращает соединение. Никто блядь не бегает и не ищет где и нахуя эта переменная была объявлена.
Кто тебе мешает заполнить класс только статическими методами? Фактически у тебя получится библиотека функций.
Постоянно какие-то сюрпризы из-за их особенности запоминать окружение.
Все, нашел причину.
Минус 2,5 часа.
Ни о чем не жалею, сам виноват, что проморгал этот момент.
Да убивать таких надо в зародыше. И вообще, никто не вправе писать на божественном PHP, не доказав свою глубокую одаренность, граничащую с гениальностью.
Интересно и почему же эти функции называют "замыканиями". Наверное какое-то совпадение.
Не передергивай, чтобы вкатиться в каловый донный язык для конченных дебилов, нужно как минимум уметь ЧИТАТЬ.
Если ты не в состоянии прочитать строчку текста из документации, тебя даже в курьеры не возьмут - там приложение, карты, клиенты, надо башкой работать.
Коль такие проблемы - оформляй инвалидность, пенсию по шизе и не еби голову здоровым людям.
Да не визжи ты. Вся документация это буквально урезанный справочник где ничего толком не написано, с ребусами (string $govno int $a : bool false| ERROR). А ошибки это написанное машинным текстом сообщение, которое зачастую к реальной ошибке не имеет отношения. Пхпшторм вообще всегда подсвечивает любую рандомную хуйню, даже хэллоу ворлд нельзя написать без его подсветки.
>Вся документация это буквально урезанный справочник где ничего толком не написано
Дегенерат, с магическим мышлением. В документации к каждой функции КАЖДЫЙ сука параметр детально расписан. Каждый вариант ошибки. Еще и блядь примеры использования в нескольких вариантах.
>с ребусами (string $govno int $a : bool false| ERROR)
>литературно называет ребусом пример кода
Я и говорю, что таким дебилам надо не код писать, а в больничку - глицин пить. Какой тут нахуй пхп вообще. Надо слабоумие лечить.
>подсвечивает любую рандомную хуйню
Рандомную хуйню генерирует твой больной мозг. А шторм просто подсказывает как этот высер превратить в нормальный код.
Сейчас практически всё переехало в компоненты.
Полезно будет ознакомиться со списком и в общих чертах посмотреть какие плюхи они дают, чтобы не городить велосипеды или не брать то же самое от васяна с гитхаба.
В глубину документации и потроха исходников уже по необходимости, когда задача того потребует.
Пришёл джуном на проект на симфони, барахтался в доке, исходниках и ебал мозги лиду.
Сейчас есть классный раздел в доке симфони, который бы очень облегчила мне тогда жизнь.
Попробуй https://symfony.com/doc/current/create_framework/index.html
Если есть силы и кураж, то альтернатива — WSL.
Спизди phpstorm, он в это умеет.
На многих продакшенах пых живёт в линупсе, мне понимание среды выполнения всегда очень помогало.
Потом потихоньку и базовые знания по докерам можно освоить. Сейчас они везде и понимать их на начальном уровне порой обязательно, чтобы решать задачи.
Так она для вкатунчиков, совсем простая.
Скорее маркетинг, чем обучающий материал, но для новичков таки полезный.
Если хочешь гоу дипер читай доку, она шикарна.
Когда становится тесно в доке — читай исходники, они тоже ничего.
Есть способ сразу знать что функция которая тебе нужна уже встроена в пхп.
спроси у чата ЖПТ, если лень по документации лазить. Вопросы такого уровня нейронка решает более-менее норм
Ну ты же им не скажешь, правда? А потом когда выяснится что то тебе в очередной подсказали это машинный бред, полезут проверять и выяснят что 90% того что ты делал это шизофазия чат бота, который нихуя не предназначен для программирования.
Вот тогда будут угарать и пиздить обоссанными тряпками, может постараются волчий билет выписать через чаты хрские. Можно понять - такой кал никакому конкуренту не пожелаешь. Хуй с ними с просранными бабками на твою зп, эта куча нейроговна может весь многомиллионный проект похерить.
Как блядь отличить где нормальный код, а где бред?
Нейрохуйня ведь умеет писать не "правильный" код, а максимально "похожий на правильный". Она блядь "правильность" определять не умеет.
Так а на мой вопрос это как отвечает? Есть класс, который состоит только из статических методов. Логично, что реализовывать этот класс нет смысла. Конечно, если где-то случайно он будет реализован, это не приведёт к ошибкам, но для наглядности было бы неплохо отметить, что весь класс по сути статичный. Раньше я делал класс abstract, но услышал мнение, что это пидорская тема. Семантически, мол, это модификатор из мира ООП, который подразумевает, что абстрактный класс будет унаследован и расширен.
720x480, 0:09
>Есть класс, который состоит только из статических методов
>Раньше я делал класс abstract
>это модификатор из мира ООП
А "класс" это не модификатор "из мира ООП"?
Да не, тут речь была про поиск функций для конкретного действия, задачки. О гении великого заменителя программистов я наслышан
>поиск функций для конкретного действия
Просто набрать в гугле "как срать?" уже не вариант?
Походу все кто мог выдачу гугла с первой страницы осилить в какие-то другие языки вкатываются.
Проблема в том, что неизвестно есть ли вообще этот метод. 3 раза переформулировал запрос, получилось найти искомый метод только практически скопировав его описание. "Получить проиндексированные значения массива по ключу php"
>проиндексированные значения массива по ключу
Еще бы оно нашло. Что это блядь вообще означает? Ключи это и есть "индекс". Как блядь в массиве может быть значения без ключа? И как по одному ключу можно получить несколько значений если ключ уникальный?
Ну а то что ты гугл посиком пользоваться не умеешь даже не удивляет. Сначала задается контекст, потом вопрос: "шиндовс php как срать какаха не выходит из жопи"
Это лишь означает то, что ты плох в гуглении. Учись формулировать запросы и всё получится.
Возьми книжку Котерова по РНР, он там 90% функций рассмотрел.
Сейчас никуда нереально устроиться. Джуны не нужны и PHP не исключение. Походу ты на битриксойдные вакансии повелся и думаешь что сюда легко вкатиться
Перескакивать с языка на язык такое себе. Если учил джаву продолжай учить его дальше. Кто тебе вообще сказал что джавистов не берут на работу?
Тебя вкатун-джавист затроллил и лишил одного конкурента в твоем лице. Поздравляю.
В качестве строчки в резюме это скорее минус чем плюс. Рискуешь застрять на должности говночиста до седых мудей, пока ссаный битрикс не вымрет нахуй. А там уже на завод.
И да, само "программирование" на битриксе устарело лет на 10 минимум, как сейчас никто не пишет. Поэтому битриксоидов и не берут никуда, собственно
Ладно, убедил. Иду покорять Ларавель
Жпт дегенерат, в том то и прикол что ответы получаются РАЗНЫЕ.
Обработка нейросетью это аппроксимация, приближенный вариант. Ответ в принципе не может быть точным на 100%, потому что для этого придется хранить воспроизводимую информацию полностью.
Если речь идет об обычном тексте, то выкинуть оттуда пару слов вполне можно, можно заменить несколько слов одним,
монжо джаэ бвукы пестаревлять и будет более менее понятно.
А в программировании нельзя блядь случайные десять процентов кода выкинуть. Нельзя "просто" аппроксимировать функцию или документацию. Ты никогда не знаешь что нейросеть "упростит". Может сократит описание, а может выкинет "ненужный" параметр. У неё приоритетов и настроек на этот счет никаких нет.
Поэтому жпт хуиплетов не слушайте, просто читайте документацию. Все функции для работы с массивами можно за час изучить, а вкатываться вам пол года минимум.
>идиоту предлагают использовать чат в качестве справочника, чтобы стек оверфлоу самому не парсить
>хуйня внезапно решила, что его заставляют использовать нейросети для пок-пограммирования особо сложной высоконагруженной системы с релизом сразу в прод без кода ревью, при малейшем баге в которой его буквально берут и ебут в зад без прелюдий, как он привык.
Хуже битриксоидов в пхп никого нет. Они органически неспособны писать нормальный поддерживаемый код.
>чат в качестве справочника
>залупа сбредила пикрелейтед
Такой-то справочник.
Тебе, дебилу тупому, сделали целый сайт по yii, с полной документацией, примерами, книгами, гайдами, ссылками на исходники, форумом. Даже на русском сука. И везде есть кнопка поиска.
Не хочу, хочу жрать говно.
У тебя тут просто выжимка из документации - мог у гугла так же спросить. Он код за тебя все равно не напишет, не протестирует и своей жопой за него отвечать не будет.
Вполне. Как минимум знают общие правильные абстракции, а не костыли из битрикса. Да и пишут обычно в одном стиле.
>знают общие правильные абстракции
Типа умеют зачитывать наизусть солид из википедии? Или бесконечный список паттернов?
Малой, 99% кода на пхп это нечитаемое неподдерживаемое говно. То что кто-то пытается свой говнокод в какие-то ебанистические нагромождения классов заворачивать лучше нихуя не делает.
Ладно. Давай, "взрослый", расскажи мне откуда пхп макаки учатся писать нормальный код? Тут весь тред ноют что по пхп нормальных книг нет. А по ооп так вообще все под джаву или на крайняк шарп.
Head first patterns - джава
Синяя книга эванса - джава
Чистая архитектура Мартина - джава
Где тут пхп и где тут пхп макаки?
>приходится
Кретин, кто тебя заставляет учить пыху? Учи свою джаву если он так тебе нравится, зачем себя так мучать?
Шансы устроится в пхп выше, чем в джаву. Сейчас там куча менторов, которые за деньги натаскивают нулевых челиков и они все вакансии закрывают. А в пхп больших денег нет, поэтому ментора работать не выгодно и поэтому самоучкам типа меня легче устроится. Ну это мне так видится.
https://ideone.com/si7cma
Есть у меня многомерный массив. Мне нужно пройтись по нему и сделать определённые действия с каждым элементом. С элементами первого уровня - одни, с элементами второго уровня - другие. И т. д.
В качестве альтернативы я вижу array_map, но из-за вложенности это будет гораздо тяжелее читать. Я просто ссылки обычно не использую и мало про них знаю. Это тот самый случай, где они нужны, да?
Типа. А как поступить в такой ситуации?
Многомерный массив. Массив, который состоит из массивов, которые состоят из массивов, которые состоят из скалярных значений. Мне нужно превратить его (корневой массив) в строку, при этом, немного изменив значения самого глубокого массива. То есть, перебрать элементы массива3, модифицировав их и превратив в строку, потом перебрать элементы массива2, превратив их в строку, потом перебрать элементы массива1, превратив их в строку.
>>3030918
Это своего рода база. Делаешь так (foreach с ссылкой) - сразу после цикла сделай unset переменной со ссылкой, чтобы случайно к ней потом не обратиться. Поскольку он вложен, это не то чтобы очень проблема, из глобальной области lvl3 не доступен. Но если код будет как-то меняться, хуй знает, что произойдёт. Для перестраховки.
>>3030932
Да вот хуй знает, мне как будто тяжелее читать это. Не то чтобы прям тяжело, но foreach вообще легко, а тут слегка подвисаешь.
Это какая-то задачка из литкода или что это?
Самое бесячее, что надо для каждого проекта создавать тонну ебанутых настроек шторма, всякие папки прописывать, сервера, прочую залупу. Неужели это нельзя всё сделать проще? И ещё кто-то говорит, что шторм - это дофига удобно. На мой взгляд самый неудобный и долбанутый редактор, который я когда-либо встречал.
А я не знаю как иначе.
У меня нет базы в голове.
У меня нет учителя, нет курсов, нет программисткого образования.
Поныл немного, ага...
Просто стыдно за свой код, за то, что я даже не могу понять как мне писать его нормально. Поставить фигурную скобку где надо я могу, но вот понимание правильной архитектуры у меня нет, понимание оптимальных, логичных и красивых решений.
Всю архитектуру, за тебя, реализовали в фреймворке. Паттерны еще пойди поучи
Одна проблема - я не понимаю почему мой код работает. Норм, пачаны?
В $_SERVER['REQUEST_URI'] летит же то, что находится в адресной строке браузера?
Я вбиваю в адресную строку браузера:
http://localhost/home.
В коде есть условие if ($_SERVER['REQUEST_URI'] === '/home') => сделать header ('Location: /home?page=2&sort=up'), после этого происходит переход на новую ссылку, в адресной строке показывается http://localhost/home?page=2&sort=up, но условие с $_SERVER['REQUEST_URI'] === '/home' все равно срабатывает повторно.
Ладно, пачаны, даже не думайте, если собираетесь о том, что у меня в коде. Я кажется понял куда смотреть.
>программисткого образования
Можно подумать, что там учат программировать. Там в основном решают простые задачки типа lab1.cpp, где пишут лютый говнокод. Преподы рассказывают лишь основы, буквально по вершкам. В итоге после универа ещё надо самому доучиваться, чтобы взяли на работу.
Ларавель - если хочешь стать фуллстеком, Симфони - если чистым бэком
Два дня долбался с этим Xdebug'ом, но в итоге победил. Оказалось, что в гайдах в интернете всякую фигню пишут, настроек нужно меньше, но всё равно надо точно знать какие именно.
Вообще, заметил, что с докером пишут конфиги как попало, лишь бы работало. Очень редко можно найти хороший гайд, где выносят переменные окружения в .env, не пытаются выловить ip-адрес контейнера, а обращаются по его имени.
И второй неприятный момент уже в самом докере, что есть различия между разными ОС. Я вначале наткнулся на гайд, где чел настраивал через винду, а в линуксах некоторые настройки надо писать по-другому.
С другой стороны, он - собранная на коленке хуита с динамической типизацией, и никак ты не укажешь тип для переменной внутри метода, отсутствием типизированных массивов (внешние инструменты типа phpstan мы не трогаем, речь о самом языке), как будто бац-бац для говнокодеров, чел, типа, если хочешь что-то серьёзное писать, иди тереби джаву, раст, си, хуй знает, а мы тут хуяк-хуяк прототип, чисто посмотреть, взлетит или нет.
Правильно понял?
вкатун
>Правильно понял?
Правильно. А теперь дропай ПХП и вкатывайся в Джаву. Иначе до конца своих дней будешь мучать себя что не вкатился туда
Пхп никого не запутывает. Это говноязык, который развивают дебилы, по прежнему живущие временами когда рандомный вася закачивал файл на сервак и это был сайт.
Все что ты видишь хорошего в языке сегодня - было протащено с воплями нытьем и драмой. А все что появится в будущем - уже есть прямо сейчас в нормальных языках без задержки в десять лет.
Никаких перспектив у пхп нет.
Доля использования именно как языка для написания кода будет падать и дальше. Джаваскрипт макаки сожрут весь рынок пхп макак просто потому что их в сотню раз больше. Все ресурсоемкие задачи уйдут го и модным растам зедам. А говнокодить сайты будут на джаваскрипте. Потому что фронт один хуй на нем. Нахуя два набора дебилов держать.
Как вывести стихотворение из mysql чтобы пхп не превращал его в строку а сохранил переносы?
>будет падать и дальше
Если я засну и проснусь через сто лет, то пхп также будут хоронить
Кстати, в пиндосиях, этих ваших, похороны пхп это давно уже ироничный мем. А по факту пыха как являлась топ 1 в бекенде, так и продолжает занимать 77-80% рынка. Остальное жрет джава и питон, а всякие однопроцентные объедки занимают уже ноды и прочие руби. Кстати, не секрет, что почти в ста процентах случаев Нода используется для сборки фронтенда, а не для разработки бекенда
Так, может, дело не в том, что php херит переносы, а в том, что оно выводится в браузер, т. е. HTML, т. е. для переноса нужно <br> вместо "\n".
На крайний случай можешь обернуть место, в которое ты выводишь, тегом <pre>
>так и продолжает занимать 77-80% рынка
И сколько из этого всего вордпресс и остальные цмс? В том-то и прикол что для этих сайтов программист не нужен. Я русским языком написал:
>Доля использования именно как языка для написания кода будет падать и дальше
Она и так падает непрерывно. 30% сайтов используют версию ниже седьмой. Это говно никто не обслуживает оно просто висит в интернете. Поддержка седьмой версии два года назад закончилась. Половина "сайтов" на пхп на седьмой версии. Половина пхп сайтов до сих пор под апачем крутится. Все это не актуальный кал. Про какое будущее можно говорить вообще? Какое нахуй развитие языка если две трети кода на нем это легаси, даже от актуальной версии на три года отставшее?
О том то блядь и речь что прямо сейчас для НОВЫХ проектов пхп нахуй не нужен. Сколько еще десятков лет перемогать фейсбуком и вк? Да, там может до сих пор пара легаси сервисов на этой хуйне крутится, но новые-то никто на пхп не пишет. Потому что нахуя?
А то что нишу пхп макак займут джаваскриптеры это просто сто процентов. Как только они высрут нормальные инструменты, как только у них появится свой ларавель всю пхп парашу как ветром сдует. И очевидно что это не изменение к лучшему, а деградация. Хуже пхп макак только жс макаки - это факт. Но так же и факт то что жс макак в сто раз больше. Как только им в руки попадет инструмент чтобы делать вменяемый бекэнд БЫСТРО пхп растворится в луже мочи. Будем плагины для вордпресса устанавливать.
Тише. Воды попей. Зайди на хх и сравни количество вакансий на вордпресс и ларавель. Это раз. Два - ты можешь вбить в поиск node и увидишь, что вакансий на пару сотен больше, но в основном это фронтенд или фуллстек. И три - выбирай любой язык и сортируй зп от 200к и ты увидишь, что вакансий +- одинаково, а в большинстве случаев пхп лидирует.
У ноды уже давно есть кошерный со всех сторон нестжс, вот только, когда будет на нем столько же вакансий как и на ларе, тогда и приходите. А про то, что нода убьёт пыху я слышу года эдак с 15го.
Напомню, что при всем при этом рынок пыхи это 80%. За последние нацать лет он ни упал вобще. Все потому что всё твои "другие" языки популярны, но популярны не в бекенде, а например в мобильной разработке, которая сейчас на хайпе, но без бека, как известно никуда не поедет (как и все в принципе)
>сравни количество вакансий на вордпресс и ларавель
Алеша, какие нахуй "вакансии" на вордпресс? Вордпресс потому и популярен, что там программист не нужен.
>когда будет на нем столько же вакансий как и на ларе
Ну будет. Тебе, дебилу о том и говорено, что тенденция к тому что будет. Назови хоть одну причину почему это не произойдет?
>А про то, что нода убьёт пыху я слышу года эдак с 15го.
При чем здесь нода? Не нода, так bun. Не ванилла, так тайпскрипт. Ты можешь хорохориться сколько угодно, но пхп расти некуда, он никакую долю рынка у жс не отъест. А вот в обратную сторону только в путь. Вопрос стоит только о том когда.
Убьет ли го пхп? Да нет конечно, просто заберет все самые денежные и интересные задачи и переманит все самые квалифицированные кадры. Я вот с "года эдак с 15го" наблюдаю как сеньорский состав отпочковывается в го, а меня пытаются нанять чтобы за ними пхп говно вытирать. Стрессоустойчивость и умение понимать чужой код им требуются. Офк все значимые задачи будут получать го красавчики, а пхп макаки будут баги искать в легаси кале, а версию языка поднять приоритета и бюджета нет.
Кому и кобыла невеста. Кому-то в кайф сидеть за копейки колупать баги в легаси говнокоде и облизываться на "новые" фичи языка, которые спиздили из джавы десятиллетней давности. Нахуя на это подписываться в 2к24 году? А самое главное нахуя работодателю в 2к24 в это вкладывать миллионы?
>тенденция
Значение знаешь? Тенденция это когда 20 лет назад пыха занимала 80% рынка, 15 лет назад - 60, 10 лет назад - 30 и т.д. А когда он стабильно занимает 80%, то о какой тенденции ты говоришь? О манямирке твоём, который ты прочёл лет 5-10 назад? Потому что крыть пыху говном уже давно моветон и признак школьника.
По поводу легаси кода я тебе ответил. Вакансий на ларе больше, чем вакансий на чем-либо ещё. Ты просто дурачек вылезший с установками из 2010-2015 годов, не понимающий, что в 2к24 дела обстоят иначе
>развиваться некуда
Кекнул с дауна. А что же считается развитием?
>Потому что крыть пыху говном уже давно моветон и признак школьника.
Ну ка, чучело, расскажи чем пыха лучше тайпскрипта. Ну так чисто навскидочку, пару фич набрось.
>По поводу легаси кода я тебе ответил. Вакансий на ларе больше
Каво блядь? Уеба, только 20% использует актуальную версию пхп. Большинство вакансий это ПОДДЕРЖКА устаревшей легаси параши. Я тебя спрашиваю: нахуя вкатуну вкатываться в эту поддержку? Перспектива какая? Почему должны новые вакансии на пхп появиться на рынке?
>А когда он стабильно занимает 80%
Это доля вордпресса. И сайтов, для которых код давным давно не пишется. Додстер, ты сам бы пошел работать с кодом под версию 5.6? А это жи САЙТЫ и ВАКАНСИИ и они ЗАНИМАЮТ.
Момент с го ты тактично проигнорил. Как же так - все больше пхп кода переписывается на го, а доля пхп только растет и растет. А вот так блядь. Сложные высокооплачиваемые задачи уплывают го разрабам, формошлепство и натягивание шаблонов на вордпресс и ларавель приплывает пхп макакам.
>А что же считается развитием?
Когда на твоем языке можно поднять приложение без ебли со сторонними вебсерверами? Когда у тебя нормальная типизация? Когда у тебя есть нормальные коллекции? Когда ты можешь разрабатывать и для фронта и для бека и под десктоп?
Ну и разумеется когда твой язык развивают не дебилы, которые пять лет ебут мозги и не добавляют модификатор ридонли "патамушта макакам будет сложна". И не могут высрать короткий конструктор, который и так все генерят. Зато высирают полностью ломающее обратную совместимость объявление свойств в конструкторе.
Вот это блядь "развитие"
https://www.logicbig.com/tutorials/core-java-tutorial/java-16-changes/intro-to-java-records.html
https://learn.microsoft.com/ru-ru/dotnet/csharp/language-reference/builtin-types/record
страница бойлерплейта сжимается в одну строчку. А с такими хуиплетами у руля никакого "развития" офк не будет.
Нихуя горение. Ну ладно.
>чем пыха лучше тайпскрипта?
А должна быть лучше? Ну ок, пара фич:
- рантайм типизация, рантайм инкапсуляция, рантайм ООП
- наличие энтерпрайзных фреймворков
- наличие работы
Это навскидку
>20% это актуалочка
Откуда ты берёшь эту инфу? Из смишных мемов? Допустим актуалочка 20%, что не так, но ок. При этом я тебе сказал, что вакансий на хх по ларе (а она является актуальным инструментом) больше, чем вакансий любого другого актуального языка.
У пыхи много говнопроектов и вакансий за 15к, потому что пыха доминирует в целом и зоопарк обширный, поэтому я сразу тебе сказал - ставь фильтр на хх с зарплатой 200к+ и сравнивай количество вакансий с другими языками
>80% это вордпресс
Почему ты такой жопой чтец? Я тебе написал, пиздуй сам проверять количество вакансий на ларе и вордпрессе, а потом объясни мне откуда ты берёшь 80% вордпресса, когда вакансий на нём меньше лары
>гошники получают больше
Пиздуешь на хх и узнаешь, что мидл+ разрабы получают +- одинаково на любых яп, вот только на пыхе таких вакансий больше
>формошлепство на ларавель
Маня. Я даже ~5 лет назад, работая с Ларой в говноконторе за 50к не пилил формочки от слова совсем
>поднять приложение без ебли со сторонними веб серверами
Ну тут уж нода уделывает так уделывает: pm2 плюс тот же nginx, плюс компиляция из тайпскрипта и тд и тд. Для пыхи же, твои любимые гошники активно пилят лонг сервера изи запускаемые продакшн пхп приложения без всяких нгинксов, а по желанию можно всё приложение скомпилить в бинарник и запускать где угодно вобще без нихуя
>фронт, бек, десктоп
А мне нужен онли бек. С этого и начался весь диалог. Пыха топ один в беке. Остальное мне не интересно
>нет ридонли😭
Ой бля. Иди ещё до знака доллара доебись
>объявление свойств в конструкторе
Хорошо хоть в тайпскрипте такого нет, да?
Нихуя горение. Ну ладно.
>чем пыха лучше тайпскрипта?
А должна быть лучше? Ну ок, пара фич:
- рантайм типизация, рантайм инкапсуляция, рантайм ООП
- наличие энтерпрайзных фреймворков
- наличие работы
Это навскидку
>20% это актуалочка
Откуда ты берёшь эту инфу? Из смишных мемов? Допустим актуалочка 20%, что не так, но ок. При этом я тебе сказал, что вакансий на хх по ларе (а она является актуальным инструментом) больше, чем вакансий любого другого актуального языка.
У пыхи много говнопроектов и вакансий за 15к, потому что пыха доминирует в целом и зоопарк обширный, поэтому я сразу тебе сказал - ставь фильтр на хх с зарплатой 200к+ и сравнивай количество вакансий с другими языками
>80% это вордпресс
Почему ты такой жопой чтец? Я тебе написал, пиздуй сам проверять количество вакансий на ларе и вордпрессе, а потом объясни мне откуда ты берёшь 80% вордпресса, когда вакансий на нём меньше лары
>гошники получают больше
Пиздуешь на хх и узнаешь, что мидл+ разрабы получают +- одинаково на любых яп, вот только на пыхе таких вакансий больше
>формошлепство на ларавель
Маня. Я даже ~5 лет назад, работая с Ларой в говноконторе за 50к не пилил формочки от слова совсем
>поднять приложение без ебли со сторонними веб серверами
Ну тут уж нода уделывает так уделывает: pm2 плюс тот же nginx, плюс компиляция из тайпскрипта и тд и тд. Для пыхи же, твои любимые гошники активно пилят лонг сервера изи запускаемые продакшн пхп приложения без всяких нгинксов, а по желанию можно всё приложение скомпилить в бинарник и запускать где угодно вобще без нихуя
>фронт, бек, десктоп
А мне нужен онли бек. С этого и начался весь диалог. Пыха топ один в беке. Остальное мне не интересно
>нет ридонли😭
Ой бля. Иди ещё до знака доллара доебись
>объявление свойств в конструкторе
Хорошо хоть в тайпскрипте такого нет, да?
>рантайм типизация, рантайм инкапсуляция, рантайм ООП
И это полезно... чем? Тем что с динамической типизацией можно срать в код? Плюс так плюс.
Дальше шизофазия какая-то пошла. Даже на два пункта не хватило.
>Откуда ты берёшь эту инфу? Из смишных мемов?
Оттуда же откуда и ты. Ты ведь сурс сразу дал.
https://w3techs.com/technologies/details/pl-php/8
Доля рынка кста опять упала.
>Я тебе написал, пиздуй сам проверять количество вакансий
>Алеша, какие нахуй "вакансии" на вордпресс? Вордпресс потому и популярен, что там программист не нужен.
Стекломойный, ты совсем ослеп? Ты тут срешь про долю рынка, а доля рынка из вордпресса почти целиком и состоит.
>Пиздуешь на хх и узнаешь, что мидл+ разрабы получают
Бля, я когда полез проверять ожидал что там пизда, но не ожидал что такая. ПХП ВСЕ. Бегите отсюда нахуй. Вот, смари паскуда, вот это развитие. Го, которым на хх еще пять лет назад даже не воняло теперь обсыкает твой ларавель и по вакансиям и по зп.
Дальше опять какая-то шизофазия пошла. Долбоебу говорят что половина пхп сайтов на апаче до сих пор, он пиздит про какие-то пилящиеся го сервера, компилилит пхп в бинарники и бороздит просторы большого театра.
Пикрелейтед все что нужно чтобы поднять сервак на жс'е прямо сейчас. Пять строчек кода и одна команда. То же самое в го. Какие нахуй нжинксы, какая нахуй ебля два дня чтобы дебаггер включить?
В общем я понял почему ты каждый пост виляешь сракой обходя отток задач и синьоров в го. Потому что ты чекнул и понял что там пизда. Го уже вполовину размером с пхп рынок в раше. А по синьорским задачам похоже уже перерос. И дальше будет только веселее.
1920x1080, 0:03
Не будет никто ничего переписывать на го. Как пилили сайты на РНР, так и будут пились. А вот как раз судьба го пока неизвестна, его нишу может занять любой новый модный язык.
Никто не будет переписывать всякую хуйню. А вот все критические сервисы, которые приносят бабки будут. Тебе, дебилу, про то и пишут - все саме вкусное и прибыльное вымывается.
Ты скрины видел? Несколько лет назад никакого го в помине не было. А сейчас там синьорских вакансий больше чем на ларавеле.
И чьи же это задачи пишут на го бывшие пхпшники? Наверное у фронтендеров часть рынка спиздили.
Го занял нишу С/С++ в бэкенде. Я помню ещё в 2017 смотрел доклады мэйлру, где они хвастались, что переписали почту на го, а раньше у них она была на С++. А нишу РНР го ни как не займёт. Конкуренты РНР - это всякие питон с джангой, дотнет с асп.нет, может действительно на жс/тс какой-нибудь бэкенд высрут, но ему надо будет догнать по удобству и производительности разработку на РНР, что весьма сомнительно. Скорей появится какой-нибудь новый язык, который предложит новый подход к быстрой разработке сайтов. Типа как в своё время руби на рельсах совершил революцию и ускорил написание MVC-приложений.
Доо, сишники в го набижали. Вот они эти сишники в ряд:
https://hh.ru/vacancy/92525414
https://hh.ru/vacancy/91937785
https://hh.ru/vacancy/92207521
Почему эти долбоебы на ларавель ищут пхп макак с опытом go? Откуда вообще у пхп макак опыт го если это ниша сишников? Да потому что в крупных конторах это повсеместно, я блядь сам курс по го проходил бисплатно за счет конторы, и не потому что я его выклянчил, а потому что критические сервисы хотят на го переносить.
По работе нужно массив разделов превратить в древовидную структуру. Изначальный массив и массив, который должен получиться:
https://codefile.io/f/oyqbaZY0Tm
То есть по порядку, если следующий уровень больше предыдущего уровня, значит он является подразделом.
Как можно решить эту задачу?
Так тут почти все в перспективе рассчитано на получение зп. Даже решение учебника ОПа
Вы видите копию треда, сохраненную 14 апреля в 11:40.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.