Статьи

Создание веб-приложения с Symfony 2: начальная загрузка

Вступление

Symfony PHP Framework является мощным, масштабируемым и гибким. Тем не менее, считается, что многие, особенно те, кто не знаком с фреймворками, имеют очень крутую кривую обучения.

Это верно в определенной степени. На первый взгляд, модели, представления, контроллеры, сущности, репозитории, маршрутизация, шаблоны и т. Д. В целом могут показаться очень пугающими и запутанными.

Однако, если вы поняли основы PHP и HTML, имеете базовые знания о современной разработке веб-сайтов (в частности, Pretty URIs, MVC) и знаете, как CRUD-базу данных / таблицу, вы не далеко от разработки довольно хороший сайт, будь то для личного использования или бизнес-приложения.

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

Я буду использовать свой личный сайт для сбора книг в качестве отправной точки. Он запущен и работает, поэтому проект, который я здесь использую, — это не демонстрационная версия, а реально работающий сайт (размещенный на http://www.rsywx.net , на чистом китайском языке).

Окончательный исходный код сайта для этой части руководства можно найти в репозитории Github . Любые комментарии и вопросы, пожалуйста, не стесняйтесь связаться со мной .

Быстрая установка

Настроить Symfony довольно просто. Мой любимый способ — скачать пакет Symfony Standard без поставщиков. Посетите официальный сайт загрузки и убедитесь, что вы выбрали правильный пакет. Разархивируйте / распакуйте архив в запланированный корневой веб-каталог, и вы почти у цели (мой проект для этой серии будет находиться по адресу f: \ www \ rsywx_test). После распаковки пакета Symfony вы увидите структуру каталогов, не похожую на эту:

Убедитесь, что указанный выше каталог правильный (вы можете не увидеть каталог .hg, поскольку он предназначен только для контроля версий).

Следующим шагом является загрузка системы упаковки PHP под названием Composer . Большинство современных PHP-фреймворков используют Composer для управления пакетами.

Если у вас установлена ​​утилита cURL , вы можете выполнить следующую команду:

curl -S https://getcomposer.org/installer | php 

или если нет (но вы действительно должны установить cURL), введите следующее:

 php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));" 

Будет загружен один новый файл с именем composer.phar. Этот файл является точкой входа для нашего управления пакетами PHP.

Как следует из названия архива, у нас есть файлы, которые не содержат библиотек (или пакетов), чтобы Symfony действительно работал. Для этого вам нужно запустить:

 php composer.phar update 

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

Если вы правильно настроили свой веб-сервер (я использую Apache), вы уже можете посетить сайт:

В Symfony обычной практикой является использование app_dev.php в качестве страницы входа во время разработки. В производственной среде app_dev.php будет опущен.

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

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

Всегда php composer.phar selfupdate периодически запускать php composer.phar selfupdate для получения последней версии composer.phar.

Примечание. Пакет Symfony всегда имеет встроенный пакет AcmeDemoBundle. Этот пакет представляет собой демонстрационное приложение, которое доказывает, что Symfony запущен и работает, и служит примером, который вы можете использовать для создания своего собственного приложения. Чтобы удалить этот пакет из настроек вашего веб-сайта, следуйте инструкциям в этой статье .

После удаления, если вы снова посетите сайт, вы увидите страницу 404 (маршрут не найден для «GET /»), поскольку мы еще не начали создавать собственное приложение.

Связка, Контроллеры, Представления, Модели (Объекты)

Короче говоря, Symfony использует пакеты (часто называемые модулями в других средах). Пакет можно рассматривать как набор файлов — он служит контейнером для извлечения данных, логического управления и представления определенного набора функций или наборов на вашем веб-сайте. Мой сайт имеет только один пакет и служит для перечисления всех моих книг, деталей одной книги, статей, которые я написал после прочтения книги, баллов моей любимой команды NBA (Lakers) и т. Д. Эти функции (или модули, как они есть) нелогично называется в Symfony) все они заключены в один пакет (trrsywxBundle).

Пакет будет содержать контроллеры, представления и файлы сущностей (модели). Они составляют основу MVC-структурированного веб-сайта.

Чтобы сгенерировать пакет и начать разработку нашего приложения, введите следующую команду:

 php app/console generate:bundle 

Перед созданием пакета консоль задаст вам несколько вопросов:

  • Пространство имен пакета: в этом примере я использую tr \ rsywxBundle. Не забудьте иметь «Bundle» в конце.
  • Имя пакета: используйте предложенное имя, полученное из пространства имен. В этом случае «trrsywxBundle».
  • Целевой каталог: используйте предложенное lcoation (в данном случае «F: / www / rsywx_test / src»).
  • Формат конфигурации: доступно 4 варианта: PHP, YAML, XML и аннотация. Выберите тот, который вы предпочитаете, и чувствуйте себя комфортно. Если вы хотите следовать, я буду использовать YAML, поэтому наберите «yml» как ваш выбор.
  • Вы хотите создать всю структуру каталогов: не обязательно.
  • Подтвердите генерацию, обновление ядра и генерацию маршрутизации.

