• Как вызвать класс из другого проекта?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Похоже на какую-то херню, если честно. Если у вас в проект А не включен проект Б - то видимо это так задумано, иначе вы бы просто подключили Б как зависимость в композере.
    То, что хотите несколько раз подключать классы из одних и тех же неймспейсов - плохая идея, работать НЕ будет.

    Покретно под ваш кейс использования - вам ничто не мешает в каталоге каждого проекта завести например yml, или json файлик с мета информацией о проекте.
    Ответ написан
    Комментировать
  • Как реализовать обратную совместимость пользовательских данных в программе?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Храните набор миграция от старых версий до последней. При сохранении старого проекта - выполняйте обязательное приведение к последнему формату. При открытии проекта - тоже самое
    Ответ написан
  • CodeIgniter мертв?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    TL;DR Да, мертв.

    Что же в нем такого плохого?

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

    Маленький, шустрый, удобный

    Шустрый он как раз потому, что маленький и убогий по функциональности. PHP это далеко не язык быстрых систем, это язык быстрых решений. Хотите скорости - смотрите в сторону java, c#, c++, golang,..
    На счет удобства: вы вероятно путаете с порогом вхождения. Потрогайте Doctrine на досуге, только хорошо так потрогайте и вы узнаете, что такое удобство работы с БД, потрогайте Monolog и узнаете, что такое удобство работы с логами, потрогайте Symfony (да, его надо нормально так покурить), но экономит время он колоссально.

    для скачивания не требует установки композеров и всякого такого

    Собственно и что?)) У кода вашего приложения так, или иначе есть зависимости, от того же CI например, что плохого в том, что зависимостями будет рулить проверенная и мощная система, с генерацией автолоада и другими плюшками?

    Что есть в других фреймворках такого, чего нет в старичке CodeIgniter?

    Для начала у них есть сегодня и будущее))
    У Symfony, по сравнению с CI есть:
    * Архитектура и мощная методологическая база. Да, тут парни по SOLID выступают, а в CI даже в MVC не могут(Model не должна обрабатывать пользовательский ввод, это задача контроллера!!)
    * DI контейнер на пару с очень гибкой системой конфигурирования
    * Есть ORM/ODM Doctrine, лучше на данный момент нету
    * Есть де-факто стандартный для многих фреймворков Symfony HttpFoundation
    * Мощный компонет, для написания консольных приложений
    * Система безопасности Security Component
    * Большое количество мощных бандлов, поддерживаемых сообществом

    Или действительно CI мертв?

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

    И да, поддержка PHP 5.2.4, это не достижение, это заморозка 2007 года
    Ответ написан
    Комментировать
  • Как получить имя роута в расширении Twig (тест)?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если я правильно понял и вы хотите проверить соответствие роута конкретному экшну, то решение есть по проще.

    <?php
    
    namespace MyVendor\MyApplication\AppBundle\Tests;
    
    use KoKoKo\assert\Assert;
    use KoKoKo\assert\exceptions\InvalidNotEmptyException;
    use KoKoKo\assert\exceptions\InvalidNotObjectException;
    use KoKoKo\assert\exceptions\InvalidStringException;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpKernel\Event\GetResponseEvent;
    use Symfony\Component\HttpKernel\HttpKernelInterface;
    
    trait ControllerTrait
    {
        /**
         * @param Request $request
         * @param string  $controllerClass
         * @param string  $actionName
         * @throws InvalidNotEmptyException
         * @throws InvalidNotObjectException
         * @throws InvalidStringException
         */
        public function checkRoute(Request $request, $controllerClass, $actionName)
        {
            Assert::assert($controllerClass, 'controllerClass')->string()->notEmpty();
            Assert::assert($actionName, 'actionName')->string()->notEmpty();
    
            /** @noinspection PhpUndefinedMethodInspection */
            static::$kernel->getContainer()->get('router_listener')->onKernelRequest(
                new GetResponseEvent($this->getKernel(), $request, HttpKernelInterface::MASTER_REQUEST)
            );
    
            $parameters = $request->attributes->all();
    
            /** @noinspection PhpUndefinedMethodInspection */
            $this->assertInternalType('array', $parameters);
            /** @noinspection PhpUndefinedMethodInspection */
            $this->assertArrayHasKey('_controller', $parameters);
            /** @noinspection PhpUndefinedMethodInspection */
            $this->assertSame($controllerClass . '::' . $actionName, $parameters['_controller']);
        }
    }


    Используется примерно так:
    <?php
    
    namespace MyVendor\MyApplication\AppBundle\Tests\Unit\Controller;
    
    use MyVendor\MyApplication\AppBundle\Controller\MyController;
    use MyVendor\MyApplication\AppBundle\Tests\ControllerTrait;
    use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
    use Symfony\Component\HttpFoundation\Request;
    
    class MyControllerTest extends KernelTestCase
    {
        use ControllerTrait;
    
        public function testMyRoute()
        {
            self::bootKernel();
    
            $request = new Request();
    
            $request->server->set('REQUEST_URI', '/MyRoute');
            $request->setMethod('POST');
    
            $this->checkRoute($request, MyController::class, 'myRouteOfMyController');
        }
    }


    Тут KoKoKo\assert\Assert - это либа для валидации входящих аргументов
    Ответ написан
    Комментировать
  • Как получить системный язык?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Под никсами смотрите переменную окружения LANG
    Ответ написан
  • Как не "изобретать велосипед", а использовать готовые решения?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    У js есть jquery, а у php что?

    HttpFoundation - это можно сказать стандарт для обработки запросов. Используется в Symfony, Laravel, Silex и еще куча где.
    Doctrine - по моему опыту это лучшая система для работы с БД. Если еще не смотрели - настоятельно рекомендую. А системы реализующие ActiveRecord (если у вас проект не на пару дней) - лучше не используйте, почему - см. тут.
    Monolog - это библиотека логгирования, практически не имеет аналогов по функциональности.
    Symfony Console Component - очень гибкий компонент для реализации консольных приложений.

    Например, такая банальность, как валидация форм: у меня есть собственные наработки и я могу их использовать, но ведь они далеки от идеала.

    Разные кейсы предполагают разные решения. В случае высоких требований к производительности, тестируемости и защищенности часто оптимален вариант типа этого:

    /**
     * @Route("/profile/{id}", name="getProfile")
     * @Method({"GET"})
     * @param Request $request
     * @return JsonResponse
     */
    public function getProfileAction(Request $request): JsonResponse
    {
        try {
            $id = $request->attributes->get('id');
            
            if (is_null($id)) {
                return new JsonResponse("Param 'id' is required", JsonResponse::HTTP_BAD_REQUEST);
            } elseif (!is_string($id)) {
                return new JsonResponse("Param 'id' must be string", JsonResponse::HTTP_BAD_REQUEST);
            } elseif (!ctype_digit($id)) {
                return new JsonResponse("Param 'id' must be digit", JsonResponse::HTTP_BAD_REQUEST);
            }
            
            // Business logic here
            return new JsonResponse();
        } catch (\Throwable $exception) {
            return new JsonResponse($exception->getMessage(), JsonResponse::HTTP_BAD_REQUEST);
        }
    }


    Да, кода получается МНОГО, но такой подход очень гибок и производителен. Есть альтернативный вариант с использованием библиотеки ko-ko-ko/php-assert

    try {
        $id = $request->attributes->get('id');
        Assert::assert($id, 'id')->notNull()->string()->digit();
    } catch (\Throwable $exception) {
        return new JsonResponse($exception->getMessage(), JsonResponse::HTTP_BAD_REQUEST);
    }
    try {
        // Business logic here
        return new JsonResponse();
    } catch (\Throwable $exception) {
        return new JsonResponse($exception->getMessage(), JsonResponse::HTTP_BAD_REQUEST);
    }


    Есть ли подобные отработанные решения в фреймворках, они дают что-то кроме "каркаса"?

    Есть, практически у каждого фреймворка свои решения со своими плюсами и минусами.

    И почему нет библиотек популярных для php?

    см. Самое началом моего ответа, там список популярных библиотек.
    Ответ написан
    1 комментарий
  • Как использовать Websocket на сайте?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Ответ написан
    Комментировать
  • Есть ли бесплатные решения как Roistat, Перезвоним, Позвоним?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    piwik вероятно
    Ответ написан
    Комментировать
  • Как подсчитать кол-во одинаковых цифр и суммировать их?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1. Не обманывайте людей)) 7774455566 у вас это совсем не строка)
    2. Вам тут json ну вот вообще нафиг не нужен.
    3. Создаете ассоциативный массив где ключами выступают цифры, а значениями - их количество. Дальше суммируете в другом цикле те значения, что больше 1.
    4. Если в строке могут быть посторонние символы - удалите их регуляркой
    preg_replace('/[^\d]/', '', $inputString);
    Ответ написан
  • Как лучше поступить с большим кол-вом переменных в начале функции?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если это именно внутренние переменные - тогда лучше как переменные и хранить. Если же большая часть из них - это аргументы - тогда используйте dto
    Ответ написан
    Комментировать
  • Как правильно составить резюме на должность junior web-разработчика?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    С таким резюме не удивительно))

    Ключевые навыки
    html, css, js, php

    Это так, ниочем. Какие html5/css фреймворки знаете, на каком уровне? Какие php фреймворки знаете, на каком уровне? С какими БД работали, на каком уровне?

    В портфолио нет ссылок на сайты, что бы посмотреть в живую. Так же не указано, что именно вы там делали.
    Если вы эти сайтики делали в режиме фриланса - так и напишите, работал в фрилансе, с такого-то по такое-то. Использовал следующие технологии ...

    Обо мне
    В последнее время нахожусь в поисках работы.

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

    Общие рекомендации: сохраняйте контакты HR-ов, с которыми будете собеседоваться обязательно. Далее сможете при следующем поиске писать к ним на прямую, это здорово экономит время. Не ограничивайтесь 1 сайтом по поиску работы, хотя бы 3-4.
    Ответ написан
    2 комментария
  • Symfony Doctrine, как показать список/настройки всех таблиц?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Полный список этих моделей (имя класса)

    см. \Doctrine\ORM\EntityManager::getMetadataFactory

    Соответствующая таблица (+ Entity - их может быть несколько)

    там же, где и 1

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

    Курим все тот же Metadata

    ну и кнопка пофиксить с предварительным просмотром sql.

    У вас на клавиатуре как раз 105 клавиш под это дело)) Если программист допустил ошибку в схеме БД и не изменили entity под нее - то он же и должен исправить эту ошибку.
    Ответ написан
    Комментировать
  • Что должен сделать (integer) в данном примере?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вы путаете приведение типов и округление. Округление типа round, ceil или floor приводят float к ближайшему целому, большему целому и меньшему целому соответственно. Приведение типов же - оставляет только ту часть данных, что подходит для результирующего типа.
    Ответ написан
    2 комментария
  • Как посчитать массив?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Конкретно в вашем случае можно и через eval
    Но это очень опасная конструкция и лучше про ее существование забыть
    Ответ написан
  • Высоконагруженный. Отправка 100 миллионов сообщений каждую секунд?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как быстро все умрет?

    Закончатся открытые порты (65536) и все.

    Хостинг не поможет?

    Выдержит распределенная сеть серверов. Хостинг, или собственные сервера - не важно. Хотя скорее всего вас забанят по ip. Что кстати будет правильно. DDOS - это плохо.

    Как сделать чтобы не украли скрипт?

    За счет своих серверов. На месте хостинг провайдера я бы тоже вас забанил за такое))
    Ответ написан
    9 комментариев
  • Можно использовать машину у DigitalOcean как торрентокачалку?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    нет, пункт 3.7
    Ответ написан
    Комментировать
  • Как динамически поменяеть имя класса?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если существует ли возможность динамической смены имени класса?

    Нет, даже через runkit.

    Это решение для очень кривой архитектуры

    Это не решение, а усугубление проблемы.

    разработчик не хочет использовать пространства имён ввиду того что проект насчитывает десятки тысяч классов.

    Если проект не особо развивается, а команда состоит из 1 разработчика - то смысла в переносе на неймспейсы может и нет.

    В остальном же - ничто не мешает начать перепил на найспейсы и человеческий автолоадинг помодульно. + Нормальные IDE типа PhpStorm с этим довольно быстро справляются.
    Ответ написан
    Комментировать
  • Как оживить Ububtu 16.04 LTS?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Для начала посмотрите, что нагружает систему: htop (cpu + memory), iotop (hdd)
    Ответ написан
  • Какие подходы, методологии, технологии нужно знать, чтобы обеспечить безопасность на сайте?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Ответ написан
    Комментировать
  • Где должна быть логика работы с внешним API?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Ни в первом ни во втором. Это отдельный сервис загрузки данных о пользователях. В MVC его впиховать не стоит. Вызывать его из контроллера - это ок.
    Ответ написан
    Комментировать