• Чат + видео чат на laravel?

    @fuliozor
    Web and Android developer
    Для видеозвонков в вебе фактически есть единственная технология это WebRTC https://webrtc.org/ , но предупрежу задача не из тривиальных
    Ответ написан
  • Где применяются key(), next(), current()?

    @Vitsliputsli
    Если мы говорим про итерирование стандартных массивов php, то эти массивы - двусвязные списки, и их перебор наиболее эффективен при использовании указателя, а не обращения по ключу. Поэтому перебирать их следует с помощью итераторов (либо foreach, либо ООП итераторы, либо процедурные итерационные функции next(), prev(), reset() и т.д.). В js простые массивы устроены иначе, поэтому и работать с ними рекомендуется по-другому.
    Для простого перебора слева направо всего массива достаточно foreach, но могут быть и более сложные варианты, тогда задействуются другие способы.
    Насчет while(key($user_ar)), уже написали: while проверяет условие на true/false, если key($user_ar) = 0, то после динамического преобразования в bool, это будет false.
    Ответ написан
  • Как решить проблему с сессиями при включении EncryptCookie в Laravel 5.7?

    @VvArtem Автор вопроса
    В общем проблема оказалась в конфиге php, был включен параметр mbstring.func_overload 2. А там по цепочке неправильно работал метод random_bytes, т.е. он выдавал строку, длину которой strlen считал не правильно. В итоге метод проверки валидности кук выдавал false.

    Начиная с php7 композер будет выдавать ошибку, что этот параметр нужно выключить, так что сомневаюсь, что кто-то еще столкнется с этой проблемой.
    Ответ написан
  • Какую дату last-modified отправлять и какие решения есть для Laravel?

    @granty
    Немного сухой теории об кэшировании на стороне клиента
    Для управление кэшем на стороне клиента, между браузером и сервером предусмотрен обмен заголовками:
    If-Modified-Since <-> Last-Modified
    и
    If-None-Match <-> ETag
    Заголовок ответа сервера ETag может быть «строгим» (документы соответствуют по-битово) или «нестрогим» (документы совпадают по основному содержанию, но без учёта дизайна и баннеров).

    Поэтому на вопрос:
    Если мы добавили блок , как пример: обратный звонок на эту страницу, то дату так же надо поменять?
    ответить можете только вы сами. Отправив нестрогий ETag можно разрешить браузеру показывать страницу из кэша, если на странице произошли незначительные изменения в дизайне (а у пользователя - хилый Интернет-канал). А можно и прислать новую страницу, если считаете нужным.

    Просто посылать заголовок Last-Modified недостаточно. Сервер должен в ответ на заголовок If-Modified-Since от браузера, давать заголовок "304 Not modified" или же "200 OK" + новая страница.
    Есть схема принятия решения как сервер должен отвечать на заголовки браузера If-modified-since и If-None-Match в разных ситуациях.

    Как это можно реализовать при динамически генерируемом контенте
    Под спойлером - плач Ярославны
    spoiler
    При всей "технической понятности" что надо сделать, задача достаточно нетривиальная в силу большого объёма и разбросанности данных, за датами изменения которых надо следить. Хранить даты изменения всех записей в БД и собирать даты изменения скриптов, которые генерят страницу - немыслимо, тем более для каждой страницы, эти наборы данных - разные. И из этого надо исключить скрипты, которые, например, отвечают на ajax-запросы. И при любой переделке движка сайта вся эта хрупкая система с высокой вероятностью поломается.


    Единственное приличное решение, которое встречалось - завести таблицу всех url сайта, и в ней хранить сам url, MD5 от html-кода страницы, дату её модификации и etag.
    При получении от браузера заголовков If-Modified-Since и/или If-None-Match, сервер генерирует страницу ответа, берёт от неё хэш MD5, и сверяет его с имеющимся в таблице.
    Если хэши совпали (с учётом схемы принятия решения выше) - страница не изменилась, отдаём в браузер заголовки "304 Not Modified" и Last-Modified / ETag, саму страницу в браузер не посылаем.
    Если не совпали - отдаём в браузер заголовки "200 OK", новые Last-Modified / ETag, и присылаем новую страницу.

    Единственная техническая заморочка будет для сайтов с кучей параметров в query-string, если у параметров не соблюдается порядок. Параметры надо будет нормализовать (например отсортировать) и заново собрать упорядоченную query string.
    Ответ написан
  • Как лучше реализовать аутентификацию в микросервисной архитектуре?

    Позднова-то наверное, но лучше поздно, чем никогда.

    Два самых важных вопроса:

    1. Каких масштабов проект? По 10-бальной шкале от 0 (интернет магазинчик) до 10 (eBay). Вангую, что не больше, чем 3-4 скорее всего.
    2. Все микросервисы находятся в приватной сети или разбросаны по узлам всемирной паутины? Опять же, скорее всего первое.

    Если мои предположения оказались верны, то:
    1. Нафиг OAuth и прочий геморрой. Вы слишком маленькие ещё для этого, надо все делать как можно проще и конкретней. Гибкость и скорость всегда покупаются человеко-часами, чудес не бывает. Выполните основные требования сусурити (brypt, смертные токены и т.п.) и не более. Напишите что-нибудь сами, простое, понятное, и легко поддерживаемое программистами того уровня, который вы можете нанять. В 50 строк кода влезете.
    2. Поставьте на входе nginx, который на каждый входящий запрос будет спрашивать подзапросом у микросервиса аутентификации: "вот запрос, такие хедеры, такой урл, кто это? его пускать?". И напишите на чем-нибудь типа Go читалку из базы юзеров, которая будет вам за 3 мс давать ответ на такой вопрос (а nginx приклеивать "Вася" к запросу и отправлять дальше или отфутболивать). А если нагрузки большой нет, то можно и медленней, не надо бояться задержки 15 мс на каждый запрос, это вполне оправданная цена за простоту и отсутствие зоопарка языков и технологий.

    Вот тут я накидал очень минималистичный пример: github.com/bitia-ru/examples-microservices-authent...
    Ответ написан
  • Почему PHP не видит css file?

    FanatPHP
    @FanatPHP
    Помогаю и новичкам, и старичкам
    Потому что PHP вообще никакого отношения к css файлам не имеет и никогда их не читает.

    "Видит" css файлы твой браузер.
    И достраивает к ним путь от текущего каталога.
    Для того чтобы любой локальный ресурс, упомянутый в HTML, гарантированно читался, путь к нему надо указывать абсолютный, от корня веб-сервера.

    То есть не file.css, а /folder/file.css

    Подробнее читаем тут
    Ответ написан
  • Как сделать insert ... on duplicate key update в Lighthouse-php на Laravel?

    @ettychel Автор вопроса
    Решил свой вопрос созданием класса мутатора, все шаги описаны ниже

    Добавляем пакет кастомных типов данных

    composer require mll-lab/graphql-php-scalars

    Создаем класс мутатор

    php artisan lighthouse:mutation ClassNameMutator

    По пути /yourPath/appName/app/GraphQL/Mutations будет создан файл ClassNameMutator.php
    Пишем в самом конце свой метод createOrUpdate

    use App\Models\ModelName;
    
    ...
    
    public function createOrUpdate($rootValue, array $args, GraphQLContext $context)
    {
        $model = ModelName::find($args['id']);
        if ($model == null) {$model = new ModelName();}
        $model->fill($args)->save();
        $model = ModelName::select($args['field'])->find($args['id']);
    
        return $model;
    }


    В файле /yourPath/appName/graphql/schema.graphql прописываем следующее:

    "A Json string with format normal Array"
    scalar Mixed @scalar(class: "MLL\\GraphQLScalars\\Mixed")
    
     ...
        
    type Mutation {
        uoiModel(input: uoi! @spread): Mixed @field(resolver: "ClassNameMutator@createOrUpdate")
    }
    input uoi{
        id: ID!         //Поле таблицы в запрос
        otherField: ID  //Поле таблицы в запрос
        field: Mixed    //Поля, которые нужны в ответ, указываются в виде простого массива ["field1","field2","fieldn"]
    }


    Теперь у нас есть мутация, которой можно легко пользоваться, запрос будет таким:

    mutation {
        uoiModel(
            input: {
                id: 900003
                status: 49
                field: [
                    "id",
                    "status"
                ]
            }
        )
    }


    Данное решение подходит для таблиц как с инкрементным id, так и без
    Ответ написан
  • В каком стеке web технологий одновременно: высокий порог входа, высокие зарплаты и в целом не проблема найти удалёнку?

    Robur
    @Robur
    Знаю больше чем это необходимо
    высокий порог входа больше не в технологиях а в решаемых задачах.
    Если вы предлагаете услуги создания лендингов - то порог (и оплата) на уровне лендингов и не важно на чем вы его запилите

    Развивайтесь в сторону создания более сложных вещей - там и технологии поймутся.
    Более сложные - это всевозможные веб-приложения, забудьте о сайтах.
    А приложения могут быть уже какими угодно и с большим разбросом по сложности - может быть CRUD админка которую любой индус накидает, а может быть какая-нибудь замороченная система бизнес-аналитики, где кнопки в браузере - это только 10% от всего функционала, и это одна из причин почему ищут фуллстеков. Фуллстек в состоянии взять фичу и сделать её полностью, а не "накидать кнопок и ждать бекенд" или "сделать апишку и отдать фронту".
    Ответ написан
  • PHP как сложить 2 переменные?

    @dero
    о себе
    switch ($ar['op']){
       case '+':
          $price_type3 = $value['p_type3_price'] + $setup['value'];
       break;
    
       case '-':
          $price_type3 = $value['p_type3_price'] - $setup['value'];
       break;
    
    //И так далее
    
    }
    Ответ написан
  • MVC реализованый через Controller, Entity, Repository, Service это как?

    gzhegow
    @gzhegow
    Думал, стану умнее, когда адаптируюсь, но нет
    Новая версия 02.10.2020

    (поскольку я не встретил никого, кто сказал мне "я точно понял DDD", а опросил в телеге человек 30 разного уровня, попробую написать своё видение - ну в смысле свое - то, которое получилось после сборки мнений этих людей)

    Смысл DDD в данном случае не столько во вселенской крутости, сколько в работе большой командой. Когда вы заставляете новых людей в команде долго изучать структуру проекта, класть все так же и следовать правилам - вы замедляете процесс и повышаете нервозность команды, никто не знает - как действительно правильно делать.

    По факту - доменная модель это некое что-ли обязательство накладываемое на заказчика (да, да, опасно) говорить об одних и тех же вещах используя одинаковые слова. То есть если процесс в компании как-то назван - используя эти слова можно быстрее найти его в коде, папке и просто на бумаге.

    Что для нас - то доменная модель отличное решение, которое дает нам следующую фишку:
    Внутри проекта в папке Домен мы можем создавать фичи по тем названиям, что дал им заказчик. Внутри не нужно придерживаться каких-то строгих структур папки, но рекомендуется, чтобы они были узнаваемы, по той теории, что по программированию пишут в интернете, на том же refactoring.guru, или просто в книгах. Те же модели допустим могут быть. Контроллеры. Сервисы. И так далее. Но если вы в папке с фичей сделаете код написанный на коленке, но напишете оборачивающий Сервис и конфиг по его подключению - что ж - оно работает. Когда захотим переделать - переделаем. Вместо необходимости всегда делить любую фичу на 20 одинаковых папок, с моделями контроллерами и так далее. и потом искать "а чо, а где"

    Проверять будут, как работают твои Сервисы.
    Что там у тебя под капотом - лично твоя ответственность.

    Структура папок:

    - Domain/
    -- (Catalog)/
    --- Di/
    ---- CatalogProvider.php
    CatalogProvider.php
    Основной файл модуля. Биндим интерфейсы. Загружаем конфиги. Определяем порядок загрузки и модули без которых модуль не запускается.

    --- Controllers/
    ---- (Any)Controller.php
    (Any)Controller.php

    Контроллеры содержат действия. Действие на вход принимает объект запроса Request, а возвращает обычно объект Response. Иногда разумно сделать, чтобы можно было возвращать, например, массив или строку текста, которая уже потом автоматически оборачивается в Response. Смысл Response в данном случае в том, чтобы позволить задавать заголовки, куки, отчеты хранилищ в виде очереди - в любом месте программы добавляешь в массив, и в конце они соединяются и отсылаются вместе с данными в виде полей или дополнительных заголовков, а не постоянно это помнить

    --- Tasks/
    ---- (Any)Task.php
    (Any)Task.php

    Таски это как контроллеры, только работают из консоли, а не из браузера. Разница в разборе входных аргументов - в браузере разбирается строка URL и Query, а в нашем случае разбирается $argv. В запросе из браузера может быть прикреплен файл, тогда как в консоли файл можно передать, например, с помощью pipe php://stdin. На выход отправляется как правило строка, но лучше чтобы она формировалась по той же логике, как и Response, т.к. отчеты хранилищ тоже могут добавляться по ходу работы программы

    --- Services/
    ---- (Any)Service.php
    (Any)Service.php

    Сервисы, они же - Фасады. Класс, имеющий много функций и не имеющий свойств и хранимой информации. По сути они просто вызывают другие классы и говорят им, что делать. Удобно проверять функционал выданной разработчику задачи, написав тесты на методы сервисов, т.к. если кто и будет пользоваться модулем - то только используя эти методы, остальные - под капотом и вообще не должно волновать как оно там и что. Может быть несколько штук, но можно и один на модуль. Даже лучше чтобы один. Но поди сделай один для своей библиотеки полезных штук - там будет один сервис для массивов, один для дат, один для строк, один для денег и т.д.

    --- Models/
    ---- (Any)Model.php
    (Any)Model.php

    Модели это классы без методов. Можно иметь абстрактную модель, содержащую методы buildFrom(что-то) и методы to(что-то), от которой наследовать остальные модели. Можно переписать конструктор, чтобы передавать аргументы через запятую, а не всегда массивом.

    ---- (Any)Vo.php
    (Any)Vo.php

    ValueObject - это объекты без методов, такие же как модели. Основное отличие состоит в том, что ValueObject как правило одноразовые, не имеют идентификатора, создаются, выводятся на экран или передаются в другую часть программы, но никогда не меняются. Например в Vo удобно заворачивать сумму и валюту. Или язык. Или еще что. Иногда им пишут методы сравнения по свойствам, методы больше меньше, сортировки.

    Это в отличии от моделей, равность которых определяется их идентификаторами в момент времени. Для программы - uuid, для базы - id.


    *** СОДЕРЖИМОЕ /(Catalog) ***

    --- (Any)Folder/File.php
    (Any)File.php

    Все остальные файлы, которые вы создаете как вам вообще хочется. Обычные классы, свойства методы, как закодите, так и будет. Их публичные методы потом переносятся в сервисы/фасады и крепятся поверху интерфейсами, если хочется подменяемость.

    - Repository/
    -- Mongo/
    --- MongoProductRepository.php
    -- Eloquent/
    --- EloquentProductRepository.php
    EloquentProductRepository.php
    Репозитории содержат методы типа "найти по", "достать несколько", "сохранить один", "сохранить много", "вставить", "обновить" и им подобные.
    В случае поиска (операция GET) на вход подается что хочешь, но лучше обойтись встроенными типами, чтобы разработчик не задавался вопросом - из какого модуля программы здесь на вход прилетел CategoryFilter или что-то такое. Пусть фильтр умеет преобразовывать себя в массив вложенный, а репозиторий умеет его понимать. На выход - нулл, модель или массив моделей. Все остальные обертки в коллекции - от лукавого таракана.
    В случае записи (операция POST/PUT/DELETE) на вход подаются модели. На выход можно отдавать или статус true/false, или те же самые модели, т.к. в случае массовой вставки через INSERT у моделей может изменится идентификатор - например вы закидываете на вход 10 моделей, а на выход возвращаете те же объекты, только проставив им айдишники.

    Важное замечание для тех, кто привык к моделям Yii или Laravel - выдаются НЕ их модели. Модели лежат у вас в папке с модулем и представляют собой класс со свойствами без методов (желательно, очень настойчиво желательно, без методов) - в папиных языках это еще называют "структурами". Если мы имеем EloquentModel-и или другие AR-модели - они размещаются неподалеку, как часть репозитория. А по программе ходят наши стандартные модели без методов. Их еще называют Entity, я как то разбирался чем отличается Entity от ValueObject. Тем, что у Entity могут быть и могут меняться идентификатор (ID) и даже быть их два - ИД в оперативке (например Uuid) и айди в источнике данных.

    --- Models/
    ---- Product.php
    --- Migrations/
    ---- 2020_10_02_120030_create_categories_table.php
    ---- 2020_10_02_120130_create_products_table.php
    2020_10_02_120030
    Обратите внимание на дату - она является ключом сортировки в алфавитном порядке. 30 секунд установлено для того, чтобы в рамках одной таблицы менять порядок после того, как миграции уже созданы. У чего-то станет 29, и у чего-то 31. А минуты позволяют управлять таблицами по порядку, меняя 01 на 02 и т.д.

    --- Seeds/
    ---- ProductSeed.php
    ProductSeed.php

    Сиды это файлы базовых данных. Их можно хранить прямо здесь в пхп, можно создать SQL файл и запускать его отсюда, а можно и вовсе положить на удаленную базу данных. Лучше всего себя показывает SQL файл сжатый в архив (мало места занимает, т.к. текст), но если данные действительно тестовые или часто меняются (пароли) - то обходимся массивом. Разумеется, сид запускается один раз после создания таблицы. Другой вопрос, что при разработке пересоздавать базу данных с нуля приходится часто.

    - Storage/
    -- File/
    --- FileImageStorage.php
    -- Aws/
    --- AwsImageStorage.php
    -- AbstractImageStorage.php

    ps.
    Но сколько бы ты не читал моё понимание, архитекторы все равно тебе скажут, что ты не так понял, и иди ещё почитай. Это бесконечный цикл о том как ты пытаешься доказать архитектору, что ты тоже архитектор, а он тебе говорит, что ты ещё молокосос (ведь рынок - это сафари - или ты гоняешь, или тебя)

    Хочется верить что наступят времена когда вместо "невозможно" начнут применять "интересно, как это возможно" и вместо "да ты гонишь" начнут применять "а не мог бы ты рассказать почему это работает", но за 2000 лет ещё не навоевались.
    Ответ написан
  • Зачем нужна нормализация БД MySQL?

    @avikb
    При разработке нормализованной или денормализованной базы размер HDD играет последнюю роль.

    В первую очередь нормализация данных нужна для устранения бардака и, как следствие, упрощения системы (уменьшение количества состояний системы), что приводит к существенному уменьшению ошибок.

    Нормализуя данные вы перекладываете часть логики проверки данных на СУБД, такие как консистентность и (частично) корректность. То есть уже на уровне вставки/изменения данных вы не можете не заполнить обязательное к заполнению поле или изменить поле в одной таблице, но забыть (или неправильно изменить) в другой (консистентность), вы не можете в поле date внести не дату, а в в поле int не int (корректность) и вы не можете удалить запись, если есть записи, которые на неё ссылаются (консистентность).

    Нормализованное состояние БД это идеальное состояние базы, денормализацию нужно делать только если без неё никак не удаётся достичь нужных результатов (при условии, что вы разбираетесь как работает СУБД, как выбираются данные, индексы, сортируются и ищутся пересечения), если для вашей системы достаточно одного сервера, то в 99% случаев денормализация данных вам совершенно не нужна и противопоказана.
    Проще говоря - если вы не знаете зачем нужна нормализация, то вам однозначно она нужна.
    Ответ написан
  • Почему не подгружается кастомный атрибут?

    greabock
    @greabock
    Могу
    Замыкание, передаваемое в метод "load" модели или в метод "with" построителя запросов, принимает на вход Illuminate\Database\Eloquent\Relations\Relation (в данном случае, возможно HasMany или BelongsToMany). То есть, это тоже самое, как если бы вы написали:
    $clinic->doctors()->each(function ($doctor) {
        $doctor->append('custom_atr');
    })

    Что не привело бы ни к какому результату, в виду того факта, что в Eloquent нет IdentityMap, который позволил бы связать записи вытаскиваемые при обходе each() c записями находящимися в отношении.
    А вот что действительно поможет:
    $clinic = Clinic::with('doctors')->find(1);
    $clinic->doctors->each(function ($doctor) {
        $doctor->append('custom_atr');
    });

    Здесь мы делаем итерации над уже загруженными докторами.
    Вообще, в данном конкретном случае, когда нас интересует одна конкретная клиника, даже `with` - лишний шаг, потому, что на следующей строке доктора все равно будут лениво загружены. Но для ясности можно и оставить.
    Ответ написан
  • Пожалуйста оцените мое убогое ООП?

    Stasgar
    @Stasgar
    Обученная макака
    Во-первых: начните изучать архитектурную часть программирования, изучите паттерны проектирования, изучите SOLID, DRY, KISS и остальные модные словечки, постарайтесь всё это осознать, или, на крайняк - зазубрить. Всё придет с опытом, изначально все не понимали зачем всё так сложно, но эта сложность обусловлена неисчислимыми литрами слёз и потраченных нервов, всё не просто так.

    Судя по всему это тестовое или учебное задание. От вас требовалось отоверинжинирить простую задачу. Давайте попробуем:

    Суть задачи - есть файл с определенной структурой хранения данных, структура строковая. Требуется этот файл преобразовать в другую структуру данных и вывести эту структуру в json формате. Задача ясна.

    Разобъем задачу на отдельные независимые этапы:
    1) Преобразование одной структуры данных (текстового файла) в другую (объект, понятный PHP, к примеру)
    2) Преобразование этой структуры данных в Json формат.
    Первый вопрос, который может возникнуть - почему сразу не преобразовать в json? Ответ - при расширении системы в будущем - нам понадобится вывести данные в виде массива, или в виде XML, или даже в виде готового файла Excel. Нам будет сложно дополнять логику изначального класса, ничего при этом не сломав и не затронув уже существующий функционал. Также ответом на этот вопрос может являться каждая буква из SOLID принципов, подробнее отвечу дальше, когда буду пояснять за реализацию, см. ниже

    Теперь рассмотрим эту задачу с точки зрения ООП, начнем думать не от конкретной реализации, а от интерфейса и абстракции (мы не парсим конкретный файл, мы парсим просто файл, мы не переводим его в конкретное представление json, мы переводим его просто в представление):
    Нам понадобится 2 класса - непосредственно класс, читающий файл и преобразующий его в простейший тип данных (например PHP array). Второй класс - преобразователь простейшего типа данных парсера в какой-то определенный тип:
    1. LogFileReaded implements/extends FileReaderContract(интерфейс, возможно абстрактный класс, если понадобится предустановленная логика)

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

    2. JsonPresenter implements/extends DataTypePresenterContract

      Абстракция содержит контракт на метод output(), а в конструкторе принимются исходные данные. В конкретной реализации JsonPresenter в output() будет банальный json_encode() (да, это нормально, нет, класс не лишний и нет, json_encode() нельзя пихать в сам парсер) А теперь к вопросу - почему не следует просто запихать это всё в парсер и вместо массива отдать json: в будущем, когда система будет расширяться - нам понадобится представить данные в виде XML - что тогда будем делать - переписывать весь код парсера ради добавления switch case "json" и т.д.? А если что-то сломается во всей системе? А если вариантов представления станет настолько много, что файл будет просто не читаем? А при данном подходе достаточно будет просто написать новый класс XMLPresenter, или даже ExcelPresenter, который на выводе не строку будет выдавать, а целый файл (опустим типизацию output пока)). Также этот класс можно реализовать в виде декоратора (паттерн), да и много еще как.



    В итоге у нас получается вполне сносная и, что важнее - расширяемая(в разумных пределах) архитектура, не забываем прописать класс клиента и определить конкретные реализации в одном месте - можно упороться и дописать сюда контейнер зависимостей.

    К примеру: в итоге, если вас уже повысили, и вы вместо парсинга стали заниматься более высшими материями - новому программисту, чтобы дописать логику преобразования данных в Excel не нужно знать как конкретно вы преобразовывали когда-то эти данные в json, ему не нужно дебажить ваш код, ему достаточно посмотреть на интерфейс - отнаследоваться от него и написать свой собственный метод преобразования и дальше использовать его в нужном месте.

    P.S. В данной реализации опускаются и упрощаются некоторые моменты для понятности
    Ответ написан
  • Почему не работает GROUP BY в Laravel 5?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Файл /config/database.php, строка 53: 'strict' => true, (в "разделе" 'mysql'), значение поменять на false.

    Подробности:
    59d3c7f6588c1557458510.png
    Ответ написан
  • Аутентификация в SPA?

    @Reallyrails
    UI/UX Software Engineer
    Использование JWT и сохранение его в storage небезопасно.
    https://www.rdegges.com/2018/please-stop-using-loc...

    Предпочтительнее все-таки использовать куки. В MDN подробно описано как их использовать для хранения сессий.

    Со стороны Vue все достаточно просто:
    1. Создаем переменную в store и храним в ней состояние наличия установленной куки.
    2. Для разделения доступа к роутам используем guard, вроде этого:
    const authGuard = (to, from, next) => {
      if (store.getters.isAuthenticated) {
        next();
        return;
      }
      next('/login');
    }
    
    const router = new Router({
      routes: [
        {
          path: '/',
          name: 'Home',
          component: Home,
        },
        {
          path: '/account',
          name: 'Account',
          component: Account,
          beforeEnter: authGuard,
        },
    });

    3. При завершении сессии удаляем куку.
    Ответ написан
  • Как начать работать в seo?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Как искать заказчиков? Где себя рекламировать?

    Это вопросы не по SEO, но по предпринимательству.

    Каналов много:
    - реклама (контекст, медийка)
    - активные продажи (холодные звонки, конференции)
    - знакомства/сарафан/блат
    - личный блог, грубо говоря выставлять себя экспертом по тем или иным вопросам, писать в своем блоге или СМИ на разные темы аспектов продвижения, например писать такие статьи:
    Кейс из России: Продвижение сайта о строительстве ...
    - к предыдущему пункту тоже относится — SEO-продвижение своего ресурса
    - поиск на биржах

    Как определить бюджет
    Самый простой способ и распространеный — оценка трудозатрат в часах и конвертация их в сумму

    Где получить практику по работе с клиентами в этой сфере
    Например работая в этих компаниях: Рейтинг ведущих компаний по продвижению сайтов Тюм...
    Ответ написан
  • Как вызвать событие на javascript

    termi
    @termi
    Во всех современных браузерах можно создать событие используя конструктор
    document.documentElement.addEventListener("click", function(e) {
      console.log(e.type, e);
    })
    document.documentElement.addEventListener("magic", function(e) {
      console.log(e.type, e);
    })
    
    var event = new Event("click", {bubbles : true, cancelable : true})
    var customEvent = new CustomEvent("magic", {bubbles : true, cancelable : true, detail : "<any string data>"})
    
    document.documentElement.dispatchEvent(event);
    document.documentElement.dispatchEvent(customEvent);
    


    Совместимость со старыми браузерами можно обеспечить с помощью polyfill библиотек
    Ответ написан
  • Как через js вписать данные в обход обработчика vue?

    @furrya_black
    Я в таких случаях форкаю библиотеки-плагин-компонент и правлю исходники.
    Ответ написан
  • Как через js вписать данные в обход обработчика vue?

    boratsagdiev
    @boratsagdiev
    Заглядывали в issues? Почему-то мне кажется это ваша проблема. Вроде бы есть и workaround, а вроде бы последний комментарий не воодушевляет :)
    Ответ написан
  • Как отловить POST на стороне 1с в веб сервисах?

    @Dementor
    программист, архитектор, аналитик
    как получить данные из пост запроса

    Из вашего вопроса не понял как вы передаете данные - в POST объект JSON или с помощью multipart/form-data.

    В первом случае текст вашего POST легко можно получить с помощью следующей конструкции:
    POST_txt = Запрос.ПолучитьТелоКакСтроку();

    и далее уже элементарно создаете с JSON объект и работаете с ним:

    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(POST_txt);
    Объект_JSON = ПрочитатьJSON(ЧтениеJSON,,"DOC_DATE");  // важно указать все ваши поля типа даты, что бы потом не парсить вручную строки
    ЧтениеJSON.Закрыть();

    Во втором случае, если я не ошибаюсь, то можно получить значение POST-параметры с помощью упомянутого у вас метода запроса ПараметрыЗапроса() , который возвращает соответствие, где ключами будут названия параметров. Но на практике я это не проверял - для работы с HTML-формами вполне достаточно GET-параметров, а в POST все же удобно писать JSON или XML).
    Ответ написан