• Почему современные языки отказываются от ООП?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Они не отказываются. Скорее происходит отказ от "парадигмы" разработки. Языки стали мульти-парадигменные. Посмотрите на С++20 или Scala. Их невозможно положить в коробочку ООП или ФП. В них есть почти полный набор фич и оттуда и отсюда. И с каждым годом число фич растет и граница размывается. Нашим потомкам будет вообще непонятно где идет раздел.

    По поводу golang. Это язык ограниченной разработки. Его создавали специально чтобы порог вхождения был низкий. Фактически делали лайтовый С++ которому можно обучить школьника за 14 дней. Но с перформансом выше чем у Питона. Поэтому выражать какие-то сложные конструкции на типах там скорее всего не получится. У golang есть свой манифест. Я забыл как он называется и где он. Вобщем там довольно четко обоснованно почему такие принципы и почему такая идеология.
    Ответ написан
    1 комментарий
  • Как правильно строить крупный проект?

    @vism
    Называется, услышал звон, да не знаю где он.

    1. Сервисный слой ты превратил в контроллер.
    Т.е. у тебя есть контроллер, а ты создал ещё один, т.к. где-то слышал, что нужны сервисы.
    Но, сервисы не шлют ответы, это внутренний слой для отделения логики.
    Ты можешь те методы вызвать через консоль, другие сервисы и т.п.
    Там должен просто генерироваться return, а сам response уже в контроллере (чтоб контроллер своб функцию выполнял). Валидацию реквеста кстати тоже надо делать не в сервесе.

    2. CategoryQuery - это вобще дичь дикая.
    Ты опять создаёшь дубликат, потому что услышал о репозиториях, и даже интерфейс. Вот я угараю с людей, кто везде пихает интерфейсы. Интерфейсы нужны там, где они нужны. Где будет 2+ наследователей интерфейса.
    Откуда у тебя тут наследники, если ты завязан на элокуент?
    А ноги от индусов репозитаристов. Не нужен репозитарий, Query и интерфейсы при работе в элокуент. Он сам в себе это всё уже содержит и все повторяющиеся вещи обёрнуты уже. find, first, firstOrNew и т.д.
    Так что используй элокуент и не переусложняй проект напрасно. Не надо делать сложно, делай просто.

    3. CategoryAction.
    Опять интерфейс...
    Вот это Экшн по сути у тебя сервис. Тут ты имеено перенёс бизнес логику создания и редактирования и возвращаешь ответ данного метода. Вот удали свой CategoryAction и перенеси методы в сервис.
    Ответ написан
    30 комментариев
  • Как оптимизировать эти запросы на Laravel?

    @vism
    Это задание, а не вопрос.
    Ну, а если вопрос, то переписать код, чтоб формировался 1 запрос к базе и уже из него доставать данные.
    Никаких проблем, много раз так делал.
    Ну а если задание, то $200/h и за несколько часов составим нужный запрос:)
    Ответ написан
    1 комментарий
  • Как передать на бекенд требования к API?

    @Vitsliputsli
    Многие фронтендеры относятся к беку, как к некой обертке для работы с базой данной. Когда такие становится лидом команды и начинают диктовать свои требования беку, начинается ад, проект даже с простым беком превращается в нечто монструозное, разваливающиеся на ходу. Но, так как снаружи бек не виден, руководство считает, что дело в отдельных тупых бек-разработчиках, которые артачатся, не хотят работать и увольняются.
    Судя по вашим фразам, вы скорее всего один из них. Так как уверены, что приложение - это то, что на фронте, что api - это хрень, которая завязана на отображении информации на фронте, что разработчики бека не нужны при разработке архитектуры и вообще пофиг, что они там делают, главное чтобы давали то, что хочет фронт.
    Но, раз вопрос задан, значит сомнения вас посещают. Поэтому: приложение это не только фронт, а зачастую фронт это не самая сложная его часть. Бек - это не обертка над базой данных, и если вы поменяете значение в базе, это не значит, что к примеру, в потоковом вещании сменится кодек (вот, кому-то может и смешно, а мне в такой ситуации ни фига не было весело). С помощью API получают данные, поэтому не важно, что там у вас напроектировали дизайнеры, или как эти данные выводит фронт, API должен быть универсальным и не зависить от того как вы отображаете данные, поэтому, к примеру, бек может вам дать для получения данных несколько универсальных запросов, а не один специальный. В общем, все гораздо сложнее, и ваш вопрос как состыковать фронт и бек перерастает в вопрос как формировать архитектуру проекта, и как управлять командой.
    Ответ написан
    17 комментариев
  • Как передать на бекенд требования к API?

    @slapshin
    Мы своей команде используем такой подход: отрисовывается дизайн, фронтендеры анализируют его, решают какие api им нужны для реализации указанного UI, затем кидают задачи на бэк. Бэкенд смотрит предложеный API, если что-то не нравится - общаемся. В принципе, такой подход нас устраивает: фронты пилят UI, бэкэнд реализует бизнес логику, модель данных, занимается оптимизациями производительности и т.д. До этого бэк сам лез в дизайн и продумывал все за фронтов - было не всегда удобно: все таки UI это больше фронтовская тема
    Ответ написан
    3 комментария
  • Какие проекты запрещено писать на React по лицензии?

    vabka
    @vabka
    Токсичный шарпист
    React использует MIT лицензию => никаких ограничений нет.

    Хз откуда эта байка пошла (может так было, когда реакт только вышел, хз)
    Ответ написан
    4 комментария
  • Как можно убедиться, что на сервере работает опенсурсный код?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Нет.
    Ответ написан
    Комментировать
  • Docker и php-fpm: почему рекомендуют не пробрасывать ip?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Самое главное не высунуть php-fpm порт наружу в интернет что бы никто не запустит на нем какой-нибудь зловред.

    Если же порт торчит из докера и прикрыт с наружи файр-волом то занчит вы знаете что делаете и принимаете на себя управление рисками you know exactly what you are doing (and are willing to accept the extreme risk)

    Ели же у Вас из докера в интернет торчит неважно кто рнр, база данных или еще какой-нибудь сервис - повертье желающих его взломать достаточно
    Ответ написан
    Комментировать
  • Как заставить Laravel Octane (Swoole) кэшировать скрипты и стили?

    Sanasol
    @Sanasol Куратор тега Laravel
    нельзя просто так взять и загуглить ошибку
    https://laravel.com/docs/8.x/octane#serving-your-a...
    In production environments, you should serve your Octane application behind a traditional web server such as a Nginx or Apache. Doing so will allow the web server to serve your static assets such as images and stylesheets, as well as manage your SSL certificate termination.

    Ответ написан
    Комментировать
  • Как проверить данные для авторизации через MySQL?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    mysqli_query возвращает false если во время выполнения запроса произошла ошибка. Поэтому, если вы уж пишете в таком стиле, то извольте проверять, что во время выполнения запроса ошибки не произошло. Примерно так:
    $checkUser = mysqli_query($connect, "SELECT * FROM `users` WHERE `email` == '$email' AND `password` == '$password'");
    if ($checkUser  === false) {
        die(mysqli_error($connect));
    }


    После того как вы добавите в код проверку, вы увидите что система ругается на некорректный синтаксис SQL-запроса. Конкретно в вашем случае это использование "==" для сравнения. В MySQL используется одинарное "=" для сравнения.
    После того как вы исправите эту ошибку, код ваш заработает, но он будет очень небезопасным.
    Для того чтобы подставлять значения из php-перемнных в SQL-запрос, используйте подготовленные выражения.

    Более подробно расписано почему не стоит использовать mysqli_num_rows и как пользоваться подготовленными выражениями (информация была скопирована отсюда):

    Это очень хороший вопрос.
    Ответ на него - никак не использовать.

    Да, в mysqli действительно есть специальная функция, которая может сказать, какое количество строк вернул запрос SELECT.
    Традиционно употребляется в двух случаях:

    а) когда это не нужно
    б) когда приводит к катастрофическим последствиям

    Первый вариант - это когда мы хотим узнать, вернул ли запрос хоть какие-то данные, или нет. Но на этот случай у нас есть сами данные. Зачем отдельно запрашивать их количество, если мы все равно будем эти данные получать в переменную, которую потом и можно будет использовать чтобы узнать, вернул ли запрос что-нибудь или нет.

    Второй вариант - если эта функция используется чтобы посчитать, сколько строк лежит в БД. В таком варианте это будет откровенное вредительство, поскольку данных может быть очень много, и все эти данные БД должна сначала получить у себя, а потом отправить в РНР. Заняв всю доступную память или даже вызвав фатальную ошибку нехватки памяти.

    Правильным решением этой задачи будет сделать запрос вида SELECT COUNT(*) FROM .... В этом случае БД сама внутри себя посчитает количество строк (очень быстро) и вернёт только одно число, которое не занимает оперативную память вообще.

    Вот и получается, что функция mysqli_num_rows() является либо вредной, либо бесполезной

    В данном случае надо сначала получить записи из БД
    // БЕЗОПАСНО выполняем запрос
    $stmt = $link->prepare("SELECT * FROM comments WHERE art_id = ?");
    $stmt->bind_param("s", $note_id);
    $stmt->execute();
    // получаем данные
    $result = $stmt->get_result();
    $comments = $result->fetch_all(MYSQLI_ASSOC);


    А после этого уже их выводить
    <?php if ($comments): ?>
        <?php foreach ($comments as $row): ?>
             <?=$row['comment']?><br>
        <?php endforeach ?>
    <?php else: ?>
        Эту запись еще никто не комментировал
    <?php endif ?>


    Как видно, никакой mysqli_num_rows нам не понадобилось
    Ответ написан
    7 комментариев
  • Curl не создает новый Laravel проект что делать?

    karabanov
    @karabanov Куратор тега Docker
    Системный администратор
    1 комментарий
  • Почему возникает ошибка Undefined offset: 1 в laravel при отправке письма на email?

    Fragster
    @Fragster
    помогло? отметь решением!
    6101622a617e8322210925.png
    Ответ написан
    Комментировать
  • От middle backend java developer к middle android developer. Как учитывается опыт работы при приеме на работу?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Как договоритесь. Если сможете нанимателя убедить в том, что ваш опыт в смежной области и крепкая теория в целевой помогут вам быстро влиться и работать с полной отдачей, то можно мидлом и остаться. На сколько это будет сложно - зависит от того, как долго уже не могут закрыть вакансию, уровню бюрократии в компании, личных качеств интервьюверов и ещё множества различных факторов. Можно ещё попробовть договориться о пересмотре грейда через полгода например.
    Ответ написан
    2 комментария
  • Нужно ли включать CSRF для SPA сайта?

    Нет
    UPD: пробегись по коментам к этому вопросу Laravel + Nuxt: Как победить ошибку 419 — CSRF token mismatch?
    Ответ написан
    Комментировать
  • Нужно ли включать CSRF для SPA сайта?

    @gomerIT
    Нету куков - нету csrf.
    Ответ написан
    Комментировать
  • Почему не работает код?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вопрос бессмысленный - код работает. Между "не работает" и "работает не так, как задумано" есть существенная разница. Попытайтесь её осознать.

    params = format({

    Зачем здесь вызов format? Не нужен.

    params_list = Object.values(params)
    console.log(params_list)
    for (var v in params_list) {s=s+v+'='+params[v]+'&'}

    Вот это конечно дичь дикая. Чтобы такое написать, надо не знать, как работает цикл for-in. Разберитесь. Не нужен тут массив значений, перебирать надо было сразу params.

    А вообще, всё это делается гораздо проще:

    function format(params, method) {
      return `https://api.vk.com/method/${method}?${new URLSearchParams(params)}`;
    }
    
    console.log(format({ access_token, version }, method));
    Ответ написан
    4 комментария
  • Как использовать Docker?

    @i1yas
    1. Да, я так часто делаю, особенно для тех стеков, с которыми я часто не работаю.
    2. Тут смотря что вы имеете ввиду.
    Есть команды docker run/docker exec/docker-compose run, они либо создают контейнер и запускают команду, либо запускают команду на существующем контейнере, например, bash, либо php -a, psql - таким образом можно попасть в интерактивную среду внутри контейнера.
    3. Как настроете. По умолчанию все данные хранятся внутри контейнера и они будут потеряны при следующем рестарте. Для данных, которые нужно сохранять между рестартами, например база данных, есть volume. Если кратко, можно забиндить часть данных внутри контейнера либо на файловую систему, либо в специальное хранилище докера.
    4. Да, можете для примера посмотреть как устроены docker-compose.yml php + mysql + nginx или что вам ближе. Рекомендую просто потыкать, попробовать своей hello world под docker-compose запустить.
    5. Пункт 4, посмотрите какой-нибудь простенький docker-compose.yml, чтобы там БД была и приложение в разных контейнерах, думаю у вас вопросы многие уйдут
    Ответ написан
    Комментировать
  • Как использовать Docker?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    1. Да
    2. Да
    3. Можно использовать volumes
    4. Да
    5. Надо указать в конфиге какие каталоги и файлы используются и запустить docker-compose
    Ответ написан
    Комментировать
  • Как правильно работать с JsonResource в Laravel?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    The whenLoaded method may be used to conditionally load a relationship. In order to avoid unnecessarily loading relationships, this method accepts the name of the relationship instead of the relationship itself:

    use App\Http\Resources\PostResource;
    
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'posts' => PostResource::collection($this->whenLoaded('posts')),
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }

    In this example, if the relationship has not been loaded, the posts key will be removed from the resource response before it is sent to the client.

    https://laravel.com/docs/8.x/eloquent-resources#co...

    В доке речь про коллекцию, у вас же одна модель, но всё остальное применимо.
    Ответ написан
    7 комментариев
  • Как работать с большим количеством запросов?

    @StiflerProger
    Просто каждый запрос делай в транзакции с "select for update".
    1. Сразу после получения запроса ставишь блок "select for update".
    2. Проводишь валидацию данных. Проверяешь оплату в другой таблице и тп.
    3. Добавляешь 10 рублей юзеру.

    Если у тебя юзер может даже после этого добавить себе 1000 раз по 100 рублей, то проблема в шаге #2.
    Т.е. твой момент с "более ее увеличивать нельзя" должен проверяться в шаге #2.
    Ответ написан
    Комментировать