Ответы пользователя по тегу PHP
  • Исключение элемента по регэкспу

    AMar4enko
    @AMar4enko
    Глядите
    rubular.com/r/PoWHYBdnL5
    Ответ написан
    Комментировать
  • Как реализовать "обратный" порядок вызова методов класса PHP?

    AMar4enko
    @AMar4enko
    $cookie = Cookie::make('name', 'value');
    return Response::make($content)->withCookie($cookie);

    Тот, кто получит Response, сам отправит данные в браузер. Попробуйте их схему применить в случае, если make($content) непосредственно отправляет контент в браузер - не получится.
    Потому что вы данные отправите в браузер, а заголовок уже не сможете, так как перед этим отправлены данные.
    Это все называется fluent interface или текучий интерфейс.
    Но он был придуман не для того, чтобы выполнять методы в произвольном порядке, а для того, что бы писать более компактный и читаемый код.

    Но я вот еще что придумал, пример (могут быть ошибки, не запускал)

    class SomeFreakyEntity {
        var param1, param2;
        public function terminalMethod(){
        // Этот метод всегда выполняет некое действие с настроенным объектом, конец текучего интерфейса
            var_dump($this);     
        }
        public function withSomeParams1($value){
            $this->param1 = $value;
            return $this;
        }
        public function withSomeParams2($value){
            $this->param2 = $value;
            return $this;
        }
        // Ловим любой вызов необъявленного статического метода
        public static function __callStatic($method, $arguments){
            $o = new __CLASS__;
            return call_user_func_array(array($o, $method), $arguments)        
        }
    }


    Теперь можно писать как-то так:
    SomeFreakyEntity::terminalMethod();
    SomeFreakyEntity::withSomeParams1('blabla')->terminalMethod();
    SomeFreakyEntity::withSomeParams2('blabla')->terminalMethod();
    SomeFreakyEntity::withSomeParams2('blabla')->withSomeParams1('blabla')->terminalMethod();
    SomeFreakyEntity::withSomeParams1('blabla')->withSomeParams2('blabla')->terminalMethod();


    А в вашем случае
    Template::withData($dataArray)->render('templateName')
    Ответ написан
  • Как реализовать "обратный" порядок вызова методов класса PHP?

    AMar4enko
    @AMar4enko
    А какова цель? Получить более естественный, легко читаемый код?
    Чем не нравится конструкция типа:
    $this->template('templateName')->withData($array)->render()


    Есть еще вариантик - перекрыть в Template метод __toString():
    В render устанавливаете имя шаблона, в withData параметры.
    В __toString вызываете непосредственно render с установленными ранее именем шаблона и параметрами.
    Тогда весь вызов будет как (string)$tpl->render('templateName')->withData($dataArray)

    Так или иначе, вам придется определять какой-то терминальный метод. Просто во втором случае он неявно вызывается, в том числе и в конструкциях типа
    $html = "<some html code>$tpl</some html code>"
    Ответ написан
    1 комментарий
  • Обращение к несуществующему элементу массива. Правильно VS Лаконично?

    AMar4enko
    @AMar4enko
    Я всегда пользовался @$array['key']
    Если нужно в результате именно boolean, то !!@$array['key']
    Ответ написан
    Комментировать
  • Как соединить массив по ключу?

    AMar4enko
    @AMar4enko
    Вам придется делать это либо руками, либо используя библиотеки наподобие https://github.com/Athari/YaLinqo
    Ответ написан
    Комментировать
  • Как запускать тесты из PhpStorm на удалённом сервере?

    AMar4enko
    @AMar4enko
    Т.е. у вас на рабочей машине тестовое окружение не настроено?
    Вы разрабатываете, закатываете на удаленный сервер, потом запускаете там тесты?
    В чем профит? Как потом посмотреть, какие тесты прошли, а какие нет?

    Обычно процесс разработки построен таким образом, что вы делаете доработки на своей машине, тут же пишете для них тесты, убеждаетесь, что они проходят, пушите изменения в репозиторий в отдельную ветку.
    В репозитории настроен хук, который из этой ветки тащит код в сервер CI. Сервер CI раз в день, допустим, запускает все тесты проекта. Перед релизом вы убеждаетесь, что у вас на сервере CI все тесты проходят, мерджите изменения в мастер.
    Ответ написан
    1 комментарий
  • Как справиться со спец символами во время парсинга через библиотеку curl?

    AMar4enko
    @AMar4enko
    Видимо не судьба, высокий порог вхождения, все дела
    Ответ написан
    Комментировать
  • Какими средствами реализовать обновление контента?

    AMar4enko
    @AMar4enko
    Ага, а вы хотите возвращать "заявку"?
    Ответ написан
    Комментировать
  • Как избавиться от зависимых запросов?

    AMar4enko
    @AMar4enko
    Вам уже правильно сказали, что надо сделать отдельный API-метод для этой ситуации. По-сути это REST-метод получения коллекции с фильтром.
    В качестве фильтра у вас будут выступать город и категория.
    Для города и категории у вас хранится alias и id, с фронта вам прилетает alias.
    Вы проверяете, есть ли у вас в кеше сохраненные id для переданных алиасов города и категории. Если нет, то строите большой запрос с джойнами, который фильтрует по альясам. В результате выполнения вы помимо информации по музеям получите id города и категории, которые вы кладете в кеш. Последующие запросы возьмут id из кеша и запрос будет к одной таблице без джойнов с фильтром по конкретным id.
    Ответ написан
    Комментировать
  • Почему не получается подключиться к MySQL через PDO, когда хост БД указан в переменной?

    AMar4enko
    @AMar4enko
    А если попробовать сначала сгенерировать строку подключения, а потом уже ее в метод передать? Ну так, в порядке бреда.
    Ответ написан
  • Алгоритм вычисления проблемного периода сумм при просчете комиссии

    AMar4enko
    @AMar4enko
    Вы серьезно?
    Это же простейшая пропорция
    200 золота = 101%
    x золота = 100%

    x = (200 * 100) / 101
    Сначала отнимаете от суммы платежа все фиксированные комиссии, потом высчитываете по этой пропорции. Какие к чертям периоды?
    Ответ написан
  • Динамическое создание классов (PHP)?

    AMar4enko
    @AMar4enko
    Вы меня простите, но вряд ли вам дадут совет, как наиболее оптимизированно сломать себе руку - в большинстве своем люди либо не ломали себе рук, либо это было очень неприятно.
    Надеюсь, метафора вам понятна.
    Ответ написан
    Комментировать
  • Двухсторонний шаблонизатор?

    AMar4enko
    @AMar4enko
    Дело в том, что вы старательно пытаетесь игнорировать тот факт, что в требованиях пришли к single page application на JS. И пробуете найти какой-то подход, который оставит вас в рамках текущей парадигмы разработки.
    А решения уже придуманы давно и их очень много, можно выбирать на любой вкус. И все он заключаются в том, что на сервере шаблонизации нет вообще - там только данные.
    Все взаимодействие с фронтом через REST API.

    Единственное, что может вызвать проблему в этом случае - индексация такого приложения браузером. Но и тут есть решение, требующее минимального вмешательства в код сервера - вы просто делаете снэпшоты страницы, требующих индексации, например с помощью PhantomJS, после чего отдаете их как статику с сервера при запросе от бота.
    Ответ написан
    1 комментарий
  • Нужен простой фреймворк или шаблонизатор для создания интерфейса к RESTful сервису?

    AMar4enko
    @AMar4enko
    Еще решение AngularJS + ngTable + Restangular.
    Пагинация + сортировка + фильтр таблиц будут из коробки, если с серверным API согласуете.
    Ответ написан
    Комментировать
  • [PHP][nginx] Как организовать множественную отдачу файлов пользователю?

    AMar4enko
    @AMar4enko
    По моему скромному мнению вам все-таки есть смысл отдать файл архивом, с минимальной компрессией.
    Т.е. по доступу к скрипту создаете архив с файлами, делаете редирект, чтобы он отдался через nginx.
    Ответ написан
  • Как заинклюдидть скрипт в webasyst?

    AMar4enko
    @AMar4enko

    Может быть проблема в правах?

    Ответ написан
    Комментировать
  • Как лучше организовать совместную работу с базой данных?

    AMar4enko
    @AMar4enko

    Не совсем понятно, что имеется в виду под термином "совмесТная работа".
    Изменение структуры? Это делается миграциями. Один решил, что нужно в БД добавить таблицу, делает миграцию, пушит в гит. Остальным придется это изменение принять перед своими пушами, ну и после pull-a они увидят, что добавилась новая миграция и должны будут ее накатить на свою БД.
    Другого пока ничего не придумали.

    Ответ написан
    Комментировать
  • В чём преимущество асинхронных серверов перед PHP/nginx?

    AMar4enko
    @AMar4enko

    Если коротко, то ошибка закралась вот тут:
    В асинхронном сервере в единый момент времени обрабатывается столько запросов, сколько есть воркеров

    Представьте себе, что у вас на сервер приходит запрос, связанный с выборкой данных из БД.
    Он отрабатывает, предположим, за 150 мс, из которых 130 это работа с базой данных.

    В случае с PHP у вас воркер будет заблокирован эти 150 мс для обработки других запросов.
    В случае с асинхронным сервером, он, пока запрос 1 ждет данные от БД в течение 130 мс, сможет принять и начать обрабатывать другие запросы. Предположим, что у нас один PHP-воркер. В этом случае таких запросов, как из примера, он сможет обработать семь штук за секунду.

    Асинхронному же, допустим, прилетят 20 запросов. Он обработает каждый до взаимодействия с БД, допустим за 10 мс, полетят 20 запросов к БД, пройдут, допустим, за 500 мс, и сервер сформирует ответ. И это все практически параллельно. Итого меньше чем за секунду мы таким образом обработаем 20 запросов.

    Можно, конечно, увеличить пул FastCGI, но оверхед при обработке запроса каждым воркером будет несоизмеримо выше, чем при обработке асинхронным сервером.

    Ответ написан
    4 комментария
  • Генерация JSON с вложенными объектами

    AMar4enko
    @AMar4enko
    Если не городить велосипедов, то это обычно делается с помощью ORM. Т.е. вы описываете соответствие классов PHP сущностям БД, описываете взаимосвязи между сущностями, потом говорите «Выбрать мне posts вместе с user». В ответ получаете уже готовые объекты класса Post, у которых, например, свойство user также является объектом класса User. После всего этого вам останется только сделать json_encode ну или с препроцессингом каким-то, по ситуации.
    А если без ORM, то единственный выход это самостоятельно связывать результаты запросов из таблиц. В этом случае может помочь yalinqo, но по опыту лучше вам по ORM-path.
    Ответ написан
    Комментировать
  • Странное поведение unset и array_walk

    AMar4enko
    @AMar4enko
    Вполне ожидаемая история из-за модификации массива во время его итерации.
    Вы встали на элемент A, запихали его в новый массив, удалили А из массива, попросили следующий элемент.
    А массив-то уже изменился, элемента А нет, текущий элемент уже В. И итератор даст вам следующий элемент, т.е. С
    Ответ написан
    Комментировать