• Нарушают ли конструкторы инкапсуляцию?

    gscraft
    @gscraft
    Программист, философ
    Это почему сеттеры нарушают инкапсуляцию? Вовсе нет. Контроль сохраняется за внутренней логикой класса. И в отношении конструкторов, получается, странным образом интерпретируете инкапсуляцию. Логика ООП практически потеряет смысл, если нельзя будет настраивать поведение объектов. Каким образом с чем-либо взаимодействовать, если нет значений, которые можно передать объекту?

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

    То есть, смысл инкапсуляции — это возможность реализации конкретной логики с распределением закрытости свойств. В одних случаях уместно закрыть доступ целиком, чтобы не нарушать базовое поведение объекта, когда разумно оставить установку значений только через конструктор, скажем, если цикл жизни объекта это некий конечный процесс, и может быть уместно запретить изменение этого поведения для дочерних классов, в других — допустимо менять свойства динамически, сеттерами, но оставляя обработку изменения за логикой класса.
    Ответ написан
    Комментировать
  • Как добавить свою валидацию в Request Laravel?

    Прочтите это - https://laravel.com/docs/5.8/validation
    Сделано специально, чтобы костыли свои не писать
    Ответ написан
    Комментировать
  • Как сделать чтобы при отправки данных формы через action, не открывалась та страница на которую данные передаются?

    @php_raper
    Рассмотрите 2 варианта

    1. Выполняйте редирект со страницы на которую вы отправляете запрос(action) через header(Location: $uri)
    2. Используйте асинхронный запрос к файлу, который обрабатывает форму на JS, например AJAX
    Ответ написан
    Комментировать
  • Как высчитывать количество дней до определенной даты?

    KornevaViktoria
    @KornevaViktoria
    Frontend Developer
    moment.js
    Ответ написан
    Комментировать
  • Почему потерялась модель на продакшене?

    @jazzus Автор вопроса
    Ошибка в регистре написания (буква L) - оказывается для unix это критично
    Ответ написан
    Комментировать
  • Практическое использование схем в Postgresql - когда они нужны?

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

    Важно понимать, что различные БД плохо подходят для логического группирования, т.к. разбиение по базам данных нужно скорее для администраторов, а не для приложений. Плюс, в большинстве СУБД, где существует понятие схемы, возможно ставить внешние ключи на таблицы в другой схеме, но нельзя на таблицы в другой БД. Иными словами, отдельные БД удобно создавать тогда, когда вы разделяете данные абсолютно не связанных приложений или сервисов. Например, складского учета и форума поддержки пользователей. С другой стороны, если вы хотите логически разделить таблицы в соответствии с компонентами одного приложения (например, корпоративный портал: 4 таблицы для поддержки авторизации, 10 таблиц для поддержки форума, еще 5 для чата со службой поддержки или отделом продаж) - то именно схемы будут удобным механизмом для этого.

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

    А что будет если несколько юзеров будут на одну public-схему коннектиться?

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

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

    то есть при работе в постгре предпочтительнее вместо отдельных баз делать разные схемы в одной

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

    Вот вам еще хороший пример. У вас есть приложение для ведения бухгалтерии и складского учёта на фирме. При этом сложилось так, что вам нужно хранить на одном сервере данные нескольких разных фирм (например, вы предоставляете готовый сервис под ключ нескольким клиентам). В этой ситуации более чем логично хранить данные разных клиентов в разных БД, а данные бухгалтерского и складского учета - в различных схемах в рамках одной БД конкретного клиента.
    Ответ написан
    2 комментария
  • Задержка Render VUE.JS. Как избежать?

    Fragster
    @Fragster
    помогло? отметь решением!
    А вот если бы вместо этого рисовали бы svg как обычный vue компонент с реактивностью, то никаких проблем бы не было. Вообще использовать set timeout вместо request animation frame странно в 2k18.
    Ответ написан
    6 комментариев
  • Где разместить вызов метода определения Geo в Laravel?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    В мидлваре.
    Ответ написан
    Комментировать
  • Как сгенерировать ссылку?

    Tesla
    @Tesla
    Открыть документацию и прочитать.
    route('name', ['key' => 'value'])
    Ответ написан
    Комментировать
  • Что не так с laravel passport?

    @iljaGolubev
    В config/auth.php так?
    'defaults' => [
            'guard' => 'web',
            'passwords' => 'users',
        ],

    Если в роуте не определён используемый guard, то используется дефолтный.
    Решений можно придумать много...
    Попробуйте auth()->guard('api')->user(), например.
    Ответ написан
    5 комментариев
  • Pusher adn Laravel как найти проблему?

    @Kostik_1993
    Web Developer
    Тут у каждого свой шар с помощью которого мы смотрим ваш код. Реально задолбали с такими вопросами. Покажите ваш код. Если что-то секретное то тогда сами мучайтесь. Консоль смотрите. Нет нет у него никаких камней
    Ответ написан
    6 комментариев
  • Как скрыть ip делая запрос через CURL (PHP)?

    devalone
    @devalone
    ̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
    Интересует в основном можно ли замаскировать не используя proxy?

    Чтоб пакет вернулся, нужно отправлять через какой-то шлюз, который знает, кому его возвращать, это может быть прокси, vpn или какой-либо ещё туннель, хоть ssh.
    Может изменение хеадера или еще как.

    можно поменять X-Forwarded-For и некоторые неправльно написанные веб приложения будут учитывать именно этот IP, но это скорее исключение, обычно этот баг пихают в CTF'ы, но на практике ни разу не встречал
    Ну а если нельзя то можно ли при запросе использовать какие-то постоянные proxy, желательно конечно бесплатные,

    Да, есть сайты, которые предоставляют такие прокси, а у меня есть программа для сбора проксей по таким сайтам https://github.com/DevAlone/proxy_py много проксей мрут, но есть такие, которые работают стабильно, самая надёжная работает уже 42 дня.
    так же интересует можно ли сделать запрос через сервера tor.

    Да, на ubuntu установить тор `sudo apt install tor`, запустить `sudo service tor start` и использовать его как socks прокси с адресом `localhost:9050`, адрес можно поменять в настройках, также можно поднять несколько таких проксей и у каждой будет свой IP адрес.
    Ответ написан
    Комментировать
  • Как подключить jquery используя bower & webpack?

    dmc1989
    @dmc1989 Автор вопроса
    Нужно дописать следующие:
    resolve: {
        alias: {
            jquery:"/your/path/to/jquery"
        }
    
    }
    
     plugins: [
            new webpack.ProvidePlugin({
                $: 'jquery',
            })
        ]
    Ответ написан
    Комментировать
  • Почему не работает метод save() в связанных моделей?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Потому что argument 1 to Illuminate\Database\Eloquent\Realtions\BelongsToMany::save() must be an instance of Illuminate\Database\Eloquent\Model, but an array given.

    Всегда рад помочь, не благодари.
    Ответ написан
    Комментировать
  • Можно ли как-то передать в middleware laravel динамический параметр из строки адреса?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Документацию, ты, похоже, не читал и как устроены другие мидлвари не смотрел. Мидлваря и так имеет доступ к объекту запроса, зачем ей что-то передавать?
    Ответ написан
    Комментировать
  • На какие слои должен (может) разделяться ЯП и его компилятор?

    SerafimArts
    @SerafimArts Автор вопроса
    Senior Notepad Reader
    Итак, корректный ответ на поставленный вопрос:

    Для начала, стоит понимать, что задача компилятора - взять сырец на X языке и перегнать его на Y язык. В современной жизни устоялась терминология "транслятора" и процесс "транслитерации", дабы не путать перегон в машинный код и на другой язык.

    В классическом варианте этапы следующие:
    1) Лексический анализ: Используя правила разбивает сырец на набор токенов (терминалов)
    2) Синтаксический анализ: Используя правила и набор токенов структурирует их в AST
    3) Семантический анализ: Проверяет корректность данных внутри AST (какого фига семантический анализ на этом этапе, а не позже, я, признаться хз).
    4) Генерация промежуточного кода: В частности, трёхадресного и этот этап имеет смысл при реализации императивных языков. Трёхадресный код так же можно заменить на опкод, байткод или прочие "заменители" промежуточного кода.
    5) Оптимизатор кода.
    6) Результат (генерация в конечный код)
    Во время всех процессов активно используется "таблица символов", грубо говоря "словарь".

    Ориентируясь на эти данные я сделал несколько выводов и перестроил архитектуру следующим образом:
    1) Парсинг (лексер + синтаксис)
    2) Построение таблицы символов в немного фривольном формате: Имя + Тип + Адрес/Позиция в исходном документе + Метаданные (AST и проч.)
    3) Билдер промежуточного кода (Reflection API)
    4) Приведение типов
    5) Валидация (вместо проверки корректности семантики из AST мне показалось удобнее оперировать высокоуровневым API, применяя некий паттерн матчинг, т.к. каждый тип проходит эту стадию сборки от 1 до 8).
    6) Экстенды (есть спец.тип в GralphQL, который занимается манкипатчингом) -> после него переход к п.3
    7) Рантайм (вызовы функций и проч) -> после него переход к п.3
    8) Выходной результат (Reflection API)

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

    Крайне рекомендую к прочтению:
    1) Тут много инфы человеческим языком https://ps-group.github.io/compilers/ особенно вот эта статья понравилась: https://ps-group.github.io/compilers/fsm которая рассказывает о построении таблицы переходов в синтаксическом анализаторе.
    2) И вот эта книжеца: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D... Довольно сложная для понимания для неподготовленного читателя, но позволяет уточнить некоторые нюансы и ответить на вопросы.
    Ответ написан
    2 комментария
  • Авторские права на GitHub?

    @Z-r
    > Не пойму какое реальное практическое применение имеет сервис github

    Никакого, не обращайте внимания.
    Ответ написан
    Комментировать
  • Авторские права на GitHub?

    Tyranron
    @Tyranron
    Не пойму какое реальное практическое применение имеет сервис github и как обстоят дела с авторскими правами?


    Это хостинг Git репозиториев, который, помимо непосредственно удаленного Git репозитория, предоставляет ещё целый ворох удобных инструментов коллаборации и интеграции (code smell, code coverage, CI, Docker Hub'ы, Zapier'ы, боты, и вот всё это вкусное). Всё это позволяет удобно вести разработку проектов.
    К слову сказать, Github используют и для закрытых проектов тоже. Но это уже идет за денюжку.
    Авторские права регулируются лицензией, которую каждый уважающий себя репозиторий имеет.

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


    Есть как закрытые (код доступен только членам команды), так и открытые (код доступен всем) проекты. В чем смысл открытых проектов и open source как такового - это отдельная огромная тема.
    Открытый исходный код, как минимум, дает следующие преимущества проекту:
    - Доверие и прозрачность. Любой желающий может изучить исходники и удостовериться, что там нет ничего вредного. Может сам взять и скомпилировать код, если не доверяет чужим бинарникам.
    - Рост за счет сообщества. 1 команда - хорошо, но тысячи контрибъюторов - лучше.

    Не все проекты являются "аудиоплеером на продажу". Не все проекты монетизируются. Более того, зарабатывать деньги - тоже далеко не цель каждого проекта. Open source - это просто другая модель разработки ПО. И с помощь неё разрабатываются достаточно серьезные вещи: Linux, Kubernetes, MySQL, PostgreSQL, тысячи их... Без open source не было бы такого бурного развития программных продуктов. Он является фундаментом и базой для всего остального. Назовите мне хотя бы один закрытый большой и известный проект, который не использует ни одного open source продукта вообще. Ведь open source на самом деле вездесущ =)

    2) И что понимается под авторскими правами на GitHub-e, да и вообще впринципе. Верстка сайта (сами блоки, расположение), если скопировать (кроме дизайна) - это считается нарушением авторских прав? С дизайном понятно, если макет один в один - это вроде как нарушение авторских прав. И кстати, сам дизайн макет по сути налеплен из разных фоток, зачастую с лицами людей - сами-то дизайнеры откуда берут это все, тупо качают из интернета чужие фотки?


    Это всё зависит под какой лицензией подается тот или иной дизайн/код/шаблон/верстка/фотка. Все условия лицензии обычно указываются в самом репозитории в соответствующем файле LICENSE.
    Некоторые проекты разрешают использовать где угодно и как угодно. Другие запрещают использовать в коммерческих целях. В принципе, никто Вам не мешает запретить использовать код посторонними лицам вообще, если Вы в этом видите какой-либо смысл.

    Откуда дизайнеры берут фотки - вопрос к ним. Как Вы должны понимать, ситуаций разных целый ворох. Одни просто берут фотки из интернета. Другие, более добросовестные, получают согласие автора на использование фотки, если она не выложена под свободной лицензией.

    3) Если взять код с функционалом типа CMS - это тоже нарушение авторских прав? Может я что-то не понимаю, но принцип CMS же примерно одинаковый, генерить статичные страницы, каталог и прочее взаимодействие? Взять тот же Bitrix, это что-то супер-уникальное чего нет в открытом доступе? Неужели за столько лет развития интернета в сети не появилось бесплатного качественного аналога платной CMS?


    Это будет нарушением прав, если Вы этот код будете использовать не согласно лицензии.

    Вопрос про принцип не понятен. Лицензирование принципов - это уже патенты. Если проект нарушает патент, то он его нарушает будь хоть открытым, хоть закрытым. И наоборот тоже, если в проекте реализовано что-то запатентованое его авторами - то копирование будет нарушением патента (если в условиях лицензии не указано другое). Но вообще open source и патенты как-то плохо смотрятся в одной корзине. Как говорится - ни рыба, ни мясо.

    За аналоги Bitrix не скажу, но вообще бесплатных CMS - пруд пруди. Гугл "в зубы" и вперед выбирать.
    Ответ написан
    5 комментариев
  • Нужна ли строка 'App\Model' => 'App\Policies\ModelPolicy' в списке политик или ее можно удалить?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Правильно понимаешь.
    Ответ написан
    Комментировать
  • Переезд на laravel?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Как это делал я:

    1) Сделал в базе поле пароля Nullable
    2) Создал временное поле в БД password_md5
    3) Во время авторизации авторизировал пользователя через связку username / password, если авторизация не прошла - username / password_md5.
    4) Если связка username / password_md5 прошла, при этом поле password пустое - задавал полю password bcrypt значение введенного пароля

    В течении нескольких месяцев база практически полностью наполнилась реальными паролями в bcrypt. Осталось несколько десятков неактивных юзеров, которым была выслана просьба поменять пароль, с отдельной страничкой, проверяющей старый пароль по полю password_md5 и задающей новый password.

    Вот таким вот образом была мигрирована старая база. Извращение, но иначе - никак.
    Удачи, надеюсь помог :)
    Ответ написан
    5 комментариев