• Какой тип баз данных самый быстрый?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Какой транспорт самый быстрый? Болид F1? А если с десятью тоннами груза? А если на пересечённой местности? А если на воде? Уловили посыл? Скорость тех или иных видов СУБД зависит от условий эксплуатации. В одних условиях быстрее будет одно, в других другое.
    Ответ написан
    Комментировать
  • На сколько плохо/хорошо менять компании с интервалом чаще, чем раз в год?

    Winsik
    @Winsik
    сис.админ, недопрограммист :)
    Если не нравиться и есть куда уходить - надо уходить. Вы ещё молоды, надо набираться опыта и на смену компаний в начале карьеры никто не обратит внимание, смотреть будут на ваш опыт и знания.
    Ищите компанию где вам интересно, работа должна быть в радость, должно хотеться приходить и уходя думать о том, что будет сделано завтра. При таком кейсе повышение квалификации идёт огромными шагами. И в будущем на очередном собеседовании вы своими познаниями сможете "уболтать" работодателя и не важно сколько раз вы меняли работу )
    Ответ написан
    1 комментарий
  • Подойдет ли составной индекс в данной ситуации?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Составной индекс может использоваться только в том порядке, в котором в него добавлены поля. То есть индекс (`name`, `job`, `status`) можно использовать при поиске по `name`, по `name` и `job` или по `name`, `job` и `status`. Отдельно по `job` или `status` такой составной индекс работать не будет.
    Ответ написан
    Комментировать
  • Зачем в catch делать throw?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    try {
        $this->initDBConnect();
    } catch (\Exception $e) {
        // Тут залогировали
       $this->logger->error('Некоторое сообщение', [некоторые данные]);
    
        // тут выкинули дальше
        // или throw new MyAnyException, 
        // а не просто дальше выкидывать тоже самое
        throw $e; 
     }


    Для чего бросать дальше
    Например идет процесс оплаты товара, в клиенте выкинулось исключение... мы в слое работы с АПИ платежки поймали исключение и залогировали, но выкинули дальше, чтобы наша система выше поймала, откатила транзакцию и плюнула ошибкой уже своей для слоя выше
    Ответ написан
    3 комментария
  • Не понимаю volumes, как понять данный пример?

    al_gon
    @al_gon
    Нет, не подтянутся, они будут ими.
    Если что-то в контейнере обращается к /etc/nginx/certs это должно лежать в /data/certs
    Ответ написан
    3 комментария
  • Если когда-либо в репозитории были данные, которые хочется никому не показывать, останутся ли они в истории?

    glaphire
    @glaphire
    PHP developer
    Если данные запушены в репу - они уже скомпрометированы, нужно поменять реальные логин, пароль и токен.

    Тулза для вычищения таких данных из справочной гитхаба: ссылка
    Ответ написан
    2 комментария
  • Почему $_REQUEST пустой, когда шлешь POST запрос в Postman?

    Потому что вы отправляете данные в теле запроса. В таком случае их можно получить только через поток php://input

    $raw = file_get_contents('php://input');
    $json = json_decode($raw);
    var_dump($raw, $json);
    Ответ написан
    3 комментария
  • Нужны ли модели для смежных таблиц?

    @jazzus
    Например, тебе зачем-то понадобилось вывести на странице все pivot записи из user_roles и вместо user_id отобразить имя юзера. Создаешь модель UserRole, прописываешь belongsTo User, делаешь запрос UserRole with user и показываешь в шаблоне $pivot->user->FullName фигачишь какой-нибудь поиск с сортировкой и фильтрацией по pivot записям, делаешь ссылки на юзера выводишь role name, статистику - все это наглядно с простым кодом и только нужными запросами. В общем делать тогда, когда в pivot модели будет необходимость, как в самостоятельной логической сущности, когда ты от нее отталкиваешься а не к ней приходишь, когда тебя не юзеры/роли интересуют,а pivot данные со своими отношениями/методами.
    Ответ написан
    Комментировать
  • Правильно ли я понимаю, что Oauth - это стандарт, и каждый его реализовывает по своему?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Можешь реализовывать самостоятельно, да. А можешь использовать готовый Identity Server (установленный или SaaS).
    Примеры:

    Premises:
    - Keycloak
    - WSO2
    - IdentityServer4
    - ...

    SaaS:
    - Auth0
    - Okta
    - Onelogin
    - AWS Cognito
    - ...
    Ответ написан
    Комментировать
  • Как правильно написать запрос?

    DevMan
    @DevMan
    кто учил так получать кол–во строк?
    Ответ написан
    7 комментариев
  • Где лучше хранить access token oauth?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Откуда они знают, что тот токен, что я ввел - он действителньо верный? Он в их случае хранится где то в бд?
    Не пофигу ли, он хранится у них?

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

    Если это общий токен для приложения, то хранить можно в .env-файле (или каком-то другом хранилище, но .env уже практически стандарт).
    Ответ написан
    Комментировать
  • Зачем использовать callback функции?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Крайне хорошее описание по таким вещам есть в Википедии. А теперь к примерам:

    1. Передача параметром
    Такие функции удобно передавать параметром/возвращать из других функций. Тут лучше углубиться в тему: Функция высшего порядка

    Например для удобной передачи асбтрактной функциональности, которая будет применяться например к каждому члену итератора/массива. Это используется например в таких стандартных функциях array_{map/filter/reduce}. В коллбеке то, что будет применяться к каждому члену массива.

    Вообще функции высшего порядка не просто "пример использовани", а даже целая концепция программирования.

    2. Отложенный/ленивый вызов
    Например в PHP приложениях используется в роутерах/контейнере/логере, да много где. Суть в том, что в соллбеке спрятана функциональность, иногда очень большая. Элементов и этих фукцниональности тоже может быть много, а нужно все зарегистрировать. Чтобы не плодить тысячи объектов при регистрации — каждый кусочек функциональности заворачивают в коллбек, и только при вызове (например роута), вызывается коллбек и соответственно все, что в нем начинает работать.

    class Container
    {
         private $callableServices;
    
         public function add(string $serviceName, callable $service)
         {
              $this->callableServices[$serviceName] = $service;
         }
    
         public function get(string $serviceName)
         {
              $service = $this->callableServices[$serviceName];
    
              return $service();
         }
    }
    
    $container = new Container();
    // объект тут не создается, тк он внутри функции, которая не вызывается
    $container->add('a', function() {
         return new FirstBigService();
    });
    // объект тут не создается, тк он внутри функции, которая не вызывается
    $container->add('b', function() {
         return new SecondBigService();
    });
    
    // Внутри метода get() идет не просто доставание нужного элемента, 
    // а еще и его вызов (тк лежат функции), то есть именно сейчас 
    // произойдет new FirstBigService()
    $service = $container->get('a');


    3. Изоляция контекста
    // тут левый код
    ...
    
    // Код ниже работает изолировано и на него ничего не может подействоват,
    // т.к. внутри свой контекст
    (function() {
        $app = new Application();
        $app->run();
    });
    Ответ написан
    Комментировать
  • Как сделать unit test метода в котором нужен заполненный массив?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    По-хорошему $this->solutions должно устанавливаться через конструктор, потому вам не составит труда заинжектить это состояние в тестируемый объект.

    Если у вас "пришлось", то можете заюзать некий хак, например через рефлексию/closure::bind установить состояние в тестируемый объект.

    Вот на скорую руку накидал (Разместите его в своем TestCase или прямо в тесте)
    protected function setPrivateProperty(object $object, string $propertyName, $value): void
    {
        $reflectionClass = new \ReflectionClass(get_class($object));
        $property = $reflectionClass->getProperty($propertyName);
        
        $property->setAccessible(true);
        $property->setValue($object, $value);
        $property->setAccessible(false);
    }


    ПРИМЕР
    Класс и метод, который нужно протестить и приватная переменная которого заполняется не через конструктор
    class System 
    {
        // Не важно, как оно будет заполнено, важно, 
        // что в методе мы проверяем некоторые значения  
        // и мы создадим ниже в тестах эти ситуации разными тест-кейсами
        private $solutions;
    
        public function checkRecords(): string
        {
            if (count($this->solutions) === 3) {
                return 'full';
            }
    
            if (count($this->solutions) === 6) {
                return 'overflow';
            }
    
            throw new IncorrectCountException('Incorrect solutions count.');
        }
    }


    Тесты
    public function testCheckRecordsFull(): void
        {
            // 3 элемента
            $data = [1, 2, 3];
            $system = new System();
            $this->setPrivateProperty($system, 'solutions',  $data);
    
            $status = $system->checkRecords();
    
            $this->assertEquals('full', $status);
        }
    
        public function testCheckRecordsOverFlow(): void
        {
            // 6 элементов
            $data = [1, 2, 3, 4, 5, 6];
            $system = new System();
            $this->setPrivateProperty($system, 'solutions',  $data);
    
            $status = $system->checkRecords();
    
            $this->assertEquals('overflow', $status);
        }
    
        public function testCheckRecordsIncorrectCOunt(): void
        {
            // сколько-то элементов, но не 3 и не 6
            $data = [1];
            $system = new System();
            $this->setPrivateProperty($system, 'solutions',  $data);
    
            $this->expectException(IncorrectCountException::class);
            $system->checkRecords();
        }

    Код тестовый, просто отобразить принцип, возможно у вас в классе зависимости -- нужно будет сделать моки и т.д. Тут некоторые повторения можно вынести в setUp().
    Также хочу обратить внимание, что тесты построены по принципу ААА (Arrange, Act, Assert).
    Как итог, 3 ситуации, все протестированы, методу не важно, как заполнлась приватная переменная, но вся его логика протестирована. Все легко и просто.
    Ответ написан
    7 комментариев
  • Плохая ли практика, создавать объект, который не требует зависимостей без скобочек?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    https://github.com/php-fig/fig-standards/blob/mast...

    Сейчас на рассмотрении PSR-12 в котором как раз прописано что скобочки нужны всегда.

    Да и раньше отсутствие скобочек наверно больше к плохому варианту относилось, хотя с точки зрения работы без разницы.
    Ответ написан
    Комментировать
  • В чем основной вред SELECT *?

    Ошибка в том, что задача СУБД вернуть соответствующий запросу результат и только те данные, которые необходимы программе.
    Т.к. СУБД обычно находится на отдельном хосте, запрос со * будет создавать дополнительную нагрузку на сеть, т.к. будет передавать даже те поля, которые не нужны приложению, в свою очередь это вызови большее потребление ресурсов и самим приложением, которому необходимо будет обрабатывать результат запроса с "мусорными" данными. Использование * будет оправдано в случае, когда действительно необходимы все поля запроса или обработка запроса будет выполняться какой-нибудь ORM.
    Ответ написан
    1 комментарий
  • Где пригодятся побитовые операции в PHP?

    Gomonov
    @Gomonov
    Использую при работе с IP. Если ipv4 представлен в виде int ip2long легко работать с масками, определять, принадлежит ли ip определённой сети и т.п.
    Также РЕДКО использую для описания состояния некоторых свойств классов/сущностей. Например у некоторой сущности есть статус, который может принимать значения: новый, в работе, остановлен, скоро запустится, скоро будет остановлен. Естественно свойство может принимать комбинации статусов - остановлен и скоро запустится или в работе и скоро будет остановлен. На пальцах:
    новый 00001
    в работе 00010
    остановлен 00100
    скоро запустится 01000
    скоро будет остановлен 10000
    Тогда комбинация остановлен и запустится 01100
    Вот для проверки каким статусам соответствует поле используются битовые операции
    Ответ написан
    Комментировать
  • Как лучше хранить одно значение, которое может меняться иногда?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    Привет, я бы сделал таблицу общего формата
    settings
    - group (группа настроек, не обязательное поле, но я бы его сразу добавил)
    - var (переменная)
    - val (значение)

    Сейчас у тебя там будет только price 1000 , но со временем заказчик может захотеть скидки по выходным или еще чего-нибудь такого (например менять контакты формы обратной связи). И ты сможешь все эти данные хранить в этой таблице.
    Ответ написан
    2 комментария
  • Когда нужно использовать API а не готовый SDK?

    Stalker_RED
    @Stalker_RED
    А этот SDK, он по волшебству появился или его кто-то написал, используя "голый" API?
    А если под ваш язык нет готового SDK?
    А если SDK на гитхабе с ошибками или устарел?

    Да, если готовый вам подходит можете его использовать.
    Ответ написан
    2 комментария
  • Когда нужно использовать API а не готовый SDK?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Например, чтобы не тянуть громадную библиотеку ради одной единственной функции.
    Ответ написан
    Комментировать