Во времена Symfony 1.x платформа имела мощный бэкэнд-модуль, чтобы помочь разработчикам и администраторам сайтов создать достаточно хорошее приложение и предоставить необходимые функции CRUD для управления базой данных (и избавить нас от использования PHPMyAdmin).
Начиная с Symfony 2, это было извлечено из ядра, и разработчики либо должны полагаться на себя, чтобы начать с нуля, либо полагаться на какой-либо другой сторонний пакет Symfony 2, когда такая функция необходима — и во многих случаях это ,
В этой статье мы рассмотрим Phreeze , простой и удобный в использовании PHP-фреймворк, который может помочь нам сгенерировать серверное приложение MySQL CRUD. Я буду использовать свой тестовый сайт коллекции книг в качестве основной базы данных. Пожалуйста, обратитесь к моей статье Data Fixtures в Symfony2 для более подробной информации о структуре базы данных.
Установка и начальная загрузка
Фриз распространяется как самостоятельный. Вы можете клонировать копию его последней версии с Github .
В моей среде я создал новый test
виртуального хоста и клонировал репозиторий в его папку phreeze
чтобы я мог запустить генерацию бэкенда с помощью Phreeze, используя: http://test/phreeze/builder
.
Чтобы упростить генерацию бэкэнда, Phreeze представляет нам два шага, похожие на мастера, чтобы помочь нам.
На первом экране мы предоставим необходимую информацию о соединении с базой данных (сервер, база данных / схема, пользователь, пароль):
В опциях драйвера MySQL Phreeze предоставляет необработанные mysql_connect
, mysqli_connect
а также PDO. Рекомендуется PDO, так как он более популярен в настоящее время, а mysql_*
устарела.
Далее мы можем нажать «Анализ базы данных», и он выведет нас на второй и последний экран:
Все таблицы в базе данных определены и выбраны по умолчанию. Если мы не хотим включать конкретную таблицу в наш сервер CRUD, мы отменим ее выбор. В моем случае я отменил выбор таблицы book_visit
поскольку в этой таблице хранится информация о посещениях страниц с подробными сведениями о книгах, и она заполняется внутри моего приложения.
Phreeze также предлагает имена сгенерированных объектов для каждой таблицы. Имя в единой форме ( BookBook
) отражает одну сущность (книгу) таблицы ( book_book
), а имя во множественной форме ( BookBooks
) отражает класс коллекции (все книги) этой таблицы ( book_book
).
Фриз довольно умен, когда предлагает множественные формы (как можно видеть в Lakers
/ Lakerses
). Поэтому обычно я просто оставляю предложения без изменений.
Мы можем смело оставлять «Префикс столбца» пустым. Он используется для удаления (НЕ добавления) префикса этого столбца из имен полей вашей таблицы во время генерации сущностей для внутреннего интерфейса. Например, если в вашей таблице есть поле с именем fld_firstname
, вы можете предоставить префикс столбца как fld_
и, таким образом, в сгенерированных классах это поле будет отображено в элемент с именем firstname
вместо fld_firstname
.
Далее, в «Опциях приложения», Phreeze предлагает несколько выпадающих меню, чтобы мы могли настроить сгенерированное приложение бэкэнда.
Пакеты для генерации
Он предлагает два типа пакетов: один — это запущенное приложение с различными шаблонизаторами (Savant, Laraval / Blade, Smarty). Шаблон Twig пока не поддерживается, поэтому на моем сайте Symfony 2 я должен использовать Smarty для своих внутренних представлений. Все шаблоны будут использовать плиту Bootstrap CSS. Это поможет нам в дальнейшей настройке макета, стиля и т. Д. Внутреннего представления.
Другой тип пакета называется тестовым пакетом. Если поддерживает PHPUnit и QUnit. Мы не будем освещать это в этой статье.
Имя приложения и корневой URL
В качестве имени приложения просто укажите его по своему выбору.
Мы должны быть осторожны при установке корневого URL приложения. Сейчас мы просто назовем его имя и вернемся позже к этому параметру.
Путь к свободе и самодостаточности
Оставьте «Путь к свободам» как есть.
Я выберу «Да», чтобы сгенерированное внутреннее приложение было автономным.
Длинный опрос
Выберите «Отключено», что также является параметром по умолчанию. При длительном опросе интерфейс обновляется с помощью ajax, что позволяет использовать приложение на нескольких вкладках и мгновенно видеть, что изменения, внесенные в одной, происходят в других, без необходимости их перезагрузки. Это глазная конфета по большей части, и она не обязательна.
Теперь нажмите «Создать приложение». Phreeze начнет генерировать все необходимые файлы и заархивировать их в один архив (в данном случае этот файл называется « backend.zip
»).
Сгенерированный zip-файл довольно большой (в моем случае почти 1 МБ), но большую часть его составляют файлы Bootstrap (CSS, image, js, font и т. Д.) И архив PHAR для Phreeze (мы выбрали «Self-Contained» и включили фриз рамки для нашего приложения).
Поместите это в проект Symfony 2
Созданный backend.zip
файл backend.zip
— это все, что нам нужно для запуска сервера. Чтобы интегрировать эти разархивированные файлы в Symfony 2, мой подход будет следующим:
- Вспомните, что мы предоставили для «URL-адреса корня приложения». В данном случае это
http://servername/backend
. - Мой сайт, который будет использовать этот бэкэнд, имеет имя сервера
rsywx
поэтому URL для вызова моего бэкенда должен быть примерно такимhttp://rsywx/backend
. - Поскольку Symfony 2 помещает все «статическое» в свой
web
каталог, я создалbackend
каталог в этомweb
каталоге и разархивировал все файлы вbackend.zip
в этот каталог.
Чтобы запустить бэкэнд, мы просто http://rsywx/backend
и экран приветствия http://rsywx/backend
будет выглядеть так:
( ПРИМЕЧАНИЕ. Из-за правил перезаписи Symfony 2 .htaccess, а также из-за конфигурации LAMP / WAMP вы можете ничего не увидеть или просто увидеть список каталогов. В этом случае попробуйте http://rsywx/backend/index.php
. Последний URL всегда будет работать.)
В верхней части страницы мы видим несколько навигационных ссылок. Каждый приведет нас на страницу CRUD соответствующей таблицы. Давайте посмотрим на некоторые из них и попробуем CRUD несколько записей.
( ПРИМЕЧАНИЕ. Операции CRUD могут радикально изменить вашу базу данных / таблицы, поэтому для этой демонстрации я буду применять эти операции только к тестовой базе данных. Тестовую базу данных всегда можно вывести с одним и тем же набором данных, используя DataFixtures
рассмотренный в моей предыдущей статье. )
На следующих нескольких book_publishers
экрана показано, что будет отображаться для book_publishers
, book_places
и book_taglist
(выполняется операция вставки):
Обратите внимание, что, поскольку book_taglist
имеет FK, связанный с book_book
, поле bid
находится в раскрывающемся book_book
, чтобы мы могли выбрать действительный идентификатор книги, чтобы избежать ошибок проверки согласованности.
Кроме того, на каждой странице, показанной выше, есть функция «Поиск», с помощью которой мы можем дополнительно фильтровать отображаемые результаты.
Нажатие на заголовок таблицы будет сортировать результат в этом конкретном поле, переключаясь с возрастания и убывания. Довольно удобно, правда?
Теперь давайте посмотрим на отображение таблицы book_book
. Мы нажимаем ссылку «Книжные книги» в верхней панели навигации и ожидаем увидеть в общей сложности 101 книгу. К сожалению! Почему отображается только одна книга?
После некоторого обсуждения с автором Phreeze нам удалось выяснить проблему: в моей book_book
таблицы book_book
есть поле с именем page
. Внутренний маршрут / контроллеры Phreeze также используют параметр страницы для разбиения на страницы набора результатов (например, page=1
для отображения первой страницы). Но поскольку page
также является допустимым именем поля моей таблицы, Phreeze считает, что я пытаюсь отфильтровать набор результатов, чтобы отобразить только те записи, чье поле page
имеет значение 1.
Ну, в моих тестовых данных есть только одна запись, чья page
имеет значение 1. Это объясняет, почему отображается только одна запись.
Автор (спасибо, Джейсон!) Предлагает два решения, чтобы выйти из этого.
Один из вариантов — переименовать это поле во что-то другое, например, в pages
. Но это потребует много усилий в нашей установке Symfony 2, включая повторный импорт сопоставлений базы данных и повторную генерацию сущностей. Так что я просто отрицал это.
Второе, что я и использую, — это немного взломать сгенерированный код. Вот как:
- Найдите и откройте файл
BookBookController.php
. Он должен находиться в нашем проекте Symfony 2 вweb/backend/libs/Controller
если вы будете следовать инструкциям по установке выше. - Где-то около строки 60-70, внутри функции
Query()
, должно быть несколько строк:
if ( property_exists ( $criteria , $prop_normal ))
{ $criteria -> $prop_normal = RequestUtil :: Get ( $prop );
} elseif ( property_exists ( $criteria , $prop_equals ))
{
// this is a convenience so that the _Equals suffix is not needed $criteria -> $prop_equals = RequestUtil :: Get ( $prop );
}
- В нашем конкретном случае, когда наша
page
поля таблицы конфликтует со страницей параметров запроса Phreeze, мы модифицируем приведенный выше код, чтобы предоставить одно исключение:
if ( $prop != 'page' && property_exists ( $criteria , $prop_normal ))
{ $criteria -> $prop_normal = RequestUtil :: Get ( $prop );
} elseif ( $prop != 'page' && property_exists ( $criteria , $prop_equals ))
{
// this is a convenience so that the _Equals suffix is not needed $criteria -> $prop_equals = RequestUtil :: Get ( $prop );
}
- Сохраните и перезагрузите.
Бинго! Вот что отображается для нашей книжной страницы CRUD:
Список книг отображается правильно, нумерация страниц работает нормально. (На приведенном выше снимке экрана показано, что мы находимся на странице 4.)
Изменение настроек приложения
Phreeze использует три файла конфигурации для правильной работы.
-
_machine_config.php
: этот файл содержит параметры подключения к базе данных, а также параметры URL-адреса корня приложения. Нам нужно изменить настройки при развертывании. -
_global_config.php
: этот файл определяет многие специфические для приложения настройки и основные функции. Обычно мы оставим все как есть. -
_app_config.php
: этот файл определяет все маршруты и другие настройки. Обычно это не должно быть изменено.
API-интерфейсы
Самая яркая особенность Phreeze заключается в том, что он предоставляет интерфейс API. Чтобы напрямую вызвать API и увидеть его вывод в формате JSON, мы добавляем api
в URI, который мы вызываем для отображения данных.
Например, для отображения данных книги используется URI: http://rsywx/backend/bookbooks
; чтобы получить вывод JSON из API, мы используем это: http://rsywx/backend/api/bookbooks
.
Этот интерфейс API имеет две блестящие точки:
- Когда мы настраиваем представления, у нас есть способ получить данные непосредственно из соответствующих API. Затем мы можем использовать JSON-декодирование для анализа возвращаемых данных и использования их в нашем шаблонизаторе. Это сэкономит нам много времени и сил.
- Это фактически становится готовым API RESTful для предоставления данных третьим сторонам.
И, конечно же, с помощью необработанных данных, полученных Phreeze, мы также можем найти некоторые другие не столь очевидные проблемы и ошибки.
Безопасный доступ
Прямо сейчас этот внутренний URL-адрес ( http://rsywx/backend/index.php
) доступен для всех. В большинстве случаев это не очень хорошая идея, поэтому давайте обеспечим доступ к этой странице или, точнее, к этому каталогу ( web/backend
).
Phreeze не является связкой в терминах Symfony 2. Таким образом, встроенная авторизация Symfony не применяется, и доступ к /backend
пропустит кого-либо.
В этом случае я использую комбинацию .htaccess
и .htpasswd
чтобы обеспечить довольно безопасный контроль безопасности начального уровня в этом каталоге с использованием HTTP-аутентификации.
ПРИМЕЧАНИЕ: Phreeze поставляется с собственной аутентификацией. Он использует таблицу для хранения имени пользователя и хешированного пароля. Но в этом коротком уроке я пропускаю это. Заинтересованные стороны могут скачать и прочитать демоверсию авторизации, чтобы лучше понять.
Phreeze поставляется с собственным файлом .htaccess
и мы просто добавляем несколько строк в его конец:
AuthName "RSYWX Backend"
AuthType Basic
AuthUserFile . htpasswd require valid - user
Затем мы можем создать файл htpasswd
с помощью утилиты htpasswd
под Linux. Мы копируем этот файл .htpasswd
в нужное место. В моей установке Windows EasyPHP его следует скопировать в f:\EasyPHP\binaries\apache\
. Не паникуйте, если вы не можете сначала определить правильное местоположение. Если этот файл находится не в том месте, возникнет ошибка 500, и Apache error.log
всегда предложит вам правильное местоположение.
ПРИМЕЧАНИЕ. На сайте Symfony 2 аутентификация HTTP, не использующая встроенный метод авторизации Symfony ( security.yml
), может завершиться ошибкой. Он отлично работает в моей текущей локальной настройке EasyPHP, но не работает в моей настройке производственного сервера, и разница в версии Apache. Apache 2.4 рекомендуется.
Несколько мыслей и вывод
Фриз очень полезен для меня. С его помощью мне удалось создать свой бэкэнд-модуль CRUD для моего сайта в течение 10 минут, не написав ни единой строки кода (кроме, конечно, хакерских программ).
Его функции не супер богатые, но достаточные. Мне очень нравится API, фильтрация и сортировка.
Возможно, его интерфейс еще нужно улучшить. В настоящее время он использует исключительно манипуляции с JavaScript и DOM для динамического отображения новых данных (например, при переходе на следующую страницу). URL-адрес останется прежним, но я хотел бы видеть что-то вроде http://rsywx/backend/bookbooks/page/2
чтобы я мог быстро перейти на http://rsywx/backend/bookbooks/page/2
вместо того, чтобы много раз щелкать ссылки на страницы (это только имеет ссылку на предыдущую / следующую страницу и всего 10 ссылок на страницу).
Я бы жаждал поддержки шаблона Twig. Пользователи Symfony 2 часто используют Twig, а сам Twig довольно зрелый и популярный. Я надеюсь увидеть это в своих будущих выпусках.
Отсутствие поддержки других БД может ограничить область ее применения. По моему личному мнению, когда MySQL поддерживается через PDO, не является задачей невозможной поддержка других популярных БД (SQLite, pgSQL, MongoDB и т. Д.). Я надеюсь, что это в дорожной карте автора.
Он может не иметь таких причудливых интерфейсов, как другие комплекты админ-генератора в Symfony 2, но этого достаточно для простой и быстрой настройки и использования бэкэнда. И в конце концов, мы можем использовать наше собственное творчество, чтобы придать ему совершенно новый вид.
Это также имеет то преимущество, что он не тесно связан с Symfony 2. Вы можете использовать его на любом из ваших сайтов на базе MySQL с другими фреймворками.
Подробную документацию по Phreeze можно найти на официальном сайте .
Я бы дал Phreeze 4 из 5 баллов и рекомендовал бы использовать его на своем сайте.
Дайте мне знать ваши отзывы и комментарии!