• Docker как локальный web-сервер (замена Open Server, Xampp и т.д.)?

    IvanCher
    @IvanCher
    Мысли шире
    Странные конечно ответы отмечены решениями, меня это несколько удивляет.
    Немного расскажу автору вопроса про вагрант и докер, в чем разница.
    Вагрант - это лишь обертка над virtualbox для создания заранее сконфигурированной машины в виртуалбоксе. Польза от него есть, но только для разработчиков. На продакшн сервер Вы не сможете развернуть то же окружение при помощи вагранта.

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

    Докер, в отличии от вагранта, позволит Вам иметь идентичные окружения и на дев-сервере, и на продакшн, и на тестовом, и везде, где только можно. Этим он выгодно отличается от вагранта.
    Вагрант в связи с вышеупомянутым недостатком и ориентированность только на дев-окружение, тихонько отмирает.

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

    На счёт того, как конкретно развернуть на докере ламп или что-то подобное, сперва прочтите Getting started на оф. сайте докера, затем гляньте на докхабе образы для веба, там их несколько и каждый описывает инетерсные подходы.

    Удачи, надеюсь мой комментарий был Вам полезен.
    Ответ написан
    11 комментариев
  • Почему Hibermate не создает таблицы?

    IvanCher
    @IvanCher
    Мысли шире
    Может кому пригодится ещё, потому что достаточно неочевидное поведение и нигде не объясняется.
    Исходные данные:
    Я только начинаю знакомство с java и решил использовать Java SE8, Hibernate 5.1, JPA для небольшого десктоп-приложения.
    Задача:
    Сгенерировать схему базы данных из аннотированных entity-классов, используя SchemaExport из командной строки.
    Проблема:
    SchemaExport не поддерживает пока аннотированные entity-классы из коробки, он ждёт старые *.hbm.xml файлы мапинга.
    Объяснение:
    Команда имеет простой синтаксис
    java -cp hibernate_classpaths org.hibernate.tool.hbm2ddl.SchemaExport options mapping_files

    Все варианты options можно посмотреть в классе org.hibernate.tool.hbm2ddl.SchemaExport строки с 499 по 551. Там всё понятно.
    Если используете hibernate.cfg.xml, то можете этот файл указать в опции --config.
    mapping_files ожидает либо jar-файлы, либо *.hbm.xml-файлы мапинга. Я сперва думал, что если передать jar, то он в нём найдет аннотируемые entity-классы и увидит их, но не тут-то было. В jar-архивах он перебирает все файлы и ищет среди них *.hbm.xml-файлы мапинга. Какой-то замкнутый круг ...
    Решение:
    Тут я выложил небольшой пример кода, который подсвечивает строку, добавляющую аннотированный entity-класс. Для этого entity-класса будет сгенерирован запрос.

    Внимание!
    Данный класс HibernateUtil является просто небольшим примером. Он только генерирует SQL-команды и вставляет их в файл init.sql.
    Можете сделать класс-обертку для SchemaExport, чтобы иметь все его возможности, только придумать какой-то вариант, чтобы добавлять аннотированные entity-классы. Хотя, если меня попросят, то и я могу такой класс написать, это вообще не сложно.
    Core-team говорят, что им сейчас некогда заниматься tools для hibernate, поэтому не известно сколько ждать от них этой правки.

    Прям целая статья получилась, надеюсь кому-то она будет полезной.
    Ответ написан
    Комментировать
  • PHP скрипт открывается как текст и не выполняется. В чем причина?

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

    Сперва веб-сервер (обычно Apache или Nginx) получают запрос и принимают решение, что делать с ним дальше. Если нет правила для такого запроса, то они просто попытаются найти файл и отдать его, как статический. В вашем случае так и происходит. Часто веб-серверу пишут правило типа "если запрос заканчивается на .php, то передай его на исполнение php (mod-php, php-fpm, php-fastcgi и т.п.), а полученный от php ответ верни клиенту (браузеру, как правило)".

    Я использую во время разработки встроенный php-веб-сервер, но не вздумайте его использовать на живом проекте. На реальном сервере с проектом лучше использовать nginx+php-fpm.
    В unix-подобных системах встроенный пхп-веб-сервер запускается очень просто:
    - Через консоль(терминал) заходите в папку с проектом и пишете "php -S localhost:8000".
    - После этого в браузере заходите на урл localhost:8000 и Ваш проект работает.
    Если Вы работаете на windows, то быстрее осваивайте линукс\mac и разрабатывайте сразу на нормальных системах. Или, как я раньше делал, на виртуалке поднимайте сервер и на нем разрабатывайте.
    Ответ написан
    5 комментариев
  • С чего начать создание веб-сервиса?

    IvanCher
    @IvanCher
    Мысли шире
    Толковый пхп-шник, который умеет пользоваться фотошопом и бутстрапом. Хорошо, если еще знает основы сео и смм. Если слишком большой проект, то еще 1 джуниор. Но вообще, если требуется намного больше для старта, то подумайте еще раз над необходимостью многих функций приложения.
    Ответ написан
    4 комментария
  • Yii боевка игры?

    IvanCher
    @IvanCher
    Мысли шире
    Он ведь у тебя наносит удар после какого-то действия пользователя ? Если так, то аяксом отправляй запрос, на сервере записывай показатели здоровья в бд и в ответ с сервера отсылай нанесенный урон, на клиенте просто нужное значение подставляй.
    Ответ написан
    2 комментария
  • Yii2 Active Form: как скрыть тег с ошибкой, если текста ошибки нет?

    IvanCher
    @IvanCher
    Мысли шире
    <?= $form->field($model,  'name', [
        template' => "
            {label}
            {input}
            {error}",
        'errorOptions' => "
            'tag' => 'span',
            'class' => 'error',
        "
    ]) ?>
    Ответ написан
  • Как в Yii2 basic убрать web/ из url при помощи .htaccess и правил urlManager'а?

    IvanCher
    @IvanCher
    Мысли шире
    Если коротко, то вам нужно WebRoot указать не корневую папку с проектом (***/project), а папку web(***/project/web).
    Ответ написан
    Комментировать
  • Как делается валидация динамических полей?

    IvanCher
    @IvanCher
    Мысли шире
    Пусть у поля атрибут name будет каким-то идентификатором, по которому можно будет узнать все его ограничения. В контролере отдаешь данные на валидацию модели поля, модель по идентификатору получает правила(ограничения), валидирует, отвечает контролеру, контролер формирует ответ клиенту.
    Ответ написан
    Комментировать
  • Где правильнее проверять пользовательские данные? В контроллере или модели?

    IvanCher
    @IvanCher
    Мысли шире
    За работу с данными должна отвечать модель. Именно модель должна знать какие данные допустимы, а какие нет, потому что на ней лежит функция обработки/записи этих самых данных.
    У контролера цель - обрабатывать пользовательские запросы и решать, как на них ответить.
    Иными словами, вы принимаете данные с формы контролером и говорите модели сказать валидные ли данные пришли. Модель отвечает контролеру, контролер принимает решение, как на это ответить пользователю (ошибкой, каким-то конкретным представлением и т.п.).
    UPDATE
    MVC советую всем прочесть, прежде, чем давать странные советы. Особенно внимательно прочесть "Наиболее частые ошибки", как раз говориться, что делать из контролера Толстый Тупой Уродливый Контролер - не правильно по определению шаблона. Можно спорить сколько угодно, но об этом прямо многие авторитеты. Другое мнение сформировано отсутствием глубокого понимания MVC и малым опытом на крупных проектах.
    Ответ написан
    17 комментариев
  • Какой фрэймворк выбрать Yii 2 или Symfony 2?

    IvanCher
    @IvanCher
    Мысли шире
    Симфонисты не работают с yii2 и не до конца понимают о чем пишут :)
    Я скажу так: оба фреймворка на высоте, по возможностям одинаковы, но подходы очень разные.
    Объективно скажу так: на yii2 не получится запускать отдельные модули без запуска всего приложения, тут у симфони2 огромный плюс. Так же у симфони более классные консольные команды для генерирования каркасов, мне больше нравится, чем gii(но дело вкуса). Но по факту большинство сильных сторон симфони не оправдывается в связи с высоким порогом вхождения. Найти хорошего симфони программиста намного сложнее, чем найти его на yii2. Поэтому взависимости от бюджета и масштаба проекта можете выбирать. Симфони2 - это больше уровень корпораций, yii2 более простой при практчески том же функционале.
    Если знаете симфони2, то лучше подтяните его. Yii2 изучить намного проще, намного всё прозрачнее внутри работает, там Вам хватит пару вечеров, чтобы пройтись по исходникам и всё для себя понять как изнутри как работает.
    Ответ написан
    7 комментариев
  • Почему не сразу срабатывает функция?

    IvanCher
    @IvanCher
    Мысли шире
    Ну а то, что данный код выполняется при событии keypress(нажатие клавиши) и привязан к textarea Вас не смущает ? :)
    Ответ написан
  • Как подключить один модуль в разных приложениях, построенных на Yii 2 Advanced Application?

    IvanCher
    @IvanCher
    Мысли шире
    1. Сделайте лучше АПИ отдельным приложением, а общие модели создайте в common.
    2. Кофиг-файлы в приложениях должны мерджиться с конфигом common-приложения, поэтому пропишите модуль в конфиге common-приложения и модуль будет доступен в любом.
    Ответ написан
    Комментировать
  • PHP Рекурсивный обход данных из базы?

    IvanCher
    @IvanCher
    Мысли шире
    $sourceArray = *предполагаю, что извлекли все записи из базы*;
    $newArray = [];
    foreach ($sourceArray as $el) {
        if ($el['parent_id']) {
            $newArray[$el['parent_id']]['children'] = [
                'id' => $el['id'],
                'text'=>$el['text'],
                ...
            ];
        } else {
            $newArray[$el['id']] = [
                'id' => $el['id'],
                'text'=>$el['text'],
                ...
            ];
        }
    }

    подойдет ?
    Ответ написан
  • Как с помощью jquery выбрать все ссылки, подходящие под условие?

    IvanCher
    @IvanCher
    Мысли шире
    jQuery('a[href!="sitename"]').not('a[href^="https://stat"], a[href^="http://support"]')
    Ответ написан
    Комментировать
  • Если вызвать модальное окно с середины - страница скроллится к верху, как запретить?

    IvanCher
    @IvanCher
    Мысли шире
    Можете использовать этот плагин, специально сделан для Вашего случая. Можете поковырять его и разобраться, как в плагине предотвращается скролл.
    Ответ написан
  • Возможно ли сделать что то подобное?

    IvanCher
    @IvanCher
    Мысли шире
    Эти возможности появились в php 5.4. https://php.net/manual/ru/migration54.new-features.php
    Что про них читать, я даже ума не приложу. Чего тут читать ? Функция возвращает массив, значит можешь сразу обращаться к элементу этого массива по индексу.
    $user_foto = $this->getUserInfo($id)['foto'];
    $user_foto = $this->getUserInfo($id)->foto; // Если возвращается объект.

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

    IvanCher
    @IvanCher
    Мысли шире
    1. Создаешь 2 модели: Account и AccountC (назови, как нравится).
    2. В модели Account создаешь публичные свойства с названиями полей, которые нужно сохранить во второй таблице.
    3. В модели Account в методе afterSave сохраняешь нужные свойства в таблицу модели AccountC.

    Можешь сделать тоже самое в методе afterSave вручную, например через это.
    Ответ написан
    Комментировать
  • Ленивая загрузка данных из базы?

    IvanCher
    @IvanCher
    Мысли шире
    Случаем код у тебя не такого плана:
    foreach($models as $model) {
      $model-> getAllTimes();
    }

    Если подобный, то действительно он будет для каждого экземпляра модели делать запрос, а при статичной переменной $_allTimes - только 1 запрос.
    Ответ написан
    Комментировать
  • Какой выбрать абузоустойчивый сервер для игрового сервиса?

    IvanCher
    @IvanCher
    Мысли шире
    любой берите, зарегистрированный в США или Европе, и чтобы сервер физически располагался где-нибудь там же, лучше в Голандии. Абузоустойчивые жутко глючные и ненадежные сами по себе. Просто думайте о том, кому вы "переходите дорогу" и исходя из этого думайте где бы всё это расположить дело. А вообще, если айпи спрячете надежно за прокси-сервером и не спалите, то хоть в России располагайте, всё ровно никто не узнает.
    Ответ написан
    2 комментария