Это копия, сохраненная 16 ноября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
В нашем треде отвечают почти на все вопросы, только бампайте каждые 5 дней.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>1475112 (OP) . Все старые треды есть в архиве: https://phpclub.tech/ (там есть поиск, так что можно легко найти обсуждение какой-то задачи или ответы на свой старый пост) или ищутся в гугле по словам "клуб изучающих php" и в архиваче.
Мейлач лежит? Есть запасной тред на доброчане: /s/res/23225.xhtml#i46467
Форматируй свой код, если хочешь, чтобы его читали (как, написано во втором посте).
Правила: ведем себя воспитанно, помогаем новичкам, читаем учебники, решаем задачки, постим ссылки на решения, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 2-3 дня, у него мало времени, не жди его, решай задачки дальше. ОП отвечает на все вопросы по его задачкам и учебнику, а вот насчет каких-то других вещей - только если останется время. Но в треде немало анонимных экспертов разного уровня, так что вряд ли вопрос останется без ответа.
С чего начать
У нас есть свои уроки по основам PHP, они собраны и выложены по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не читайте, не сохраняйте, не запоминайте его, он временный). Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то можно начать с него. Он простой и понятный. Там есть задачи, их нужно решать (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению. С другой стороны, если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Visual Studio Code, Netbeans PHP или PhpStorm (с ним будет удобнее).
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.
Надо переходить к более серьезным задачкам, которые научат тебя всему этому.
- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony 3/Doctrine 2
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md
Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Параллельно стоит подучивать английский, на первых порах можно без него, но по мере развития придется все чаще сталкиваться с англоязычными статьями, так что лучше не откладывать. Читать можно news.ycombinator.com - это что-то вроде их хабра. Также можно начинать смотреть фильмы и видео на английском.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://github.com/codedokode/pasta/blob/master/db/databases.md
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
- Новости IT на англ. https://news.ycombinator.com/
- какой-то древний, устаревший, но большой и на русском справочник по веб-разработке, посоветованный аноном: https://starcat.dp.ua/doc/wdh/
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
У ОПа нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.
Платиновые вопросы
- Почему PHP? Потому что вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу.
- Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
PSR-1: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-2-coding-style-guide.md
- https://github.com/asdasdasdasddasasdasdas/StudentList из >>1448614
- https://github.com/baraboolka/StudentList из >>1460026
- https://github.com/hikkej/student_list из >>1460537
- https://github.com/asdasdasdasddasasdasdas/Filesharing из >>1462815
- https://github.com/deadj/student-list/ из >>1466025 и >>1475811
Если я кого-то еще пропустил или не ответил, можно напомнить о себе в этом треде. В прошлом треде >>1475112 (OP) на большинство постов даны ответы.
И какие курсы он продает?
Таки спорно. С одной стороны, ты прав и действительно нет смысла что-то усложнять, если нужно выкинуть пользователю html-ку с парой кнопок, то jquery будет гораздо проще.
Но:
1) jquery уже подрастерял свою актуальность, не полностью, но... Во-первых, браузеры подсократили различия между собой (только говносафари ещё удивляет), нет такой острой необходимости в умной обёртке, учитывающей их. Во-вторых, сам js уже эволюционировал, на ванильном js-е можно сделать то же самое с чуть-чуть большим количеством кода.
2) Любой софт имеет тенденцию к усложнению со временем. Тебе нужно показать пользователю одну формочку, вторую, добавить валидацию, эффектик, что-то ещё, анимацию красивую... и в какой-то момент ты понимаешь, что оно слиплось в ком из лапшевызовов апи браузера и работы с глобальным состоянием, стоящий на костылях и хаках, чтоб быстрее. И переделать это на любой нормальный фреймворк займёт часов 20. И ты приходишь такой к начальнику и говоришь, что да, добавить новую форму - два часа, но тебе нужно ещё двадцать, потому что вот так вот. И ты услышишь следующие аргументы: "а чего ты сразу нормально не сделал?", "ну оно же работает сейчас, правильно?", "у нас нет денег на бессмысленные украшательства, не трать на это времени", "просто добавь кнопку, как-нибудь потом перепишешь" и тд и тп. В итоге будешь жить с этим легаси-говном или, матерясь, срочно переписывать его нормально.
Я это к чему, у бизнеса почти никогда нет ресурсов переделывать то, что и так приносит ему денег. Проще уже сразу сделать нормально, потратив на жалкий час больше, там не так много работы, сделать одну сраную форму на сраном реакте и пропустить через сборщик. Зато потом легче будет, если что.
Как взаимодействовать с контейнером из классов? У меня есть индексный файл, в нём создаётся контейнер и через контейнер получается главный класс приложения. Примерно так:
```
$dicBuilder = new \DI\ContainerBuilder();
$dicBuilder->addDefinitions("config.php");
$dicBuilder->useAutowiring(false);
$dic = $dicBuilder->build();
$blog = $dic->get(\Core\Blog::class);
$blog->run();
```
А вот как мне получить доступ к $dic из остальных классов? В голову пришли следующие варианты:
0. Создать статическое свойство/синглтон, который будет хранить контейнер. Интуитивно кажется, что это хуёвая идея. Типа, использую DIC, но сам контейнер доступен "глобально".
1. Вставить код создания контейнера (4 строчки) в каждый класс. Возможно, это наиболее правильно, но куча копипаста ведь.
2. Создать такой же контейнер в контейнере. Т. е. в config.php пишу примерно следующее:
```
\DI\Container::class => function ( ContainerInterface $c ) {
$dicBuilder = new \DI\ContainerBuilder();
$dicBuilder->addDefinitions( "dic-cfg.php" );
$dicBuilder->useAutowiring( false );
$dic = $dicBuilder->build();
return $dic;
}
```
Вроде не самое неадекватное решение, но получается, что я в контейнере создаю абсолютно такой же контейнер и дальше уже работаю с ним. Да и опять же - копипаст, пусть и всего 2 раза.
3. Изменить код в индексном файле на примерно следующий:
```
$dicBuilder = new \DI\ContainerBuilder();
$dicBuilder->addDefinitions("config.php");
$dicBuilder->useAutowiring(false);
$dic = $dicBuilder->build();
$dic->set(\DI\Container::class, $dic);
$blog = $dic->get(\Core\Blog::class);
$blog->run();
```
Т. е. добавить контейнер в самого себя через set. На первый взгляд выглядит адекватно, но, возможно, я что-то упускаю.
Как поступить более правильно? Или, может, все варианты сосут и есть какой-то другой?
Как взаимодействовать с контейнером из классов? У меня есть индексный файл, в нём создаётся контейнер и через контейнер получается главный класс приложения. Примерно так:
```
$dicBuilder = new \DI\ContainerBuilder();
$dicBuilder->addDefinitions("config.php");
$dicBuilder->useAutowiring(false);
$dic = $dicBuilder->build();
$blog = $dic->get(\Core\Blog::class);
$blog->run();
```
А вот как мне получить доступ к $dic из остальных классов? В голову пришли следующие варианты:
0. Создать статическое свойство/синглтон, который будет хранить контейнер. Интуитивно кажется, что это хуёвая идея. Типа, использую DIC, но сам контейнер доступен "глобально".
1. Вставить код создания контейнера (4 строчки) в каждый класс. Возможно, это наиболее правильно, но куча копипаста ведь.
2. Создать такой же контейнер в контейнере. Т. е. в config.php пишу примерно следующее:
```
\DI\Container::class => function ( ContainerInterface $c ) {
$dicBuilder = new \DI\ContainerBuilder();
$dicBuilder->addDefinitions( "dic-cfg.php" );
$dicBuilder->useAutowiring( false );
$dic = $dicBuilder->build();
return $dic;
}
```
Вроде не самое неадекватное решение, но получается, что я в контейнере создаю абсолютно такой же контейнер и дальше уже работаю с ним. Да и опять же - копипаст, пусть и всего 2 раза.
3. Изменить код в индексном файле на примерно следующий:
```
$dicBuilder = new \DI\ContainerBuilder();
$dicBuilder->addDefinitions("config.php");
$dicBuilder->useAutowiring(false);
$dic = $dicBuilder->build();
$dic->set(\DI\Container::class, $dic);
$blog = $dic->get(\Core\Blog::class);
$blog->run();
```
Т. е. добавить контейнер в самого себя через set. На первый взгляд выглядит адекватно, но, возможно, я что-то упускаю.
Как поступить более правильно? Или, может, все варианты сосут и есть какой-то другой?
Все варанты - костыли с говном, никогда не делай такого. Любой контейнер зависимостей имеет встроенные способы разрешения этих самых зависимостей. Ищи в документации - там всё есть, только поискать.
А вот то, что ты не почитав нормально доки по либе, которую решил использовать, да ещё и потом костыли писать начал - хуёво. Избегай такой практики - самому же потом фейспалмами лицо разбивать не придётся.
Иначе поставь вопрос - чем лучше питон, или нода или руби? И зачем тебе, допустим предпринимателю выбирать не пхп?
То что хотят программисты - это маня хотелки. Важно что хотят те кто платят бабки. И думаю всякие помидоры всегда пляшут от этого.
В документации я ничего не нашёл. Единственное, что хоть сколько-то релейтед https://github.com/PHP-DI/demo/search?q=$container&unscoped_q=$container
Но это, по сути своей, 1 вариант, только без копипаста. Разве это адекватное решение?
Не понимаю зачем ты на такие посты отвечаешь. Каждый тред очередной шизоид всплывает с таким вот вопросом.
И невдомёк болезному, что те, кто варится в этой всей теме знают рыночек побольше его, причём в разы. Вопрос нубский, жирный и неуместный.
>Вопрос нубский
Ну так я нуб, думаю с чего начать. Вот и спросил.
Тут ведь для начинающих тред.
>думаю с чего начать
Думай молча.
>Тут ведь для начинающих тред.
Т.е. ты тут ждёшь только таких же как ты - думающих с чего начать? И что толку от такого треда?
>Думай молча.
С чего ты решил что ты можешь мне указывать?
>Т.е. ты тут ждёшь только таких же как ты - думающих с чего начать? И что толку от такого треда?
С чего ты решил что тут должно быть как ты хочешь?
>Как взаимодействовать с контейнером из классов?
Вся соль контейнера в том что тебе не нужно взаимодействовать с ним из классов. Ты в конструкторах описываешь нужные зависимости, и контейнер эти зависимости за тебя резолвит.
>Как поступить более правильно? Или, может, все варианты сосут и есть какой-то другой?
У любой программы есть точка входа, подумай какая точка входа нужна для твоего приложения и что она должна делать? Для твоего веб приложения упрощенно это почти всегда инициализация, рут -> обработчик. Т.к. контейнер в иерархии находится ближе точке входа то у тебя есть возможность просто сказать ему, контейнер - вызови обработчик и передай ему все зависимости. (На этом этапе еще тесно можно общаться с роутером и биндингом переменных рутов и переменными обработчика, например /post/:id и передавать в $id это значение).
И почему ты автовайринг выключил? Это же пушка
Почему нет? Представь что ты в public/index.php подключаешь этот файл, получаешь объект контейнера, и всё, ты можешь инитить любой класс, тот же роутер, ну а дальше понятно.
>Вся соль контейнера в том что тебе не нужно взаимодействовать с ним из классов
В принципе, я предполагал такой вариант. Это объясняет, почему в доках ничего по этому поводу нет.
>И почему ты автовайринг выключил? Это же пушка
Я пока несколько путаюсь в этой теме, поэтому сейчас хочу руками указывать зависимости. Как начну лучше понимать происходящее, можно будет и включить.
Вообще, мои искания начались вот с какого вопроса - как передать в объект два разных объекта одного и того же класса. Автовайринг тут, очевидно, не сработает. В процессе поиска ответа понял, что нихуя не понимаю, как оно работает.
>>11355
Ну, допустим. А какие очевидные минусы имеются к варианта 3 (кинуть контейнер через set)? Или тут уже принципиальной разницы нет?
>Ну, допустим. А какие очевидные минусы имеются к варианта 3 (кинуть контейнер через set)? Или тут уже принципиальной разницы нет?
Я, если честно, вообще не понял зачем ты контейнер засовываешь в контейнер и как это тебе поможет. Это же какой-то бред на уровне return $var === true ? true : false;
>как передать в объект два разных объекта одного и того же класса. Автовайринг тут, очевидно, не сработает.
Автовайринг сработает, но скорее всего по дефолту передастся две ссылки на один и тот же объект, хотя реализация вообще разная может быть. Для таких случаев используются биндинг или фабрики, например у тебя класс принимает два одинаковых интерфейса, но ты хочешь две разные реализации засунуть. (Хотя выглядит это очень странно и тупо)
есть нативная функция mail() в пхп, которая для отправки почты использует встроенный почтовый сервис операционной системы. В линукс он есть по дефолту.Я работаю с вин7, и у меня это функция не работает.
Так же существует smtp - протокол и smtp-сервера. Что бы отправить на такой сервер письмо - необходимо что бы данное письмо соответствовало стандарту smtp. Для этого используют библиотеки типа PHPMailer.
Я правильно понимаю?
Если я работаю из винды, то мне требуется поставить smtp сервер какой нибудь. Настроить его, и уже из своих скриптов отправлять на него письма, которые уже этот сервер будет рассылать куда нужно.
Так?
Либо да (нет), либо хранить как json в sql базе, либо хранить как json в json-ориентированной базе типа монгодб на выбор
Вообще ниоткуда не отсылаю пока что, хочу толково понять что к чему. О том и вопрос
Я правильно цепочку понимаю:
Мой пхп код -- вызываю smtp клиент, он формирует письмо и отправляет на smtp сервер, который отправляет письмо адресату . Так ?
Здарова, пыхеры.
Для стороннего заработка хочу делать магазы на вордпрессе со всякими опенкартами.
Вчера немного пописал на пхп, освоился, нынче хочу задать вопрос, я так понимаю плагины со всякими валидациями и куками хранятся в композере?
Во что мне посоветуете углубиться, или же забить на это хуй и учиться чисто вордпрессу, а там все плагины сами всё сделают?
Кстати, что за хуйню ублюдочный оракл сделал с сайтом mysql? Вчера зашел и ахуел
Сам жээс фулстак.
/web
$conteiner->register('request', Request::class);
Когда я буду получать реквест в конструкторах других классах мне будет возвращаться один и тот же обьект?
Или есть у меня зависимость шаблонизатора Twig. Я хочу в этот шаблонизатор добавить глобальную переменную класса Session.
$container->register('twig', Environment::class)
->addArgument(new Reference('twig.loader'))
->addMethodCall('addGlobal',['session', new Reference('session')]);
Если мне, допустим, нужно определить Session еще и в конструкторе асбтрактного контроллера. У меня будет один и тот же обьект Session в обоих случаях? Или создадутся 2 разных обьекта? Смотрю примеры фреймворков (Symfony, Laravel) вообще ничего не ясно. Доки симфони по контейнеру прочитал, думаю, десяток раз. Не вижу там этой инфы. Еще меня смущает использование таких обьектов как $app, response в контроллерах. Как они обьявлены глобально?
Подскажите хотя бы как это загуглить, ибо как не ищу выдает одни и те же доки на разных языках, но там только описано как задать зависимость, например.
>У меня будет один и тот же обьект Session в обоих случаях? Или создадутся 2 разных обьекта?
А тебе в исходниках посмотреть не судьба эти методы?
Да я без негатива вроде, хз.
Смотри тот метод, где разрешается зависимость очевидно - как оно там работает. Исходники-то открыты.
Ты ж программист.
Я уже все пересмотрел. Сейчас пробовал респонсы создавать разные контейнером и менять в контент. Пришел к выводу что он создается один и тот же. Это радует.
Только пропала одна проблема - появляется новая. Symfony Session компонент просто не работает. Когда пытаюсь его создать - пишет что сессия уже запущена. Но на метод $session->isStarted() возвращает false. Пробовал и session_abort до этого делать и гуглить. В гугле самая большая проблема в том, что выдает запросы по работе с самим фреймворком, а не с компонентом.
Но, конечно же, "все пересмотрел" !== "все понял и разобрал"
Я в некотором замешательстве. Лениво учу python довольно продолжительное время, знаю синтаксис и не более. Да и то поверхностно. Не могу понять где применить этот язык и куда двигаться, везде кричат что нет вакансий, дикая конкуренция итд. Короче полная дизмораль. Подумываю пересесть на стул с php. Скажите, у вас есть четкий алгоритм прихода к успеху на работу? Не уткнусь ли я в лес непонимания куда мне двигаться дальше? У меня тройка по математике и я хочу простую ламповую работку для сыча. Пхп тоже требует адский стек технологий?
бамп!
Аноны, кто в теме объясните подробно.
Как phpmailer может отправлять напрямую письма из винды, если это поидее надстройка над mail(), которая по дефолту вызывает в linux функцию sendmail, а в виндовс на сколько я понимаю не вызывает нихуя ( или вызывает какую то виндовую почтовую службу все таки? )
В принципе в контейнере всегда должен храниться один и тот же объект. Когда ты запрашиваешь объект, идет проверка - если объекта в "хранилище" контейнера нет - он создается, а если нет - возвращается уже созданный объект.
У ОП-a есть урок который позволит понять чуть лучше:
https://github.com/codedokode/pasta/blob/master/arch/di.md
Ты не прав. В контейнерах может лежать по сути фабрика, есть такой подход. В том же симфони контейнере можно указать, тебе кэшировать объект или каждый раз пересобирать его заного.
Ну и да, главная задача контейнера - резолвить зависимости между компонентами, а все прочие кэши-хуеши - дело десятое.
мимо
Везде нужен стек. Но на пхп легче, можно хоть в те же вордпрессы вкатиться. Я хоть и нуб, но не особо понимаю преимущество питона в вебе, язык сам по себе тормознутый, так еще и конкуренты аля пхп => и работы меньше.
Тебе правильно посоветовали: изучать исходный код.
Контейнер Симфони относительно сложный, для изучения лучше взять что-нибудь простое вроде Pimple:
- https://pimple.symfony.com/
- https://github.com/silexphp/Pimple
Контейнер Симфони сложнее, так как он позволяет конфигурировать сервисы через конфиги вроде YML-файлов, а также в нем есть "компиляция" - генерация единого PHP-файла с заложенными в нем настройками, что позволяет сразу загрузить этот файл, а не читать и не разбирать конфиги в дальнейшем. Это повышает производительность.
> Когда я буду получать реквест в конструкторах других классах мне будет возвращаться один и тот же обьект?
Это зависит от контейнера и его настроек. Возможно и то, и то. В Симфони, например, есть специальная опция для выбора, возвращать один и тот же объект или создавать новый: https://symfony.com/doc/3.4/service_container/shared.html
Вообще, на мой взгляд, это плохая идея класть Request в контейнер (или какие-то другие изменчивые объекты). Представь, что у тебя приложение, которое обрабатывает много запросов подряд:
foreach ($requests as $request) {
$container->set('request', $request);
$kernel->handle($request);
}
В ходе работы приложения оно может запросить какой-то сервис из контейнера, и при создании этого сервиса контейнер встроит в него текущий request. Затем при обработке следующего request оно запросит тот же сервис, и ему дадут экземпляр, в который встроен предыдущий request, и который будет "думать", что до сих пор работает с предыдущим запросом.
Раньше Симфони использовала scopes, чтобы не допускать такие ситуации и удалять сервисы вместе с request. Но позже их убрали: https://symfony.com/blog/new-in-symfony-2-8-deprecating-scopes-and-introducing-shared-services Вместо request теперь в контейнер кладут request_stack, который возвращает актуальный request, что по моему не сильно лучше и не исключает того, что долгоживущий сервис сохранит себе копию request.
Также Симфони могла бы пересоздавать контейнер на каждый новый запрос. В любом случае, мне это их решение не нравится. Проще просто не класть request в контейнер.
> $container->register('twig', Environment::class)
> ->addArgument(new Reference('twig.loader'))
Это, кстати, можно настраивать с помощью конфига, а не писать кодом. Правда тогда для оптимизации придется делать "компиляцию" контейнера.
> Еще меня смущает использование таких обьектов как $app, response в контроллерах. Как они обьявлены глобально?
Ты бы дал пример кода или ссылку, а то непонятно, о чем речь. Непонятно, где ты их увидел, какой фреймворк или библиотеку использовал, какой версии. Симфони, например, умеет смотреть на тип аргументов в методе контроллера и автоматически передавать туда подходящие объекты (мануал: https://symfony.com/doc/3.4/controller.html#fetching-services-as-controller-arguments )
Тебе правильно посоветовали: изучать исходный код.
Контейнер Симфони относительно сложный, для изучения лучше взять что-нибудь простое вроде Pimple:
- https://pimple.symfony.com/
- https://github.com/silexphp/Pimple
Контейнер Симфони сложнее, так как он позволяет конфигурировать сервисы через конфиги вроде YML-файлов, а также в нем есть "компиляция" - генерация единого PHP-файла с заложенными в нем настройками, что позволяет сразу загрузить этот файл, а не читать и не разбирать конфиги в дальнейшем. Это повышает производительность.
> Когда я буду получать реквест в конструкторах других классах мне будет возвращаться один и тот же обьект?
Это зависит от контейнера и его настроек. Возможно и то, и то. В Симфони, например, есть специальная опция для выбора, возвращать один и тот же объект или создавать новый: https://symfony.com/doc/3.4/service_container/shared.html
Вообще, на мой взгляд, это плохая идея класть Request в контейнер (или какие-то другие изменчивые объекты). Представь, что у тебя приложение, которое обрабатывает много запросов подряд:
foreach ($requests as $request) {
$container->set('request', $request);
$kernel->handle($request);
}
В ходе работы приложения оно может запросить какой-то сервис из контейнера, и при создании этого сервиса контейнер встроит в него текущий request. Затем при обработке следующего request оно запросит тот же сервис, и ему дадут экземпляр, в который встроен предыдущий request, и который будет "думать", что до сих пор работает с предыдущим запросом.
Раньше Симфони использовала scopes, чтобы не допускать такие ситуации и удалять сервисы вместе с request. Но позже их убрали: https://symfony.com/blog/new-in-symfony-2-8-deprecating-scopes-and-introducing-shared-services Вместо request теперь в контейнер кладут request_stack, который возвращает актуальный request, что по моему не сильно лучше и не исключает того, что долгоживущий сервис сохранит себе копию request.
Также Симфони могла бы пересоздавать контейнер на каждый новый запрос. В любом случае, мне это их решение не нравится. Проще просто не класть request в контейнер.
> $container->register('twig', Environment::class)
> ->addArgument(new Reference('twig.loader'))
Это, кстати, можно настраивать с помощью конфига, а не писать кодом. Правда тогда для оптимизации придется делать "компиляцию" контейнера.
> Еще меня смущает использование таких обьектов как $app, response в контроллерах. Как они обьявлены глобально?
Ты бы дал пример кода или ссылку, а то непонятно, о чем речь. Непонятно, где ты их увидел, какой фреймворк или библиотеку использовал, какой версии. Симфони, например, умеет смотреть на тип аргументов в методе контроллера и автоматически передавать туда подходящие объекты (мануал: https://symfony.com/doc/3.4/controller.html#fetching-services-as-controller-arguments )
Юзал 7.2, ставил пакеты требующие именно 7.2.
Откатил до 7.0 - теперь composer не может их удалить
>>v6.4.1 requires php ^7.2 -> your PHP version (7.0.32) does not satisfy that requirement.
Такая вот ошибка пишется.
--ignore-platform-reqs
Композер, как я понимаю, обновляет версии в большую сторону. Проще всего удалить папку vendor и composer.lock и запустить установку заново.
Бамп вопросу, я может не совсем правильно спросил, имелось ввиду смогу ли я вкатится во что нибудь простенькое вроде пилить сайтики на фрилансе. На начальном этапе и 20-30к зарплата ьудет норм. Что для этого необходимо знать?
Очень много всего, на самом деле. Для начала, попробуй сделать студентов или файлообменник из оп поста. Дальше уже сам будешь видеть какие у тебя пробелы.
Алсо, не рекомендую сразу во фриланс нырять, ты с 90% будешь пилить адовый говнокод.
Ребят, я уже спрашивал но конкретного ответа не получил. Какая загруженость на работе в веб-конторах? На данный момент я сижу с утра до ночи и либо код пишу либо что то читаю. Пока что все устраивает, но понимаю, что если дальше так продолжу то выгорю или ослепну нахуй. А на счет работы боюсь что меня возьмут, а я не буду успевать работу выполнять.
Тоесть ты предлагаешь учиться на собственных проектах. Придумывать сайт с функционалом, потом реализовывать его. Что скажешь о cms, оно вообще нужно или сразу фреймворк учить? Имеет ли смысл пилить свой движок для сайта?
Сильно зависит от конторы. Среднее по больнице никто не даст.
У пхп ждунов только ларавел конторы. Бойся как огня всяких вордпресс контор. Не делай сложных заданий дома. Налегай на жс. Быстрее вкатишься.
Хочешь СМС изучать или программистом стать? Программист не ограничен пхп проектами.
Да и вообще ты сможешь себя программистом в полном смысле считать только когда в командной разработке участвовал. СМS подразумевает что один чушка по быстрому накидывает плагинов и проверяет чтобы это все минимально работало.
Это не мой пост, мне лучше чтобы без cms , а то это зашквар как я понял. У python и php есть точки соприкосновения? Будет профит если знать оба языка?
У меня в городе просто нет вакансий для чистого Laravel junior. Везде упоминается Yii как минимум. А то и на cms скажут шаблон натянуть - хер знает. Стоит ли мне без опыта в такую контору идти чтобы его набраться? Или сидеть ждать чуда/искать фриланс на ларке/symfony.
Зашкар или не зашкар понятия какие-то детские. Это твой путь или не твой, может кто хочет стать cms одиночкой на арворке. Кто-то веники вяжет и неполохо себя чувствует.
>Алсо, не рекомендую сразу во фриланс нырять, ты с 90% будешь пилить адовый говнокод.
Тут считаю двоякая ситуация. Для большинства войти-в-ойти это что то типа двери в нарнию, где тебя добрые дяди возьмут к себе, научат и платить будут. В принципе это потенциально возможно.
Но в этом контексте я считаю что личные качества значат больше чем навык, навык придет по итогу если код писать. А вот решительность, активность, предприимчивость, умение искать работу и себя подавать - это стоит гораздо дороже всех прочих личных навыков, и на самом деле не просто так из воздуха берется. А уж если ты еще и начинающий.
Я это к тому говорю, что по итогу на любой скилл будет покупатель. Я лично видел статичный прости Господи лендиг это был пиздец ужас, на табличной верстке за который взяли 10 тыщ. Тут полтреда за 10 к и месяц времени фреймворк ебанет и магазин поверхнего. Утрирую конечно. Но работать зная что ты учишься,и тебе еще и бабла заплатят, пусть и на дошик - это гораздо приятнее.
Поэтому эти вещи стоит прокачивать, просто реально по себе искать задачи. Люди на такой хуйне зарабатывают порою, что диву даешься. Кабанчики не зря подскакивают в этой жизни.
>>12298
>>Программист не ограничен пхп проектами.
Золотые слова. Я как в пхп основательно въехал - для меня в node.js все значительно яснее стало.
>Золотые слова. Я как в пхп основательно въехал - для меня в node.js все значительно яснее стало.
Хочу когда с пхп разберусь и стану хотя бы мидлом - начать учить другие языки. Считается ли это нормой? Помню в треде писали что нужно выбирать что то одно - там и сидеть.
Скорее наоборот, чтобы стать мидлом придется учить другие языки и технологии. Иначе будешь на одном месте сидеть.
У бекендеров принято ещё и фронтенд знать хоть как-то. Тот же js тебе по-любому изучать придётся. Никто не мешает потом на него перекатиться.
Ноду ту же щупал, наверное, каждый второй из местных.
Кажется я понял почему PHPmailer может отправлять smtp-почту - потому что соединение реализуется черкз сокеты. А их пхп нативно поддерживает.
Я прав?
что не так?
<?php
error_reporting (-1);
$human1 = mt_rand(1,6);
$human2 = mt_rand(1,6);
$cpu1 = mt_rand(1,6);
$cpu2 = mt_rand(1,6);
$humanSum = ($human1 + $human2);
$cpuSum = ($cpu1 + $cpu2);
if ($humanSum > $cpuSum);{
echo "Победа человека!\n";
}
elseif($humanSum < $cpuSum);{
echo "Победа ИИ!\n";
}
else ($humanSum == $cpuSum);{
echo "Ничья!\n";
}
?>
Идеон говорит что-то не так с синтаксисом PHP Parse error: syntax error, unexpected 'elseif' (T_ELSEIF), expecting end of file in /home/m5d2V4/prog.php on line 16
ПХП Шторм подсвечивает выделенные жирным скобки как Expecting statement
<?php
error_reporting (-1);
$human1 = mt_rand(1,6);
$human2 = mt_rand(1,6);
$cpu1 = mt_rand(1,6);
$cpu2 = mt_rand(1,6);
$humanSum = ($human1 + $human2);
$cpuSum = ($cpu1 + $cpu2);
if ($humanSum > $cpuSum);{
echo "Победа человека!\n";
}
elseif($humanSum < $cpuSum);{
echo "Победа ИИ!\n";
}
else ($humanSum == $cpuSum);{
echo "Ничья!\n";
}
?>
Идеон говорит что-то не так с синтаксисом PHP Parse error: syntax error, unexpected 'elseif' (T_ELSEIF), expecting end of file in /home/m5d2V4/prog.php on line 16
ПХП Шторм подсвечивает выделенные жирным скобки как Expecting statement
<?php
error_reporting (-1);
$human1 = mt_rand(1,6);
$human2 = mt_rand(1,6);
$cpu1 = mt_rand(1,6);
$cpu2 = mt_rand(1,6);
$humanSum = ($human1 + $human2);
$cpuSum = ($cpu1 + $cpu2);
if ($humanSum > $cpuSum);{
echo "Победа человека!\n";
}
elseif($humanSum < $cpuSum);{
echo "Победа ИИ!\n";
}
else ($humanSum == $cpuSum);{
echo "Ничья!\n";
}
?>
Точно! Спасибо.
Но теперь Шторм ругается на
else ($humanSum == $cpuSum) {
echo "Ничья!\n";
}
Cannot use [] for reading
>В чем?
Ты теперь на каждый пук будешь у нас спрашивать?
Сходи и сам посмотри как правильно писать на пхп надо.
будем надеяться,что тебя забанят
1) Откуда берётся ноль? Пробовал убрать с помощью $i+1, но не вышло.
2) Я хочу, чтобы у меня в $a записывались числа при помощи цикла, после чего при появления знака '+' - он прекращал записывать цифры в $a и начал следующие цифры после знака '+' записывать в $b. Как это реализовать?
У тебя не видно чему равен $input и чему равно начальное значение $a. Может, там такой код?
$a = 0;
....
$a = $a . $char;
Здесь оператор точка перед склеиванием преобразует число 0 в строку "0" и к ней приклеит следующую цифру.
Бля, точно, спасибо.
А как можно добавлять число к числу, без преобразования в строку?
$a += - не преобразует, но он тогда просто прибавляет цифры. Какой-то оператор для этого существует?
А не надо вначале было класть 0. Помести в переменную пустую строку.
Также, ты мог бы использовать математику вместо строковых операций, что будет красивее. Формула такая:
число = число умножить на 10 + новая цифра.
>А не надо вначале было класть 0. Помести в переменную пустую строку.
Так поменял я, я говорю о том, как сделать так, чтобы переменные добавлялись не в строку и чтоб на выходе получалась НЕ строка.
>Формула такая:
Формула чего?..
>>12543
Ну фронтэнд это ясное дело. Просто все обычно к стеку так привязаны, советуют делать упор конкретно на него. А я хочу и все фреймворки шарить, и в ноде копаться, и в питоне. Но если так даже принятно, то в чем вся "болезненость" перехода на другой язык? Или это все сказки неосиляторов?
>> Но если так даже принятно, то в чем вся "болезненость" перехода на другой язык? Или это все сказки неосиляторов?
Я с ноды начинал, у нее документация для нуба - ад адский. Я вообще нихуя не понимал. Че от чего наследуется, и нахуя оно вообще нужно. И как из этого говна сайт собрать. Потом между делом изучил питона синтаксис, но питон рыночек порешал. На нем крайне мало для нуба работы.
По итогу пришел в пхп, выучил sql, и так по гайдам, по видосам и прочем я разобрался и в сессиях, и в ООП и в том как вообще должно быть организованно приложение. Слои, контейнеры и все такое.
Я все еще нуб, но именно на пхп я начал понимать что к чему.
Сейчас для одного человека пилю личный кабинет для сайта, за небольшие деньги, типа первый проект. И все дается через боль, но идет вперед.
И когда я возвращаюсь к node иногда - я прям гораздо проще понимаю что к чему, яснее.
Но это я с позиции нубаря.
>А я хочу и все фреймворки шарить,
Время
>и в ноде копаться, и в питоне.
Время x20
>Но если так даже принятно, то в чем вся "болезненость" перехода на другой язык?
Во времени. Если ты можешь тратить на это всё по 25 часов в сутки большую часть своего свободного времени то все ок.
Нет проблемы выучить yii, laravel и symfony ибо в целом они все mvc, только со своими внутренними правилами. Если поймешь какой-нибудь один из них, то с другими будет уже проще разбираться.
Тоже самое и с другими языками программирования. В них свой синтаксис, свои нюансы, свои библиотеки/фреймворки/мода.
Нужно следить за новыми версиями языка/фрейворка. Обновляться если в новой версии есть какие то исправления по критическим проблемам / улучшение производительности.
Я все ржу когда вспоминаю как в 7.0 или 7.1 зарезервировали слово Object и на одном проекте пришлось в коде все это переименовывать
Нет смысла быть человеком-оркестром. Стоит грамотно выбирать то, что учить.
Плюс не забывай, что если постоянно работать и/или учиться то можно просто ебнуться и выпилиться.
Понятно, что учиться можно бесконечно. Да и некоторые аноны с нулевыми знаниями работать шли и там уже учились.
>Нет проблемы выучить yii, laravel и symfony ибо в целом они все mvc
Ну я узнал о psr-7. И сейчас в компонентах ковыряюсь. Как я понимаю в пхп фреймворки все на одном фундаменте построены.
>В них свой синтаксис, свои нюансы, свои библиотеки/фреймворки/мода.
Мне кажется синтаксис другого языка не очень долго учить, мода - да. Не знаю почему, но не верится что для перехода с той же пыхи на руби или питон у мидла потребуется более 1 месяца. Ну потеряю я на месяц-два чуть чуть в зп, лучше чем на люстре вздернуться.
>Плюс не забывай, что если постоянно работать и/или учиться то можно просто ебнуться и выпилиться.
На самом деле я уже начинаю этого бояться. Слишком спешу и времени много уделяю, жаль что выбора другого нет.
>>13424
Можешь откликнуться на вакансию - пришлют тестовое. Даже если ты его не сможешь сделать/сделаешь плохо, то для тебя это какой никакой а опыт. Возьмут - хорошо, не возьмут так хоть практики прибавиться.
>Нет смысла быть человеком-оркестром. Стоит грамотно выбирать то, что учить.
А я считаю, что поковырять стоит всё что интересно и дотянешься, но при этом иметь собственный стек в котором сечёшь.
Напиши программу, выводящую таблицу умножения чисел от 1 до N на самих себя, используя цикл. Программа должна вывести примерно такой результат:
1×1 = 1
2×2 = 4
...
9×9 = 81
Я не понимаю вообще эти ебаные циклы.
Это какая-то дичь.
Скачай видеоурок какой-нибдуь и посмотри. Или на ютубе. Всё станет ясно и понятно.
Советую именно так делать. Если всё ещё не поймёшь - гугли как сделать такой цикл (таблица умножения). Но не копируй, а разбери по строке, что происходит и почему прибегаю к туториалам, которые ты прошёл.
То у одного регнуться нельза, у другого дебильные ограничения на название группы, у кого-то код отформатирован так, будто копипейстом за одну ночь настрочено.
Вы там своё говно вообще тестируете?
Сможешь ли ты в спойлере хотя бы показать как?
Логика от меня начисто ускользает.
Я третий день сижу за этим и похоже зря теряю время.
Если надо что-то совсем плюшевое, то:
for I>N
{
echo "<tr>$X</tr><tr>x</tr><tr>$X</tr><tr>=</tr><tr>pow($X)</tr>"
}
чувак так далеко не уедешь. Расскажи как ты пытался решить эту проблему, какой код писал, что именно было не понятно.
а почему говорят,что лучше нода с сокетами?
Я знаю что не уеду.
Я не понимаю ебучего принципа как это говно работает, это ускользает от моей человеческой логики.
Ну теперь когда я пробомбился, я не понял почему у меня не умножает
$a =1
$b = $a*$a;
for ($a = 1; $a < 10; $a++) {
echo "$a X $a = $b";
}
А надо чтобы выводило:
1Х1 = 1
2Х2 = 4
3Х3 = 9
И так далее до 10.
Я не понимаю как отобразить вывод, как сделать так чтобы число само на себя умножалось и как оно бы посчиталось.
По моему пиздец какой неудачный пример и резкий скачок в сложности там.
Просто цикл при увеличении на единицу понятен, но дальше просто космическая пропасть сложности.
for ($b=1; $b<=9; $b++) {
for ($i = 1; $i <= 9; $i++) {
echo "$b $i = " . $b $i . "<br>";
}
}
Или
for ($i = 1; $i <= 9; $i++) {
echo "$i $i = " . $i $i . "<br>";
Просто не твоё.
В IT много разных профессий - попробуй что-нить более понятное и не задротное.
>$a =1
>$b = $a$a;
Не нужно
>for ($a = 1; $a < 10; $a++) {
правильно
>echo "$a X $a = $b";
неправильно.
echo "$a X $a = " . $a $a;
> Нет проблемы выучить yii, laravel и symfony ибо в целом они все mvc
Тащемта то, что называется mvc в yii и (частично) laravel - это хуита, которую перенесли из старых GUI-шных приложений и не адаптировали нормально под веб.
Ну и в принципе, 99 погромистов из 100 понимают "модель" как слой работы с базой данных, "контроллер" как место, где нужно писать (бизнес) логику, а "вьюху" как место, где нужно принтить данные.
Что, естественно, не так.
>>$b<=9;
А зачем тут равно?
Один знак < меньше достаточен только 10 указать и явно все окончится 9кой.
Ты хули доебался, долбоёбина?
Ну блядь, сука, мне надо числа от ОДНОГО до ДЕВЯТИ выводить, я и сделал цикл от ОДНОГО до ДЕВЯТИ, а не десяти. Иди на хуй, чёрт ебаный
Если стоит просто < 10, 9 и будет последней цифрой и 10 не выведет никак.
В остальном твой бомбаж как бы говорит что ты говно.
>послал выблядка на хуй
>анон считает, что это бомбёж а не призыв к действию
Выключай свои маняфантазии и иди работать.
Я понял что ты тот шизик что тут срет.
Если вкратце, то:
"Модель" обычно понимается как "набор классов-моделей бд", что ошибочно. "Модель" является "моделью бизнес-области", по аналогии с математической моделью.
По сути, работа программиста - это моделирование некие бизнес-процессы средствами программного кода.
Соответственно, модель ничего не знает про то, на чём она работает, не знает ничего про базу данных и всё такое, там пишется платформо-независимый код.
Далее, "вьюха" и "контроллер", эти штуки нужны были в те времена, когда софтина крутилась на одной машине с пользователем, соответственно, была задача "отображать" что-то на экране и "контролировать" приложение, улавливая сигналы. Сейчас в вебе как бы всё давно не так, mvc, mvp и прочее актуальны для десктопов и мобилок.
Сейчас в вебе нужен слой транспорта/интерфейсов (сокеты/http/grpc/*), вызывающий слой приложения (содержит юз-кейзы), который уже вызывает конкретный сценарии из модели и связывает их в конкретный юз-кейз.
При этом оно всё базируется на инфраструктурном уровне, который уже содержит реализации работы с бд (к примеру, в виде репозиториев) и прочее.
Там много всего и ещё больше тонкостей, читай про clean architecture, hexagonal architecture и domain driven design.
>я мимокрокодил и вообще не кодил ничего
А какой тогда смысл с тобой вообще время терять? Притащил статей чтобы срач начать, а сам отношения к разработке не имеешь.
Иди-ка ты в/б, дружок.
имеет место проблема с кешированием сайта, сделанного на slim
Суть проблемы - делается урл типа /delete/2
по нему система удаляет файл с айдишником 2, обычный анлинк. Проблема в том, что к концу дня этот урл перестает удалять файл.
НО, если я очищаю кэш браузера, то урл начинает работать и срабатывает еще пару раз. А потом по-новой очищай. Вопрос - кто-нибудь сталкивался с подобным? Куда хоть копать? В сторону браузера? В сторону хостера (бегет)? В сторону слима? Я добавил в шапку сайта заголовок с ноу-кэш. Не помогает. Смотрел в трех разных браузерах - везде одинаково.
А, в глаза ебус. Сорян.
Ты или по пунктам критикуй, или не возникай. И да, сам попробуй уложить архитектуру приложений в 2 абзаца.
Ну и да, если совсем кратко:
- "модель" - это модель предметной области, содержит бизнес-логику
- "контроллер" - это то, что нужно делить на две части, собственно, "хендлер" (вычитывает нужные данные из запроса) и "юз-кейз" (валидирует данные, вызывает модель)
- "вьюха" не нужна совсем.
>Соответственно, модель ничего не знает про то, на чём она работает, не знает ничего про базу данных
Минуточку, а скул-запросы куда лепить? В контроллер? Или во вью? Куда их ещё-то, как не в модель? И как можно написать запрос, который будет ничего не знать, в какую базу он полезет: в оракл или в майскул?
в сервис
контроллеру насрать, каким образом получается нужный набор объектов из модели
он только говорит "а дай-ка мне такие объекты"
потому что завтра ты поменяешь БД на обращение к микросервису, и чо, будешь контроллер еще переписывать?
а там и до гуя дойдешь?
Анон дело говорит. Ты описываешь интерфейс, скажем:
interface UsersRepository {
public function Load(int $userId);
public function Save(int $userId);
public function LoadByName(string $name);
}
И используешь его в сервисах и юз-кейзах. А этот интерфейс уже может реализовывать MysqlUsersRepository, который и делает запросы.
ну его нах
>по пунктам критикуй
Пережовывали сто раз уже на форумах. Нах ты сюда это принёс, болезный? Ни кода, ни своих наработок - только чужие статьи и чужие мысли.
Кого критиковать, тебя? Ты никто вообще.
Хз, я не пробовал, но с большой настороженностью отношусь к любым таким надстройкам над php. Может и норм, но я бы всё равно ноду взял.
ну я про то же.асинк-это не про пых
>потому что завтра ты поменяешь БД на обращение к микросервису, и чо, будешь контроллер еще переписывать?
Зачем контроллер? Модель. А "сервис" - это уже не MVC же получится. Я что-то запутался в вебе образца 2019.
Олсо, за это "мы делаем сайт визитку, но вдруг завтра он станет порталом на микросервисах и оракловой базой в распределённом кластеере? Давайте предусмотрим всё!" известный всем нам товарищ рекомендовал в своей книге (обязательной для изучения любому программисту) пиздить ногами.
Что за книга? Прям увожением проникся к товарищу.
городить абстракции на абстракции только потому, что так можно, и может пригодиться когда-нибудь - признак дегенерата от программирования
>Что за книга?
Честно говоря, я забыл и как его звали, и как называлась книга. Не то Кнут, не то Страуструп, а может ещё кто-то из их компании. Постоянно мелькает эта книга, а я постоянно забываю название.
Клавиша shift
Если ты общаешься в интернете, то, наверно, заметил, что у некоторых людей есть дурная привычка, вопреки всем правилам и нормам русского языка, начинать все предложения (и даже иногда имена) с маленькой буквы. Поскольку никакие аргументы на таких людей не действуют, давай исправим их текст с помощью языка PHP.
Не знаю как составить регулярное выражение для разделения текста на строки. Не получается впихнуть пробел в такое выражение '/[.!?]+/u' .
http://sandbox.onlinephpfunctions.com/code/943693eba4c9584583afc1fa406796417445212a
Ну я понел примерно.
Помню первые парсеры писал и с ООП игрался - наворачивал одно на другое вечерами - библиотеку на фасад, с тором чтоб и многопоточно, и по SOLID всё надо красиво. Потом заметил, что я третий день пишу ёбань и ни строчки конкретной логики, и написал за полтора часа всё что надо. Тогда и понятно стало, что тормозить надо все эти фантазии и писать конкретику, иначе дроч один.
Надо, Федя. Надо. Это за бабло заказчику извлоль быстрее, некогда проектировать и так сойдет. Когда учишься нужно айл ду май бест всегда делать. Вот наспупит реальный случай, когда сеньор-помидор психанет и нахер уволится, и придется тебе придумывать архитектуру 1000 человекочасов. А ты обосрешься и будешь дальше всю жижнь свои мокрописьки писать. Оно конечно понятно что 90% веба - это мокрописки. Но хочедца расти над собой.
- Дарья, когда котлеты будут?
- Через десять минут Филипп Филиппович.
- Молодой человек, изволите обследоваться, приходите после обеда к трем часам.
Молодой человек, помогите пожалуйста
>Не получается впихнуть пробел в такое выражение '/[.!?]+/u'
Она берет фреймворк типа битрикс и берет джуна типо знающего жиквери и пытается их померить
/[.!?]+/u =====> /\s/u
Разбивает теперь по словам....
Возможно я неправильно описал проблему.
С предыдущей маской /[.!?]+/u получается это
__________________________________________________________
array(3) {
[0]=>
string(11) "ну что"
[1]=>
string(47) " не смотрел еще black mesa "
[2]=>
string(86) "я собирался скачать ,но все как-то некогда было"
}
__________________________________________________________
Вроде бы всё ок, но остаются пакостные пробелы в начале и конце строки... Как бы их убрать?
Тагда аставайся.
Шоб ты долго не искал самое важное
Понятно, что для сайта-визитки сложного бекенда не надо.
Но:
1) Не все пишут сайты-визитки;
2) Софт имеет свойство усложняться, а не упрощаться со временем;
Я приведу аналогию с канализационной системой и прочей инфраструктурой. Проектируешь ты такой городской район и тебе говорят, что там 3.5 хижины находятся. И ты бросаешь им провода с соседнего здания, пару труб - и все счастливы.
А потом появляется ещё хижина, ещё одна, домик, домик, магазинчик, маленький заводик, офисное здание, блядский сраный небоскрёб и статуя огромного кота.
И если ты в какой-то момент (а может даже сразу) не сделал нормальную развязву, систему распределения и так далее, то в итоге всё превратиться в тайские коммуникации (https://om-ek.ru/image/cache/catalog/photo/vxTa4HosZ4w-800x600.jpg).
Именно для этого и придумали архитекутуру, методы, паттерны и так далее - как набор инструментов и способов выстраивать инфраструктуру так, чтобы в итоге не самоудавиться случайно.
И говняный MVC при усложнении логики - это отличный способ навернуть говнеца, ещё говнеца поверху и запечь в совершенно нечитаемый дерьмонолит, разработчики которого уволятся или умрут от ужаса, фичи будут пилиться годами, вызывая каскады регрессий и всё такое.
Так что не будь дауном, применяй паттерны и инструменты с умом и не ври мне тут, что "не нужно и всё и так работает", всегда после таких слов я заглядывал в код разработчика и видел кромешный пиздец.
Нормально делай и нормально будет.
Разбей исходную строку на предложения. В них сделай заглвные буквы и склей. Чтобы регулярки подбирать удобно пользоваться этим https://regex101.com
А, увидел. Вообще способов много можно придумать, сам не помню каким делал. Но сейчас первое что в голову приходит - разбить строку на предложения, потом предложения на слова. И все это склеить. Но мне кажется можно сделать как то легче с помощью регулярок
Для начала, использовать онли симфони либо ларавел, если мало опыта. yii и cms-ки - это архитектурный ад.
Во-вторых, прочитать гайды, советы и бест практики по выбранному фремворку.
В-третьих, выше уже писали. Изучать clean architecture, hexagonal architecture и ddd, а затем их реализации на php, лучше на конкретном фремворке. Лучше пока ещё ничего не придумали.
Ты в глаза долбишься что-ли?
Симфони, либо ларавел, если мало опыта.
Много опыта -> симфони
Мало опыта -> ларавел
Интересно где найти контору, которая делает все на чем то одном. Как правило это студия где делается все и на всем, от wordpress до laravel. Или ДСах это норма?
"Задача" стоит в том чтобы воспользоваться им в дальнейшем наименее больно, для этого нужна та или иная обертка, какие рассматриваются варианты?
1. работать полностью по философии битрикса только насытить обертку чеками и некоторыми нужными вещами которые в апи отсутствуют в силу говности - этот вариант наименее удобен для дальнейшего пользователя библиотеки но наиболее устойчивый об этом далее
2. делать обертку в виде классов гейтов и дтошек на всякие сущности с минимальными проверками уже в дтошках, всем остальным внутри гейтов
3. спрятать апи по сути в "орм" поверх него, играй с модельками и кидай в персист, на остальное тебе посрать, возможно немного кодогенерации для отражения схемы реального портала на модели или тому подобное
варианты 2. и 3. (в меньшей степени) "опасны" в том плане что т.к. контракт у этого апи по сути так же как и документация
"прозрачный", почти невидимый, то следовательно код который оборачивает его вероятно придется часто менять, так-же не понятно с многими вещами как работать, т.к. любой модуль может пихать своё говно в это же самое апи и иным образом его модифицировать
В общем задача завернуть апи наиболее устойчивым и удобным образом, уже два дня бью голову как получше это организовать.
Наличие всяких жидких штучек вроде серверного батчинга с референсами через по сути обращение к серверным php переменным не сильно в этом помогает, мы даже думаем тупо не поддерживать такое.
САП, двач, нужна помощь.
У меня есть три класса с профессиями. Задача: Создать страничку, где с помощью <form> и <select> дать пользователю возможность выбрать профессию, ajax запросом отправить ее на сервер, где нужно получить список полей (свойств класса), сформировать под каждое из них <input> и снова отправить на сервер, где создать выбранный объект класса и записать информацию о создании в лог.
Если пользователь изменит профессию, то список полей должен обновиться.
Что у меня получилось:
1. Создать классы, унаследоваться, разобраться с __constructor, __get и __set и все такое;
2. Создать класс-логгер;
3. Разобраться с запросами и ответами, манипуляцией dom с помощью jquery, добавлением, удалением и обновлением элементов страницы.
Что у меня не получается:
Разобраться с тем, как создать объект на основании информации их $_POST['prof'].
Пробовал разный треш, на который пышечка справедливо шлет меня становиться членодевочкой:
$object = new $_POST['prof']; - так объект создать нельзя
get_class_vars($_POST['prof']); - так нельзя посмотреть методы класса
get_class_vars($_POST['prof']); - так нельзя посмотреть методы объекта.
Я понимаю, что это бред, так как я получаю в $_POST['prof'] строку, а не класс. Но не понимаю, как тогда мне сассоциировать с этой строкой класс, как на ее основании создать объект и заполнить его данными.
К задаче есть подсказка:"Что бы получить список полей (то есть список всех свойств класса профессии), можно создать специальный метод, который будет получать массив всех свойств при помощи функции https://www.php.net/manual/ru/function.get-object-vars.php.
Например, для водителя это будет: Имя, возраст, зарплата, стаж, категории, марка личного автомобиля".
Но мне она особо не помогает, так как я концепцию как таковую не оч понимаю.
Двач, очень прошу, объясни в чем тут дело? Как правильно?
САП, двач, нужна помощь.
У меня есть три класса с профессиями. Задача: Создать страничку, где с помощью <form> и <select> дать пользователю возможность выбрать профессию, ajax запросом отправить ее на сервер, где нужно получить список полей (свойств класса), сформировать под каждое из них <input> и снова отправить на сервер, где создать выбранный объект класса и записать информацию о создании в лог.
Если пользователь изменит профессию, то список полей должен обновиться.
Что у меня получилось:
1. Создать классы, унаследоваться, разобраться с __constructor, __get и __set и все такое;
2. Создать класс-логгер;
3. Разобраться с запросами и ответами, манипуляцией dom с помощью jquery, добавлением, удалением и обновлением элементов страницы.
Что у меня не получается:
Разобраться с тем, как создать объект на основании информации их $_POST['prof'].
Пробовал разный треш, на который пышечка справедливо шлет меня становиться членодевочкой:
$object = new $_POST['prof']; - так объект создать нельзя
get_class_vars($_POST['prof']); - так нельзя посмотреть методы класса
get_class_vars($_POST['prof']); - так нельзя посмотреть методы объекта.
Я понимаю, что это бред, так как я получаю в $_POST['prof'] строку, а не класс. Но не понимаю, как тогда мне сассоциировать с этой строкой класс, как на ее основании создать объект и заполнить его данными.
К задаче есть подсказка:"Что бы получить список полей (то есть список всех свойств класса профессии), можно создать специальный метод, который будет получать массив всех свойств при помощи функции https://www.php.net/manual/ru/function.get-object-vars.php.
Например, для водителя это будет: Имя, возраст, зарплата, стаж, категории, марка личного автомобиля".
Но мне она особо не помогает, так как я концепцию как таковую не оч понимаю.
Двач, очень прошу, объясни в чем тут дело? Как правильно?
Зависит от конкретной конторы и её типа. Если тебя интересуют аутсорсеры, то те, которые подешевле, берутся за всё подряд. Те, которые подороже, могут себе позволить крупных закачиков и какую-никакую архитектуру, они так и так будут тяготеть к нормальным фреймворкам. Но тут всегда нужно очень внимательно смотреть на саму контору, чтобы в ад не попасть, даже крупняк бывает очень херовый и лучше бы в такой не попадать.
А у продуктовых контор основной продукт уже на чём-то написан, можно хоть на собеседовании об этом спрашивать.
Ну у меня в городе из контор только пару контор берущихся за любую работу как я понимаю (любой регион и любая сложность). Я вот начитался, и теперь боюсь идти, ибо скорее всего работать придется со всем cms/yii/laravel
Современный, хорошо задизайненный набор компонентов. Лучше в мире php пока не придумали.
Ну упрашивай и договаривайся, чтобы на laravel работать тогда.
Смотря когда. Иногда без него не обойтись, но по возможности лучше так не делать, конечно.
>ajax запросом отправить ее на сервер, где нужно получить список полей (свойств класса), сформировать под каждое из них <input> и снова отправить на сервер
Мне кажется это лишнее, лучше сразу их куда-нибудь скласть и при смене пункта в селекте рисовать нужные инпуты.
Если задача - просто дать пользователю возможность менять профессию, то городить что-то со свойствами классов изначально ошибочно.
Делаешь класс UserStorage с методами add и get, делаешь класс ProfessionStorage с теми же методами add и get, делаешь класс UserProfessionStorage с методами addForUser и getForUser.
(Чтобы не заморачиваться с бд, то каждый из классов, может писать и читать из файлика, это изи пишется)
так что твоё действие "получить для юзера профессию" будет выглядеть, как:
$profId = $userProfs->getForUser($user->id); // возвращает id профессии или null.
if ($profId !== null) {
$prof = $professions->load($profId);
// тут делаешь с профессией, что хочешь.
}
Фабричный метод тебе в помощь.
Хотя, скорее всего, ты неправильно архитектуру пилишь с ООП это надо продумывать.
Собственно, такие вопросы: https://ideone.com/8Xfm05
1. Есть price и weight. Если я хочу с ними работать, например с учётом ндс цену вывести, то в каком виде и где я должен рассчитывать ндс? Без разницы куда вставить расчёт ндс? Внутри product?
2. функции - являются методами, верно?
3. Если я хочу создать отдельный метод, в котором будет выводиться только цена и ндс, то надо просто создать второй метод с нужными данными, после чего вызвать его? Нужно ли мне ещё один констракт создавать для этого, потому что при создании new Product у меня будут значение кроме ндс и цены, такие как вес, название и пр.?
>3.
Так, с 3им разобрался, нужно указывать все значения констракта, просто новый метод не будет их выводить. Тупанул.
1. Ты неправильно понимаешь "суть" (тм) ООП. ООП - это не про то, чтобы нафигачить классов, это про то, чтобы представлять код в виде объектов (сервисов), каждый из которых выполняет свою работу и по необходимости обменивается сообщениями (вызовами методов) с другими. Всякие инкапсуляции и наследования - это уже частность, следствие объектности.
Также прочитай про SOLID, в частности про принцип единой ответственности.
Грубо говоря - если у тебя есть user, то это просто объект для хранения данных о пользователя, и всё, кроме геттеров и сеттеров там ничего держать не нужно.
Если тебе нужно считать цену - то тебе нужен PriceCalculator, который берёт, скажем, продукт и возвращает посчитанную цену для него.
Если тебе нужно вывести что-то куда-то (запринтить объект в виде html в output), то тебе нужен Renderer, View или что-то такое.
Короче, на каждую область логики тебе нужен свой сервис, не смешивай всё в одном.
2. Метод - это функция, исполняемая в контексте или конкретного объекта (может обращаться к его свойствам), или класса (если метод статический).
>1
Ух. Понятнее не стало. Т.е. мне нужно создать метод подсчёта цены, так? Т.е. должна быть функция подсчёта цены, к которой я буду обращаться в будущем.
Алсо, создам я, например, функцию прайскалькулятор, которая будет подсчитывать цену с ндс. А после чего я её просто засуну в функцию printInfo, верно?
Блин, чё-т сложно и непонятно.
Блин-блинский. Вообще ниче не понимаю. Пойду дальше туториалы смотреть.
Ну, общую суть ты уловил.
Ни один твой клас не должен делать всё, он должен исполнять только свою конкретную работу, не больше. Представь свой код в виде конвейера, в котором каждый твой класс - это или объект, лежащий на ленте, или робот, которой чего-то там делает над объектом, лежащим на ленте.
(собственно, код - это и есть конвейер, он исполняется по одной инструкции, сверху вниз, отдельными "операторами" - функциями, ну ты понял)
Соответственно, твой класс Product задизайнен неверно, потому что у него откуда-то нарисовался метод printInfo(). А твой класс Product, очевидно, хранит информацию о продукте. Всё, если тебе нужно принтить продукт - создавай productPrinter либо Renderer, что-то такое.
Твой код должен выглядеть условно как-то так:
Роутер (принимает запросы и вызывает коллбек) -> Хендлер (получает объект запроса и вызывает нужный сценарий из бизнес-сервиса) -> Бизнес-сервис (описывает сценарии типа "добавить продукт в корзину", "оплатить заказ", вызывая специализированные сервисы по необходимости) -> Инфраструктурные сервисы (база данных, калькуляторы, счётчики, любая фигня) -> начинаем возвращаться назад -> Бизнес-сервис (всё рассчитал, сохранил, возвращает ответ) -> Хендлер (получил от бизнес-сервиса ответ, прокидывает его в сервис, отвечающий за отображение ответа) -> Отображатель (или View, выводит или возвращает какие-то данные в каком-то виде, например продукты в json или ордеры в html)
>Соответственно, твой класс Product задизайнен неверно, потому что у него откуда-то нарисовался метод printInfo(). А твой класс Product, очевидно, хранит информацию о продукте. Всё, если тебе нужно принтить продукт - создавай productPrinter либо Renderer, что-то такое.
Это весьма сомнительное умозаключение. Сделать для дебага функцию printInfo у продукта - это совсем не такая уж плохая идея.
А вообще не плохо было бы сделать сразу несколько классов для продуктов:
1) Продукт как модель, хранящий данные продукта и работающий с базой данных.
2) Продукт как View, отображающий продукт тем или иным образом. Таких View может быть разумеется несколько.
3) Контроллер для продукта, который получает запросы пользователя, выбирает нужный продукт, объединяет нужный продукт с нужной View и выдаёт ответ пользователю.
Это у тебя сомнительное умозаключение. У него в printInfo понаписаны `<div style='border: {$this->border}; ` и прочее, это явный рендеринг уже. Да и принтится любой объект элементарным print(serialize($object)), так что специальные методы в принципе не нужны.
Ну тогда ты прав конечно, html не место в классе продукта.
>print(serialize($object))
Не читабельно получится.
Вместо этого нужно использовать print_r($product) или var_dump($product). А действительности лично я на практике применяю функцию print_r_die($object) и var_dump_die($obejct)
Функция print_r_die() выглядит следующим образом:
function print_r_die($object) {
ob_clean();
print_r_die($object);
die();
}
Функция var_dump_die выглядит аналогичным образом.
В итоге, если нужно отдебажить какой-то объект, я могу в любом месте кода запустить print_r_die() и посмотреть строение любого объекта или массива.
Это в любом случае костыли. С момента создания xdebug надобность принтить объекты практически исчезла, потому что ты смотришь непосредственно на данные в памяти.
Мне не нравится дебажить при помощи xdebug. И я как дебажил принтами, так и буду продолжать.
Для меня это звучит, как "мне не нравится ездить на автомобиле, буду как привык, на лошадях".
Дебаггеры не просто так придумали.
Прочем, как только ты окажешься на достаточно сложном проекте - поймешь. Ох, как же я как-то в своё время заколебался дебажить логику процессинга заказов на одном очень крупном интернет-магазине.. 15 шагов у дерева статусов, нетривиальная логика переходов, куча условий.. Мммм, мякотка.
Пиздос. Ваще нихуя не понятно.
Мне пока элементарные вещи не ясны.
Вот как пример, я создаю вторую функцию getPrice
она должна выглядить так?
public function getPrice(){
$NDS = ($price/100*18)+$price
}
А что мне с ней в итоге делать? Куда её записывать/вставлять и главное как?
Во первых, мне надо, чтобы она выводилась. Значит мне надо создать public $NDS. После чего её надо добавить в констракт, чтобы она существовала. И только после этого добавить её в принт инфо в виде -
<p>{$this->NDS}</p>
Это всё так будет работать или нет?
К тому же, по скольку мы добавили её в констракт, $test = new Product(Запросит здесь NDS указать, а как я её тут укажу?.. 'getPrice()'?)
Точнее строение понятно, но вот что ты там понаписал...
>>15719
Мне в голову пришла совершенно тупая мысль: почему бы тебе не вывести логику расчёта НДС в субд?
Давай начнем с того, что ты нормально вопрос сформулируешь. Что хочешь сделать и что не понятно.
Я же всё вроде расписал.
>>15372
Вот тут вот оригинал кода. Хочу добавить функцию расчёта ндс, чтобы цена с ндс выводилась, но я точно не уверен, как это делается, потому что со всеми этими паблик/констрактами и прочем создалась путаница в голове и я не совсем понимаю строение кода и как его применять.
Собственно, все вопросы которые у меня возникли находятся именно в этом посте >>15719
Ну и зачем ты пытаешься лезть в ООП, если не понимаешь как оно работает. Посмотри на ютубе видос про создание инернет магазина, блога и тд или почитай пикрелейтед.
Большое спасибо за помощь, можешь дальше не отвечать на поставленные вопросы!
Пиздец, каждый вопрос в треде - за место внятного ответа на простые вопросы говорят 'иди читай то, иди читай сё', или предлагают какую-то невъебенно-сложную залупу или же вообще отвечают не по теме, предлагая какие-то базы и прочую хуйню.
Я уже прочитал несколько статей и посмотрел гайды и мне непонятны очевидные вещи, потому что я НЕ ВИДЕЛ как эти вещи решаются на пример. Поэтому я жду ответа правильно ли я понял, как это делается или же что-то нужно изменить/что-то я не понял/делается как-то иначе > >>15719
Я сразу вспоминаю тот видос от какой-то пизданутой психиаторши, которая говорит о программистах и которую тут форсили. На фоне происходящего в треде из срачей и пиздежа не по делу кажется, что она не такая уж и пизданутая.
>Реально, в чём проблема написать 'ты понял правильно, делается так так и так, а в этом случае ты понял не правильно и делать надо как-то иначе'.
Проблема в том, что тут сидят такие же чуваки и им нахуй не впёрлось заниматься твоим образованием.
Ты идиот ваще? Нанимай репетитора и будет он тебе всё расжёвывать, а у нас самообучение в ходу.
Просто судя по твоему сообщению, у тебя на самом деле отсутствует элементарная база, в этом нет ничего плохого. Я рекомендовал тебе посмотреть видосы на ютубе как раз чтобы ты посмотрел как вся эта хуйня работает на примере. Можешь глянуть канал этого чувака что по ссылке, он неплохо рассказывает про ооп и mvc, как только вникнешь в то что он объясняет, многие вопросы сами по себе отпадут.
https://www.youtube.com/watch?v=ba3M3_Myrqg&t=1s
Так если они не понимают - нахуя они лезут? Лол.
Я написал - ваше дело ответить по/ не ответить.
Я точно так же тут где могу отвечаю на лёгкие вопросы, где не могу - молчу.
>у тебя на самом деле отсутствует элементарная база
Дело в том, что я уже много чего прочёл, где-то попрактиковался. Но я такой человек, что если я не понимаю что-то логически, тогда надо просто посмотреть чужой пример. Да и как видишь я выше вроде как расписал план действий исходя из логики, но скорее всего оно не будет работать, потому что я что-то упустил.
Просто я привык копировать и запоминать, после чего применять. А многие вещи в гайдах не упоминаются из-за этого приходиться каждый раз изобретать велосипед. Как ты и сказал, у меня даже не с ООП проблема, а скорее с базой и построением кода при применение ООП.
Просмотрю уже завтра на свежую голову. Может быть найду ответы, спасибо.
Тебе правильно намекнули - ты в теории плаваешь. Без теории ты проста очередная макака за клавиатурой.
Если не делал задачи из ОПпоста, то не лезь ваще никуда пока.
>у меня даже не с ООП проблема, а скорее с базой и построением кода при применение ООП
В твоих сорцах не только с ООП проблема. Ты даже данные неправильно выводишь - через эхо никто не выводит разметку уже лет 15 как. За это по яйцам бьют в хороших коллективах.
У тебя именно базы нет.
ПХП сделан для того, чтобы безболезненно впиливаться в вёрстку, а у тебя наоборот - вёрстка болезненно всунута в ПХП.
Просто чтобы посмотреть данные, то можно выводить через var_dump. Особенно православно получается, если ещё и xdebug накатить.
>Так если я не хочу вардампить
Да не хоти. Только потом не надо обижаться, если тебя макакой кличут и книжки советуют.
Ну с учётом того, что вар дамп был использован, почему бы не перестать его использовать и вписать эко?..
Речь не об echo, а о вёрстке в коде.
Перемешивать логику и представление, а потом говорить, что не понимаешь ООП это, как бы, несколько неправда.
Тебе никто ничего не должен. Учить тебя никто не нанимался. Если что то не получается - ты ОБЯЗАН, как минимум, нормально сформулировать свой вопрос:
"Ребята, помогите. Нужно сделать это вот. Я не понимаю вот тут, пробовал так и сяк, гуглил такое и сякое."
А когда человек заходит и пару постов ноет что у него что то не выходит, при этом считая что ему все должны быстро кинуться и помочь - это свинство.
Не понимаешь ООП? У ОП-а есть хорошая теория и пару задач практических. Понимаешь теорию, но нужна практика? Загугли бля, есть куча практических примеров, реализаций всего и вся. Или ты хочешь чтобы в треде тебе в 1000 раз что то расписывали? Скинули ссылку на видос по MVC - посмотри же его, а не ной что кто то хуевый не ответил на твой вопрос
>Тебе никто ничего не должен.
Где я написал, что мне кто-то должен? Это вы тут некоторые делаете вид, что чё-т полезное пишите, на деле же из 5 человек только 1 чё-т дельное скажет.
>А когда человек заходит и пару постов ноет
>ноет
Один пост спросил, дальше вы сами говно развезли. И ты кста продолжаешь это делать.
>Скинули ссылку на видос по MVC - посмотри же его, а не ной что кто то хуевый не ответил на твой вопрос
А где я, долбоёб, ною? Я сказал человеку спасибо и сказал, что посмотрю.
Иди короче хуй соси, дебил. Вот о таких анонах-проггерах я ранее и писал. Попробуй ещё раз доебаться до меня, я тебя опущу за каждый пункт как это сейчас сделал.
Да мне вообще до пизды. Можешь дальше в глаза долбиться и думать что прав. Я тебе написал как это выглядит со стороны. Опустил он меня, лол. Откуда вы такие лезете отпускатели
Ты же тред засираешь, а не я. Не удивлюсь если ты тот самый шизик-перекатывальщик с JS
>если у тебя есть user, то это просто объект для хранения данных о пользователя, и всё, кроме геттеров и сеттеров там ничего держать не нужно.
проиграл с этого эксперта по ООП.
Ну давай, поясни мне за active record. Заранее знаешь, что я тебе отвечу. Возможно даже Фаулера процитирую, чтобы совсем наверняка.
Ну и какие идеи у тебя по этому поводу?
Да зачем же сразу актив рекорд? Хотя бы какие-то преобразования на приватными данными делать - уже методы нужны. Тот же жснонабле интерфейс например.
Во-первых, ты неправильно понимаешь концепцию приватных полей. На то эти поля и приватные, что они требуются исключительно для работоспособности данного класса и не должны торчать наружу.
Во-вторых, JsonSerializable - это костыль, потому что у объекта может быть много разных представлений в формате json. Самый простой пример - динамический набор полей, какие поля в get-е задал, такие и хочешь получить (есть такая практика в rest api).
Или, к примеру, проверки доступа - такое бывает, что некоторые поля можно возвращать не всегда, например, есть разница, в показе json-представления объекта пользователю (вернув его из апи) или послать этот объект в другой сервис (сервис аналитики, к примеру). Если ты всю эту логику будешь писать в юзере, у тебя получится божественный класс с кучей ответственностей.
Поэтому не путай тёплое с мягким, User - это такой DTO, отвечает за передачу объекта пользователя между компонентами твоей системы, ни для чего более. Для сохранения его в базе тебе нужен будет UserRepository, для представления его в json тебе нужен будет отдельный JsonEncoder или даже UserJsonEncoder (смотри компоненты симфони, которые сериалайзеры, они совсем не зря сделали их именно так или иначе).
Вдруг в один момент у меня перестали работать редиректы:
return $response->withRedirect('/', 301);
Не работают и все тут.
Посмотрел раннюю версию - там все работает. Начал сравнивать - вроде все одно и тоже. Начал дикую еблю с обменом файлов, рокировкой каталогов. И выяснил вот что.
Структура index.php таковы, что зависимости находятся в другом файле и подгружаются в index.php.
Типа такое - require_once $_SERVER['DOCUMENT_ROOT'] . "/dependences/dependences.php";
Методом перебора я выяснил что если который в файле зависимости подкинут в файл глючной версии - то все работает. Херня только в том, что код и там и там одинаковый.
Более того, если код из глючного файла поместить прямо в index.php - а сам файл заккоментировать - то все будет работать нормально.
А если создать еще один файл подгрузки зависимости и в него поместить глючный код - то работать редирект не будет. Но если же в этом новом файле удалить глючный код, и записать идентичный код из старой рабочей версии приложения - то работать будет.
Я если честно слегка фрустрирую от этих дел. Мож кто то встречался с таким?
>>Методом перебора я выяснил что если который в файле зависимости подкинут в файл глючной версии - то все работает. Херня только в том, что код и там и там одинаковый.
Методом перебора я выяснил что если в файл зависимости подкинуть код из нормальной рабочей версии - то все работает. Херня только в том, что код и там и там одинаковый.
самофикс
> Есть price и weight. Если я хочу с ними работать, например с учётом ндс цену вывести, то в каком виде и где я должен рассчитывать ндс? Без разницы куда вставить расчёт ндс? Внутри product?
Если расчет совсем простой, то можно поместить в отдельный метод в классе. Но если там всякие тонкости, то имеет смысл делать это в отдельном классе-сервисе для расчета налогов.
> 2. функции - являются методами, верно?
Метод это что-то вроде функции, которая работает с данными объекта.
> 3. Если я хочу создать отдельный метод, в котором будет выводиться только цена и ндс, то надо просто создать второй метод с нужными данными, после чего вызвать его?
Вообще, вывод данных обычно делается в шаблоне. То есть класс Product хранит информацию о товаре и предоставляет ее, а вывод карточки товара делается шаблоном такого вида:
<div class="product-price"><?= ViewHelper::formatPrice($product->getPrice()) ?></div>
<div class="product-weight">Вес: <?= $product->getWeight() ?> гр.</div>
Урок про шаблоны: https://github.com/codedokode/pasta/blob/master/php/templates.md
Соответственно, метод printInfo() тоже имеет смысл убрать. Впрочем, если ты с его помощью что-то дампишь для отладки, то можно оставить, хотя дампить товар через var_dump($product), наверно, было бы удобнее.
> Нужно ли мне ещё один констракт создавать для этого, потому что при создании new Product у меня будут значение кроме ндс и цены, такие как вес, название и пр.?
Ты не можешь сделать два конструктора. Можно, впрочем, сделать статический метод для создания объекта.
> обменивается сообщениями
Лично мне не нравится, когда вызов метода называют "сообщением", так как никаким сообщением он не является. Соответственно, зачем называть одно другим - непонятно. В моем понимании сообщения ассоциируются с очередями сообщений, многопоточностью и подобными вещами.
>>15979
>>15863
Такие посты тут не нужны. Они не содержат никакой полезной информации и только отталкивают посетителей.
>>15820
Людям, которые тут устраивают флейм, и правда, стоит задуматься, что заставляет их это делать.
>>15834
Не вперлось - так пройдите мимо, зачем флейм устраивать? Вопросы заданы вполне нормальные и на них можно спокойно ответить. Все ли в порядке с человеком, который в ответ на нормально заданный вопрос агрессивно реагирует?
У нас в ОП-посте есть учебник, в нем есть глава про ООП, я бы советовал ее почитать и решить задачи оттуда. Или любой другой подходящий учебник. Там рассказано и про поля, и про методы.
Объект содержит поля, где хранится информация, и методы для работы с ними. Для того, чтобы рассчитать НДС, достаточно добавить один метод, который посчитает и вернет значение, не требуется добавлять новые поля.
Твой код сделан неправильно, так как в нем нету return, и поле NDS не требуется.
Вместо "констракт" правильно писать "конструктор".
>>15215
Нет. Но слишком большая вложенность (более 3-4-5 отступов) это плохо.
>>15134
> Разобраться с тем, как создать объект на основании информации их $_POST['prof'].
Просто:
if ($prof == 'x') {
$object = new ClassX(...);
} elseif ($prof == 'y') {
$object = new ClassY(...);
} else {
// ошибка
}
Идея описывать профессии в виде классов может быть немного неудобной, так как тебе скорее всего надо как-то еще описывать подписи к полям (вроде "зарплата") и тип полей (например, год рождения - число от 1901 до 2010, пол - это выбор из 2 вариантов итд). Для этого придется либо добавлять аннотации к полям ( https://elisdn.ru/blog/80/some-reasons-to-learn-phpdoc ), либо делать в классе метод для получения такой информации.
Описывать форму может быть удобно, представив каждое поле в ней объектом определенного класса:
$manager = new Profession();
$manager->addField(new IntField('Опыт работы, лет', 0, 50));
$manager->addField(new StringField('Личные качества'));
...
При желании можно сделать класс Manager extends Profession, в котором в конструкторе добавляются нужные поля.
Возможно, также имеет смысл вместо изобретения велосипеда использовать что-то готовое вроде Symfony Forms.
> Но мне она особо не помогает, так как я концепцию как таковую не оч понимаю.
Концепция в том, что состав полей формы описан списком полей в классе.
Также, мне кажется, что аякс тут вообще не требуется. Можно просто заранее получить список полей во всех профессиях, встроить его в страницу в виде JSON объекта и обращаться к нему вместо отправки запросов:
var fields = {
manager: ['age', 'experince', 'salary', ...],
engineer: [....],
...
};
Более того, можно на стороне сервера в шаблоне сгенерировать формы для всех профессий и переключать их (скрывать/показывать) при смене типа профессии:
<select name="profession">...</select>
<div class="form-for-manager state-hidden"> форма для менеджера </div>
<div class="form-for-engineer state-hidden"> форма для инженера </div>
Это будет проще всего, хотя наверно и не соответствует формулировке задания.
Еще одна идея - помечать блоки в HTML-разметке специальными атрибутами и на их основании скрывать/показывать блоки при смене профессии:
<div data-professions="manager, engineer">
<label>Опыт работы: <input ...></label>
</div>
У нас в ОП-посте есть учебник, в нем есть глава про ООП, я бы советовал ее почитать и решить задачи оттуда. Или любой другой подходящий учебник. Там рассказано и про поля, и про методы.
Объект содержит поля, где хранится информация, и методы для работы с ними. Для того, чтобы рассчитать НДС, достаточно добавить один метод, который посчитает и вернет значение, не требуется добавлять новые поля.
Твой код сделан неправильно, так как в нем нету return, и поле NDS не требуется.
Вместо "констракт" правильно писать "конструктор".
>>15215
Нет. Но слишком большая вложенность (более 3-4-5 отступов) это плохо.
>>15134
> Разобраться с тем, как создать объект на основании информации их $_POST['prof'].
Просто:
if ($prof == 'x') {
$object = new ClassX(...);
} elseif ($prof == 'y') {
$object = new ClassY(...);
} else {
// ошибка
}
Идея описывать профессии в виде классов может быть немного неудобной, так как тебе скорее всего надо как-то еще описывать подписи к полям (вроде "зарплата") и тип полей (например, год рождения - число от 1901 до 2010, пол - это выбор из 2 вариантов итд). Для этого придется либо добавлять аннотации к полям ( https://elisdn.ru/blog/80/some-reasons-to-learn-phpdoc ), либо делать в классе метод для получения такой информации.
Описывать форму может быть удобно, представив каждое поле в ней объектом определенного класса:
$manager = new Profession();
$manager->addField(new IntField('Опыт работы, лет', 0, 50));
$manager->addField(new StringField('Личные качества'));
...
При желании можно сделать класс Manager extends Profession, в котором в конструкторе добавляются нужные поля.
Возможно, также имеет смысл вместо изобретения велосипеда использовать что-то готовое вроде Symfony Forms.
> Но мне она особо не помогает, так как я концепцию как таковую не оч понимаю.
Концепция в том, что состав полей формы описан списком полей в классе.
Также, мне кажется, что аякс тут вообще не требуется. Можно просто заранее получить список полей во всех профессиях, встроить его в страницу в виде JSON объекта и обращаться к нему вместо отправки запросов:
var fields = {
manager: ['age', 'experince', 'salary', ...],
engineer: [....],
...
};
Более того, можно на стороне сервера в шаблоне сгенерировать формы для всех профессий и переключать их (скрывать/показывать) при смене типа профессии:
<select name="profession">...</select>
<div class="form-for-manager state-hidden"> форма для менеджера </div>
<div class="form-for-engineer state-hidden"> форма для инженера </div>
Это будет проще всего, хотя наверно и не соответствует формулировке задания.
Еще одна идея - помечать блоки в HTML-разметке специальными атрибутами и на их основании скрывать/показывать блоки при смене профессии:
<div data-professions="manager, engineer">
<label>Опыт работы: <input ...></label>
</div>
> Лично мне не нравится, когда вызов метода называют "сообщением", так как никаким сообщением он не является. Соответственно, зачем называть одно другим - непонятно. В моем понимании сообщения ассоциируются с очередями сообщений, многопоточностью и подобными вещами.
Про обмен сообщениями - это в первую очередь был референс в сторону классического определения ООП, каким оно задумывалось изначально, пока не превратилось в карго-культ трёх главных слов.
Ну и да, обмен сообщениями - это всё ещё хорошая абстракция, потому что она превращает какие-то классы и функции в логическую структуру программы, где есть сервисы и они вызывают друг-друга. Сообщением тут является метод + аргументы. По моему опыту, когда человек усваивает эту аналогию, его код тут же становится чище, ему становится легче разделять ответственности и не лепить всё в одно место.
Спасибо!
Взял сокетный чат https://kode-blog.io/websocket-server-php
Установил его на хостинг - всё ок, отлично работает. С хрома. А файерфокс не хочет коннектиться к серверу, говорит, несекьюрно.
>The app itself is under SSL but the websocket being accessed is not. Chrome and Opera don't care but Firefox does.
According to: https://bugzilla.mozilla.org/show_bug.cgi?id=303952
This is known and is not considered a bug. Mozilla's response: wontfix
Ок, нашёл решение (использовать на сервере прокси, первый ответ тут: https://stackoverflow.com/questions/16979793/php-ratchet-websocket-ssl-connect )
Установил оба модуля в апач модули:
sudo a2enmod proxy
sudo a2enmod proxy_wstunnel
sudo a2enmod proxy_http
Добавил в apache2.conf строки:
ProxyPass /wss2 ws://xxxxxxxxxxx.xxx:999
ProxyPassReverse /wss2 ws://xxxxxxxxxxx.xxx:999
А в js-скрипт вызова сервера:
websocket = new WebSocket('wss://xxxxxxxxxxx.xxx/wss2/');
999 порт специально открыт.
И снова хром работает, а файерфокс нет. Пикрелейтед. Маму его ебал, что этой собаке не нравится? Уже два дня ебусь.
Сервер:
Ubuntu-18.04-amd64
Apache/2.4.29
PHP 7.2.24
Взял сокетный чат https://kode-blog.io/websocket-server-php
Установил его на хостинг - всё ок, отлично работает. С хрома. А файерфокс не хочет коннектиться к серверу, говорит, несекьюрно.
>The app itself is under SSL but the websocket being accessed is not. Chrome and Opera don't care but Firefox does.
According to: https://bugzilla.mozilla.org/show_bug.cgi?id=303952
This is known and is not considered a bug. Mozilla's response: wontfix
Ок, нашёл решение (использовать на сервере прокси, первый ответ тут: https://stackoverflow.com/questions/16979793/php-ratchet-websocket-ssl-connect )
Установил оба модуля в апач модули:
sudo a2enmod proxy
sudo a2enmod proxy_wstunnel
sudo a2enmod proxy_http
Добавил в apache2.conf строки:
ProxyPass /wss2 ws://xxxxxxxxxxx.xxx:999
ProxyPassReverse /wss2 ws://xxxxxxxxxxx.xxx:999
А в js-скрипт вызова сервера:
websocket = new WebSocket('wss://xxxxxxxxxxx.xxx/wss2/');
999 порт специально открыт.
И снова хром работает, а файерфокс нет. Пикрелейтед. Маму его ебал, что этой собаке не нравится? Уже два дня ебусь.
Сервер:
Ubuntu-18.04-amd64
Apache/2.4.29
PHP 7.2.24
Нафига ты тогда песню про геттеры-сеттеры завёл,если у тебя все поля публичные?
Алсо, актив рекорд вполне рабочий паттерн, что бы не говорили такие пафосные снобы вроде тебя.
Ващет это он создаёт эти треды и во многом благодаря ему они все ещё держаться. Если это ОП конечно.
Это нормально, что я понимаю, что делает человек с видео, но вернувшись к коду через час забываю, как это работает и зачем это вообще нужно?
>благодаря ему они все ещё держаться
Другие треды без всяких ОПов держатся. Если ОП что-то делает, то это никак не даёт ему право указывать остальным как себя вести - это уже свинство. Да и не касается его это никак и не должно касаться.
Алсо, не надо из двача доброчан лепить - гарантированно будешь послан.
Актив рекорд рабочий в простых случаях, когда нужно на коленке mvp сварганить. А в сложных системах смешение отвественностей ни к чему хорошему не приводит. И с этим спорить тоже бесполезно, все тонкости сравнения active record vs data mapper уже по сто раз обсосаны и куча статей на эту тему написана.
Не понимаю, как вас самих не корёжит видеть в одном классе методы из разных предметных областей
А геттеры-сеттеры нужны в сложных случаях, когда у тебя внутри объекта что-то нетривиальное хранится. Например, объект времени, там могут лежать таймстамп, таймзона и микросекунда, всё такое. В простых случаях для DTO сойдут и публичные свойства.
Да. У всех так (кроме совсем умников, которых очень мало). Понять мало, нужно еще что то сделать самому по мотивам, что бы закрепить. Желательно в этот же день. И желательно, поменьше заглядывать в исходное видео.
Такие вещи объясняет "Learning How to Learn" by Barbara Oakley.
Суть в том, что в общих чертах я понимаю, что в родительскую абстрактную модель пихается круд, с привязкой к свойствам дочернего класса, но как-то с реализацией не получается совсем.
Можно свою, у кого есть если.
Разбей все на небольшие задачи. Начни с простого. Сделай класс с двумя полями - одно строковое для имени таблицы, второе для словаря ['Имя поля' => 'значение']. И одним методом save() по вызову которого значения из словаря будут записываться в таблицу. Потом добавь возможность загружать в этот класс данные из таблицы - сначала просто по айди (если сможешь то можно и сразу по более сложным запросам). Проще всего наверное будет сделать через фабричный метод, хотя обычно наворачивают какие-то конструкторы запросов. Теперь надо добавить возможность отличать новые классы от загруженых из базы (для новых класов при сохранении вызывается инсерт, для старых апдейт). После этого обмазываешся магией __get/__set и скрываешь реализацию (словарь с значениями полей). В общем у тебя есть примитивный AR класс. Дальше уже добавляешь что нужно. Возможно стоит подумать в сторону синглтона - чтобы когда ты создаешь несколько объектов которые соответсвуют одной и той же записи в таблице то чтобы при изменении одного объекта сразу апдейтился второй (без записи в таблицу и обязательно при записи). Это не обязательно синглтоном наворачивать - как минимум есть вариант с наблюдением/ивентами. Также очень полезно будет помечать поля которые были изменены (и сохранять старые значения) - но это уже когда будешь добавлять события жизненного цикла, типа beforeSave, afterSave и т.д.
Завтра заморочаюсь тогда.
>Теперь надо добавить возможность отличать новые классы от загруженых из базы
Это, как ни странно, я уже продумал - по наличию айдишника. Если он пустой - вставляем, если там что-то есть, то апдейт.
Это пиздец, очевидно же. Кроме symfony, laravel и микрофреймворков (если ты шаришь) в мире php лучше ничего не трогать.
пилить велосипед штатными средствами неохота
Ты забыл знак вопроса.
И да, погугли выше и предыдущий тред, эта тема обсуждается здесь раз в неделю точно. Вкратце: php не особенно для этого предназначен, лучше даже не пробуй и используй какие-нибудь прокси для этого.
а где то я видел пост,там один сказал против,а другой,да не ссы,там все НАТИВНО))
короче,тогда придеться либо ноду юзать,либо aiohttp
https://www.yiiframework.com/doc/api/2.0/yii-db-activerecord
https://github.com/yiisoft/yii2/blob/master/framework/db/ActiveRecord.php
Можно еще конечно посмотреть модель из Eloquent, но она пиздец какая сложная.
У меня на проде работает Centrifugo. Отличное и простое решение без всяких пхпшных демонов. Есть хорошая и поддерживаемая либа https://github.com/centrifugal/phpcent для работы с ним.
Поддвачну этого просветлённого
Там не столько в сложности дело, сколько в навороченности - мне суть нужна, а не фичи.
Ну ты же понимаешь, что "суть" - это класс с набором полей и методами save() и load() - и пишется за 5 минут?
Суть можно посмотреть в документации фреймворков.
В Yii довольно лакончиные исходники, поэтому там разобраться весьма легко.
Так да, но обычно за тебя выбирает рынок, на Симфони нужны одни мидлы да сеньоры в крупные компании, а вкатывальщик еще повезет если yii будет ковырять, с высокой вероятностью онлайн магазин запчастей на битриксе будет творить
Почему кал? Полгода где-то сижу джуном в конторе, которая свой продукт пилит. Фичи пилить достаточно просто, документация неплохая, в целом работать с ним приятно. Откуда такой хейт?
slim подходит под твое условие?
Мне нравится на нем писать и ебаться с библиотеками.
Ща делаю небольшой заказ на нем.
>>да не ссы,там все НАТИВНО))
Речь шла про принципиальную поддержку. А так для реального приложения на сокетах node повеселее будет
На Laravel скорее всего набирают джунов. Он похуже симфони, но зато дико популярен и уж точно лучше yii. Ну и даже на симфони полюбому можно найти что-то, если захотеть.
>>16995
Потому что действительно очень плохая архитектура. Плохая в смысле некачественная, порождающая хрупкие решения с высокой связностью. Плюс, многие решения уже устарели.
Не спорю, писать на ней можно, но вообще говоря, писать возможно на всём, что угодно.
Прочитай статьи на том же хабре на тему сравнения yii с другими фреймворками и всего такого.
Ну и да, беги оттуда. Yii к счастью по-тихому умирает и всё меньше продуктов делается на ней. У нас в СНГ оно почему-то ещё популярно, а вот за рубежом (а значит, и за бОльшие деньги) ты его уже не найдёшь.
>>17011
В целом норм, но если ты джун, лучше поищи себе контору, где сможешь научиться правильным вещам у сильных ребят, это сильно ускорит твоё развитие.
Сделал простую гостевую книгу (Ввод имени, отзыва, сохранение и вывод данных из файла).
https://github.com/RamPG/guestbookOOP/tree/master
В плане работоспособности кода не смог разобраться с ошибкой: когда файл пуст, он выбивает Undefined offset, пробовал empty и isset, но безуспешно.
В плане архитектуры вижу только одну корявость - это класс View, я просто разорвал класс и запихал туда HTML документ. Как можно сделать лучше? Создать отдельный файл page . php и вызывать его через include?
Не обращайте внимания, что все в одном файле, с этим чуть позже разберусь.
>Yii к счастью по-тихому умирает и всё меньше продуктов делается на ней
настолько умирает что скоро yii3 скоро должна полноценно выйти (:
Я видел ченджлоги, они не впечатляют. Вместо нормальной архитектуры и компонентов symfony они обновили мажорную версию и перелезли на PSR-овские интерфейсы. Ну так себе. Выглядит словно, что чуваки просто насилуют труп. Очень надеюсь, что его как можно быстрее закопают и оно перестанет отравлять людям жизнь.
Ну и да, для меня вообще неочевидно, что именно из yii нужно спасать? Коряво реализованную систему внедрения зависимостей, наполовину состоящую из статических вызовов? Консольную тулзовину на скриптиках? Магически унылый active record с костыльной событийностью? Уёбищную систему плагинов? Напрочь стандартную MVC архитектуру хотя нет, с хуёвым роутингом? Дешёвую кодо-генерацию, которая генерирует ненужные вещи, которые пишутся за 5 минут? Гайды и рецепты на уровне 2010?
Yii и ему подобное говно умерло в тот момент, когда люди узнали о компонентах симфони, стоит это признать. Сейчас если ты хочешь написать mvc, ты берёшь любой роутер, пишешь код контроллеров, модель и сцепляешь это всё через любой контейнер, с любой ORM. В итоге, ты получаешь то же самое, но более качественное и не обременённое внешними зависимостями, делающее только то, что нужно. Под любую задачу есть симфони-компонент или библиотека, просто делаешь composer require и пишешь нужный тебе код. Yii остался где-то в прошлом, когда каждый писал свой умеющий всё комбайн. Ну и имхо, для тех, кто до сих пор не научился разрабатывать системы сложнее, чем mvp и просто копипастит код из примеров и stack overflow. Джуниоров и вечных джуниоров, одним словом.
Твои view файлы для каждой страницы должны храниться в разных файлах. Отдельно должен лежать layout, в котором они будут рендериться. Сделал примеры как это можно организовать максимально просто.
https://www.codepile.net/pile/X5JXblNd
https://www.codepile.net/pile/wW8mEXLN
View, грубо говоря, это твоя html страничка которую ты пихаешь в content-body твоего сервер-ответа.
Анон выше кинул примерно как они рендерятся. Я когда список студентов делал - просто нужный для контроллера html файл подключал. Но я сам еще не особо в этом разбираюсь.
>Поцчему?
Чем тебе такой же вкатывальщик поможет? Всё скатится к обоюдным смехуёчкам и мемесам в телеграмме.
Осваивать всё равно каждому по одиночке придётся.
Ну в идеале они могут друг с другом новой инфой делиться. Закрепляя эту инфу для себя, и подталкивая товарища к чему то новому. Но это, конечно же, в идеале.
>на второй вопрос
>как в таком случае облегчить обучение и не сдуться?
Никак. Оставайтесь в жопе.
>Справедливо, но на второй вопрос ответа не поступило
Бля, бро. Все зависит от того в какой ты ситуации находишься и кто по жизни. У тебя же своя голова на плечах есть? Есть. Вот она тебе и нужна чтобы самому себе на такие вопросы отвечать "а как мне будет лучше". Мы то откуда знаем
>они могут друг с другом новой инфой делиться
То же самое можно делать и на тематических форумах, типа как в этом треде аноны отвечают.
>подталкивая товарища
Это психологическая уловка - дескать вдвоём уж мы-то не сдуемся никак. На самом деле вам обоим будет одинаково влом этим занимать.
Просто очередная попытка переложить ответственность на плечи товарища.
По жизни я е6аный лентяй и хикка со стажем. Дважды пытался вкатываться в программирование, но не вышло. Сейчас я изменил пару переменных, но нет никаких гарантий, что снова не обосрусь. Поэтому я и надеюсь на какую-то поддержку, потому что сам не могу справиться.
У меня друг в вузике на it инженера учится, у них с этим все ок. Есть компания ребят которая делает что по кайфу. Разные технологии щупают, пытаются что то делать. Конечно это все на уровне "и там и сям", но им вроде как интересно. Так что если люди реально хотят - то почему бы и нет, это будет точно в плюс.
У меня самого только с третьего раза что-то получаться стало.
Над ними в вузике стоят и теребят, а над вами никого не будет. Ну и они во вкус уже вошли, а тебе ещё только предстоит это всё.
До сих пор факт нахождения в жопе не помогал.
За какое время планируешь вкатиться, что с работой в твоем регионе. Мыслить нужно отсюда начинать. В ОП-посте есть нормальный гайд по вкату, когда сделаешь файло-обменник спокойно можешь искать галеру . Я, учась в вузе почти на 3 курсе, начал с него. Мне понравилось как он написан, ведь в вузе у меня учат полнейшией хуйне (аля ООП с первой ссылки в гугле на листочке). Вот, спустя 3 месяца в своей залупе нашел работу, осталось мелкие детали обсудить. Но я и до вуза уже в минимальное программирование умел. Только от тебя зависит сколько времени уйдет. Но желательно сильно не перенапрягаться ибо можно кукухой поехать.
>>18213
Нет, они по собственной инициативе этим занимаются. Тот же web им не говорят пилить. Но для себя, пощупать, они не против. Да и технологии разные обсуждают часто - вариться в тусовочке очень даже полезно. Если там не отбитые аутисты сидят, конечно
>Но для себя, пощупать, они не против.
Так это нормально - я вот тоже щупаю всякое из любопытства. Я ж говорю - они в теме и на волне уже, тут главное не забрасывать и продолжать. Тебе до этого пилить и пилить ещё.
>вариться в тусовочке очень даже полезно
Я как-то ходил в конфочу местных и нихуя хорошего там не увидел. 95% пиздежа по левой теме и только 5% по делу.
Если в правилах конфы нет чётких требований общения, то всё скатится к мемам и смехуёчкам. По опыту уже знаю.
А все те, где указаны эти требования ничем не лучше этого треда\любого тематического форума.
>В ОП-посте есть нормальный гайд по вкату, когда сделаешь файло-обменник спокойно можешь искать галеру
нипонел. Но спасибо.
>Но желательно сильно не перенапрягаться ибо можно кукухой поехать
Да, у меня с распределением ресурсов не очень ^^"
Мертворожденная идея потому что для эой цели
>>поэтому я и надеюсь на какую-то поддержку, потому что сам не могу справиться.
ты не найдешь себе нужного партнера. Тебе нужен чувак с волей, который превозмагает. Но такому чуваку не нужен баластный инвалид, который пока еще нихуя не знает, так еще и с психологическими проблемами. Для такого ты ненужный балласт.
Ты можешь найти себе подобного тебе партнера - но как выше справиделиво заметили, вы оба будете одинаковы, и будете опыляться друг от друга постоянно, и заниматься хуитой. Так что толку не будет.
Увы, тебе придется в первую очередь самому привозмочь свои психологические проблемы
>По жизни я е6аный лентяй и хикка со стажем
У тебя просто нет мотивации и тебе норм. Я так последние полгода тоже ебловал типа некуда спешить, иногда настроение было такое что не вставал целый день с кровати, месяц назад последние бабки кончились что уже жрать не мог купить ну и за неделю вкатился на работку, мозг все загоны и внутренние проблемы просто офнул и начал действоватб.
>>18490
$i = 5;
++$i + ++$i = ?
>>18505
Из готовых решений есть вордпресс и опенкарт, но это говно говна. В учебных целях почему бы не попробовать написать свой магазин? Можно смоделировать систему на ооп без веба вообще. Потом эту модель доктриной замапить и сразу прокачаться в нескольких направлениях.
>вордпресс
>говно говна
Как-то пробовал его. Темки васянские хорошо накатывать и удобно, но вот разработка на нём - пробитое днище. Архитектура отсутствует и вместо неё одни костыли. Весь вордпресс это один большой костыль над простецкой системой для блога. Уже тогда стало понятно, что такие вещи изучать не стоит - костыли индивидуальны для каждого проекта и в другом они не пригодятся.
А ведь там ещё и плагины накатывают, которые друг от друга зависят. Ояебу какой кошмар.
Как эта адская хуетень ещё не подохла я удивляюсь.
> Как эта адская хуетень ещё не подохла я удивляюсь.
Есть целый класс говнокодеров, которые только на нём и работают. Своя экосистем получается. Одни хотят заплатить поменьше и получить побольше, а другие хотят говнокодить за гроши и не париться.
Это еще и во всем мире, в Пиндосии и Германии каких-нибудь на пхп девелоперов и энтвиклеров как раз часто требуют вордпресс/друпал, прямо как у нас любят написать в требованиях жс жквери вьюжс вордпресс джумла модх пхп ларавел йии симфони опыт 5-10 лет 35к
Да, вот ты правильно написал, херка напишет латиницей, еще лучше "Bitrix Framework, уверенное знание Bitrix API".
Вот кстати одна из типичных пиндосских индусовакансий с вполне такой зп даже
https://job-openings.monster.com/magento-developer-php-milwaukee-wi-us-tekpartners-solutions-llc/213582793
Пфф, уверенное знание SOAP.
Друпал тащемта сделан хотя бы наиболее качественно, да и на симфони компоненты переехал. Хотя вся ирония в том, что именно его хорошее качество и прочая архитектура ему и мешает, cms-говношлёпы ссутся использовать что-то сложнее скриптиков в стиле php4, а хорошие разработчики в любом случае не хотят на cms что-то делать.
А на пыхе бывают полноценные пхп 7 проекты, шоб со стрикт тайпс и функциональщиной?
Для защиты от накрутки думал идентифицировать запрос по фингерпринту и не давать чаще чем в 5 минут например обновлять счетчик.
Сам счетчик можно много как реализовать, начиная от колонки в таблице view_counter и заканчивая отдельной таблой PageViews со всей инфой и считать из неё. Была еще упоротая мысль кроном каждые 30 мин из гугл аналитики выгружать просмотры по страницам и обновлять в бд данные.
>хорошие разработчики в любом случае не хотят на cms что-то делать
Так с нынешними либами за пару часов можно самому небольшую cms за вечер накидать. И при этом нет никаких ограничений от производителя - руки развязаны.
А для какой цели?
Можешь логи нгинкса парсить демоном на фоне.
Можешь свой счетчик в sql поставить, но если приложение окажется нагруженным, то ето узким местом может оказаться из-за локов при записи.
Можно в очередь кидать записи и оттуда уже разгребать демоном.
Сам браузер решает какой именно нажат (группировка по атрибуту name) и в запросе устанавливает соответстdующие name=value
Как? name же одинаковые у группы, а потом в name присвоится value нажатой? Это бред.
>накликал что-то
>и не надо платить разработчикам, архитекторам и так далее
Как накликал - так и работает. А потом ходят и жалуются, что у них скорость сайта никакая, сео чёто тоже не ахти, плагины есть, но всё не то, что нужно конкретно им.
Тысячи их.
>Для малого и среднего безнеса
Максимум для лендосов салона "Валентина". Что-то серьёзное и со структурой ты на cms не поднимешь, а порой в этом вся соль.
Несколько радиобаттонов с одинаковым именем образуют группу
<input type="radio" name="a" value="1">
<input type="radio" name="a" value="1">
<input type="radio" name="a" value="1">
Когда пользователь кликает по какому-то из радиобаттонов с одинаковым name, браузер следит за тем, чтобы выделение с остальных снялось. Когда пользователь отправляет форму, в форме по ключу name будет стоять значение кликнутого радиобаттона.
Понял, спасибо, только value 1 2 3
Да нифига, какой-нибудь простенький сайт с контентом, интернет-магазин, формочку там для обратной связи, туда-сюда.. Там нагрузок не было и не будет, удобство может быть и не очень удобным и всё такое. Какой-нибудь, к примеру, сайт для заказа цветочных букетов. Маленькая витрина с фотками и наборными компонентами, форма заказа и админка для выкладывания контента и управления заказами/статусами заказов.
Пиздец манямир, из разряда пэхэпэ мертвый язык, скоро всех програмистов заменят нейросети !!!!!!!!!!!!!!1
>Laravel Homestead
>Included Software Ubuntu 18.04
Ты просто хомячок. Какая тебе альтернатива. Свой хуюмстед ты же не осилишь запускать из чрута
>Мне надо именно в datetime(не timestamp)
А что так? Таймштамп потом в датетайм перегнать - как 2 пальца, насколько я помню.
Просто такое задание было в инете ,хы
Напишу снова: всё что может делать сама СУБД, пусть делает сама БД, например высчитывает timestapm через NOW().
Кстати совет. Юзай сокращённый открывающий тэг только для краткого эко. <?= "Привет"?> В остальных случаях всегда <?php
Стандарты все дела
OK, спасибо
Ребят, пролистал/pr как я понял вы тут самые добрые (аниме), поэтому обращусь с вопросом к вам - я работаю юристом, но мне это надоело, постоянный негатив от клиентов, все они проблемные, душные и я думаю вкатится в програмириование/кодинг. С перспективами потом перебраться в Москву, начать зарабатывать в идеале 100к примерно.
Какой язык учить, с чего начать?
>Какой язык учить, с чего начать?
Смотря к чему у тебя душа лежит. Если пофиг и просто ищешь место поспокойнее и потеплее, то учи JS, на фронтендеров нынче спрос большой.
php норм, но готовься, что для нахождения любой нормальной работы нужно въебать кучу времени и сил в обучение. Минимум 2-3 года только для того, чтобы перестроилось мышление и можно было хоть как-то называться разработчиком, а не кодомакакой.
И это не снобизм, просто область реально огромная и нужно, знать, понимать, как устроены и уметь использовать туеву хучу инструментов, протоколов, приёмов и всё такое. Ну и зависит от того, что считать разработчиком, cms-формошлёпы же тоже что-то там делают.
Хм. Ну для начала стоит отметить, что программирование делится на кучу сфер, от науки, то секьюрити.
Из самых популярных: Web, мобильная разработка( деление на андроид\айос) , десктоп (опять же apple\windows). Игры опять же разные платформы.. консоли.
Для начала выбери направление. В ом же вебе есть разные стаки.. например php/js/html (бэк) + frameworks. Или Js/ Css/ html + frm(фронт). Или Python/js... (бэк)
А когда выберешь. Можно выбрать язык..
Если просто хочешь денег то выбери самое востребованное - web or mobile.. А там тоже есть свои самые полпулярные языки+фреймы
> web звучит как то проще и понятнее.
В целом , так оно и есть. Но щас опять же наплодили кучу технологий.. поэтому учить надо пару языков и сверху пару фреймворков. К примеру, стажор бэкендер должен знать на базовом уровне: Php/Js/Html/ ООП ,MVC, Larqvel/Yii.
Я бы врачем стал, но я уже старый и ойти. Работал в больнице, в стационаре каждый второй на лехухе или бнв катает. Им люди сами за профессионализм несут.
И статус - если ты хороший уролог/гинеколог ты в друзьях у топ своего мухосранска будешь находиться всегда.
Конечно нужно не всратым терапевтом калымить, а идти на оперирующие специальности. Но там и ответственность, мама не горюй. И почет, и пиздец уважение. Представь как горд врач, когда с того света вытаскивает кого то?
Пока ты очередному комерсу магазин пилишь.
>Пока ты очередному комерсу магазин пилишь.
Двигаем человечество в будущее, пока очередной гордый врач стотысячного алкаша с того света тащит.
А как же.
Толсто.
Любой хороший специалист имеет уважение. Если ты думаешь освоить профессию, относясь к ней без уважения, то у тебя ничего не выйдет. Это распространённая ошибка васянов, которые потом оседают в Пятёрочках. Они ничего не любят и не стремятся, а ценности их - лексусы, и чтобы заносили побольше.
Знаю тупо, но просто хотел поделиться, появилась маленькая гордость, что хоть в чем то разобрался.
<?php
for($x = 1, $b = 1; $x < 10, $b < 10; $x++, $b++) {
$sum = ($x $b);
echo "$x$b = $sum\n";
}
кек
Тут ты прав. Прост увидел из прошлых примеров и не стал заморачииваться как на инглише это записать.
> пхп не видит инклюд в функции пиздос как удобно
Используй require и require_once и будет тебе счастье.
Т.е вот кнопкочка с статьекй, жмешь - а статья удаляется из бд без перезагрузки стр.
Можно ссылочку или что гуглить надо?
Буду очень благодарен
Отправляешь запрос на сервер с помощью ajax -> сервер удаляет нужную статью -> данные на странице обновляются. Или что тебя интересует?
Да но как это делать, реализация этого интересует, как писать такие запросы. Задействован ли php? Или мой код может напрямую менять инфу в моей базе данных на сервере? Тогда разве это безопасно? Так каждый сможет отправить запросы ,не?
Если остановится на rest то ты мог бы
1. Сделать get запрос с номером статьи и получить обновленный список статей в теле ответа и c помощью js обновить html (так делают только самые нубы)
2 Сделать тоже самое delete запросом (rfc ничего не сказано о теле ответа на delete запрос. Но это считается отклонением от стандартного поведения)
3 Сделать такой же delete запрос но получить пустой ответ. Сделать нововый get ajax запрос для того чтобы получить
обновленный список статей
4 После delete запроса с пустым ответом просто js ом удалить статью из html
Я не совсем опытный, но что тут не безопасного? Отправляется post/delete запрос на сервер, на сервере с помощью php этот запрос обрабатывается и выполняется нужное действие. Подозреваю что для удаления статьи нужно обладать какими то правами, вот это и проверяется с помощью сервера. Так же из минимальной защиты пользователя можешь почитать про crsf токен.
В браузере у пользователя можно статью с нужным id просто в JS-е убрать, либо как написали выше на запрос серверу вернуть обновленый список статей, но мне этот вариант как то не очень нравится
>>19717
> post/delete запрос на сервер, на сервере с помощью php
Т.е в этом пост запросе указывается например к примеру файл x.php в котором код удаления статьия. А сам post/delete запрос просто его запускает?
а как гуглить такое? Просто у меня домашка на завтра я все сделал кроме такого запроса.
Вангую, что он инклюдил в какой-то функции, поэтому переменные у него попадали в локальную видимость и не были видны снаружи этой функции.
>>19695
>что гуглить надо?
Работу с ajax.
Но я бы не совался без понимания http-протокола, как минимум. Эта кнопочка только для пользователя просто работает - на деле там логики нормально так.
>статья удаляется из бд без перезагрузки стр
В двух словах: js посылает данные с удаляемой статьёй на определённый эндпоинт API сервера, который в контроллере уже работает с базой данных.
Потом этот же js удаляет ноду со статьёй из DOM-дерева документа. Получается без перезагрузки.
Нет, сначала гуглишь и читаешь про MVC, потом про HTTP запросы.
>а как гуглить такое? Просто у меня домашка на завтра я все сделал кроме такого запроса.
Ну мы же не знаем как ты свое приложение скостылил, какие свойства есть у твоей статьи, какой ключ. Самое банальное делать ссылку по типу ursite.com/threads/{id}/delete
И по id в БД просто удалять
>Отправляешь запрос на сервер с помощью ajax -> сервер удаляет нужную статью -> данные на странице обновляются
А как сервер поймет, что это не хаккерский скрипт? Прежде чем выполнить
Так же как и при обычном не ajax запросе, при помощи номера сессии, который посылается в виде кукиса даже при ajax запросов.
Правда это нужно еще программировать на php.
Спасибооу друщиже
В ней куча элементов которые появляются и скрываются в зависимости от выбранного поля в селект. Я когда JS изучал подобное делал.
В форме на том сайте для такого юзается jQuery вовсю.
Сейчас везде и всюду говорится что jQuery не торт и его юзать нельзя.
Но допустим закажут мне что то подобное - как реализовывать такую форму? Не на рекат\вью это писать?
Или вообще нативно херачить?
Или таки jQuery, как и раньше?
Сайт древний, скорее всего. Легаси - все дела. Если заказчику нет дела до технологий - бери фреймворк, тебе же легче будет (если умеешь в него). Если заказчику нужно что-то допилить - используй то, что уже есть.
>jQuery не торт и его юзать нельзя
Так ты спрашивай - почему нельзя его юзать?
Очень часто такое слышно от хайповых js-петухов, которые кроме своего фреймворка ничего не знают.
Уже тысячу раз вам блять объясняли, что сам по себе он норм для того, чтобы повесить пару обработчиков, сделать анимашку или отправить запрос, но когда появляется что-то посложнее типа динамической формы с валидациями, какой-никакой роутинг или ещё чего (что ВНЕЗАПНО делает просто сраный скриптик на фронте отдельным маленьким приложением, работающим в клиентском браузере), то лапша на jquery стремительно превращается в неподдерживаемый кусок говна, без архитектуры, расширяемости, зато с кучей дырявой магии.
Есть Ubuntu 18.04. На ней apache 2.4. Корень для сайт: /var/www/html. Какой владелец должен быть у этого каталога? Какие права нужно выдать, чтобы ларавел нормально с ним работал? Плюс папки bootstrap/cache и storage.
Я и так и сяк пробовал настроить, в итоге всё сломалось и не работает.
Последнее, что делал:
sudo chown -R testuser: /var/www -сменил владельца с рута, на себя.
sudo find /var/www -type f -exec chmod 664 {} \;
sudo find /var/www -type d -exec chmod 775 {} \; - хз что это, написано "Then I give both myself and the webserver permissions:", что бы это ни значило.
>что бы это ни значило.
Вернее, что он написал, я понимаю, но что это за команды - нет. find какой-то - это же просто команда поиска, что она может сделать?
$a = $b ?? 'b is null';
А мне надо что-то вроде:
$a = $b !?? someFunciton ($b);
То есть, иногда надо что-то сделать с переменной, но только если она не null. А если null, так пусть просто будет null.
Попробовал по https://tecadmin.net/laravel-file-permissions/
sudo chown -R www-data:www-data /var/www/html
sudo find /var/www/html -type f -exec chmod 644 {} \;
sudo find /var/www/html -type d -exec chmod 755 {} \;
cd /var/www/html
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
Всё равно не работает. Если положить в корень test.php, то он нормально отрабатывает, а Ларавел нет.
Forbidden
You don't have permission to access this resource.
> Жиквери никогда не юзал.
Да это же стейтлесс-либа.
Там 10 методов, которые требуются для 99% задач и все они тривиальные и понимаются интуитивно, типа "ты ей передаёшь dom-элемент (или путь до него) и коллбек, она вызывает коллбек при определённом событии".
Короче, поиграешься полчаса и можешь считать себя знатоком и обновлять резюме, лол.
может так?
//если не null
if (isset($переменная));
//если нул
elseif (!isset($переменная));
только вкатываюсь
Равно: ==
Очень прям пиздец равно аж по типу: ===
Не равно: !==
https://www.php.net/manual/ru/language.operators.comparison.php
>но когда появляется что-то посложнее типа динамической формы с валидациями, какой-никакой роутинг
А это что?
Кажись ты просто не понимаешь разницу между фронтом и бэком.
> но когда появляется что-то посложнее типа динамической формы с валидациями, какой-никакой роутинг
Это писал я, другие посты - кто-то ещё.
Про роутинг я сказал потому что потом окажется, что форма должна вести себя по-разному на разных страницах, быть универсально-гибко-настраиваемой и всё такое. Там туева хуча вариантов и роутинг - только один из примеров того, что делает jquery-поделки неудобными для развития.
>форма должна вести себя по-разному на разных страницах
А если без фантазий?
>роутинг - только один из примеров того
Роутинг форм, ты имеешь ввиду?
Просто не надо лезть в чужую ветку со своим реактом - не о том речь.
У всех так?
потому что бэк в массе однообразен и отточен.а фронт,это то что человек видит-дизайн и логика.тут фантазии больше.ну перчинка-жс ублюдский ЯП
Но я хотел на ПХП писать, а не жс.
Помню как свой парсер первый писал весь вечер - стена кода, сток под 200-250. А счас - накатил модную либу, скормил ей xpath, привёл в нужный формат другой либой, и всё - жрать подано. Дай бох 50 строк будет всё это дело.
И ларавел и симфони являются фреймворками.
Однако архитектура симфони построена так, что большая его часть ето независимые компоненты, которые не пересекаются с другими компонентами. Из-за этого компоненты симфони стали использоваться в других фреймворках, в том числе в ларавеле.
В ларавеле куда меньше надо собирать руками, то есть из коробки что-то запустить, чтобы оно работало на ларавеле будет быстрее. В основном потому, что за тебя уже все решили. Например, взгляни на документацию роутинга в симфони и ларавеле:
https://symfony.com/doc/current/routing.html
https://laravel.com/docs/6.x/routing
Оба фреймворка имеют большое коммьюнити.
На мой субъективный взгляд, для ларавеля написано больше инструментов (например какие-то свои очереди, вместо rabbitmq), однако и используются они только с ларавелем, как я видел.
Наверное, можно предложить так:
Если ты не работал с фреймворками до етого (либо работал с каким-то мамонтами типа yii и другими того времени), то тебе для проекта стоит выбрать Laravel. Если тебе нужно сделать что-то типа блога или онлайн-магазина, то тоже сстоит выбрать Laravel. Если ты хуево понимаешь в архитектуру, то тоже стоит выбрать для начала Laravel (тк на симфони накостылить несравнимо проще). Если это кастомный проект, с кучей недефолтных требований, то на симфони ето будет собирать проще скорее-всего, чем ларавель под себя переделывать.
Я думаю анон меня поправит и дополнит чуть что.
Если делать сайты-визитки и онлайн-магазины да. Надо идти в продуктовые компании, там куда лучше с этим.
Очень много интересных задач было, нагрузки, масштабируемость, написание каких-то допинструментов. Как только уровень джуна пройдешь беги от сайтошлепов в продуктовое что-то, ну или куда-то, где проекты по 4-6 месяцев идут.
На моем прошлом месте работы, когда начало появляться слишком много задач про сделай кнопку красную, чтобы жало и отправлялись данные и заебись все, то отдельно наняли фронтендера для этого. Но у тебя второго фулстака наймут.
Я бы дополнил что на ларавел не то чтобы сильно проще, а просто намного быстрее что-то написать чем на симфони, т.к. существует много шорткатов в виде глобальных функций и тебе не нужно долго думать о структуре классов и т.д. потому что в любой момент можно вызвать request() и оп, у тебя объект запроса например. А еще он всё таки немного подвязан на свой же орм Eloquent, это и хорошо и плохо, и если в теории можно свапнуть на доктрину или что-то еще, то на практике разные ларавел фичи начинают не работать потому что свойства приватные, или у этой фичи внутри проверка на инстанс или еще что, и приходится опять писать тот самый бойлерплейт. Например ларавель джоб класс, который через трейт умеет трансформировать модель в айдишник перед сериализацией чтобы память не охуела от активрекорда, а когда эта джоба выходит из очереди то по айдишнику заново гидрирует в свойство эту модель через рефлексию. Думаю что такой трейт можно легко и для доктрины написать, но сам факт.
Я бы советовал всё таки сразу на симфони + доктрина писать, мне кажется что там больше классического ооп, бойлерплейта, конфигов и вот этого всего, после такого на ту же ларку перекатиться будет в разы легче чем наоборот, когда ты не понимаешь зачем тут вводить тип если можно просто строкой что-то передать и т.д.
Как дальше заставить прогу вычесть столько, сколько нужно, что бы в минус не уйти.
>Реально ли решить задачку с айфоном новичку?
Она для новичка и есть.
>Как дальше заставить прогу вычесть столько, сколько нужно, что бы в минус не уйти.
Но сперва нужно синтаксис узнать - какие операторы есть и что делают. Нет смысла задавать такие вопросы.
Нужно это в следующей ситуации. В интернет магазине пользователь нажимает на кнопку "заказать". Скрипт создаёт различные документы содержащие данные о заказе и отправляет уведомления на различные емейлы. И только после этого показывает клиенту сообщение, что заказ совершён удачно. В результате клиенту приходится ждать примерно 10 секунд, а иногда и ещё больше.
Ну так вот можно ли решить эту проблему только средствами пхп, без использования кронджоб?
active job
нет. только очереди
>>Роутинг форм, ты имеешь ввиду?
Я думаю он имеет ввиду роутинг SPA фронтред приложения, реализованного к примеру на react.
Если ты никогда не писал на react - то попробуй.
>>А если без фантазий?
Нет никаких у него фантазий.
react реализует компонентный подход, когда ты можешь собирать элемент из других элементов, и все это может динамически изменяться. И один и тот же компонент может себя по разному вести на разных страницах.
Похоже ты просто не перерос еще классическое MVC на бэкенде со статикой отдающейся клиенту.
Внезапно MVC и тыщи его вариантов отлично живут на фроте. По необходимости получая от сервера только json с данными без какой либо разметки вообще.
>один и тот же компонент может себя по разному вести на разных страницах
Зачем? Это хуевый пример, когда пишутся сложные компоненты на все случаи жизни. SPA - это когда на одной станице рендерятся разные компонеты, в зависимости от условий. Например в зависимости от урл, когда для разных урл бекендом отдается одна страница. Это кстати наиболее правильное использование SPA, чем когда для урл используется хеш и зачастую не работают кнопки назад/вперед
Чувак, наш с тобой диалог - абсолютно бесцельное "просто попиздеть". Словил такое густое ощущение.
https://3v4l.org/dWVtb
[
>И почему так вообще происходит ведь раз нет поля в классе, то кажется заполнить эти поля никак нельзя при создании объектов
Поля могут задаваться динамически через магический метод __set()
Пардон, не проснулся, хуйню спизданул, fastcgi_finish_request нужен
Хочу разобраться в том, как правильно готовить симфони, какая там внутри архитектура, какие бест-практики, как правильно юзать доктрину и всё такое.
Чего можно почитать, какие хорошо сделанные примеры приложений посмотреть и всё такое?
Пока нагуглил бест практики на сайте самого симфони и пример оттуда же, но может есть ещё чего дельного.
Ну и чего вообще нужно поизучать в этом котексте (из разряда, если бы я знал, чего спросить - спросил бы)?
>роутинг SPA фронтред приложения
Речь о jQuery. Ты нормалный вообще - на нём SPA делать?
Был вопрос о нём - вы в ответ бред нести стали. Один с реактом успокоиться не может, второй с роутингом форм носится.
Зачем пхпшнику сдалось ваше SPA в норме, если ему интерфейс накидать? Именно поэтому ваше мнение никому не интерсно - вы даже в суть вопроса неспособны вникнуть.
Ты почему-то отказывешься воспринимать тот самый первый пост, что тебе анон написал, чем только выставляешь себя долбоёбом.
Тебе сразу сказали, что нет проблемы взять jquery чтобы навешать пару триггеров. Но в любом сложном случае типа роутинга, зависимости элементов одного от другого сразу лучше брать vue или react.
Тебя головой в детстве не роняли? Ты третий раз уже пишешь про роутинг на жс, в пхп треде.
Контекст использования jQuery способен понять исходя из темы треда?
Я специально перевел. А то он потом такой: "А на русском есть че почитать?" А я такой: "Иди учи ингришь, Маня". И понеслась на 20 постов. Ну как обычно в /pr/ происходит.
Да какая разница? Эти доллары абсолютно не мешают (даже на самом деле чуть удобнее читать код, глазу есть, за что зацепиться).
В глазах рябит.
Зато объявлять переменные не нужно. Лично меня больше огорчают стрелочки в объекте.
Лол, проиграл
$word = explode('/(?=\s)/u', $word); просто не работает
$word = explode(" ", $word); убивает пробелы
нихуясе
>А зачем в пыхе сделали $ перед переменными?
Что-бы можно было писать переменные переменные и переменные функции:
$var = 'hallo';
$var_name = 'var';
echo $$var_name; //напечатает 'hello';
function bar() {
echo ' world';
}
$func_name = 'bar';
$func_name(); //напечатает ' world';
Я думаю, что $$ - реализованы совсем по-другому чем eval. Впрочем это не важно, как они реализованы, главное что они работают и иногда бывают очень полезны.
Ни одного нормального использования придумать не могу и не видел, за всё время работы.
Лучший код - это явный код, когда точно понятно, что вызывается, когда, какого типа и так далее. Уверен, что со всеми трендами к типизации пыхи, $$ рано или поздно задепрекейтят.
Насчёт переменных ты прав, но не на счёт функций. Запуск функций через $func_name() просто позарез необходимо в php и даже используется в стандартной библиотеке:
Вот пример передачи названия колбэк функции в качестве аргумента:
set_error_handler("handleError");
Двачую вопрос
У тебя просто маленький кругозор. $ используется в bash и ее предках, в perl. В глобальных переменных в Ruby. В конце строковых переменных в BASIC.
Думаю, сделано это, чтобы упростить парсинг (разбор) кода, чтобы сразу было видно, где переменные.
>>21102
Стрелочки используются в Си/Си++ для обращения к полям и методам через указатель на объект, а не через сам объект.
>>21300
Нет. Это "переменная переменная", то есть обращение к переменной, чье имя хранится в другой переменной. Осложняет понимание кода и не рекомендуется к использованию. Аналогично, есть "переменные свойства" и "переменные методы", хотя я предпочитаю для них использовать более читабельный call_user_func.
>>20797
Надо найти туториал по изготовлению приложения на Симфони, хорошие туториалы на английском. В ходе выполнения читать соотв. разделы документации, чтобы полностью разобраться в используемых компонентах, при необходимости не бояться залезть посмотреть код.
Вот примерно такое может получиться у тех, кто не любит фреймворки, и любит писать все сам на "чистом" PHP. Правда, в случае с Битриксом там это вынужденно из-за авторских прав.
>>21178
> $word = explode(' ', $word);
Не стоит использовать одну переменную для хранения и массива, и строки. Лучше назвать их по-разному ($words и $phrase).
> $words = " ";
> $words .= $word;
Чтобы не мучаться с лишними пробелами, проще предложения с обрезанными trim() пробелами класть в массив, а в конце склеивать массив через implode. У тебя же в коде выводятся лишние пробелы в начале текста и тебе приходится кривым костылем добавлять пробелы после точек.
>>21108
Первое не работает, так как explode не поддерживает регулярки. Надо использовать preg_split.
>>20939
Отношение многие-ко-многим через таблицу связи.
Также, тебе в помощь урок про нормальные формы БД: https://github.com/codedokode/pasta/blob/master/db/normalization.md
Задача выглядит достаточно простой для jQuery. Делаем список вида "при каком значении какие поля показывать". Более того, можно обойтись почти без JS, вешать на форму класс в зависимости от выбранного значения, а на скрываемые поля повесить атрибут, при каком значении класса их показывать:
<form class="type-x">
...
<div class="field" data-show-for="x y z"> .. </div>
> Сейчас везде и всюду говорится что jQuery не торт и его юзать нельзя.
Если не интересует поддержка старых браузеров, и лаконичность кода, то же самое можно сделать на vanilla js. Зачем тащить монстрообразный реакт, webpack, babel, JSX для этой задачи и связанные с ними головные боли, непонятно.
>>19974
Динамические формы с валидациями нормально делаются на jQuery или vanilla js при грамотной архитектуре, и реакт не спасет их при неправильном проектировании. Будет такая же лапша. Наоборот, он потребует лишних затрат времени, сильно усложнит работу из-за внезапно всплывающих проблем, потребует ставить вебпак и грузить полмегабайта кода, итд. Например, работа с асинхронными аякс-запросами не самая веселая вещь и потребует добавлять всякие промежуточные состояния "идет загрузка" и "ошибка загрузки". Впрочем, это и на jQuery невесело.
Типичный пример подвоха: вы делаете автокомплит и по мере набора букв шлете запросы на сервер. Но ответы на запросы приходят в обратном порядке. Покажете ли вы неактуальный результат или вы знаете и предусмотрели эту ситуацию? Отмените ли лишние запросы? Обрабатываете ли корректно ошибки ответа на запрос? Показываете ли индикатор активности?
И реакт (поправьте, если ошибаюсь) сам по себе эти проблемы не исключит. Все, что он делает - привязку (data-binding) отображаемых данных к данным "модели", которая там представлена огромным анонимным объектом.
А чтобы усложнять код внедрением SPA должна быть веская причина, а не "на хабре много статей про реакт".
Это в общем плохая идея, так как ты можешь показать пользователю, что все ок, а потом операция не удастся. Также, если это часто использовать, то такие фоновые задачи могут занять все доступные воркеры и некому будет обрабатывать приходящие запросы. Нет защиты от дублирования, когда два процесса обновляют одни и те же данные.
Лучше все же это делать в очереди задач.
>>20697
Это странная особенность PHP, что при записи в несуществующее поле оно автоматически создается. Это мешает обнаруживать ошибки, когда ты опечатался в названии поля. В такой ситуации было бы лучше выдать ошибку, а не молча создать поле и продолжать выполнение программы.
Можно запретить это магическим методом __set.
> И раз все и так работает зачем что то объявлять в классе questoins?
Чтобы при чтении кода было видно, какие есть поля. Также, чтобы можно было добавлять к ним комментарии. А в новом PHP - указывать еще и тип значения поля.
Решение верное.
>>20562
Надо перед тем, как платить и вычитать что-то, сравнить остаток долга и сколько ты готов заплатить. И взять меньшее из 2 чисел. Если долг = 7000, а у нас с собой только 5000, то платим 5000. Если долг = 2000, а у нас 5000 то платим 2000.
Смысл задавать есть, так как тут мог быть вопрос про логику, а не какой оператор использовать.
>>20521
Увы, никогда не интересовался этой темой. Но, естественно, если изучать только PHP и ничем больше не интересоваться, то упрешься в потолок. Крутые специалисты, даже если работают на PHP, обычно обладают кругозором (например: Си, линуксы). Можешь поискать на Хабре статьи про переезд, а также попробовать погуглить вакансии и посмотреть требования.
>>20043
Используй if, либо тернарный оператор и не усложняй код.
>>20096
Там есть поддержка старых браузеров.
Можно пользоваться любой информацией, если это поможет.
>>20023
Ты бы ссылку приложил на инструкцию, а то непонятно, откуда это взято. Смысл в том, что доступ к файлам должен быть и у тебя, и у веб-сервера, если он запущен от другого пользователя.
Если ты глобально установил тот же Апач + mod_php или nginx + php-fpm, то в линуксе они обычно работают от имени пользователя www-data. И этому пользователю нужно иметь доступ к файлам хотя бы на чтение. А в те папки, куда будет писать Ларавель, еще и на запись.
Владельцем лучше назначить себя.
Там правда, будет проблема, что Ларавель будет создавать временные файлы от имени www-data, и лишить тебя к ним доступа.
Я обычно использую встроенный в PHP сервер, который запускается от моего пользователя из ком. строки и позволяет не мучаться с правами. Также, ты можешь отключить глобально установленный Апач или nginx и запускать их вручную из командной строки от своего пользователя и с выводом логов в консоль, но ту придется поколдовать и почитать мануалы.
>Вернее, что он написал, я понимаю, но что это за команды - нет. find какой-то - это же просто команда поиска, что она может сделать?
Она находит файлы и может выполнить определенную команду для каждого найденного. Вот сайт, который пытается объяснить разные опции в команде: https://explainshell.com/explain?cmd=find+/var/www/html+-type+f+-exec+chmod+644+{}+\; (исполнительные идиоты в моем провайдере зачем-то его блокируют).
Также, ты можешь набрать в консоли или в гугле man find и почитать справку по команде.
Также, может тебе поможет гайд по основам CLI https://github.com/codedokode/pasta/blob/master/soft/cli.md
> Всё равно не работает. Если положить в корень test.php, то он нормально отрабатывает, а Ларавел нет.
Проверь командой stat или ls -l, какие права стоят у файлов Laravel, в том числе index.php или что там используется вместо него. Проверь лог веб-сервера, к какому файлу доступа нет.
>>19817
Вот тебе в помощь важные моменты, о которых надо помнить при использовании AJAX-запросов: https://github.com/codedokode/pasta/blob/master/js/ajax.md
И правильно пишут, нужна защита от уязвимости CSRF.
Тут не требуется две переменные $x и $b, если они всегда равны, хватило бы одной. Просто писать $sum = $x*$x;
> $x < 10, $b < 10
Это не имеет смысла, так как тут мы пишем не команду, а условие. Запятая используется, чтобы вписать несколько выражений в первый или третий блок, а во втором пишут условие проверки. В нем можно использовать && или ||, но нет смысла ставить запятую.
Тебе надо внимательно прочитать, как работает for, а не ставить выражения наугад.
for (действия до начала цикла; условие продолжения; действия после каждого шага) { ... }
for (тут можно запятую; тут не имеет смысла ; тут можно запятую) { ... }
>Ты бы ссылку приложил на инструкцию
Уже по нескольким делал. Вот последняя: https://www.digitalocean.com/community/tutorials/apache-ubuntu-18-04-ru
А тут написал, что именно делал и что получил https://2ch.hk/s/res/2685013.html#2686503 (М)
Впервые настраиваю веб сервер вообще и апач в частности. Очень... непривычно.
https://t точка me/anonaprphp
Этих групп как говна за баней.
Надо в одну строку
>и не усложняй код.
Ясно, вы нихуя не понели.
Кучи скобочек - вот что усложняет код.
Сделать что-то с переменной, если она не null - это настолько частая операция, что для нее очень не помешает однострочная языковая конструкция.
>Кучи скобочек - вот что усложняет код.
С каких это пор группировка усложняет код?
>это настолько частая операция
По твоему коду не скажешь, что ты способен оценить насколько это частая операция.
Не могу допереть что от чего наследовать: отдел от сотрудника, или сотрудника от отдела.
Вроде бы нет. Я просто вижу очевидную связь между тем, что бы наследовать Профессии от Сотрудника. Но как должны взаимодействовать класс Сотрудник и Департамент?
Ты совершаешь классическую ошибку новичка, пытающегося в ООП - пытаешься применить его там, где оно не нужно.
По сути, забиваешь гвозди микроскопом.
Так вот, наследование - это инструмент, который предназначен для - сюрприз - наследования (расширения) свойств и поведения одного объекта другим. И реально применяется в довольно узком наборе случаев, кроме шуток. Например, когда у тебя есть класс "модель", которая работает с базой данных и в этом случае все "модели" типа юзера, отдела и так далее также являются моделями.
В твоём случае, отдел является сотрудником (или наоборот)? А сотрудник является профессией (или наоборот)? Если нет, то тебе вообще не стоит наследовать их.
Не читал твою задачу, но вообще отдел и сотрудник - это два разных объекта твоей предментной области, а профессия является скорее всего свойством сотрудника.
То есть, у тебя есть классы условно сотрудник, отдел, профессия и у сотрудника должны быть поля "ид профессии", "ид отдела".
Спасибо. Вроде бы понял. Завтра попробую
У тебя какая то каша получается.
Немного расширю то, что писал >>22203
У тебя есть класс сотрудник. Далее у тебя есть класс сторож, класс продавец и класс директор. Они являются сотрудниками. Т.е наследуют из базового класса какие то общие свойства и методы. Например у них у всех есть рабочий график, оклад, стаж, дата приема на работу и какой нибудь метод расчета коэффициента зп который высчитывается на основании стажа и времени работы в предприятии.
А вот что ты собрался наследовать сотруднику от отдела - для меня до сих пор загадка.
>>22311
>Далее у тебя есть класс сторож, класс продавец и класс директор.
Я бы под это классы не делал - с точки зрения кода сторож, продавец и директор являются обычными сотрудниками. Достаточно им в свойство прописать ид должности.
Я хочу подружить ckeditor с ларкой. Он генерирует выход в html тегах. Только выход через {{}} всё успешно экранирует и я вижу <b>хуй</b> текст. Если убрать проверку, то мне могут поднасрать, сохранив напрямую через post, например. Если вырезать все эти script, onclick и так далее, то можно так же с веселым гиканьем испортить текст юзверу. Как мне усесться сразу на два стула?
никак. найди какой-то редактор, который в bbcode или markdown будет текст размечать, и из него уже комментарии рендери
либо, как очень хуевый вариант, можешь сделать свой валидатор, который будет только разрешенные теги без аттрибутов сохранять. но ето ебала и ты точно где-то проебешься, такие дела
>никак
Ох. А как тогда справляются другие? Редактор популярный вроде
Я тут пока надумал оставить поддержку только всяких br и h2, куда точно не навесить скрипты, а все остальное спецсимволами замещать
Добавляют только в админку такие штуки вроде. Для пользователей давно не видел. Если я не прав, анон покажет.
Ну и смотри, такие редакторы, они реализацию с данными мешают. Например, твой сайт взлетит и надо будет мобильные приложения пилить, вот ето вот все. А у тебя в каждой статье, в каждом комментарии html тэги висят. И что теперь, через вебвью все выводить? Или страйпать теги и убивать всю разметку?
Поэтому разметку рили лучше на маркдауне каком-то хранить, или посмотри другой, который тебя устраивать будет.
>>22346
Ну, это не только мобильных приложений касается. Для магазинов, например, те же выгрузки товаров создавать если для маркетплейсов.
Мой опыт показывает, что если менеджерам/маркетологам дать возможность где-то большой красный текст въебать, они его обязательно въебут. А если не давать, то они обязательно попробуют. А ты потом ахуевать будешь, глядя в базу, сколько говна они наворотили.
Поетому если есть возможность, лучше сразу донести до бизнеса, что такие редакторы веселых табличек потом могут кучу проблем сделать и это какбы много часов работы.
На самом деле там ид должности не надо - это доменный объект и там уже должно само имя должности содержаться.
Я сам тот ещё нуб.
в чем рофл?
Это копия, сохраненная 16 ноября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.