Кто-то уже празднует, а мы изучаем язык PHP (а также JS/CSS/HTML/SQL) и учимся делать сайты. Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.
Это тред для начинающих. Слово «классы» у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>2932466 (OP) . Старые треды тут https://2ch.hk/pr/arch/ (искать по слову php), а также на архиваче и в гугле по словам по словам "клуб изучающих PHP".
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- скачать учебник: зайди на https://github.com/codedokode/phpbook, нажми зеленую кнопку Code -> Download ZIP, распакуй на рабочий стол и открой index.html - что будут спрашивать на собеседовании, если 0 опыта - будут гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись - сколько времени надо изучать все это? - все зависит от тебя, в районе 12-24 месяцев
ОП, спасибо за ответ из прошлого треда. У меня все-таки два вопроса...Ага!
Как считаешь, как мне стоит поступить в этой ситуации:
Мне нужно выводить 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 и на выход - ничего, просто объект будет меняться в ходе функции.
Бля, я ненавижу регулярки всею душою и просто пишу это для облегчения души. Ради интереса, может кто рассказать как составить цельную регулярку для пOиCKA лATиHицы в CлOBAX? Объединение результатов /w[a-z][а-я]/w и /w[а-я][a-z]/w не устраивает аутиста внутри меня
>>2975788 Я не пишу идеальные регулярки, но дам совет: чтобы понимать регулярные выражения, нужно рассматривать их как описание из каких символов состоит слово.
Например, опишем простые имена на русском: Иван, Катя, Андрей Из чего состоят эти слова? Сначала идет одна заглавная, потом несколько строчных букв русского алфавита.
На языке регулярок можно написать так: [А-ЯЁ]{1}[а-яё]+
Можно читать как: одна заглавная буква русского алфавита, от 1 до бесконечности строчных букв русского алфавита
Как описать имена через дефис на русском: Мария-Антуанетта Анна-Мария
Эти слова состоят из: одна заглавная буква русского алфавита, некоторое количество строчных букв русского алфавита, один дефис, заглавная буква русского алфавита, несколько строчных букв русского алфавита.
Регулярка может выглядеть как-то так: [А-ЯЁ]{1}[а-яё]+-{1}[А-ЯЁ]{1}[а-яё]+
Опытные аноны могут привести тебе более лаконичные и синтаксически правильные регулярные выражения, я лишь хотел показать как перестать ненавидеть регулярки.
>>2975788 Ну и еще: нужно хорошо понимать что делает каждый элемент регулярных выражений, если ты ставишь квадратные скобки, не зная что они значат в синтаксисе, то будет путаница.
>>2973449 → 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 оно будет матчить ещё и полностью латинские слова, как быть?
>>2975945 >https://github.com/libin9iOak/ja-netfilter-all >Переведи гуглом и выполни пошагово >Спасибо за ответ, я уже знал это. Я как раз спрашивал про часть решения одной из задач по регуляркам из шапки. Нужно найти слова с заменами букв на латиницу (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
>>2975955 >Есть же | >\w([а-я][a-z])\w|\w([a-z][а-я])\w\ui Точнее даже \w([а-я][a-z]|[a-z][а-я])\w\ui Сделай ещё нежадный захват для обоих \w (\w*?), чтобы слово целиком матчилось.
В 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 и на выход - ничего, просто объект будет меняться в ходе функции.
>>2976778 Спасибо за ответ. >А что в этом плохого? Я думал, что вид $name или $enrollee['name'] более лаконичный и удобочитаемый. Кстати, а что ты думаешь о том, как я буду получать значения из объекта ErrorList: $errors->implode(" ", getListOfFieldErrors('name')); Т.е. сначала я получаю массив, где ключи - 0, 1, 2..., а элементы - строки. Потом я сшиваю их. Я читал одну из твоих статей и там говорилось, что, по возможности, не стоит использовать встроенные функции в html-коде. Как мне тут поступить? Оставить как есть? Преобразовать где-то в контроллере, а потом вывести как строку в html?
>>2976778 >Конечно, лучше бы там было getName(), а не get('name') В прошлом треде ты советовал мне, если и использовать магию для создания сеттеров и геттеров, то использовать __call.
Как раньше я получал значение поля в валидаторе: у класса валидатора есть свойство-массив, ключи которого - строки - названия полей Enrollee. И я просто вызывал $enrollee->get('name')
А сейчас что? Как вариант - подготавливать название метода, чтобы получить значение.
Например, так: Получить название поля, заменить первую строчную букву на заглавную, соединить название поля со строкой "get". Вызывать метод с таким названием. Как-то так: https://3v4l.org/MpibO Как вариант, чтобы не ебаться с заменой регистра первой буквы - хранить название поля сразу с большой буквы
Даже если я не буду реализовывать магию и просто в лоб напишу геттеры и сеттеры для каждого класса, то как мне быть в классах-сервисах? Все равно придется подготавливать названия методов.
Это неправильно. В PHP уже есть функция implode, зачем ты делаешь в объекте ее копию? И объект для хранения ошибок вообще не должен беспокоиться о том, как их потом выводить.
> Я читал одну из твоих статей и там говорилось, что, по возможности, не стоит использовать встроенные функции в html-коде.
Да, это правда не моя статья (о чем в начале написано). Я думаю, что этот совет не очень хороший. Функции для обработки строк и массивов типа implode использовать можно. Не рекомендуется использовать такие вещи:
- обращения к переменным типа $_GET, $_POST, $COOKIES напрямую - вызовы функций для работы с БД, типа $pdo->execute('SELECT 2 + 2');
То есть не рекомендуется бизнес-логику переносить в шаблон.
> Преобразовать где-то в контроллере, а потом вывести как строку в html?
В шаблоне получить из объекта список ошибок и склеить их, в том числе с помощью implode.
>>2978093 Окей, спасибо за ответ. В прошлом треде ты писал, что лучше писать DIContainer по PSR-11, я читал PSR-11, но у меня был тупняк из-за того, что нет функции регистрации сервисов. Сегодня решил почитать одну из статей, код из этой статьи: https://3v4l.org/oAk18 Мне стоит реализовывать DIContainer как там?
>>2978105 А вообще, стоп. Автор вроде опустил момент с тем, чтобы не создавать один и тот же объект каждый раз...Я думаю, переписать немного get, добавить свойство - созданные объекты и все будет нормально.Но в любом случае, он мог ответить на вопрос где регистрировать сервисы - в конструкторе.
- если пользователь вызывает getXXX, то: -- если поле XXX существует, вернуть его значение -- иначе, выбросить исключение, видимо пользователь опечатался - если пользователь вызывает setXXX, то действовать аналогично
То есть при обращении с правильным разванием ты делаешь обращение к полю, с неправильным - выбрасываешь исключение.
Дополнительно можно сделать аннотации #[Setter] и #[Getter] к полям, и разрешить через магический метод обращаться только к тем полям, где есть аннотация. То есть, делать доступными не все поля, а только часть.
Плюс такого подхода, в том, что ты можешь потом добавить написанный вручную геттер, если нужна более сложная логика.
В регулярках нету ^ и $. В имени поля могут быть цифры. Имя поля можно извлекать из регулярки через скобки, например:
if (preg_match('/^get(....)$/', $name, $m)) ...
> А сейчас что? > Как вариант - подготавливать название метода, чтобы получить значение.
Да, надо формировать из имени поля название геттера. Либо можно оставить твой метод get(...), но тогда валидатор будет поддерживать лишь классы с таким методом, а не любые.
В Симфони есть целый компонент PropertyAccess для таких задач.
> Получить название поля, заменить первую строчную букву на заглавную, соединить название поля со строкой "get".
Норм. Можно даже функцию или метод в utility class для этого сделать (вызвать геттер по имени поля).
> Как вариант, чтобы не ебаться с заменой регистра первой буквы - хранить название поля сразу с большой буквы
Что за фигня? Просто $prefix !== 'get' && $prefix !== 'set' или !in_array($prefix, ['get', 'set']).
Также, я забыл дать совет, старайся везде использовать тройное строгое равно === вместо обычного ==. Правила работы обычного поменялись в PHP8 и ты замучаешься исправлять код с ним, если они еще раз поменяются. Ну и у строгого равно правила гораздо проще, а вот для двойного ты вряд ли их наизусть помнишь.
PSR-11 это интерфейс только для получения сервисов. Регистрацию ты делаешь как хочешь.
Это на самом деле правильно, что они сделали интерфейс только для части функционала. Так и надо делать - интерфейс представляет способность объекта выполнить какое-то действие (выдать экземляр сервиса), а не описывает все его методы.
Можно, но тут список сервисов как бы встроен в контейнер намертво. Это не очень красиво с точки зрения ООП. Например, ты не сможешь использовать этот контейнер в другом проекте с другими сервисами.А контейнер с регистрацией более универсальный и переносимый между проектами.
Также, там не реализовано запоминание созданного объекта.
Также вместо имен типа user.repository лучше использовать имя класса UserRepository::class.
>>2978142 >return 1 писать не надо (зачем? что ты будешь делать с этой единицей?).
Разве php не будет ругаться? Когда указываешь тип возвращаемого значения и ничего не возвращаешь (а сеттер обычно ничего не возвращает), то возникает ошибка. Вроде так, разве нет?
>>2978142 >Если хочется, метод __call можно засунуть в трейт.
Если добавлять этот метод в трейт, мб его нужно распилить на геттер и сеттер, чтобы классы брали только то, что им нужно - либо и то и то, либо что-то одно? У меня ведь часть классов не нуждается в сеттере, но геттер вполне был бы полезен им.
>>2978089 Может вкатунам в PHP ещё и замену PHP написать чтобы два раза со стула не вставать? Ну а чё, он же всё равно будет заменён, так чё ждать если можно заменить его самому
Ну так убери тайп-хинт mixed тогда, если функция может ничего не возвращать.
> Если добавлять этот метод в трейт, мб его нужно распилить на геттер и сеттер, чтобы классы брали только то, что им нужно - либо и то и то, либо что-то одно? У меня ведь часть классов не нуждается в сеттере, но геттер вполне был бы полезен им.
Это лучше решить использованием атрибутов, то есть явно помечать поля с геттерами или сеттерами.
>>2979400 Купи им платья, туфельки. Одень, усади на маленькие стульчики за маленький столик и налей им чаю в маленькие фарфоровые чашечки. Это будет добро и дружба на долгие годы.
>>2979400 Откуда мы знаем, что ты там делаешь? Ты там опенсервер поставили или ксамп, а может вообще пытаешься через докер запустить? Вариантов миллион. Учись задавать вопросы.
Так в общем, норм. Единственный момент - мы делаем проверку наличия атрибутов при каждом обращении. Для задачи уровня список студентов это норм, но для более сложного проекта эти списки атрибутов надо кешировать, чтобы не лезть за ними каждый раз и не тратить время. Ведь этот код выполняется при каждом вызове геттера.
Можно для этого сделать статическое свойство в трейте (статическое, так как список атрибутов у полей одинаковый для всех экземпляров класса) и кешировать информацию в нем. Массив такого вида:
[ Имя поля => список разрешенных методов (get, set) ]
Но, если подумать, то можно пойти еще дальше. Можно кешировать не список разрешенных методов, а функцию-геттер/сеттер. То есть, чтобы было так:
- При первом вызове типа getName срабатывает вся магия, все проверки, и генерируется функция-геттер и кладется в массив-кеш - При повторном вызове она просто берется из массива и вызывается
Массив имеет вид:
[ имя геттера/сеттера => функция-геттер/сеттер ]
По типу:
['getName' => fn () => $this->name]
То есть, идея в том, чтобы сделать повторный вызов геттера как можно короче и не делать кучу проверок каждый раз.
Это позволяет ловить конкретный вид ошибки, и в тестах упрощает тестирование. Единственный минус - так получается много классов-исключений. Но у тебя маленький проект и ничего страшного не случится.
Обрати внимание, что в PSR-11 для исключений даны интерфейсы.
При регистрации можно использовать короткие анонимные функции:
$container->register(Some::class, fn () => new Some(1, 2, 3));
Также, если ты хочешь реализовать PSR-11, то ты должен не делать свой интерфейс ContainerInterface, а подключить интерфейсы с помощью композера.
Это значит, что у тебя не настроено в сервере, что надо для PHP файлов вызвать интерпретатор PHP. Готовые советы есть в интернете, даже в документации nginx есть пример. Обычно запускают php-fpm и nginx настраивают, чтобы он передавал ему запросы.
>>2979707 У меня апач, но, мб это поможет. Конфигурационный файл настроен? Даже если настроен так, как написано в гайде, может оказаться, что какую-то инструкцию автор гайда пропустил. Можно где-то посмотреть текст ошибки? Там еще какая-то ебка с тем, используешь ли ты браузер, чтобы открывать файл php или запрашиваешь этот файл с локального своего сервера. Я ставил апач давно, поэтому помню туманно с чем может быть ебка.
>>2979721 Если открываешь php в браузере как файл, например: c://localhost/example.php То ничего обрабатываться не будет и браузер покажет просто код. Если пишешь в адресной строке браузера: http://localhost/example.php Код обрабатывается и выводится результат кода.
Как думаете чтоб в мухосранске в веб-студию устроиться человеком-оркестром фуллкеком на пхп и вью, то для этого надо учить всякие там микросервисы, redis, rabbitmq, kafka?
Мы как-то с тобой обсуждали классы-проверятели-валидации. И там было два класса: один проверяет структуру значения, другой - что значение содержит валидные символы.
Меня смущает выбранная мною формулировка для текста ошибки: 'Поле должно иметь следующий вид: %s. Вы написали - %s.';
Например, пользователь напишет: ИвАн, моей проверке на структуру не понравится этот вариант, потому что она допускает заглавные буквы только в определенном месте слова. И как тогда будет звучать текст ошибки?
'Поле должно иметь следующий вид: бла-бла. Вы написали - ИвАн';
Получается я заставляю пользователя самому думать почему программа не принимает его вариант.
Наверное стоит все-таки переписать?
Кстати, я выбрал такие формулировки для текста ошибок (хотя такое лучше показывать пользователю до того, как он начнет вбивать значения в поля):
Для имени: Сайт принимает 3 типа имен: 1) простое имя, пример: Анна; 2) имя с апострофом, пример: О'Генри; 3) имя с дефисом, пример: Анна-Мария.
Заглавные буквы русского алфавита можно использовать только в таких случаях: 1) первая буква простого имени; 2) первая и вторая буквы имени с апострофом; 3) первая буква и первая буква после дефиса в имени с дефисом.
Для фамилии: Сайт принимает 5 типов фамилий: 1) простая фамилия, пример: Иванов; 2) фамилия с апострофом, пример: Д'Арк; 3) фамилия с пробелом, пример: Сан Антуан Кристоф; 4) фамилия с дефисом, пример: Римский-Корсаков; 5) фамилия со скобками, пример: Иванов(Римский).
Заглавные буквы русского алфавита можно использовать только в таких случаях: 1) первая буква простой фамилии; 2) первая и вторая буквы фамилии с апострофом; 3) первая буква и первые буквы после пробела; 4) первая буква и первая буква после дефиса; 5) первая буква и первая буква после открывающей скобки.
>>2980067 Кто тебе сказал, что твои правила верные? Как минимум имя бывает составное через пробелы. У моих детей, например, по два имени, но нет отчества, потому что они родились в Канаде, их российский паспорт выдан на основании канадского свидетельства о рождении, в котором нет никакого отчества, зато есть middle name (оно опциональное, но мы Прочитали дать). В странах Южной Америки могут вообще 10 имён дать. Так чисто по приколу записать кучу святых, чтобы они присматривали за ребёнком лол. А ещё у нас тут есть индейцы, у которых может быть одно имя вместо имени-фамилии. Я не знаю, как это в России разруливают. У одного из детей Маска есть цифры в имени.
Короче говоря, не надо думать, что ты щас покроешь всё норм валидацией, и всё будет хорошо. Обязательно что-нибудь упустишь. Так что просто проверяй на пустоту и обрезай пробелы по краям, больше ничего не надо.
>>2979673 >в PSR-11 для исключений даны интерфейсы Я не представляю что мне с ними делать. Вся моя работа с исключениями, на данный момент, заключается в том, что я просто создаю класс-исключение, делаю extends от Exception и выкидываю исключения с текстом ошибки. И я не знаю что я должен делать, чтобы из интерфейсов исключений получить что-то, что можно использовать в коде...
>>2979673 Еще как вариант - можно не проверять регистр вообще, а принимать значение как есть, если оно подходит под хотя бы один тип, и изменять регистр самому. Тогда текст ошибки будет указывать только на то, что имена или фамилии такого типа не поддерживаются сайтом. Да-да, я понимаю, что имена и фамилии бывают разными и кому-то может не понравиться, что его имя или фамилия не проходят по системе, но я не хочу писать идеальную валидацию для имен и фамилий. Я не хочу, чтобы моя валидация покрывала все случаи. Ты как-то скидывал ссылку какие символы могут использоваться в ФИО. Я часть не стал брать. Хотя бы потому что не могу нагуглить пример использования таких символов в имени. Не лучше ли вместо того, чтобы задрачиваться, ЧитатьБелый Медведькие проблемы по мере их появления? Все-таки те системы, которые валидируют ФИО, сами могут заниматься тем, что добавляют варианты, которые раньше не допускали, потому что узнают, что существует кто-то, кто должен проходить валидацию, но система валидации под него не заточена.
>>2977980 >использовать __call Советую его не слушать, и писать максимально простой и читабельный код, магия в 🎄е это зло, которое надо под корень уничтожать, чем уже успешно занимаются в новых версиях 🎄, объявив устаревшим динамические объявления свойств объекта
🎄 тред в какую-то метаиронию на самого себя превратился? Один не может загуглить как создавать энтити через шторм, другой мускли изучает, третий изобрел Новогодний Репертуар🎄 винда нжинкса, четвертый не может загуглить шорткаты иде и дергает рефлексию ради геттеров. Обязательно вернусь снова следить за вашими результатами аноны!
>>2981938 Да, понимаю, только зачем делать магию на сеттеры-геттеры? Это: 1)Лишние действия 2)Отсутствие автокомплита от IDE 3)Отсутствие статического анализа от 🎄стана Так какие преимущества?
Никогда не обращал внимания на последовательность вызовов в Stack trace, который показывают наследники Throwable. А сейчас обратил и немного нихуя не понял.
Я правильно понимаю, что там идёт ОТ самого "глубокого" вызова К самому "поверхностному", НО последний элемент Новогодний Репертуара - тот момент, на котором исключение непосредственно кидается, то есть, фактически самый глубокий.
Я как-то изначально ожидал, что line 20 будет первым (индекс 0) элементом Новогодний Репертуара, раз они идут от глубокого к поверхности. А она последний элемент Новогодний Репертуара. Но при этом они идут от глубокого к поверхности.
То есть, trace[0] это момент вызова функции, которая бросила исключение. А trace[(count(trace) - 1)] - непосредственно throw. Они в разных концах, хотя на деле оно идёт после другого.
>>2982871 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
>>2982871 >Ну и нахуя пхп дегенератам знать что такое Новогодний Репертуар? >Пхп дегенераты: а пачиму исключение не в Новогодний Репертуаре? Умоляю, скажи что ты тот самый слабоумный с рефлексией и геттерами, если вас несколько я веру в людей совсем потеряю.
Здарова мужики! Препод пригласил на стажировку в его компанию. Новогодний Репертуар Yii 2, Switch API, могу ошибаться ибо не знаю таких вещей. Попрошу посоветовать книги, курсы для продвинутого погружения в пхп и начала изучения Yii, а дальше разберусь
>>2983488 1) Yii2 это древний сухой кал говна. В 2к23 нахуй никому не нужен. 2) Вся инфа по фреймворку есть в блоге автора фреймворка https://rmcreative.ru/ 3) Хули твой препод тебя "продвинуто" не погрузил? Пусть теперь на стажировке отрабатывает.
>>2983520 Почитай доку (не шучу) Ларавеля. После нее доку Юии2 усвоишь буквально за вечер тру стори
Это как во Детям в костюмах звёздочек. Если знаешь Реакт, то легко выучишь за вечер Вуе тру стори
А ещё узнай, что там делают на Юии2 - рест апи или Дети в костюмах снежинок, который прям отдает отрендеренный 🕛. А ещё узнай, нужны ли знания Дети в костюмах звёздочека, чтобы не обосраться
А так не расстраивайся, что Юии2 - легасное говно. Потом найдешь работу на Симфони или Ларке
Бизнес-логика - это правила "предметной области". "Предметная область" - это то, что моделирует приложение, ради чего оно пишется.
Например, ты пишешь приложение для покупки билетов на самолет. В предметную область будут входить рейсы, аэропорты, авиакомпании. В бизнес-логику будут входить правила, как эти билеты надо покупать, как искать свободные места, как бронировать их.
Кроме бизнес-логики, есть еще "техническая" логика, например: логгирование, логика отправки email-ов и тд, обработка ошибок.
>>2975215 (OP) Сап программач. Раньше занимался веб Белый Медведьоткой за Сюрприз от Зайчика, сейчас перекатился в другую сферу и подвернулась подработка, требуется сделать сайт. Я не ебу как оценить сколько за это просить. Грубо говоря требуется сделать корпоративный сайт с несколькими страницами материалов. Также должна быть страница администрирования для изменения материалов сайта. Доступ к материалам только зарегистрированным пользователям. Собсна сколько просить за это?
При ошибке ты бросаешь исключение. Для этого ты должен сделать исключение, которое реализует указанный в PSR-11 интерфейс.
Например, если сервис не найден в get() , то ты должен выбросить исключение любого класса, который реализует интерфейс Psr\Container\NotFoundExceptionInterface. Для этого достаточно просто дописать implements ... в твой класс исключения.
Почему интерфейс? Потому, что контейнеры от разных авторов могут использовать разные исключения с разными полями и методами, и интерфейс позволяет их объединить.
Точнее, интерфейс позволяет пометить, что это именно исключение обозначает "сервис не найден". Интерфейс без методов, он только для добавления пометки к классу.
У тебя идет: сначала пара проверок правильности имени, а только потом это:
> if (isset(self::$listOfGettersAndSetters[$name]) && $prefix === 'get') {
Можно было бы поставить обращение к кешу в самое начало. Если функция есть в кеше, значит она прошла проверки и можно ее не проверять. Этим мы еще чуть-чуть ускорим работу с кешированными свойствами.
> $properties = $property->getAttributes(); переменную надо назвать $reflAttributes
> if ($methodName === 'Setter') { ... === Setter::class
Кстати, каждый экзепляр стрелочной функции это объект класса Closure (см мануал). В нем даже где-то хранятся запомненные значения переменных: https://3v4l.org/3rXUW
О кстати, вопрос от анона мне подкинул идею. А может вместо атрибутов Getter/Setter смотреть доступ к полю по наличию аннотации @method getAge() ? Хотя это сложновато будет...
Новогодний Репертуартрейс тут надо читать снизу вверх. То есть мы вызывали one, она two и так до функции five, где и выбросилось исключение. По моему, стандарта нет, в разных языках пишут то сверху вниз, то снизу вверх.
На номера типа #0 вообще смотреть не надо. Они тут явно от балды стоят.
> А trace[(count(trace) - 1)] - непосредственно throw. Они в разных концах, хотя на деле оно идёт после другого.
Неверно. throw находится в функции five(), которая в трейсе под индексом #0. То, что написано внизу "thrown in...", это как бы отдельно от списка функций.
Да, перед именем функции указано из какой строки она была вызвана, например вызов five() идет в 16-й строке. Это тоже где как делают, никакого стандарта нет.
>>2985581 Окей. Спасибо за ответы. >Хотя это сложновато будет... Мб когда-нибудь я возьмусь, ага!.. Пока что не представляю как это можно реализовать. Но все-таки когда-то нужно будет разобраться как работать с аннотациями. >>2985547 >А в мануале не написано? Написано! Но я хотел твою версию объяснения. Те же атрибуты тоже описаны в мануале, есть статьи по ним, но +- я начал представлять что это такое и как своими ручками что-то с ними делать только после твоего объяснения. Когда впервые узнал о таком поведении замыканий, я ничего не понял и отложил это знание. А ты довольно-таки просто объяснил суть. Официальный мануал по php это хорошо, но только тогда, когда изначально пришел к нему +- подготовленным, потому что часто формулировка подается сухо (не упрекаю мануал, все-таки мануал должен содержать четкую и лаконичную форму, чтобы легче было поверять какие-то моменты в работе языка) и лучше сначала прочитать простое объяснение, а потом читать формальное. >>2985572 >... === Setter::class Как ты считаешь лучше: создавать для атрибута класс или нет? Тот же php советует, но я пока что не вижу нужды в том, чтобы под атрибут создавать отдельный класс. Все-таки в своем коде я смотрю на наличие атрибута, а не использую объекты класса-атрибута.
Только у меня появился баг в шторме, что нажимаешь коммит и пуш, шторм начинает анализировать код, а дальше ничего не происходит, как будто я кнопку не нажимал. Потом нажимаю вторую раз и он снова анализирует код и выдаёт своё тупое предупреждение, что типа там есть ошибки и стоит ли отправлять коммит. Жму энивей и только тогда происходит работа. В итоге сейчас жму кнопку 3 раза! За что мы вообще платим деньги!?
>>2979971 Разве смысл веб-студии не в штамповке несложных сайтиков на коленке? Нахуй там нужны очереди, кеши и микросервисы? Я бы никому не советовал связываться с кабанчиком, который не имея своей ниши хватается за разработку любой сложности и трясет своих разрабов за сроки работы. Это адская работенка чреватая скорым выгоранием. Такое лучше обходить десятой дорогой.
>>2989634 Насколько я знаю, там задачи чёкнутые. Типа там за сто тыщ надо сделать свою кастомную CMS, на которой можно делать сайты для розничной торговли и вести учёт проданного, налогов и ещё чего-то там. Хуй знает чем существующие CMS не угодили, ну надо почему-то заказчику кастомную делать при том в Мухосрани, на коленке и чтоб нубы студенты за копейки делали. Короче заказы сложные, платят мало, логики в заказах нет, они сумасшедшие. Но сгодится для того чтоб залутать наконец первый год опыта
>>2989655 В ИТ очень много проходимцев - надо быть внимательным и смотреть к кому идешь работать. Иначе банально выебут, высушат и ничего не заработаешь. Когда вкатывался на каких только поехавших не насмотрелся. Часто, например, в разработку лезут какие-то левые окатыши, у которых никакого опыта в этой сфере как у руководителей. Нередко ещё и предлагают списочек требований со страницу А4 на зарплату курьера доставки.
>>2989661 Даже первую работу надо искать более-менее внятную, а не хвататься за первое попавшееся дерьмо. Во-первых, тебя могут банально кинуть, во-вторых ты там ничему не научишься, и в-третьих тебя все равно будут на собесе спрашивать - что ты там делал, а в таких шарашках у тебя только один вариант - грести легаси говно за гроши. Такая себе заслуга для работодателя.
По Симфони сам разработчик написал пошаговый туториал в виде книги, чтобы можно было ознакомиться с фреймвёрком. А по Лараверю что-то ничего подобного найти не могу. Есть документация, но это справочник, а хотелось бы учебник. Есть ли подобные текстовые ресурсы для пошагового изучения Ларавеля? Он по идее популярный, но что-то ничего найти не могу.
>>2985581 Как считаешь правильно поступить в этой ситуации: Насчет того же валидатора, ага. У меня есть главный класс - Валидатор и классы-проверятели-правил.
Я должен передавать объект TDG как зависимость моему валидатору или классу-проверятелю, который проверяет уникальность емайл?
Учитывая то, что мой валидатор можно настраиваться и в него вообще может не попасть проверка на уникальность емайл, я думаю, что мне нужно добавлять эту зависимость в класс-проверятель.
Если так, то получается, что класс-проверятель я уже буду регистрировать в DIContainer?
Остальные классы-проверятели я не планировал регистрировать в DIContainer. Потому что у них нет зависимостей и потому что у этих классов может быть несколько объектов с разным содержимым, у класса, проверяющий уникальность емайл, этого нет и есть зависимость. Ну и еще в пользу этого: Если я не буду регистрировать этот класс-проверятель в DIContainer, то как я буду разрешать его зависимость в виде объекта TDG? Я думаю, что раз уж я выбрал, что буду разрешать зависимости так, то нужно и дальше это соблюдать?
>>2985581 Я еще решил распилить класс-проверятель, который проверяет структуру строки.
Список классов: ValidSymbolPosition = проверяет, что символ находится на определенной позиции, конкретно, им я хочу проверять, что апостроф будет находиться ровно на 1-ой позиции (считая от 0).
ValidSpacingBetweenCharacters = берет два символа, ищет их позиции, проверяет условие, что кто-то должен идти раньше в строке, планирую этой проверкой проверять, что открывающая скобка в фамилии стоит раньше, чем закрывающая.
SymbolIsPresentBecauseThereIsAnotherSymbol = проверяет, что если строка содержит определенный символ, то она обязана содержать и другой определенный символ, планирую использовать для тех же скобок, потому что если есть открывающая скобка, то обязательна должна быть и закрывающая.
StringContainsSubstring = проверяет, что строка содержит указанную подстроку, планирую проверять емайл на то, что перед @ есть определенный набор символов (нельзя же, чтобы уникального имени почты не было), и после @ (нельзя же, чтобы доменного имени не было).
NumberOfSymbolIsValid = проверяет, что строка содержит символ определенное количество раз, планирую проверять, что апостроф и @ содержатся в строке ровно 1 раз.
Причина, по которой я распилил класс-проверятель, проверяющий структуру строки, в том, что мне не нравится текст ошибки. Он вообще не говорит о том, что не так со строкой. А разбив на отдельные классы, я могу выдавать более конкретные ошибки.
Отдельно: Я до этого писал о том, что буду проверять имена и фамилии на то, что они соответствуют определенному типу (для имени это - простое имя (состоящее только из букв русского алфавита), имя с апострофом, с дефисом), но потом я решил, что строго нужно проверять только определенные типы. Для имени это имена с апострофом, для фамилии - фамилии с апострофом, со скобками.
И я решил так. Как я буду регистрировать валидатор для студента в DIContainer: сначала создам массив, в него добавлю нужные классы-правила, а потом сделаю условие, если имя содержит апостроф, фамилия содержит апостроф/хотя бы одну из скобок, то соот. классы, которые проверяют что-то связанное с апострофом/скобками, будут добавлены в массив. А потом уже этот массив в конструктор.
> Как ты считаешь лучше: создавать для атрибута класс или нет?
По моему, должен быть единообразный подход. Либо всегда создавать, либо никогда. Классы имеют такие преимущества: тип аргументов проверяется при создании объекта, можно писать к ним комментарии.
Это редко сейчас используется. require_once используется, если ты хочешь подключить файл с функциями или классами вручную. require если ты хочешь прочитать какой-то конфиг.
TDG передается туда, где нужно, то есть в класс-правило. Валидатор про этот TDG знать ничего не должен.
Класс-правило можно положить (а можно не класть) в контейнер, если у него нет параметров. Если при создании надо указывать какие-то параметры, то придется создавать ручками.
> Если я не буду регистрировать этот класс-проверятель в DIContainer, то как я буду разрешать его зависимость в виде объекта TDG?
Ручками передашь в конструктор. DI не обязывает создавать все через контейнер.
Честно говоря, многовато классов получается. Нельзя ли сделать что-то чуть более универсальное?
Вот, например, многие из твоих правил можно реализовать правилом, проверяющим соответствие строки регулярке. Например: проверить, что перед апострофом ровно одна буква:
new MatchesRegexp('/^\pL`[^`]$|^[^`]$/', 'Апостроф можно использовать только после первой буквы имени')
Язык регулярок придумывался как раз для таких проверок. Или это правило не дает хорошее сообщение об ошибке?
> ValidSymbolPosition = проверяет, что символ находится на определенной позиции, конкретно, им я хочу проверять, что апостроф будет находиться ровно на 1-ой позиции (считая от 0).
Может лучше так: SubstringBeforeMatches - если в строке есть символ, то подстрока перед ним должна соответствовать регулярке. Ну или описанное выше правило проверки регуляркой.
Я бы объединил в MatchingPair, которая позволяет проверять наличие парного символа (что закрывающий символ есть и идет за открывающим).
> StringContainsSubstring = проверяет, что строка содержит указанную подстроку, планирую проверять емайл на то, что перед @ есть определенный набор символов > NumberOfSymbolIsValid
Это слишком универсально, и, наверно, ни для чего кроме email, не понадобится. Советую сделать просто валидатор ValidEmail, и в него заложить несколько проверок и сообщений на разные случаи.
> сначала создам массив, в него добавлю нужные классы-правила, а потом сделаю условие, если имя содержит апостроф, фамилия содержит апостроф/хотя бы одну из скобок, то соот. классы, которые проверяют что-то связанное с апострофом/скобками, будут добавлены в массив. А потом уже этот массив в конструктор.
Как-то костыльно выглядит. Думаю, набор правил лучше сделать постоянным, чтобы упростить понимание кода. Иначе ты Логику проверки выносишь в код, который формирует список правил.
>>2991655 Ты плохо понял. Хочешь фулстак - устраиваешься в обычную средне/мелко галеру. Хочешь чистый бек - натаскиваешься для трудоустройства во всякие авито.
>>2991656 Т.е. можно выучить Лару и устроится чистым бэком? Мне почему-то казалась, что Лару создавали, чтобы быстро разобраться и начать клепать сайты, а у Симфони более фундаментальный подход и она больше заточена под солидный бэкенд.
>>2991582 Спасибо за ответ, но я все равно запутался. У меня есть перечень правил для структуры строк, которые я хочу, чтобы соблюдались: Для имен и фамилий с апострофом: 1) Апостроф можно использовать только 1 раз; 2) Апостроф должен быть 2-ым символом, считая от 1-го. Для фамилий со скобками: 1) Использовать скобки можно только 1 раз; 2) Сначала должна идти открывающая, а потом закрывающая скобка; 3) Если есть одна скобка, то должна быть вторая. Для емайла: 1) Уникальное имя почты должно начинаться с латинской буквы или цифры; 2) Емайл должен содержать уникальное имя почты (нельзя, чтобы перед @ ничего не стояло); 3) Емайл должен оканчиваться доменным именем (его реальное существование не проверяется, проверяется только структура, что там латинские буквы + точка + латинские буквы); 4) Емайл обязательно должен содержать символ @ и обязательно в единичном количестве. Для года рождения: 1) Первая цифра должна быть от 1 до 2. Для баллов ЕГЭ: 1) Первая цифра должна быть от 1 до 3.
Я могу попробовать сделать регулярные выражения, которые проверяют эти правила и реализовать все одним классом-правилом MatchesRegexp.
Есть одно "но". А что делать с секцией Имя и Фамилия? Я принимаю имена, которые либо просто состоят из букв русского алфавита, либо с апострофом, либо с дефисом, фамилии тоже самое, только + фамилии со скобками и пробелами. Проверять нужно только с апострофом и со скобками. Я не знаю какое значение на сервер придет из поле для Имени и Фамилии, может прийти имя, полностью, состоящее просто из букв, т.е. проверять его не надо. И что мне делать? Я другого выхода не вижу, кроме как добавить условие, что значение для имени и фамилии проверяется, если оно содержит апостроф/скобки. Как вариант, можно использовать эту функцию - mb_substr_count.
>>2991582 Я только сейчас задумался, если я все равно проверяю год рождения и баллы ЕГЭ на адекватность - то, что они входят в валидный диапазон чисел, то, мб и не надо проверять их структуру?
У меня есть 2 проверки для этих полей: Число должно входить в определенный диапазон; Значение должно состоять только из цифр.
>>2991582 >можно использовать эту функцию - mb_substr_count
Можно проверять такое условие: if (mb_substr_count($name, "тут апостроф, пишу буквами, а то непонятно") !== 0) { $validationRules['name'] = new MatchesRegexp('regexp', 'errorText'); }
>>2991582 В прошлом треде ты давал мне ответы по поводу идентификации, аутентификации, авторизации. Я все равно не понимаю что мне делать. Ты предлагаешь три публичных метода в классе Авторизация: 1) Залогинить пользователя = установить куки с токеном; 2) Определить текущего пользователя = получить объект с данными студента; 3) Разлогинить пользователя.
Я понимаю так: Когда я буду добавлять запись о новом пользователе в БД, я должен буду выдать токен в куки пользователю и положить токен в БД. Потом на каждой странице я должен буду проверять наличие этого токена, чтобы отображать страницы так, как их нужно отображать для знакомого сайту пользователя (предлагать, мб, на главной, где будет список абитуриентов, ссылку редактировать свои данные). И если залогиненный пользователь перейдет на страницу редактирования информации, то я должен буду выгрузить из БД его данные и заполнить форму, а пользователь уже сам исправит их и пришлет на сервер $_POST.
Методы залогинить и определить в таком ключе я понимаю, я не понимаю зачем мне нужно разлогинить пользователя.
И вообще, вот ты давал определения идентификации, аутентификации, авторизации и пример. Я это понял (хотя бы как мог). Но мне трудно переложить их на свою ситуацию. У меня нет логина, а, как я понял, идентификация это о том, кто пытается войти, а как я, имея токен просто в куки, скажу кто? Ну, просто пользователь с установленной кукой. Потом идет аутентификация, является ли тот, кто пытается войти, тем, кем он себя называет. Не ответив на вопрос о том, кто пытается войти, могу ли я ответить на вопрос о том, он ли этот кто-то?
>>2990978 Ты хочешь сказать, что знаешь Симфони, но не способен разобраться в Ларавел, который мало того, что проще чем Симфони так ещё и построен на его компонентах?
>>2991661 >начать клепать сайты >фреймворк Для сайтов есть CMS, а фреймворки для более кастомных проектов различные апишки, crm, какие-то онлайн-магазины, саас-сервисы и тд.
>>2992689 >Не ответив на вопрос о том, кто пытается войти в айти, могу ли я ответить на вопрос о том, я ли этот кто-то? Этим глубоким философским вопросом можно подвести итог нескольких последних тредов.
Идея в том, чтобы сделать правило "строка соответствует регулярке", но в валидатор на одно поле добавить несколько таких правил с разными регулярками и сообщениями об ошибках.
То есть, один экземпляр правила проверяет кол-во апострофов, другой экземпляр, что апостроф может идти только после первой буквы и тд.
Может, конечно, этого не хватит, и придется для какого-то случая сделать отдельное правило.
Например:
> Апостроф можно использовать только 1 раз; > Апостроф должен быть 2-ым символом, считая от 1-го.
Это все проверяется 2 регулярками.
> Использовать скобки можно только 1 раз; > Сначала должна идти открывающая, а потом закрывающая скобка; > Если есть одна скобка, то должна быть вторая.
Это скорее всего тоже.
Для email лучше все интегрировать в одно правило, так как кроме проверки email это все вряд ли понадобится.
> Первая цифра должна быть от 1 до 2. > Первая цифра должна быть от 1 до 3.
Это можео сделать через регулярки.
> Проверять нужно только с апострофом и со скобками.
А ты можешь сделать регуляру в стиле:
- или в строке нет апострофов, или он только один - или в строке нет апострофов или он идет вторым
Или же, ты можешь сделать чуть усложненное правило с 2 регулярками, которое применяет вторую только если строка соответствует первой. То есть, проверяет положение апофстрофа если в строке он есть.
> Я только сейчас задумался, если я все равно проверяю год рождения и баллы ЕГЭ на адекватность - то, что они входят в валидный диапазон чисел, то, мб и не надо проверять их структуру?
> Методы залогинить и определить в таком ключе я понимаю, я не понимаю зачем мне нужно разлогинить пользователя.
Залогинить - значит, выдать куки. Это ты будешь делать. Разлогинить в задаче не нужно, просто мне в голову пришло, что если можно залогинить, то наверно надо иметь возможность и разлогинить. Но пожалуй тут эта функция не нужна.
> У меня нет логина, а, как я понял, идентификация это о том, кто пытается войти, а как я, имея токен просто в куки, скажу кто?
Ты ищешь токен из куки в БД и идентифицируешь пользователя по нему. По нему же ты его аутентифицируешь, так как токен сложный и неподбираемый.
>>2992884 Спасибо за ответ. >Для email лучше все интегрировать в одно правило, так как кроме проверки email это все вряд ли понадобится Ты имеешь ввиду использовать одно регулярное выражение для проверки всех требований к емайл? >Залогинить - значит, выдать куки Получается, что логиниться пользователь будет только 1 раз - при первом добавлении его информации в БД?
>>2993202 В го не берут "новичков" потому что каждый пхп сеньор это "го новичек", ему только синтаксис почитать и хомяка плюшевого купить. А писать код, работать в команде над крупным проектом и все прочее он давно умеет. Нахуй ты там усрался если ты все это не умеешь да еще и язык не знаешь?
>>2993206 >И что ты предлагаешь? Идти в петон? Язык программирования - не волшебная таблетка. Он не пофиксит конкуренцию на рынке, не сделает хуй на 20 см длиннее, не исправит проблемы с самооценкой. От того что ты один язык сменил на другой, это никак не повлияет на конкуренцию. Она как была так и останется. Если я сменю автомобиль хёндай на киа, стану ли я популярным у девушек? Если ты не можешь найти работу - скорее всего ПРОБЛЕМА В ТЕБЕ, а не в языке. Проблема в том, что ты негативно мыслишь, что у тебя низкая самооценка, нет боевого настроя, ты претендуешь только на вакансии для начинающих и ты неспособен сказать - ДА! Я добьюсь своего! Я выучусь и найду высокооплачиваемую работу! Ты воспринимаешь отказы как какую-то непреодолимую стену. Хотя нужно просто пробовать, пробовать, пробовать, пробовать, пробовать, пробовать, снова и снова. Какая-то чмошная фирма мне отказала? Ваще поебать! А уйду к конкурентам, а они будут кусать локти. Ты должен быть бойцом, а не спрашивать у незнакомых кукаретников на анонимном форуме советы, вот и всё.
>>2993350 >и легче вкатиться В разработку вообще вкатиться непросто - меньше пиздунов слушай. Легче всего вкатиться в сварщики или строители, а то и вообще в моряки - платят там примерно так же, а учить сильно меньше надо. Если ты ждёшь ламповую удаленочку через год, то ты это зря - на удаленочку сажают только опытных челов, а ты сперва будешь пахать за копейки на мутных челов пару лет.
>>2993350 >Говорят, что в РНР уровень ниже и легче вкатиться. Кто так говорит? Назови по именам. Это зависит от работодателя. Если ты вкатываешься чтобы просто сайты верстать на вордпрессе или битриксе, то там требования минимальные. А бывает так выебут, начинают спрашивать такие тонкости пхп, типа что такое абстрактный класс, где он используется? Или в чём отличие $message от $$message? Или есть ли в пхп множественное наследование? Какой метод используется для хеширования паролей в пхп? Тебя бы туда посадить, я бы посмотрел как ты с понурым еблищем ушёл с "легкого" собеседования.
Не надо утверждать ЧЕГО ТЫ САМ ЛИЧНО НЕ ЗНАЕШЬ. Если ты не испытал на своей шкуре, не повторяй. Иначе будешь ныть в тредах плак-плак ну вы же говорили...
>С дипломом программиста больше никуда не возьмут. А у тебя программистская вышка? Так хули ты на двачах сидел, а не стажировку выбивал? У нас еще с курса третьего всех кто хотя бы шнурки умел завязывать разобрали.
>>2993462 Проблема в ТВОИХ ОЖИДАНИЯХ. PHP может быть как очень лёгким, так и очень сложным языком. Там где конторы посолиднее, там огромные требования. Включая знание сторонних rabbitmq, elasticsearch, postgresql, чуть ли не kubernetes требуют.
Даже если ты прав, лёгкость вката компенсируются низкими зарплатами. PHP программисты получают меньше всего среди всех программистов. Даже наверно 1С-ники и то больше зарабатывают.
>>2993452 Если я знаю ответы на эти вопросы, то меня возьмут на РНР?
>>2993456 У нас ни кого ни куда не брали. Помню только возле деканата висела рекламка, что отличников приглашают в местную "элитную" фирму. Остальные сами искали себе работу.
>>2993113 Вот что мне не нравится в Симфони - это сплошная кодогенерация. Буквально на каждый чих надо писать symfony console make:... Хотя там буквально надо две строчки написать, нет надо скодогенерировать. Даже в Спринге, с которого слизан Симфони, такого нет, там как правило всё пишут ручками.
>>2993498 >Если я знаю ответы на эти вопросы, то меня возьмут на РНР? Возьмут! Но если ты знаешь ответы на эти вопросы, то нахуя вообще вкатываться в PHP? Зарплаты PHP-ников самые низкие по отрасли. Любой Go-шник обладая точно таким же багажом знаний будет получать 2х. При этом считая тебя червём-пидором. То есть, тебе это надо вообще? Если ты потом будешь в тредах ныть, что у тебя 100к и дальше не растёт. Я не вижу особого смысла вкатываться в PHP. Тут проекты тоже не особо интересные. Если ты можешь проходить интервью на PHP, то и на другие языки точно также сможешь.
>>2993522 Бывает, что в рамках одного коммита надо что-то самому написать, потом сгенерировать, потом ещё какую-нибудь фигню прикрутить и только потом коммитить.
>>2993498 >У нас ни кого ни куда не брали. Я хз в какой шараге ты учился, но в учебном курсе обязательно присутствует производственная практика. Её блядь не может там не быть.
А уж сколько желающих заполучить такой сладкий послушный петушок, который до четвертого курса продержался. У нас если че диплом получило 8 (восемь) человек из 40, и я не в их числе.
>>2993540 Че ты несешь, это не по желанию делается. Практика как и вся программа обучения законодательно утверждается http://ivo.garant.ru/#/doclist/162:0 Ты вообще в кампус заходил, чучело?
>>2993575 Ну не было у нас ни какой практике, а дипломы выдали государственного образца. Мне лично декан вручал на торжественной церемонии. ВУЗ один из лучших в моём регионе.
>>2993577 Ну не было и не было. Значит ты молодец, все правильно сделал. Сейчас на изи со своим охуенным дипломом вкатишься.
Ты чего-то такого ждешь? Ну пинал ты хуи четыре года, декан что-ли за тебя должен был думать нахуя тебе эта корка ебаная была нужна? Можешь в резюме написать как тебе декан с халявным опытом работы поднасрал, паскуда.
>>2993623 Сам посмотри. Там каждая страничка: читаем тему в документации, а теперь примените эти знания в своём проекте. Это не учебник, а просто индекс по доке с набором тупых заданий без всякой проработки. Халтура в общем.
>>2993658 Так в доке блядь примеры кода и написаны. Буквально целые классы прописаны. Не, ребят, таким имбецилам даже кассу в пятерочке не доверят, только грузчиком.
>>2993717 Практика показывает, что важнее быть не супер умным, а старательным. Как раз вот умники и не доходят до конца и бросают программирования, а старательные тупки шаг за шагом осваивают и становятся программистами на 300-400 тыщ
>>2993732 >Практика показывает, что важнее быть не супер умным, а старательным Ну так старательно читай доку, там все про фреймворк написано. А лучше старательно наизусть выучи. Хуй с ними с супер умными, они в пхп не вкатываются. Надо как-то вкатунов среднего ума догонять.
>>2993758 Мудила, открой доку и почитай. Там чтива на пару вечеров. Какой нахуй курс, любая обезъяна на ларавеле веб страничку сделает. Там и делать нихуя не надо - 90% кода генерится.
>>2993510 В разы меньше надо писать. Даже миграции пишут ручками. Ещё в Симфони целые интерактивные консольные утилиты созданы, где надо отвечать на тупые вопросы.
>>2992884 >Или же, ты можешь сделать чуть усложненное правило с 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-токен, что я и делаю (темный скрин)
Я сконфигурировал Middleware, пропустил CORS (потому что у меня localhost, а не разные под-домены, вроде, все так) А вот дальше началось что-то совсем непонятное с этой login page, никакое залогинивание мне не нужно, нужно просто данные отправить и необходимость делать запрос к sanctum/csrf-cookie С ФРОНТА меня вообще ставит в тупик, когда я писал фронт для других проектов (где бэк делал не я), никаких предварительных запросов туда я не делал, сразу просто отправлял данные на сервер из формы
Если я меняю запрос с пост на гет, лол, то все работает, запись в базу добавляется (при соответствующих изменениях Route::post на ::get) (поэтому скрины из пхп-кода не прикладываю, к нему вопросов то нет)
В общем, пожалуйста, помогите разобраться с этой частью, как сделать post-запрос? Или не Санктум вообще?
>>2994377 Тогда непонятно что ты хочешь. Ты же сам сказал что тебе авторизация не нужна. CSRF предназначен для защиты роутов авторизованых пользователей. Если нет авторизации, то каждый посетитель может делать что угодно бай дезин. Если ты хочшь защитится, чтобы боты не постили, CSRF для этого не предназначен. Обычно нет необходимости специально получать CSRF токен, потому что он живет в куках
>>2994391 1) Значит ты неправильно отключаешь 2) Отключать необязательно. VerifyCsrfToken в ларке по дефолту на всех роутах. CSRF отправляется вместе с кукисами и он невидим для жс. Нужно разобраться в твоем кейсе. Что ты хочешь получить, что делаешь.
Тут кудахтают что НИЗЯ ОТКЛЮЧАТЬ не вдаваясь в детали, хотя по определению 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.
>>2994398 Нет, не публичное, сайт будет публичный, общедоступный Просто задача для меня такая: изучить laravel, дошел вот до post-запросов и очень сильно споткнулся. В принципе начал с работы с базами, потому что фронт для меня это вью, а поскольку вью работает с ларавелем так себе, то соответственно ларавелю остается функционал работы с базами, в основном (на моем текущем уровне).
>>2994395 ну там кажется сложно не так отключить, всего-то надо роуты добавить в массив с исключенными роутами в App\Http\Middleware\VerifyCsrfToken.php
>Что ты хочешь получить, что делаешь. хочу, чтобы данные их формы добавились в базу (самый простой вариант действия без каких-либо усложнений или условий) для этого отправляю их на сервер на сервере принимаю и в базу записываю когда отправляю данные через get, все работает, когда через post, ошибка тут >>2994326
гугление показало, что дело в csrf, который как бы превентит post, поскольку тут шибко опасен и если в headers нет csrf-token, то ничего не происходит, т.е . происходит ошибка
>>2994395 >CSRF отправляется вместе с кукисами и он невидим для жс. В Ларке есть axios специально для работы с ажаксом, он цепляет все нужные данные автоматически - только в конфиге ему указать надо. Мне приходилось и без аксиоса делать запросы с жтими токенами - я их клал в meta страницы и оттуда доставал уже жсом. Но лучше использовать аксиос - просто меньше секса с мозгом изкоробки.
>>2994414 Хидер X-CSRF-Token, а не CSRF-Token Но как я тебе сказал что обыно не нужно это делать так как CSRF токен в нормальных случаях содержится в кукисах
Вангую что у тебя фронт отдельно, а бек отдельно. По дефолту ларавел на такое не настроен
>>2994502 Кстати ты начал с хуевого примера изучать ларку. На 99,9% проектах на ларке используются серверный роутинг на ларке, а жс фронтенд загружается обычно в шаблоне. Nuxt очень редко используется, обычно в проектах максимально laravel way придерживаются, например inertia js использют, а не nuxt
>>2994326 Не думал роутинг прописывать в файле api.php, если ты на эти роуты запросы с отдельного фронта кидаешь? Файл web.php, как мне кажется, предназначен для приложения которое строится полностью на ларавеле(то есть отдельного фронтенда нет), могу ошибаться.
Я не очень понимаю, о каком API речь. Ты делаешь API для HTML-приложений, которые работают в браузере, или для отдельных приложений (десктопное или мобильное)? CORS нужен только если твоим API будет пользоваться браузерное приложение, размещенное на другом домене (не на том же, что и сервер API). То есть, для случаев, когда у тебя один сервер и несколько приложений на других доменах, шлющих к нему запросы.
Что касается CSRF, обычно токен просто вставляют в тело страницы. Почему в Laravel все так усложненно сделано, непонятно.
Также, я бы вообще не заморачивался с токенами, а проверял бы заголовки браузера вроде Origin, чтобы проверить, откуда пришел запрос. Это, по моему, проще. Почему в Laravel так не сделано, непонятно.
Неверно. CSRF предназначен для исключения ситуации, когда злоумышленник отправляет запросы от имени ползователя. Аутентифицирован пользователь или нет - не важно.
> Если нет авторизации, то каждый посетитель может делать что угодно бай дезин.
CSRF не для этого. Он для исключения ситуации, когда злоумышленник заманивает пользователя на свою страницу и та от его имени шлет запросы к серверу.
> Обычно нет необходимости специально получать CSRF токен, потому что он живет в куках
Неверно. Обычно токен есть в куке, недоступной для JS, и одновременно в теле страницы. JS берет токен и тела и отправляет в запросе, а сервер сравнивает токен в куке и в теле запроса. Также, токен может не храниться в куке вообще, а храниться, например, в сессии.
>>2994566 От какого имени? От Васи или Пети? Как узнать Вася это или Петя без аутентификации?
Если у тебя есть роут /image/delete/1 без аутентификации, то какая разница есть CSRF или нет, если любой из интернета может перейти по этому роуту. Для того ему просто нужно зайти на страницу с сайта, получить CSRF токен и перейти по роуту /image/delete/1. Зачем злоумышленнику пользователь в этой схеме?
CSRF заключается в том что пользователь аутентифицирован на сайте и авторизован на какое-то действие, а злоумышленник посылает авторизованный запрос с фишингового сайта, куда зашел пользователь.
>>2994502 Вот кстати это помогло, ошибка исчезла, но теперь другая проблема, почему-то ->post() пустой! В на сервер в body отправляется объект, а в итоге там ничего (последний вывод консоли это собственно return из метода обработки поста контроллером)
Там почему-то в принципе $request пустой! хоть ->input() хоть ->post()
Добавляю картнки с кодом к >>2994603 Вроде все дб просто (не обращайте внимание на мешанину из консольных выводов, это для создания картинок нужно, чтобы проще объяснять что где и как)
Меня вот в Ларавеле больше всего раздражает, что набираешь Something:: и видно только часть методов, хотя на самом деле их там в разы больше. Фасады типа облегчают работу с фреймворков. В каком месте они её облегчают? Как по мне только усложняют всё своей магией, что метод высирается из ниоткуда.
>>2994674 Эти методы описаны в php доке фасада, оснальные методы ты не должен использовать, если не хочешь чтобы при обновлении был риск поломатьсся, потому что это внутренняя кухня фреймворка.
>>2994669 Просто положи перед запросом на сервер нужную куку в поле где его ищет миддлвар проверки CSRF токена, если такой любитель ручного пердолинга. Все должно работать.
>>2994777 Нет ты. Тут ключевое слово 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) Проблема когда домены фронтенда и бекенда разные тогда надо токен через специальную ручку доставать и класть в хидер Тогда и твой каксиос самостоятельно не добавит.
>>2994786 Да что ты мне про то, что Лара на фронт присылает заладил? Речь идет об обратном процессе когда данные с клиента идут. Пост перечитай ещё раз.
>>2994905 Ну а по твоему как кукисы работают? Кукисы пришли одним реквестом в респосе в хидере, теже кукисы ушли следующим реквестом в хидере. Я тебе ссылку привел, что ларка из кукисов может токен читать. Я всегла fetch использовал, axios удалял как лишнюю хуйню. Что заголовки, что кукисы, эта вся хуйня все равно в хидере запроса передается. О чем споришь?
>>2994926 Подытожу У чела который вопрос задавал была проблема не в аксиосе, а т том что он название хидера перепутал, но так как у него фронтенд и бек на разных доменах, то кукисы не отправлялись на бек, а хидер был неправильный и ларка не нашла токен. Если бы у него был один домен, то он бы не заметил что у него хидер неправильный, так как ларка нашла бы токен из кукисов А ты влез со своим акисосом, что надо через него запросы делать.
Я лично в спор ударился, чтобы освежить и провалидировать свое представление о механизме CSRF
Да и тут указали что CSRF не связан никак с аутентификацией. В общем я подумал и согласен, что токен может защищать от взлома текущей сессии независимо от того аутентифицирован пользователь или нет. Хотя это наверно большого практического значения не имеет, разве что злоумышленник в корзину пользователю товаров насует или видосов в плей лист, потому что обычно все важные действия требуют авторизации.
Ну вобщем персмотрел код в ларке, да я не прав был ларка читает либо только хидер либо X-XSRF-TOKEN либо хидер X-CSRF-TOKEN либо поле _token из боди Токен X-CSRF-TOKEN не зашифрованный а токен X-XSRF-TOKEN зашифрованный и берется из кукисов
>>2994952 они оба у меня на localhost пока, разве это разный? или доменом в случае localhost считается следующая папка? фронт лежит в /test, бэк в /back (оба в htdocs само собой)
Короче, этот отстой все равно не работает без токена А с токеном работает только если он был создан еще одним запросом ДО основного, что довольно глупо само по себе, как мне видится. Не понимаю, что делать.
Надо чтобы просто было: ввел данные форму => нажал на кнопку => бэк принял => роут отправил на контроллер => контроллер отработал с базой...
Ибо когда я делал фронт для других проектов, там никаких дополнительных запросов к бэку не было и все было без авторизации. Просто сразу из формы в базу, из формы в базу...
>>2995673 потому-что ты используешь web.php для роутов если ты хочешь RESTfull API в ларке для этого есть api.php В api.php нихуя нет мидваров ни сессий, ни токенов все как ты хочешь.
Еще такой вопрос: Вот эта часть документов ларавеля, она про что? Про какое место? потому что код выглядит как js, но секция то не подходящая, да и вокруг примеры странные, о чем это вообще, где это писать и что должно происходить на конце /sanctum/csrf-cookie ? Или там происходит что-то автоматическое? Или надо где-то там что-то делать? втф
>>2995680 Вот с этого стоило начинать! Очень ценная информация, благодарю.
Но однако ты мне где-то капельку наврал, я перенес туда Route::post('/intro', [TestController::class, 'add']), убрал из хедера токен и ВСЕ ПЕРЕСТАЛО РАБОТАТЬ, опять ошибка, хочет токен, зараза такая
>>2997072 >/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 без всяких пабликов
ты даже в апаче не умеешь рерайт настроить в своем ксампе хуямпе
>>2997118 Если нужна БД то и MySQL и PostgreSQL устанавливаются инсталятором и спокойно работают. Но мог бы для обучения SQLite использовать. Даже сеньки ее для прототипирования юзают.
>>2997118 >>2997123 Поскольку я изучаю - то есть знаний не ноль, но мало-мало - то я выбрал один из распространенных путей, не имея понятия о возможных проблемах, и, да, твое предположение про базу было верно, два в одном было ок-ок, вот и выбрал
Как заставить тупой шторм ставить точки с запятой как надо со смещением? Даже если нажимаю перед точкой с запятой Backspace, то тупой шторм переносит её на предыдущую строку, а не смещает на один таб назад. Они там в жидбрейнс про PSR вообще слышали?
>>2997543 Попробовал в VS Code. Всё отлично ставится куда надо. Ну и какой редактор куда лучше теперь? Платное, кривое, лагающие поделие от жидбрейнс, или бесплатный, легковесный, замечательный продукт вс код?
>>2997543 Бля, да хуй знает как. Может быть блядь в НАСТРОЙКАХ? В тех самых неебически подробных настройках где есть параметр на каждый пердежь и в реальном времени видно как это влияет на код? В тех самых настройках где можно в один клик выбрать целиком пресет под любой нужный формат?
А что не так с mysql 8.2? Ебался-ебался вчера с ней несколько часов - не открывалась консолька, сегодня решил снести и поставить 8.1 - все прекрасно работает.
>>2994029 >>2992884 Я понял, что у меня все работает не потому что я понял условные подмаски (я их не понял), а потому что если убрать лишнее, то это регулярное выражение находит то, что мне нужно. В итоге я составил регулярные выражения: /^[^']+'{0,}[^']+$/ui = проверяет, что апостроф один.
/^[^']{1}'?[^']+$/ui = проверяет, что апостроф второй символ в строке.
/^[^\(\)]+\(?[^\(\)]+\)?$/ui = проверяет, что скобки использовались 1 раз и положение открывающей скобки относительно закрывающей.
/^[^\(\)]+$|^[^\(\)]+\({1}[^\(\)]+\){1}$/ui = проверяет, что строка содержит обе скобки.
>>2998602 А, да. Для емайла забыл: /^[a-zA-Z0-9]/ Адрес электронной почты должен начинаться с заглавной или строчной латинской буквы или цифры от 0 до 9.
/.+@/ Адрес электронной почты должен содержать уникальное имя почты (набор символов перед @ (разрешаются заглавные и строчные латинские буквы, цифры от 0 до 9; точка, нижнее подчеркивание, дефис, но только не первым символом)).
/@{1}[a-z]+\.{1}[a-z]+$/ Адрес электронной почты должке содержать доменное имя (набор символов после @ (допускаются доменная имена, состоящие из строчных латинских букв)).
/@{1}/ Адрес электронной почты должен содержать символ "@", причем в единичном количестве.
Кто всерьез (за деньги) этой хуйней занимался, то давно понял, что емейл это строчка с собакой (@) и максимальной длинной, на которую тебе не похуй (от 100 до ♾️). Все.
>>2998618 >Свит саммер чайлд, завязывай теребить свои коротыши и обрубки. Вот так выглядит правильная регулярка для валидации мыла https://pdw.ex-parrot.com/Mail-RFC822-Address.html Там же написано, она не учитывает комментарии, которые могут быть вложенными. Фактически на это нельзя написать регулярку, надо писать грамматику, но никто это делать не будет. >Кто всерьез (за деньги) этой хуйней занимался, то давно понял, что емейл это строчка с собакой (@) и максимальной длинной, на которую тебе не похуй (от 100 до ♾️). Все. Ага, сосачую.
>>2992887 >Залогинить - значит, выдать куки. У меня есть файл utils.php, где есть функция, которая генерирует токен. Мб мне и не нужен класс авторизации? Вместо метода "залогинить" будут строки: вызов функции, которая генерирует токен, установление куки самим контроллером. Тогда остается один метод - определить текущего пользователя. Не жирно ли одному методу, в частности этому, целый класс? Мб сделать метод в TDG, чтобы он принимал токен и возвращал объект студента? Контроллер будет обращаться к этому методу у TDG, а потом уже что-то с ним делать.
Читаю книжку Фабьена по Симфони и буквально от каждой главы у меня жестко бомбит. Действительно такое говно делают в реальных приложениях? Вместо пары строчек на РНР или html, он наворачивает всякие бандлы-хуяндлы, тянет 100500 пакетов через композер, а в конце ещё наворачивает npm с кучей фронт-говна. Я уж даже молчу про подключение ко всяким левым сервисам. Ещё постоянно сталкиваюсь с багами, хоть и пытаюсь точно следовать книге, но постоянно возникают ошибки, о которых не упоминается. Какие-то сам догадываюсь как пофиксить, а какие-то вообще не понимаю. Например, его "замечательный" дизайн так и не смог увидеть, потому что фронт-говно не завелось, а вывалилось с ошибкой. Из-за чего ошибка - не пойму, не фронтендер и ничего в этом не смыслю.
Посоветуйте какой-нибудь нормальный материал по изучению Симфони.
>>2998837 Бля, мне аж интересно стало че там он там такое написал. В чем обосрался. Читаю: Создаем контроллер. Создаем модель. Создаем связи. Создаем шаблон. Создаем админку. Добавляем слаги. Выводим с пагинацией. Все средствами фреймворка, руками буквально только конфиги нужно настраивать да хтмл писать в шаблонах.
>Вместо пары строчек на РНР или html Пары строчек с чем? С самписной орм? Цитата блядь из книги: >Чтобы не изобретать велосипед, давайте воспользуемся Symfony-компонентом String, который не только облегчает работу со строками, но и содержит слагер Ломающие новости: в книге по фреймворку учат пользоваться фреймворком. Да ну нахуй.
>подключение ко всяким левым сервисам Ну так ты эту книгу честно спиздил. А тем кто купил предоставляется индивидуальный сервачок. И все средства чтобы с этим сервачком удобно работать. Если ты не умеешь деплоить, админить и прочую красноглазую хуйню, то тебе не книгу по фреймворку надо читать.
Короче, вкатусик. Вместо дебильного вопроса "зачем нужны фреймворки и либы" тебе нужно задаться вопросом "какого хуя я не могу повторить все в точности как описано в инструкции". Никакая книга не научит тебя внимательности, дисциплине и не даст способность концентрироваться на проблеме пока ты не найдешь её причину и не решишь. Баги и ошибки будут всегда, и некоторые придется искать неделями по восемь часов в сутки. Подумай лишний раз, нахуя оно тебе надо.
>>2999193 >че там он там такое написал Автор сам не повторял свой гайд. У него куча несостыковок. Например, создали модель, описали как он сказал. А в итоге через пару глав оказывается, что модель уже другая. Конкретно некоторые поля внезапно стали допускать NULL. Также по коду примеров не дописывает, надо лезть на гитхаб и самому выцеплять куски кода.
>учат пользоваться фреймворком Я хотел нащупать эту грань фреймворка, но она почему-то расползается на тысячи компонентов, написанных другими людьми (не командой Симфони) и он тянет эту парашу в примеры. Мне вот интересно, действительно в реальных коммерческих проектах тянут эти бандлы?
>деплоить, админить и прочую красноглазую хуйню Умею, но не хочу. Я на программиста учусь или на сисадмина? Тем более многие сервисы сейчас недоступны в РФ. Да и сам Симфони пишет про поддержку сам знаешь какой страны.
Идем и смотрим в книгу: https://symfony.com/doc/6.2/the-fast-track/ru/8-doctrine.html#dobavlenie-dopolnitel-nyh-svojstv >Я только что понял, что мы забыли добавить одно свойство к сущности комментария: участники, возможно, захотят приложить фотографию с конференции >Выполните команду make:entity ещё раз и добавьте свойство/столбец photoFilename типа string с возможностью иметь значение null, так как загрузка фотографии не обязательна Даже хз какой тут диагноз. Какая-то дикая смесь тупости наглости и чсв.
>Я хотел нащупать эту грань фреймворка А я тебе уже написал, что у тебя не достаточно квалификации не то что выбирать библиотеку или фреймворк, а просто абзац текста прочитать. Что ты прекрасно и продемонстрировал выше.
>Умею, но не хочу. Ну не хоти. От твоего не хотенья хтмл и жс сами в браузер не попадут.
>>2999476 Давай тогда уже мимо яслей сразу обратно в отцовскую залупу. И постарайся учесть все сложности программирования и максимально быстро стечь по ляжкам мамки.
Я не испытывал никогда большей эйфории чем сейчас. Делал вход в приложение, причем я уже достаточно продвинуто знаю пыху. В кишках использовался метод password_verify. Все последние 11 часов я беспрерывно искал все способы разобраться в чём проблема. Оказалось, что жёстко заданные пароли (через SQL запрос) воспринимаются как с двойными кавычками, а необходимы динамичные одинарные. Поэтому все что нужно было зарегистрировать юзера через интерфейс и потом входить в него. А я 11 часов долбился в sql. 10% кода, 90% дебага.
>>3003138 6 часов дебажил до этой проблемы, а 5 часов я копался до этого метода, потом проштудировал stackoverflow почему возвращает false. Признаться честно по большей части я страдал хуйней, а надо было просто пройтись по пути вызовов. Боялся что придётся менять что-то в кишках и искал обходные новые пути
Посмотрел парочку видео-гайдов по Симфони и ещё больше убедился, что книга Фабьена по Симфони - говно. Вместо того, чтобы описать свой фреймворк, показать основные фишки, он рассказывает про сторонние сервисы, которые ни как не относятся к Симфони.
>>3003138 >Оказалось, что жёстко заданные пароли (через SQL запрос) воспринимаются как с двойными кавычками, а необходимы динамичные одинарные. Искренне хотел впитать мудрость, добытую таким трудом, но нихуя из написанного не понял.
1) Что такое "жестко заданные"? Это из какой документации термин? 2) Как вообще "задать" пароль (через SQL запрос)? Я думал что в базе хранится хеш (строка). И мы просто проверяем что хеш от введенного сейчас пароля такой же. А тут чего? 3) Что значит "воспринимаются"? Это у кого навык "восприятие" недокачан у базы или у пхп? 4) Что такое "динамичные" кавычки? И почему ты так назвал именно одинарные? 5) А главное, причем тут вообще кавычки? Вся работа с SQL должна происходить через PDO и все твои данные добавляться в запрос через параметры, а там никаких кавычек нет.
>>3003458 Ты тупой? Ты или указываешь путь к css файлу или идешь нахуй. Кого ебет что ты уебищно настроил веб сервер и все запросы на index.php переводишь? Ну делай так чтобы Index.php мог css файл отдать. Или не делай. Ссылка на css файл есть - стили есть.
Можно ли использовать суперглобальную переменную $_COOKIE в html, если от того, установлена кука или нет, зависит логика отображения страницы? Если кука установлена => отобразить такую надпись Иначе => такую надпись. В таком контексте можно обращаться к суперглобальным переменным в Представлении?
>>3004426 Надо взять за правило использовать всегда
>>3004471 Нельзя. Логика должна быть отделена от представления. Лучше пробросить свою переменную-флаг в представление и через неё отображать или нет надписи. Во фреймвёрках такие переменные группируют в сущности ViewModel и таким образом представление зависит только от них.
>>3004479 >Лучше пробросить свою переменную-флаг в представление Даже если я пишу так: isset($_COOKIE['someCookie'])? Ты предлагаешь завести отдельную переменную и давать ей значение в соответствии с тем, установлена кука или нет? Например: кука установлена => $someVariable = 'такая-то надпись' кука не установлена => $someVariable = 'другая надпись'.
>>3004496 Нет, переменная должна быть просто флажком (булевой) в данном случае. <?php if (isSomeThink): ?> такая-то надпись <?php else: ?> другая надпись <?php endif; ?>
>>3004479 Вот такие вот дегенераты и несут с сурьезным ебалом какую-то чепуху.
>Нельзя. Логика должна быть отделена от представления. Логика никому ничего не должна. И уж точно не нужно отделять логику представления от непосредственно представления. Тем более что это в принципе не возможно. Потому что один хуй придется выбирать что отображать, именно это и называется "логика" блядь.
>сущности ViewModel Термин "сущность" хуй знает зачем тут приплетен. Даже по каличному обрубку определения из википедии понятно ну никаким хуем представление сущностью быть не может.
ViewModel из названия говорит о том что это view модель блядь. Никакие переменные в ViewModel не группируют. Это данные МОДЕЛИ преобразованные чтобы их было удобно отображать. И используют ViewModel именно когда данные внутри модели бизнеса не подходят для отображения. Например: для операций с датами необходимо и достаточно чтобы эти даты были в виде объектов. А для отображения надо даты преобразовывать в строки определенного формата, причем разного. Вместо того чтобы совать в бизнес модель методы под каждый шаблон создают View этой модели в котором и преобразуют все как надо.
Короче наворочено терминов чтобы выглядеть умнее. А достаточно знать всего две вещи: 1) Для удобства работы с шаблонами заводят специальный сервис, который обычно называют View (то самое V из MVC). Типичный вызов которого выглядит так $view->render('my-template.php', array $dataToShow). Все остальное факультативно, необязательно и по желанию.
2) Работать на прямую с $_COOKIE нельзя потому что это ГЛОБАЛЬНЫЙ блядь массив. И его содержимое может поменяться в любом месте. Как минимум есть куки входящего запроса и исходящего. И это нормально что они могут в процессе поменяться. Поэтому типичный способ работы с куками это положить входящие куки в иммутабельный объект, который гарантирует что они не будут перезаписаны или перезатерты и спокойно доедут до твоего шаблона.
>>3004771 Нет, проблема в агрессивном быдле, которое научилось что-то там клепать на пыхе и думает, что знает всё на свете, и пытается свою дурь выдавать за единственно существующую истину.
ViewModel - это то, что ты передаёшь как array $dataToShow. Как правило она отличается от обычной модели и требует дополнительных параметров, чтобы отобразить контент.
>>3004783 >проблема в агрессивном быдле, которое научилось что-то там клепать на пыхе и думает, что знает всё на свете, и пытается свою дурь выдавать за единственно существующую истину. >выдает "истину", источник - ОБС Самокритично
>>3004616 Смотря в каком классе. В модели/сущности - хуета, т.к. данные там могут меняться в рантайме. В сервисе каком-нибудь или ДТО - нормальная тема, ибо мутабельные ДТО - зло, а в сервисах изменять зависимости после сборки - тоже плохо.
>>3005015 В миграции ты описываешь схему таблицы в БД.
Модель остаётся пустой из-за того, как в Элоквенте (дефолтная ОРМ в Ларавеле) устроены модели. Там за счёт родительского класса модели происходит инициализация всех полей. В самой модели там обычно только методы с логикой описывают (ибо Элоквент - ActiveRecord)
>>3005328 А что непонятно? Все же написано. OpenServer пытается изменить файл hosts, но не может. Потому что кто-то прямо сейчас с ним работает. Это может быть вирус, антивирус, да хоть не закрытый процесс того же опенсервера.
Как вариант можно в настройках OpenServer запретить редактировать hosts, но этот вариант хуевый. Потому что во первых ему это надо для нормальной работы, а во вторых все и так должно нормально работать.
>>3005460 Большое спасибо за ответ. Я сейчас комп включил, ради интереса запустил Open Server, и он начал работать нормально. Хз с чем это связано, потому что я его уже перезапускал несколько раз и всё равно вылезала эта ошибка. Если вдруг возникнет та же проблема, то воспользуюсь твоей утилитой которую ты скинул. Спасибо за помощь.
Как считаете, будет норм, если: У меня есть форма с полями, у каждого поля должно быть значение. Значение зависит от того, что находится в переменных php. Я отображаю либо значение, либо пустоту, в зависимости, установлено значение для переменной или нет. пример: <?= isset($someObject->someProperty) ? $someObject->getSomeProperty() : ' '; ?>
У меня постоянно какая-то хуйня выскакивает. Объект $someObject заполнен данными и условие isset($someObject->someProperty) должно быть истинным, но скрипт отображает форму так, будто объект пустой.
Но не суть дела.
Я думаю сделать так: Убрать все эти isset, завести переменные для каждого поля, заполнить их в php-скрипте, а потом уже загружать шаблон.
Т.е. раньше было так: <?= isset($someObject->someProperty) ? $someObject->getSomeProperty() : ' '; ?>
Коданы, нужна небольшая подсказка про Ларавель. Помогите, пожалуйста, разобраться с тем, как относятся друг к другу файлы .env и database.php (который в папке config)
Не понимаю, в частности, зачем нужен database.php если он все равно файлом .env перекрывается и что бы я в датабейс не писал, важно только то, что написано в енв
Что это за такое как как с этим жить? Зачем датабейс, если он не используется? Или используется когда-то?
Почему спрашиваю: вот в файле датабейс я написал 1) конфиг для локальной машины, чтобы тестить пере загрузкой на хостинг и 2) конфиг хостинга -- с тем, чтобы поменяв только DB::connection('name') легко и просто переключаться между соединениями - а в итоге использовался только енв и его пришлость полностью править руками... что за чепуха?
Поставил бесплатный плагин для симфони в шторм и появилось удобное меню создания проекта как в идее для спринга. Но при этом стоит платный плагин для ларавеля и нифига такого нет. За что мы плотим этим дармоедам деньги!?
>>3006271 >isset($someObject->someProperty) ? $someObject->getSomeProperty() Наркоман, тебя ничего не смущает? Ну типа ты проверяешь одно, а выводишь другое. Ниче в башке не щелкает? Я уж не говорю что сто лет как упрощенный синтаксис для этого существует: <?= $someObject->getSomeProperty() ?? '' ?>
>>3006628 Пароли не хранят в кодовой базе. Потому что там их может увидеть по сути кто угодно. На реальном сервере пароли задаются админом через переменные окружения ОС. Соответственно видеть их может только админ сервака. И твой код должен все пароли, секретные фразы и префиксы именно оттуда и получать.
А поскольку ты работаешь не с боевым сервером, а с девелоперским, никакой админ туда ничего не прописал. Для этого и существуют специальные библиотеки, которые и загрузят содержимое твоего .env файла в переменные окружения. При этом в кодовой базе хранится только шаблон со списком переменных и какими-то неважными тестовыми паролями. А создаешь .env файл со своими паролями локально ты сам.
Короче: 1) Твои девелоперские пароли должны храниться только в локальном .env файле и ни в коем случае не в гите. 2) Получать пароли внутри кода нужно только через переменные окружения. 3) Ни в каком .php файле офк никакой секретной информации быть не должно.
>>3006766 >бесплатный плагин для симфони в шторм и появилось удобное меню создания проекта >платный плагин для ларавеля и нифига такого нет Не дают делать говно. А минусы будут?
Очевидно что в конечном счете содержимое .env попадает в конфиг. Но важно как оно туда попадает. Код обращается к абстрактному Repository - хранилищу переменных окружения. А откуда в это хранилище эти переменные попадают - с хоста или из файла дело десятое. Сам код от способа их получения не сломается и пароли никуда не утекут.
Вообще, это как-то тупо, что такой важный файл по сути исчезает из репозитория. Допустим я скачаю свой проект на другой комп и он не запустится, потому что этих файлов нет, а быстро их фиг создашь. Надо где-то взять такой же как образец. На мой взгляд сделали бы маленький файл password, где всего одна строчка - сам пароль, а не сложную такую структуру, которую не повторишь по памяти.
Даже с платным плагином для лары фасады всё равно не автокомплитятся и шторм считает их ошибкой, подчеркивает жёлтой линией. Как сделать, чтобы это всё автокомплитилось и не подчёркивало жёлтым?
>>3007824 Можно поместить в корневую директорию скрипт, который просит указать имя\пароль, после чего создаёт env файл и запускает проект. Хотя не уверен, насколько такая практика корректна.
>>3007844 Не программист же должен развешивать это всё? Почему сам фреймвёрк не добавляет эти теги? Почему плагин ничего не делает? Они вообще-то берут деньги за него, а пользы от него пока я не увидел. В платной идее есть полная поддержка спринга, а шторм ни черта нет. Походу жидбрейнсы хуём по губам водят пхпышникам и берут деньги за редактор кода. Мне просто есть с чем сравнивать и я вижу, что тут полное надувательство.
>Допустим я скачаю свой проект на другой комп Дядя, для этого уже лет десять используется докер. Хер с ними с паролями к базе. Ты как саму базу между "компами" синхронизировать собрался? А работодателю че будешь говорить? Ну вы там кароч пук среньк не забудьте вот эту хуйню для пхп включить и вот такие настройки для базы прописать, а ну и тестовые данные надо загрузить еще ага. И так под каждого додика с пет проектом что-ли делать?
В папке с проектом должен лежать docker-compose.json и все что человеку, который хочет твой проект запустить надо сделать это выполнить docker compose up -d . Все.
>>3007863 И как докер решает проблему публикации паролей? Ты там тоже описываешь все параметры базы как ссылки на секретный env файл, только он там другого формата. И тот, кто скачает, тоже должен создать свой env файл, прописать свои пароли и только тогда docker compose up -d корректно отработает.
>>3007878 Пароли и не публикуют. Их админ генерирует, когда проект деплоит. Тогда он передает докеру окружение через свои скрипты или использует docker secret. Задача програмиста только говно в проект не хардкодить
>>3006806 ><?= $someObject->getSomeProperty() ?? '' ?> У меня от этой хуйни вылезает ошибка: Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in
>>3010695 >наверно Бля, проверить и узнать точно даже проще чем пернуть "наверно". https://3v4l.org/eT1Fq Все никак не привыкну что в этот тред стекается самое тупорылое отребье двачей.
>>3010883 На мой взгляд нужно мыслить в рамках объектов. У тебя есть объект, который надо сохранить в базе или достать из базы. Соответственно и методы должны выполнять эти роли. Сама обвязка для работы с базой обычно называется репозиторием. Интерфейс работы с ней не должен быть привязан к какой-то низкоуровневой системы вроде базы данных, файлам и т.п. А просто представлять собой универсальное хранилище. Таким образом можно менять реализацию хранилища, а для пользователя это будет единный удобный интерфейс.
>>3010945 >Дохуя воды Данные то как в таблице обновлять? Даже с твоим охуительным репозиторием данные в итоге должны попасть в таблицу в базе. Ты вообще прочитал о чем спрашивали? Умное ебало ты сделал, а на вопрос не ответил.
>>3011375 Ясен хуй что пдо, чучело. "Запросы" надо делать, ебать гений. Водяной ебучий, вопрос был как эти запросы формировать. Нахуй ты лезешь если тебе по делу сказать нечего?
>>3010883 Без кода и как ты это будешь использовать не получится подсказать. Тут такое, если через много колонок кто вызывать этот метод будет, будет знать структуру таблицы надо же описать в массиве ее что бы обновить. Попробуй обобщить все, а потом уже детально разбить на другие функции
>>3010883 Просто отталкивайся от задачи. Если у тебя есть форма обновления, где заносятся старые данные то делай общий метод. Если отдельная кнопка повысить сотрудника, то отдельный метод. Спросишь что если и то и это, так всё то же самое есть общий метод, есть метод для отдельной колонки. Связано это с тем, что нехуй делать хулиярд запросов к бд когда можно одним
>>3013808 Если ситуация такая, что старые данные не заносятся в форму и поля передаются пустыми (не хочешь их изменять), то ничего плохого в том, чтобы делать отдельные запросы методами внутри общего метода обновления нет. А еще если подумаешь найдёшь способ прописать условия при наличии/отсутствии данных в общем методе одним запросом
Короче общий метод всегда лучше так как по правилам метод == запрос. Общий метод у тебя так и так будет, только в одном случае ты делаешь 5 запросов, в другом 1 и соответствуешь логике метода
>>3013808 >Просто отталкивайся от задачи >если и то и это, так всё то же самое >нехуй делать хулиярд запросов к бд когда можно одним >ничего плохого в том, чтобы делать отдельные запросы >по правилам метод == запрос >Общий метод у тебя так и так будет Это какая-то шизофазия. Начинается с "так-то да, а так-то нет", а заканчивается философским выводом о сути процедурного программирования. И о каких "правилах" идет речь? Откуда ты это ебанутое правило про запрос вообще взял?
Спасибо, товарищ долбоеб, что в трех абзацах повторил вопрос. Действительно можно сделать одним методом, а можно не одним. Очень тонко подмечено.
>>3012513 >кстати с тобой хотел поговорить наш тимлид. Просил передать, чтобы ты зашёл к нему в кабинет Я еще не устроился на работу, а он уже меня ждет.
>>3013992 Тред не читал, да? Начни вот с этой. Половина тут сидящий её скипнули. Буквально парой десятков постов выше еблан не осилил прочитать сто страниц.
>>3014000 Спасибо, но я серьезно. Я чувствую, что мне очень не хватает базы по архитектуре, по ООП, по всяким сущностям, сервисам и т.д.
И вот хотелось бы книг, чтобы восполнить этот пробел.
Я пробовал читать такие книги, но такое ощущение, что и книги по программированию теперь пишут как те книги, которые рассказывают как стать счастливым.
Но мб у анона есть хороший пример книг и я не туда смотрю?
>>3014006 >я серьезно >книги обязательно прочитать любому php и просто программисту >мне очень не хватает базы по архитектуре, по ООП, по всяким сущностям, сервисам Серьезно? Открой букварь и внимательно просмотри. Видишь как это работает: есть текст, а есть картинка. На картинке то что в тексте, а в тексте то что на картинке. Научись блядь называть вещи своими именами.
Если у тебя "пробелы" в виде незнания ооп, то ты просто не знаешь язык. Пхп это исключительно про ооп. Не знаешь = не умеешь писать код. Если ты не знаешь каких-то терминов, то пиздуй в википедию. Целиком книгу ради одного абзаца читать бессмысленно.
>такое ощущение, что и книги по программированию теперь пишут как те книги, которые рассказывают как стать счастливым Вот это предельно точное определение. Ты пытаешься читать ответы, не зная вопросов. Литературно тот самый нафталиновый прикол про "42".
Тебе не "не хватает". Ты подменяешь задачу, которую тебе нужно решать как джуну: научиться писать код, который делает то что хочет умный дядя. Быть на подхвате. На задачу, которая тебе ближайшие несколько лет не светит: проектирование систем. Ты пытаешься научиться строить башню из кубиков пикрелетед, вместо того чтобы понять что у тебя в руках и как этим пользуются.
>>3013992 По РНР нет хороших книг. Сам искал что-нибудь достойное, но большинство какой-нибудь кал типа давай изучим как говношлёпать сайты на пыхе, мускуле, хтмл, жс и цсс. Сами авторы пишут отвратительный говнокод. Переводные книги, несмотря на огрехи переводов, всё равно лучше книг отечественных авторов. Не знаю почему так происходит, но русскоязычные авторы элементарно не могут формулировать мысли. Так что лучше читать книги по другим языкам по интересующей тематике. Если нужно ООП и паттерны, то читай книги по джаве. Если по сетевым технологиям и микросервисам, то сейчас выходит куча книг по го.
>>3013936 Сиронизировал графоманией над вкатуном. Естественно после нажатия на кнопку "обновить запись article" должен запускаться метод обновления записи article целиком единым запросом, а не обновление столбцов article по-отдельности. Обосрался в том, что вообще допустил идею об отдельных методах и говном смердит на весь тред
>>3014925 >должен запускаться метод обновления записи article целиком единым запросом И этот запрос возьмется... откуда? А если надо не "целиком", а только одно поле поменять? Такой запрос откуда возьмется? А если у тебя десять таблиц? Ты под каждую таблицу будешь запросы писать?
Ты ведь смотри, долбоеб. Если реально думать, а не пердеть водой в тред, то можно дойти до того что нужен БИЛДЕР, который по СХЕМЕ таблиц будет строить ЗАПРОС, в который ты через PDO будешь свои значения передавать.
>>2975215 (OP) Сап, двач, я в кодинге абсолютный ноль, хоть и учусь в вузике, пошёл на вакансию без опыта, моё тз - написать веб-приложение блог, я не знаю откуда мне начинать, мне нужно это сделать за пару дней. Анонны, помогите, пожалуйста, что и в каком порядке мне нужно изучить, и как это заспидранить? Буду благодарен
>>3015941 >в кодинге абсолютный ноль, хоть и учусь в вузике Чем ты там занимаешься тогда? Помню мне дали аналогичное задание и удалось это всё изучить и сделать буквально за неделю, хотя про РНР ничего не слышал даже.
Я своё тестовое чуть ли не полностью сгенерил, просто лень было и не все нужные методы знал. Главное сначала сформулируй запрос так: Вот моё тз: .... Опиши порядок действий который я должен сделать. И потом проси его написать каждый пункт отдельно
>>3016566 Дожили, долбоебы даже набросить не могут нормально. Ты вопрос неправильно сформулировал, еблан. Правильный вопрос: что будет быстрее, объединить строку с переменной конкатенацией или интерполяцией?
>> Для email лучше все интегрировать в одно правило, так как кроме проверки email это все вряд ли понадобится > Ты имеешь ввиду использовать одно регулярное выражение для проверки всех требований к емайл?
Нет, сделать класс-правило для проверки email и в нем сделать нужное количество проверок. А не разбивать проверку email на несколько отдельных правил.
>> Залогинить - значит, выдать куки > Получается, что логиниться пользователь будет только 1 раз - при первом добавлении его информации в БД?
Нет, я имел в виду правило, в которое ты передаешь 2 регулярки:
new MatchesAllOrNone('/'/u', '/^\pL'/', 'сообщение об ошибке');
Но воообще, тут можно обойтись и одной регуляркой без условий. Мы можем просто сделать регулярку вида: либо в строке нет апострофа, либо он идет после первой буквы и дальше нет апофторофов:
1) настроить виртуальные хосты (vhost), каждый в своей папке 2) использовать имена вида xyz.localhost либо прописать домены в файл hosts, чтобы они резолвились в IP-адрес
Например, есть голосование без авторизации, но с ограничением голосов по IP. Злоумышленник может с помощью CSRF накрутить себе голосов с IP пользователей.
CSRF нужна везде, не только для авторизованных пользователей. Поэтому она и использует отдельный токен.
Но как вариант, можно проверять HTTP-заголовок Origin. вместо токена.
Вообще, нет. Что если на сайте-жертве есть редирект и злоумышленник отправляет запрос на сайт-жертвы сквозь URL редиректа? Уверен, что кука не будет отправлена?
Ты какие-то свои велосипеды придумываешь вместо того, чтобы применять рекомендации.
>>2975215 (OP) >>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 и делать изменения в наследуемых классах. Но что делать с сущностями? А может есть более грамотный вариант? Спасибо.
>>3018071 Какой же жуткий беспросветный говнокод. Просто смотришь на эти комменты и охуеваешь. Слева написано одно - справа другое. В между собой так же общаетесь? - Удали ненужные данные. - Удаляешь кеш. - Малаца, я это и имел ввиду.
И это сладкое актив рекорд программирование. Через статику в базу и обратно - приключение на десять минут.
Начни с того что контроллер возвращает не МОДЕЛЬ, а ПРЕДСТАВЛЕНИЕ. Некоторую структуру данных, которая нужна клиенту, от которого пришел запрос. МОДЕЛЬ это модель бизнес процесса, она содержит только то что нужно чтобы этот бизнес процесс выполнить. В частности АКТИВ РЕКОРД МОДЕЛЬ моделирует процесс сохранения данных в хранилище, и соответственно содержит все данные, которые можно положить в хранилище. Иногда структура ПРЕДСТАВЛЕНИЯ совпадает с МОДЕЛЬЮ, а иногда структура МОДЕЛИ совпадает с АКТИВ РЕКОРД МОДЕЛЬЮ.
Такая банальная хуйня, а надо о ней напоминать. Потому что ваш код давно перерос этап когда что-то там совпадало. Поэтому нужно разделять набор данных для представления, набор данных для бизнес логики и способы получения этих данных. Способы получения офк будут разные для разных наборов. Напрмер для представления нужны аксессуары, а для бизнес логики нет. Структуры разные, методы разные. Зато для бизнес логики нужно получить бренд, а бренд вообще не в базе и не в актив рекорде.
Дальше нужно разобраться что куда относится. ПРЕДСТАВЛЕНИЕ это часть логики отображения, МОДЕЛЬ это бизнес логика, а АКТИВ РЕКОРД МОДЕЛЬ это хранилище. Так вот нет никакого резона пытаться получить и представление и модель через один и тот же метод. Это разные структуры и получаются они по разному.
Так вот ключевой вопрос: твой oldProduct он на каком из слоев отличается? Он отображается по другому? Например нужно обязательно показать и старое и новое название. Он получается другим способом? Например он получается из какой-то таблицы с историей изменений аля event sourcing. Или он отличается тем что с ним можно или нельзя сделать? Например к старому товару нельзя добавлять аксессуары, а к новому можно.
>>3014215 Книги вкатунам нахуй не нужны, это тяжелый способ получения информации, плюс их часто переводят люди далекие от программирования со всеми вытекающими. Лучше их читать когда уже шаришь
>>3018492 В 12 лет читал книжку по микроэлектронике и справочник по матанализу. Сейчас зумеры не могут прочитать книжку "Делаем сайты на пхп и жиквери"?
>>3014006 СИКП же. Буквально на пальцах объясняют как строить качественные и масштабируемые программы. Дальше по желанию можешь навернуть каких-нибудь новомодных книжек по архитектуре аля ddd, tdd и тд, но начинать надо с базы.
>>3019962 То есть ты на серьезном ебале ради пяти символов генерируешь строку из 70 * 3 символов. В этой строке еще и всего максимум три уникальных символа на возможные пять позиций. Еще и реджексы в цикле. Один единственный реджекс скорее всего медленнее, чем все твое приложение. Ты их решил побольше хуйнуть, чтобы наверняка?
Единственное хорошее в этом коде это использование random_int, остальное можно спокойно нахуй выкидывать.
ищу компаньонов для pet проекта
Аноним26/01/24 Птн 11:36:29№3020287477
>>2975215 (OP) Захотелось на досуге разработать анонимный чат-рулетку, наподобие ЧатВдвоём и Nekto.me, но с более годным функционалом. Пока что с нуля накидал прототип на голом PHP + Swoole (т.е. сам чат работает через websockets), связь двух случайных собеседников уже работает, сообщения туда-сюда ходят, есть уведомления о наборе текста. Нужно дальше пилить функционал и сделать какой-то приличный фронт/дизайн (тут я не силён). На GitHub обнаружил массу примеров кода уровня "клон Omegle", хотя там почти всё на JS или Python, но какие-то идеи можно заимствовать. Чат пока планируется только текстовый, никакого голоса и видео. Если кому интересно поучаствовать ради практики, то оставляйте свои мыльца (мессенджеры не надо), сконтачимся.
>>3020631 >>3020668 А хули с вами церемониться? Вы же даже какие-то минимальные усилия не хотите приложить.
Вам буквально впадлу ПАЛЬЦЕМ ПОШЕВЕЛИТЬ, чтобы кликнуть на картинку и прочитать что на ней написано. Или кликнуть на кнопку "по щучьему веленью яндекс дай мне код с картинки", которую вам абу к каждой пикче прилепил.
Нахуй вы такие нужны тут? Нахуя вам отвечать, если после ответа на вопрос "Как срать?" вам сразу нужен ответ на вопрос "Как вытирать жопу?". И вам совершенно поебать что ответы на эти вопросы знает каждый первоклассник и прописаны они везде и всюду по миллиону раз.
>>3019962 >>3020028 >Один единственный реджекс скорее всего медленнее, чем все твое приложение. PHP использует либу PCRE, она компилит регекс в конечный автомат, который потом быстро работает. Нормальная последовательность действий в интерпретаторах: интернинг строки, потом определение, что такой регекс уже скомпилен. Аналогично с prepared statements и SQL, кстати. Но, конечно, интерпретаторы далеко не всегда делают нормально. Ну и PHP должно в FPM вертеться, чтобы скомпиленный регексп мог долго сохраняться. Это, повторюсь, если PHP вообще так умеет. Другие языки умеют. Что регексп обязательно медленный, это совсем не факт.
И я еще раз повторю: все что ты напишешь, буквально весь код, который ты напишешь будет быстрее всего одного реджекса. Это не шутка. Медленне реджекса только запрос в базу. Но если это запрос в локальную базу вида "SELECT 1;", то по времени будет примерно одинаково. Такие дела.
>>3020796 А ты это заебись придумал. Первый цикл на миллион итераций, с реджексом по фиксипрованной строке. Который вычисляется всего один раз, в первую итерацию, лол. Остальной миллион гоняется порожняком.
А второй цикл на 16 миллионов итераций. Здесь результат вычисляется уже 16 раз. По разу на каждый элемент excludes. А потом 16кк раз гоняется порожняком. Прямо даже хуй знает почему во втором случае медленнее получилось.
$markup = "<!DOCTYPE html><html><head></head><body><div>ЯЯЯЯ</div></body></html>"; $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. Правильно?
>>3021495 DOMDocument насколько помню, но могу и спиздеть, это биндинг к быстрой сишной либе libxml2. Альтернатив не так и много, но для них всех тебе уже виртуальный сервер будет нужен (VDS то есть). У либы на pure PHP хз что будет со скоростью. Парсер на скрипте может и тормозить. Так что я бы просто регулярками втыкал meta http-equiv content type.
>>3021502 >DOMDocument насколько помню, но могу и спиздеть, это биндинг к быстрой сишной либе libxml2 Судя по тому, что для того, чтобы он не жаловался на ошибки в вёрстке, нужно вызвать libxml_use_internal_errors(true) - звучит похоже на правду. >Так что я бы просто регулярками втыкал meta http-equiv content type Да, я так и сделаю, но было ощущение изначально, что это какой-то быдлокод и я что-то делаю не так. Однако, так и не смог нагуглить других решений. И что ещё больше запутывает - у конструктора DOMDocument есть аргумент encoding, но что он делает вообще хрен пойми. Указывай, не указывай - результат не меняется.
>>3021503 У него есть и version, и encoding. Похоже, это скорее всего то, что он тебе выдаст, если этот document сохранить как xml: <?xml version="1.0" encoding="utf-8"?> - первой строчкой
0. Сложность проверки O(1). Минимально возможная. 1. В ЧЕТЫРЕ раза быстрее. 2. Все символы случайные, а не три как у бузинесменов. 3. Производительность не зависит от сложности реджекса, длины повторяемой строки, размера словаря итд.
>>3021516 Лол, так там просто все комбинации двух символов в итоге кешируются. Сколько их всего? Две-три сотни? А остальные 100к раз оно никаких реджексов не выполняет.
>>3021518 Ничего нигде не кэшируется. С чего ты это взял вообще? PHP так не умеет. Ты запустишь в цикле миллион раз preg_match('/12345/', '123456') и это выполнится у тебя миллион раз.
>>3021519 Причем здесь то как устроены сами реджексы вообще? Пхп кеширует РЕЗУЛЬТАТ выполнения функции. Потому что на самом деле этих результатов в примере не миллион, а всего пара сотен.
Ты вообще в курсе что пхп код компилируется в код виртуальной машины? Именно поэтому похуй в каких кавычках что написано и конструкция $string = "ааа" . 'fff' будет преобразована в одну инструкцию ASSIGN !0, 'aaafff'.
Вот тебе пример. https://ideone.com/OaeO1g Мы сначала сгенерировали три массива со строками разной длины 2, 5 и 10 символов. А потом проходим по каждому из них и для каждой строки выполняем реджекс.
Вот тут-то все и видно. Проверка двух символов не стоит нихуя. А дальше вместо линейного роста пять символов стоят сразу дохуя, а десять как пять. Что еще смешнее, рандом может сгенериться так что десять будут стоить... ноль. Потому что проверка совпадет с предыдущей. В чем ты можешь убедиться поставив проверку long перед medium https://ideone.com/ZalEjM
Уот так уот. Пхп гораздо умнее ебланов, которые на нем пишут. И понимает что выполнять реджекс миллион раз - это тупость. Разумеется кеш штука полезная, но не надежная. Поэтому самый правильный способ сразу писать нормальный код. Кеш и с нормальным кодом поможет, зато все внезапно не пойдет по пизде из-за неправильного порядка вызовов и неоптимально скомпиленных опкодов.
>>3021527 Мне не нужны эти танцы. Я уже сам на всякий случай модифицировал исходники PHP8.4 и собрал его из них. Я вижу свомим глазами, что PHP миллион раз ломится к функции сишной либы pcre2_match, когда я его прошу проверять одну и ту же строку одним и тем же регэкспом в цикле. Так что никакие результаты не кeшируются. Как ты вообще представляешь себе архитектуру такого кеша? Для него не существует подходящей архитектуры. Это должно быть что-то вроде кеша SQL для детерменистических функций, которому явно не место в скрипте.
>>3021529 >>3021530 Для добивающего осталось выяснить, что когда ты присваиваешь значение строки в другую переменную, до тех пор пока одна из переменных не поменяется значение будет общим.
А когда ты удаляешь значение из массива место на самом деле не освобождается.
>>3021535 Какие танцы, дебич? Я ебу как ты там че скомпилил? Может у тебя опкеш вообще не включен. Ты высрал пример на конкретной конфигурации пхп и железа. Я показал тебе почему он быстрый и как эта быстрота может как улетучиться, так и стать вообще мгновенной.
>>3021540 Лол, ты как себе вообще представляешь кэширование результатов функций? Для этого нужна хэш-таблица (аргументы) => (результат) с вытеснением более старых результатов, а никакой не опкеш.
>>3021864 Это просто альтернативный синтаксис. Хуй знает почему в изначальном примере так было написано. Нихуя не меняется от скобок https://ideone.com/uLVwmr
>>3021970 Так у тебя самого два цикла с более длинными строками, которые не могут участвовать в каком-либо кэшировании, поскольку они все разные, выполняются каждый процентов на 30 даже быстрее, чем цикл с короткими строками, среди которых много повторяющихся. Это буквально доказательство, что ничего не кэшируется. Ты все-таки троллишь, тварь.
>>3021997 >два цикла с более длинными строками выполняются каждый процентов на 30 даже быстрее, чем цикл с короткими строками Стекломойный еблан, где ты это увидел? >short : 0.00015 >medium: 9.89437 >long : 9.70363 Залупа ты понурая, о том и речь была что в списке коротких строк 90% повторений, которые отлично кешируются. А время для списка со средней длиной и длинной и есть настоящие затраты на все эти реджексы. Там уже похуй какая длина, хоть двадцать. Главный скачек затрат происходит в тот момент когда кеш перестает срабатывать.
>>3022413 Шторм думает, что ты пишешь приложение под FPM/FastCGI со стройной декомпозицией всего в полтысячи классов, зашиванием всего в контексты, автоинклюдом на основе имен классов. Сделай один глобал, с тебя не убудет.
А как красиво вывести данные из mysql ? Хочу с бутстрапом сделать аккуратные куски текста, в гугле нашел только инфу в виде вывода таблицы с костыльными "echo <tr>".
Вы чё, пидорасы, охуели? Я-то думал, сейчас прочитаю ваш срач и как пойму, насколько регулярки медленные или нет, насколько стоит избегать их использования. Ага, лол. ньюфаг
>>3022934 С версии 7 стал конечно намного быстрее, но когда некоторые пытаются зеркалить сишный код на PHP, получается все еще намного хуже, чем, например, с жопаскриптом. В принцепе, если у тебя узкое место типа исказить картинку капчи, и инфраструктура позволяет, то просто делаешь модуль для пыха на сях. Но это уже переезд с виртуального LAMP хостинга на VDS, где тебе самому надо админить.
>>3022890 XML/HTML сами по себе довольно неоднозначные вещи, наловившие в свое время много критики. Так что meta можно добавлять смело, это не говнокод, а просто тебе не оставили выбора.
>>3023398 Первый раз регулярка выполняется долго, потому что она компилируется. Дальше она выполняется очень быстро.
>>3023453 >функции реально кешировать должно Вот откуда вы это берете, блять? Ну хоть ссылку дайте, где написано, что пых кэширует так, как вы пишете?
Считается ли нормальной практикой не использовать формы в Симфони, а самому ручками всё обрабатывать как на голом РНР? Дело в том, что мне они совсем не нравятся.
>>3023562 >Вот откуда вы это берете, блять? Ну как минимум пых делает так как на пиках. Второй вызов strlen компилируется сразу в результат, функция не вызывается. Вот и думай.
>>3024274 Проблема двойных кавычек не в скорости. А в непредсказуемости интерполяции. Использовать их нельзя по той же причине почему нельзя использовать нестрогое сравнение. Пхп пытается сделать с переменными какие-то ебанутые неочевидные преобразования, которые нам нахуй не нужны. Малейшая опечатка и произойдет хуй знает что. А найти такую багу можно только с дебаггером, буквально по строчкам перебрав весь код.
Вот "простенький" пример https://3v4l.org/QBVVf Что выведется в каждом из вариантов? Да хуй его знает, то значение переменной, то какая-то функция вообще. А как читать это дерьмо? Хуйня полная.
Поэтому либо конкатенация, либо sprintf. Двойные кавычки только если нужно вывести спецсимвол типа "\n" переноса строки.
>>3024640 Когда откроешь страницу в браузере, нажимай Ctrl + Shift + i Поклацай там табы, и найди HTML код страницы. Удаляй маленький кусочек, и смотри что получилось. Визуально. Затем удаляй тот же маленький кусочек в PHP коде, и обновляй страницу с помощью F5.
Как освоить фреймворк? Если обычный РНР просто дополняется новыми конструкциями, которые можно легко внедрить в свой код, то с фреймворком так не получается. Каждый компонент фреймворка тянет за собой другой. Хочешь попробовать шаблонизатор - нужно написать контроллер. Пишешь контроллер - надо разобраться в маршрутизации. Хочешь сделать простую формочку - надо закопаться в модели, ОРМ, валидацию и ещё черт знает что. Любая тема выливается в десяток смежных тем и не получается разом понять такой объём знаний, а поделить на части не получается.
>>3024803 Никак. Та же история что с шариком для гольфа. Чтобы долететь до цели, после удара шарику нужно сначала пролететь половину, а чтобы пролететь половину нужно пролететь одну четверть. А раз таких половин бесконечное количество, то шарик никогда до цели не долетит.
А ты никогда не освоишь ни один фреймворк, потому что ты еблан.
Не совсем верно. {0,} значит "0 или более символов". Если ты хотел написать "0 или 1 апостроф", то нужно писать '?. Также, апостроф может быть написан еще символом ` (косая кавычка).
Для проверки правильности использования апострофа можно сделать такую регулярку:
в строке любое чилсло символов без апострофов ИЛИ строка это буква, за ней апостроф, и дальше 1 или более символов не-апострофов.
> Кто всерьез (за деньги) ... занимался, то давно понял, что емейл это строчка с собакой (@) и максимальной длинной
Нет. Люди часто делают тупые ошибки, например, ставят пробел после @ или вместо точки, или пишут mailru слитно. И кто за деньги этим занимается, анализирует типичные ошибки и пишет костыли для их исправления.
Есть сайты типа: leetcode, codeforces, там куча задач на разные темы. Если непонятно, как их решать, то гугли книги или статьи по теме "структуры данных" и "решение олимпиадных задач".
> Вместо метода "залогинить" будут строки: вызов функции, которая генерирует токен, установление куки самим контроллером.
Лучше бы сделать именно функцию. А то вдруг надо будет где-то еще залогинить пользователя и придется копировать код. Или ты протестировать авторизацию захочешь, а как это делать, если ее код не вынесем в функцию, а размазан где-то в других функциях.
> Мб сделать метод в TDG, чтобы он принимал токен и возвращал объект студента?
> Например, его "замечательный" дизайн так и не смог увидеть, потому что фронт-говно не завелось, а вывалилось с ошибкой.
Дай ссылку на инструкцию, по которой ты все устанавливал. И дай текст или скриншот ошибки. И посмотрим, это инструкция неправильная, или ты невнимательно читаешь.
> Автор сам не повторял свой гайд. У него куча несостыковок. Например, создали модель, описали как он сказал. А в итоге через пару глав оказывается, что модель уже другая. Конкретно некоторые поля внезапно стали допускать NULL.
Давал бы конкретные ссылки, а то непонятно, это действительно ошибка или ты что-то пропустил.
> Мне вот интересно, действительно в реальных коммерческих проектах тянут эти бандлы?
Реальный прибыльный коммерческий проект, в composer.json порядка 40-50 библиотек и компонентов Симфони.
Тебе надо исправить конфигурацию сервера, чтобы запросы к статическим файлам (вида /static/css/xyz.css) не перенаправлялись на index.php, а просто отдавался файл.
Чтобы это сделать, тебе надо изучить, как настраивается используемый тобой веб-сервер.
Да, так и надо делать. Потому, что обработка кук должна быть в котроллере, а не в шаблоне. К тому же, твой код трудно будет адаптировать, если завтра понадобится не только проверять куку, но и содержимое БД например.
> Никакие переменные в ViewModel не группируют. Это данные МОДЕЛИ преобразованные чтобы их было удобно отображать. И используют ViewModel именно когда данные внутри модели бизнеса не подходят для отображения.
Мне кажется, неверно. ViewModel обычно используют в JS-фреймворках, чтобы описать модель, которая хранит состояние интерфейса (кнопок, галочек), а отличие от Model, которая хранит состояние данных приложения.
> Поэтому типичный способ работы с куками это положить входящие куки в иммутабельный объект, который гарантирует что они не будут перезаписаны или перезатерты и спокойно доедут до твоего шаблона.
Ты не прав. Переложить куки в иммутабельный объект и передать в шаблон точно так же плохо, так как это нарушает разделение ответственности. Если какая-то надпись выводится в зависимости от наличия куки, то это должно определяться не в шаблоне, а в функции, которая за этот функционал отвечает. А в шаблон лишь передается переменная, говорящая, надо ли вывести надпись.
Это упрощает, например, тестирование: мы можем тестировать ту функция в изоляции.
Почему так, нахуй? Я понимаю, что за такое нужно бить в ебало, но тем не менее. Попробовал узнать у гопоты, он на этом вопросе сломался. Сначала утверждал, что строки, которые невозможно привести к числу, приводятся к 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 и не привык использовать ООП. А не в фреймворке.
Когда ты сравниваешь значения разных типов, они преобразуются к однаковому типу перед сравнением. Согласно мануалу, при сравнении числа со строкой строка должна преобразоваться в число.
Но похоже, в твоем случае, 3 преобразуется в строку "3" и сравнивается как строка с "dddd" (по алфавиту). То есть, в мануале то ли устаревшая информация, то ли неточная.
> Результат сравнения несравнимых значений не определён
Это значит, что одна версия PHP может вернуть один результат, а другая другой и твой код сломается при обновлении PHP.
> Значит, мне нужно напердолить функцию-обертку
Не надо. Тебе надо в своем коде указывать типы переменных, а для получаемые извне переменные принудительно приводить к нужному типу. И тогда все будет ок.
Для поиска таких проблем в коде можно использовать статические анализаторы вроде phpstan, psalm.
>>3025213 >ООП, атрибуты, DI, MVC, ORM Я изучил ООП, атрибуты, MVC. Написал блог на ООП по MVC. Что такое атрибуты знаю, но не использовал. DI, ORM ведь часть фреймворка. Как их заранее изучить?
ООПзависимые, а если я всё-таки хочу какой-то класс использовать процедурно, и чтобы он не имел возможности реализоваться? Типа Utils::timestampUs(). Как это правильнее сделать? 1. abstract class Utils {} 2. class Utils { private function __construct () {} } Я обычно делал 1, но тут услышал мнение, что семантически abstract следует читать как "этот класс 100% должен быть унаследован и расширен, сам по себе не может быть реализован", а не просто "этот класс не может быть реализован". И, следовательно, семантически правильнее второе. inb4 правильнее обоссать тебя, пиши ООП и не выёбывайся, дали тебе DI - вот и не пизди. Ага, понятно, но отвечая на мой вопрос?
>>3024281 Перестань относиться к ошибкам как к ОЙ НИПАНЯТНА ВСЁ СЛОМАЛОСЬ. Относись к ним, как к подсказкам, которые говорят, что ты делаешь не так. В твоём случае это очень явно видно, никакой магии не происходит.
>>3026243 >смог решить проблему >не смог прочитать одну строчку в документации >не смог прочитать текст ошибки >несколько раз еблом тыкнули куда надо >смог решить >иде с самого начала и до сих пор подсвечивает косячный код
Радость у меня только от того что такие уебни никуда никогда не вкатятся. Таких дегенератов даже на кассу в пятерочке не поставят.
Область видимости свойства/метода, это вещь не настолько же серьёзная, как, например, указание типа свойства. Если свойство объявлено как int, хоть усрись, значение "foo" ты ему не присвоишь. Если свойство объявлено как private, его фактически можно прочитать с помощью var_dump как минимум. Более того - можно изменить его значение извне с помощью ReflectionProperty. Итого, область видимости - это что-то типа DocBlock. Подсказка для разработчика, которая говорит, как, по идее, всё должно быть. Но если захочется выстрелить в ногу (изменить значение private свойства извне) - технически это сделать можно. И, например, не стоит рассчитывать, что если ты объявил свойство private и не добавил к нему публичные геттер и сеттер, то его действительно нельзя будет получить и модифицировать извне. Если захочется - можно. Правильно понял?
>>3026533 >Это дефолтная псевдо ошибка при подключении include если переменная не глобальная Не бывает никаких "дефолтных" ошибок. Если шторм что-то подчеркнул тебе красным ты 100% делаешь какую-то хуйню. У тебя даже желтых подчеркиваний никаких в коде быть не должно.
Никто не объявляет переменные по разным файлам. Создается метод getConnection(), который и возвращает соединение. Никто блядь не бегает и не ищет где и нахуя эта переменная была объявлена.
>>3026256 Да убивать таких надо в зародыше. И вообще, никто не вправе писать на божественном PHP, не доказав свою глубокую одаренность, граничащую с гениальностью.
>>3027656 Не передергивай, чтобы вкатиться в каловый донный язык для конченных дебилов, нужно как минимум уметь ЧИТАТЬ.
Если ты не в состоянии прочитать строчку текста из документации, тебя даже в курьеры не возьмут - там приложение, карты, клиенты, надо башкой работать.
Коль такие проблемы - оформляй инвалидность, пенсию по шизе и не еби голову здоровым людям.
>>3027778 Да не визжи ты. Вся документация это буквально урезанный справочник где ничего толком не написано, с ребусами (string $govno int $a : bool false| ERROR). А ошибки это написанное машинным текстом сообщение, которое зачастую к реальной ошибке не имеет отношения. Пхпшторм вообще всегда подсвечивает любую рандомную хуйню, даже хэллоу ворлд нельзя написать без его подсветки.
>>3028002 >Вся документация это буквально урезанный справочник где ничего толком не написано Дегенерат, с магическим мышлением. В документации к каждой функции КАЖДЫЙ сука параметр детально расписан. Каждый вариант ошибки. Еще и блядь примеры использования в нескольких вариантах.
>с ребусами (string $govno int $a : bool false| ERROR) >литературно называет ребусом пример кода Я и говорю, что таким дебилам надо не код писать, а в больничку - глицин пить. Какой тут нахуй пхп вообще. Надо слабоумие лечить.
>подсвечивает любую рандомную хуйню Рандомную хуйню генерирует твой больной мозг. А шторм просто подсказывает как этот высер превратить в нормальный код.
Сейчас практически всё переехало в компоненты. Полезно будет ознакомиться со списком и в общих чертах посмотреть какие плюхи они дают, чтобы не городить велосипеды или не брать то же самое от васяна с гитхаба.
В глубину документации и потроха исходников уже по необходимости, когда задача того потребует.
>>3003398 Так она для вкатунчиков, совсем простая. Скорее маркетинг, чем обучающий материал, но для новичков таки полезный. Если хочешь гоу дипер читай доку, она шикарна. Когда становится тесно в доке — читай исходники, они тоже ничего.
Подскажите как находить полезные, часто используемые функции, например для работы с массивами. Единственный вариант лазить по доке заходя в каждую функцию?
>>3028626 Ну ты же им не скажешь, правда? А потом когда выяснится что то тебе в очередной подсказали это машинный бред, полезут проверять и выяснят что 90% того что ты делал это шизофазия чат бота, который нихуя не предназначен для программирования.
Вот тогда будут угарать и пиздить обоссанными тряпками, может постараются волчий билет выписать через чаты хрские. Можно понять - такой кал никакому конкуренту не пожелаешь. Хуй с ними с просранными бабками на твою зп, эта куча нейроговна может весь многомиллионный проект похерить. Как блядь отличить где нормальный код, а где бред?
Нейрохуйня ведь умеет писать не "правильный" код, а максимально "похожий на правильный". Она блядь "правильность" определять не умеет.
>>3027427 Так а на мой вопрос это как отвечает? Есть класс, который состоит только из статических методов. Логично, что реализовывать этот класс нет смысла. Конечно, если где-то случайно он будет реализован, это не приведёт к ошибкам, но для наглядности было бы неплохо отметить, что весь класс по сути статичный. Раньше я делал класс abstract, но услышал мнение, что это пидорская тема. Семантически, мол, это модификатор из мира ООП, который подразумевает, что абстрактный класс будет унаследован и расширен.
>>3028898 >Есть класс, который состоит только из статических методов >Раньше я делал класс abstract >это модификатор из мира ООП А "класс" это не модификатор "из мира ООП"?
>>3028965 Проблема в том, что неизвестно есть ли вообще этот метод. 3 раза переформулировал запрос, получилось найти искомый метод только практически скопировав его описание. "Получить проиндексированные значения массива по ключу php"
>>3028982 >проиндексированные значения массива по ключу Еще бы оно нашло. Что это блядь вообще означает? Ключи это и есть "индекс". Как блядь в массиве может быть значения без ключа? И как по одному ключу можно получить несколько значений если ключ уникальный?
Ну а то что ты гугл посиком пользоваться не умеешь даже не удивляет. Сначала задается контекст, потом вопрос: "шиндовс php как срать какаха не выходит из жопи"
>>3029109 Сейчас никуда нереально устроиться. Джуны не нужны и PHP не исключение. Походу ты на битриксойдные вакансии повелся и думаешь что сюда легко вкатиться
>>3029269 Перескакивать с языка на язык такое себе. Если учил джаву продолжай учить его дальше. Кто тебе вообще сказал что джавистов не берут на работу?
>>3029477 В качестве строчки в резюме это скорее минус чем плюс. Рискуешь застрять на должности говночиста до седых мудей, пока ссаный битрикс не вымрет нахуй. А там уже на завод. И да, само "программирование" на битриксе устарело лет на 10 минимум, как сейчас никто не пишет. Поэтому битриксоидов и не берут никуда, собственно
>>3029601 Жпт дегенерат, в том то и прикол что ответы получаются РАЗНЫЕ.
Обработка нейросетью это аппроксимация, приближенный вариант. Ответ в принципе не может быть точным на 100%, потому что для этого придется хранить воспроизводимую информацию полностью.
Если речь идет об обычном тексте, то выкинуть оттуда пару слов вполне можно, можно заменить несколько слов одним, монжо джаэ бвукы пестаревлять и будет более менее понятно.
А в программировании нельзя блядь случайные десять процентов кода выкинуть. Нельзя "просто" аппроксимировать функцию или документацию. Ты никогда не знаешь что нейросеть "упростит". Может сократит описание, а может выкинет "ненужный" параметр. У неё приоритетов и настроек на этот счет никаких нет.
Поэтому жпт хуиплетов не слушайте, просто читайте документацию. Все функции для работы с массивами можно за час изучить, а вкатываться вам пол года минимум.
>>3029770 >идиоту предлагают использовать чат в качестве справочника, чтобы стек оверфлоу самому не парсить >хуйня внезапно решила, что его заставляют использовать нейросети для пок-пограммирования особо сложной высоконагруженной системы с релизом сразу в прод без кода ревью, при малейшем баге в которой его буквально берут и ебут в зад без прелюдий, как он привык.
>>3029811 >чат в качестве справочника >залупа сбредила пикрелейтед Такой-то справочник.
Тебе, дебилу тупому, сделали целый сайт по yii, с полной документацией, примерами, книгами, гайдами, ссылками на исходники, форумом. Даже на русском сука. И везде есть кнопка поиска. Не хочу, хочу жрать говно.
>>3029601 У тебя тут просто выжимка из документации - мог у гугла так же спросить. Он код за тебя все равно не напишет, не протестирует и своей жопой за него отвечать не будет.
>>3029866 >знают общие правильные абстракции Типа умеют зачитывать наизусть солид из википедии? Или бесконечный список паттернов?
Малой, 99% кода на пхп это нечитаемое неподдерживаемое говно. То что кто-то пытается свой говнокод в какие-то ебанистические нагромождения классов заворачивать лучше нихуя не делает.
>>3029927 Ладно. Давай, "взрослый", расскажи мне откуда пхп макаки учатся писать нормальный код? Тут весь тред ноют что по пхп нормальных книг нет. А по ооп так вообще все под джаву или на крайняк шарп. Head first patterns - джава Синяя книга эванса - джава Чистая архитектура Мартина - джава
>>3030271 Шансы устроится в пхп выше, чем в джаву. Сейчас там куча менторов, которые за деньги натаскивают нулевых челиков и они все вакансии закрывают. А в пхп больших денег нет, поэтому ментора работать не выгодно и поэтому самоучкам типа меня легче устроится. Ну это мне так видится.
Есть у меня многомерный массив. Мне нужно пройтись по нему и сделать определённые действия с каждым элементом. С элементами первого уровня - одни, с элементами второго уровня - другие. И т. д. В качестве альтернативы я вижу array_map, но из-за вложенности это будет гораздо тяжелее читать. Я просто ссылки обычно не использую и мало про них знаю. Это тот самый случай, где они нужны, да?
>>3030859 Многомерный массив. Массив, который состоит из массивов, которые состоят из массивов, которые состоят из скалярных значений. Мне нужно превратить его (корневой массив) в строку, при этом, немного изменив значения самого глубокого массива. То есть, перебрать элементы массива3, модифицировав их и превратив в строку, потом перебрать элементы массива2, превратив их в строку, потом перебрать элементы массива1, превратив их в строку.
>>3030918 Это своего рода база. Делаешь так (foreach с ссылкой) - сразу после цикла сделай unset переменной со ссылкой, чтобы случайно к ней потом не обратиться. Поскольку он вложен, это не то чтобы очень проблема, из глобальной области lvl3 не доступен. Но если код будет как-то меняться, хуй знает, что произойдёт. Для перестраховки.
>>3030932 Да вот хуй знает, мне как будто тяжелее читать это. Не то чтобы прям тяжело, но foreach вообще легко, а тут слегка подвисаешь.
Кто-нибудь вообще настраивал XDebug для шторма через докер? Сейчас попробовал и ничего не получилось. Причём проблема очевидно в тупом шторме, который не может подхватить xdebug. Самое бесячее, что надо для каждого проекта создавать тонну ебанутых настроек шторма, всякие папки прописывать, сервера, прочую залупу. Неужели это нельзя всё сделать проще? И ещё кто-то говорит, что шторм - это дофига удобно. На мой взгляд самый неудобный и долбанутый редактор, который я когда-либо встречал.
Сижу-пишу свой говнокод, мешая ООП-код с ФП-кодом...
А я не знаю как иначе.
У меня нет базы в голове.
У меня нет учителя, нет курсов, нет программисткого образования.
Поныл немного, ага...
Просто стыдно за свой код, за то, что я даже не могу понять как мне писать его нормально. Поставить фигурную скобку где надо я могу, но вот понимание правильной архитектуры у меня нет, понимание оптимальных, логичных и красивых решений.
>>3032585 В $_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' все равно срабатывает повторно.
>>3032573 >программисткого образования Можно подумать, что там учат программировать. Там в основном решают простые задачки типа lab1.cpp, где пишут лютый говнокод. Преподы рассказывают лишь основы, буквально по вершкам. В итоге после универа ещё надо самому доучиваться, чтобы взяли на работу.
>>3031597 Два дня долбался с этим Xdebug'ом, но в итоге победил. Оказалось, что в гайдах в интернете всякую фигню пишут, настроек нужно меньше, но всё равно надо точно знать какие именно. Вообще, заметил, что с докером пишут конфиги как попало, лишь бы работало. Очень редко можно найти хороший гайд, где выносят переменные окружения в .env, не пытаются выловить ip-адрес контейнера, а обращаются по его имени. И второй неприятный момент уже в самом докере, что есть различия между разными ОС. Я вначале наткнулся на гайд, где чел настраивал через винду, а в линуксах некоторые настройки надо писать по-другому.
Сложилось впечатление, что PHP запутывает своим желанием усидеть на всех стульях сразу. С одной стороны, он как бы говорит - тут всё серьёзно, на тебе статическую типизацию аргументов методов, и статическую типизацию возвращаемых значений, и ещё кучу всякого претенциозного, мол, мы не совсем безнадёжные говнокодеры, а стремимся к Java. С другой стороны, он - собранная на коленке хуита с динамической типизацией, и никак ты не укажешь тип для переменной внутри метода, отсутствием типизированных массивов (внешние инструменты типа phpstan мы не трогаем, речь о самом языке), как будто бац-бац для говнокодеров, чел, типа, если хочешь что-то серьёзное писать, иди тереби джаву, раст, си, хуй знает, а мы тут хуяк-хуяк прототип, чисто посмотреть, взлетит или нет. Правильно понял? вкатун
>>3033173 Пхп никого не запутывает. Это говноязык, который развивают дебилы, по прежнему живущие временами когда рандомный вася закачивал файл на сервак и это был сайт.
Все что ты видишь хорошего в языке сегодня - было протащено с воплями нытьем и драмой. А все что появится в будущем - уже есть прямо сейчас в нормальных языках без задержки в десять лет.
Никаких перспектив у пхп нет. Доля использования именно как языка для написания кода будет падать и дальше. Джаваскрипт макаки сожрут весь рынок пхп макак просто потому что их в сотню раз больше. Все ресурсоемкие задачи уйдут го и модным растам зедам. А говнокодить сайты будут на джаваскрипте. Потому что фронт один хуй на нем. Нахуя два набора дебилов держать.
>>3033228 >будет падать и дальше Если я засну и проснусь через сто лет, то пхп также будут хоронить
Кстати, в пиндосиях, этих ваших, похороны пхп это давно уже ироничный мем. А по факту пыха как являлась топ 1 в бекенде, так и продолжает занимать 77-80% рынка. Остальное жрет джава и питон, а всякие однопроцентные объедки занимают уже ноды и прочие руби. Кстати, не секрет, что почти в ста процентах случаев Нода используется для сборки фронтенда, а не для разработки бекенда
>>3033415 Так, может, дело не в том, что php херит переносы, а в том, что оно выводится в браузер, т. е. HTML, т. е. для переноса нужно <br> вместо "\n". На крайний случай можешь обернуть место, в которое ты выводишь, тегом <pre>
>>3033452 >так и продолжает занимать 77-80% рынка И сколько из этого всего вордпресс и остальные цмс? В том-то и прикол что для этих сайтов программист не нужен. Я русским языком написал: >Доля использования именно как языка для написания кода будет падать и дальше Она и так падает непрерывно. 30% сайтов используют версию ниже седьмой. Это говно никто не обслуживает оно просто висит в интернете. Поддержка седьмой версии два года назад закончилась. Половина "сайтов" на пхп на седьмой версии. Половина пхп сайтов до сих пор под апачем крутится. Все это не актуальный кал. Про какое будущее можно говорить вообще? Какое нахуй развитие языка если две трети кода на нем это легаси, даже от актуальной версии на три года отставшее?
О том то блядь и речь что прямо сейчас для НОВЫХ проектов пхп нахуй не нужен. Сколько еще десятков лет перемогать фейсбуком и вк? Да, там может до сих пор пара легаси сервисов на этой хуйне крутится, но новые-то никто на пхп не пишет. Потому что нахуя?
А то что нишу пхп макак займут джаваскриптеры это просто сто процентов. Как только они высрут нормальные инструменты, как только у них появится свой ларавель всю пхп парашу как ветром сдует. И очевидно что это не изменение к лучшему, а деградация. Хуже пхп макак только жс макаки - это факт. Но так же и факт то что жс макак в сто раз больше. Как только им в руки попадет инструмент чтобы делать вменяемый бекэнд БЫСТРО пхп растворится в луже мочи. Будем плагины для вордпресса устанавливать.
>>3033540 Тише. Воды попей. Зайди на хх и сравни количество вакансий на вордпресс и ларавель. Это раз. Два - ты можешь вбить в поиск node и увидишь, что вакансий на пару сотен больше, но в основном это фронтенд или фуллстек. И три - выбирай любой язык и сортируй зп от 200к и ты увидишь, что вакансий +- одинаково, а в большинстве случаев пхп лидирует.
У ноды уже давно есть кошерный со всех сторон нестжс, вот только, когда будет на нем столько же вакансий как и на ларе, тогда и приходите. А про то, что нода убьёт пыху я слышу года эдак с 15го.
Напомню, что при всем при этом рынок пыхи это 80%. За последние нацать лет он ни упал вобще. Все потому что всё твои "другие" языки популярны, но популярны не в бекенде, а например в мобильной разработке, которая сейчас на хайпе, но без бека, как известно никуда не поедет (как и все в принципе)
>>3033611 >сравни количество вакансий на вордпресс и ларавель Алеша, какие нахуй "вакансии" на вордпресс? Вордпресс потому и популярен, что там программист не нужен.
>когда будет на нем столько же вакансий как и на ларе Ну будет. Тебе, дебилу о том и говорено, что тенденция к тому что будет. Назови хоть одну причину почему это не произойдет?
>А про то, что нода убьёт пыху я слышу года эдак с 15го. При чем здесь нода? Не нода, так bun. Не ванилла, так тайпскрипт. Ты можешь хорохориться сколько угодно, но пхп расти некуда, он никакую долю рынка у жс не отъест. А вот в обратную сторону только в путь. Вопрос стоит только о том когда.
Убьет ли го пхп? Да нет конечно, просто заберет все самые денежные и интересные задачи и переманит все самые квалифицированные кадры. Я вот с "года эдак с 15го" наблюдаю как сеньорский состав отпочковывается в го, а меня пытаются нанять чтобы за ними пхп говно вытирать. Стрессоустойчивость и умение понимать чужой код им требуются. Офк все значимые задачи будут получать го красавчики, а пхп макаки будут баги искать в легаси кале, а версию языка поднять приоритета и бюджета нет.
Кому и кобыла невеста. Кому-то в кайф сидеть за копейки колупать баги в легаси говнокоде и облизываться на "новые" фичи языка, которые спиздили из джавы десятиллетней давности. Нахуя на это подписываться в 2к24 году? А самое главное нахуя работодателю в 2к24 в это вкладывать миллионы?
>>3033683 >тенденция Значение знаешь? Тенденция это когда 20 лет назад пыха занимала 80% рынка, 15 лет назад - 60, 10 лет назад - 30 и т.д. А когда он стабильно занимает 80%, то о какой тенденции ты говоришь? О манямирке твоём, который ты прочёл лет 5-10 назад? Потому что крыть пыху говном уже давно моветон и признак школьника.
По поводу легаси кода я тебе ответил. Вакансий на ларе больше, чем вакансий на чем-либо ещё. Ты просто дурачек вылезший с установками из 2010-2015 годов, не понимающий, что в 2к24 дела обстоят иначе
>развиваться некуда Кекнул с дауна. А что же считается развитием?
Чисто интересно. Аноны, которые регулярно сидят в этом треде, для чего вы тут сидите? Я вкатун, иногда прихожу спросить что-то, поэтому и сижу в этом треде.
>>3033707 >Потому что крыть пыху говном уже давно моветон и признак школьника. Ну ка, чучело, расскажи чем пыха лучше тайпскрипта. Ну так чисто навскидочку, пару фич набрось.
>По поводу легаси кода я тебе ответил. Вакансий на ларе больше Каво блядь? Уеба, только 20% использует актуальную версию пхп. Большинство вакансий это ПОДДЕРЖКА устаревшей легаси параши. Я тебя спрашиваю: нахуя вкатуну вкатываться в эту поддержку? Перспектива какая? Почему должны новые вакансии на пхп появиться на рынке?
>А когда он стабильно занимает 80% Это доля вордпресса. И сайтов, для которых код давным давно не пишется. Додстер, ты сам бы пошел работать с кодом под версию 5.6? А это жи САЙТЫ и ВАКАНСИИ и они ЗАНИМАЮТ.
Момент с го ты тактично проигнорил. Как же так - все больше пхп кода переписывается на го, а доля пхп только растет и растет. А вот так блядь. Сложные высокооплачиваемые задачи уплывают го разрабам, формошлепство и натягивание шаблонов на вордпресс и ларавель приплывает пхп макакам.
>А что же считается развитием? Когда на твоем языке можно поднять приложение без ебли со сторонними вебсерверами? Когда у тебя нормальная типизация? Когда у тебя есть нормальные коллекции? Когда ты можешь разрабатывать и для фронта и для бека и под десктоп?
>чем пыха лучше тайпскрипта? А должна быть лучше? Ну ок, пара фич: - рантайм типизация, рантайм инкапсуляция, рантайм ООП - наличие энтерпрайзных фреймворков - наличие работы Это навскидку
>20% это актуалочка Откуда ты берёшь эту инфу? Из смишных мемов? Допустим актуалочка 20%, что не так, но ок. При этом я тебе сказал, что вакансий на хх по ларе (а она является актуальным инструментом) больше, чем вакансий любого другого актуального языка.
У пыхи много говнопроектов и вакансий за 15к, потому что пыха доминирует в целом и зоопарк обширный, поэтому я сразу тебе сказал - ставь фильтр на хх с зарплатой 200к+ и сравнивай количество вакансий с другими языками
>80% это вордпресс Почему ты такой жопой чтец? Я тебе написал, пиздуй сам проверять количество вакансий на ларе и вордпрессе, а потом объясни мне откуда ты берёшь 80% вордпресса, когда вакансий на нём меньше лары
>гошники получают больше Пиздуешь на хх и узнаешь, что мидл+ разрабы получают +- одинаково на любых яп, вот только на пыхе таких вакансий больше
>формошлепство на ларавель Маня. Я даже ~5 лет назад, работая с Ларой в говноконторе за 50к не пилил формочки от слова совсем
>поднять приложение без ебли со сторонними веб серверами Ну тут уж нода уделывает так уделывает: pm2 плюс тот же nginx, плюс компиляция из тайпскрипта и тд и тд. Для пыхи же, твои любимые гошники активно пилят лонг сервера изи запускаемые продакшн пхп приложения без всяких нгинксов, а по желанию можно всё приложение скомпилить в бинарник и запускать где угодно вобще без нихуя
>фронт, бек, десктоп А мне нужен онли бек. С этого и начался весь диалог. Пыха топ один в беке. Остальное мне не интересно
>нет ридонли😭 Ой бля. Иди ещё до знака доллара доебись
>объявление свойств в конструкторе Хорошо хоть в тайпскрипте такого нет, да?
Лично я попробовал РНР ещё в универе и тогда он мне показался действительно языком, чтобы быстро говнокодить сайтики в процедурном стиле. Но сейчас я познакомился с ООП в РНР и могу сказать, что он теперь мало чем уступает джаве. И при этом сохраняет все преимущества интерпретируемого языка. Особенно удобно при работе с докером, что не надо постоянно перезапускать контейнер с новым жарником как в джаве, а он просто мапится на твой код и при первом же запросе выполняется. Удобно, быстро, нет лишнего геморроя.
>>3033889 >рантайм типизация, рантайм инкапсуляция, рантайм ООП И это полезно... чем? Тем что с динамической типизацией можно срать в код? Плюс так плюс. Дальше шизофазия какая-то пошла. Даже на два пункта не хватило.
>Я тебе написал, пиздуй сам проверять количество вакансий >Алеша, какие нахуй "вакансии" на вордпресс? Вордпресс потому и популярен, что там программист не нужен. Стекломойный, ты совсем ослеп? Ты тут срешь про долю рынка, а доля рынка из вордпресса почти целиком и состоит.
>Пиздуешь на хх и узнаешь, что мидл+ разрабы получают Бля, я когда полез проверять ожидал что там пизда, но не ожидал что такая. ПХП ВСЕ. Бегите отсюда нахуй. Вот, смари паскуда, вот это развитие. Го, которым на хх еще пять лет назад даже не воняло теперь обсыкает твой ларавель и по вакансиям и по зп.
Дальше опять какая-то шизофазия пошла. Долбоебу говорят что половина пхп сайтов на апаче до сих пор, он пиздит про какие-то пилящиеся го сервера, компилилит пхп в бинарники и бороздит просторы большого театра.
Пикрелейтед все что нужно чтобы поднять сервак на жс'е прямо сейчас. Пять строчек кода и одна команда. То же самое в го. Какие нахуй нжинксы, какая нахуй ебля два дня чтобы дебаггер включить?
В общем я понял почему ты каждый пост виляешь сракой обходя отток задач и синьоров в го. Потому что ты чекнул и понял что там пизда. Го уже вполовину размером с пхп рынок в раше. А по синьорским задачам похоже уже перерос. И дальше будет только веселее.
>>3033914 Не будет никто ничего переписывать на го. Как пилили сайты на РНР, так и будут пились. А вот как раз судьба го пока неизвестна, его нишу может занять любой новый модный язык.
>>3033925 Никто не будет переписывать всякую хуйню. А вот все критические сервисы, которые приносят бабки будут. Тебе, дебилу, про то и пишут - все саме вкусное и прибыльное вымывается.
Ты скрины видел? Несколько лет назад никакого го в помине не было. А сейчас там синьорских вакансий больше чем на ларавеле. И чьи же это задачи пишут на го бывшие пхпшники? Наверное у фронтендеров часть рынка спиздили.
>>3033928 Го занял нишу С/С++ в бэкенде. Я помню ещё в 2017 смотрел доклады мэйлру, где они хвастались, что переписали почту на го, а раньше у них она была на С++. А нишу РНР го ни как не займёт. Конкуренты РНР - это всякие питон с джангой, дотнет с асп.нет, может действительно на жс/тс какой-нибудь бэкенд высрут, но ему надо будет догнать по удобству и производительности разработку на РНР, что весьма сомнительно. Скорей появится какой-нибудь новый язык, который предложит новый подход к быстрой разработке сайтов. Типа как в своё время руби на рельсах совершил революцию и ускорил написание MVC-приложений.
>>3033940 Доо, сишники в го набижали. Вот они эти сишники в ряд: https://hh.ru/vacancy/92525414 https://hh.ru/vacancy/91937785 https://hh.ru/vacancy/92207521 Почему эти долбоебы на ларавель ищут пхп макак с опытом go? Откуда вообще у пхп макак опыт го если это ниша сишников? Да потому что в крупных конторах это повсеместно, я блядь сам курс по го проходил бисплатно за счет конторы, и не потому что я его выклянчил, а потому что критические сервисы хотят на го переносить.
>>2975215 (OP) По работе нужно массив разделов превратить в древовидную структуру. Изначальный массив и массив, который должен получиться: https://codefile.io/f/oyqbaZY0Tm То есть по порядку, если следующий уровень больше предыдущего уровня, значит он является подразделом. Как можно решить эту задачу?