Более подробные инструкции по этому процессу можно найти здесь .

Маршрутизация

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

Как и большинство других сред, Symfony имеет функцию маршрутизации для поддержки красивых URI . Это делается путем создания маршрутов в routing.yml (и с правильной конфигурацией .htaccess, которая находится в каталоге web / вашей настройки Symfony).

Чтобы сделать инкапсуляцию более сильной, я рекомендую вам добавить свои собственные маршруты в файл routing.yml пакета (расположенный в пути к корневому каталогу вашего сайта / src / tr / rsywxBundle / Resources / config). Это удобно, когда вы в конечном итоге хотите перенести весь пакет на другой сайт. Обратите внимание, как пространство имен пакета отражается в структуре каталогов.

Распространенная ошибка при определении маршрутов заключается в том, что маршруты имеют приоритет. Чем раньше появится маршрут, тем раньше он будет сопоставлен. Другими словами, если маршруты не организованы должным образом, возникнут странные, трудные для устранения проблемы.

Например, в более ранней версии моего сайта у меня было два маршрута, выглядящих так:

 tag_list: pattern: /books/{tag}/{page} defaults: {_controller: trrsywxBundle:Book:taglist, page:1} ... reading_list: pattern: /books/readings/{page} defaults: {_controller: trrsywxBundle:Reading:list, page:1} 

Видишь проблему? /books/readings самом деле /books/readings будет сопоставлен с маршрутом tag_list , в котором tag параметра будет принимать readings качестве значения и направлять нас к совершенно другому контроллеру. Я не могу просто поменять порядок этих двух маршрутов (что решило бы большинство проблем, но сбой, когда кто-то действительно ищет книги, содержащие «чтения» в качестве тега). Единственный способ обойти это — изменить шаблон маршрута для первого:

 tag_list: pattern: /books/tag/{page}/{tag} defaults: {_controller: trrsywxBundle:Book:taglist, page:1} 

Основываясь на том факте, что чем раньше появляется маршрут, тем раньше он сопоставляется, вам нужно поместить наиболее часто используемые маршруты в начало файла routing.yml. Это дает дополнительное преимущество, заключающееся в том, что он быстрее, так как у фреймворка есть меньше маршрутов для проверки, прежде чем попасть в соответствие.

Я не рассматриваю весь аспект маршрутизации в Symfony здесь. В официальной документации все сказано.

База данных

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

Файл rsywx.sql папке проекта misc позволит вам импортировать базу данных (MariaDB или MySQL) — просто импортируйте ее с помощью инструмента командной строки mysql или через веб-интерфейс, такой как PhpMyAdmin. Хотя официальная документация Symfony предполагает создание баз данных / таблиц из среды Symfony, я настоятельно рекомендую использовать другой сторонний инструмент. Преимущества использования стороннего инструмента включают в себя:

  • Более интуитивное и понятное определение базы данных;
  • Меньше вводов при определении типа данных, отношений, индексов, первичных ключей и т. Д.

Теперь мы можем связать базу данных, настроив app/config/parameters.yml :

 parameters: database_driver: pdo_mysql database_host: 127.0.0.1 database_port: null database_name: symfony database_user: root database_password: null 

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

После создания базы данных / таблиц легко импортировать эти структуры базы данных в Symfony:

 php app\console doctrine:mapping:import 

А затем создайте соответствующие объекты:

 php app\console doctrines:generate:entity tr 

(где tr — пространство имен пакета).

Примечание. На данный момент Symfony поддерживает два ORM: Doctrine и Propel. Я использую Doctrine в этом приложении.

В целом, импорт будет успешным без проблем. Однако есть как минимум две вещи, на которые следует обратить внимание:

  • Инструмент не подходит для отображения таблицы с составным первичным ключом (т. Е. Первичным ключом с 2 или более полями), в котором одно из полей одновременно является также внешним ключом для другой таблицы.
  • Вы можете редактировать сгенерированные файлы сущностей (расположены в пути к корневому каталогу вашего сайта / src / tr / rsywxBundle / Entity /). Но если вы изменили имена полей, типы и другую информацию, обязательно «отразите» эти изменения обратно в базу данных с помощью команды php app/console doctrine:database:create . Не волнуйтесь, Syfmony теперь сильнее и умнее. Команда не уничтожит загруженные вами ранее данные.

Вывод

В этой части руководства мы настроили проект и инфраструктуру Symfony, поместили базу данных на место и выполнили работу по очистке (удалив встроенный AcmeDemoBundle).

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

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