Развитие языков программирования растёт с большой скоростью
Скачать 2.79 Mb.
|
My blogHere I will write my posts. PHP: Junior Kit 290 Twig позволяет с легкостью выводить какие-то данные, которые мы хотим передать через РНР на страницу. Это как и есть одна из особенностей данного фреймворка. Теперь, когда у нас есть шаблон, который мы хотим использовать для нашей первой страницы, давайте перейдем в файл нашего контроллера и пропишем функцию чтобы при переходе на эту страницу показывался созданный нами шаблон: … class Post Controller { … public function indexAction() { return $this- >render("posts/home.html.twig"); /* Просто вместо того чтобы создавать новый объект, воспользуйтесь функцией render, и укажите правильный путь к папке в которой находиться шаблон, т.е. в папке templates */ } } ?> Как вы можете увидеть из этого примера, и комментария в данном примере - то мы просто как бы сказать “зарендерели” шаблон для нашей функции страницы. Можете перейти по адресе страницы и проверить работает ли все и отображается ли все то что было запрограммировано в файле. PHP: Junior Kit 291 Хорошо, а теперь давайте разберемся, какие функции будет иметь наш блог. Только четыре функции будут в нашем блоге, это создание/редактирование/удаление/просмотр поста. Поэтому давайте создадим их сначала пустыми в нашем контроллере: … use Symfony\Component\HttpFoundation\Request; class PostController { /** * @Route("/", name="index") */ public function indexAction() { return $this- >render("posts/home.html.twig"); } /** * @Route("/create", name="create_post") */ public function createAction() { } /** * @Route("/edit/{id}", name="edit_post") */ public function editAction($id) { PHP: Junior Kit 292 } /** * @Route("/show/{id}", name="index") */ public function indexAction($id) { } } ?> Для того чтобы мы могли делать запросы на получение данных через форму мы подключили компонент Request. Пока что наши функции, которые отвечают за новые страницы - пусты, но вы можете заметить, что в таких функциях как createAction() и editAction() есть локальная переменная $id. Но также когда мы с вами задавали параметры для маршрутизации данных функций, в конце названия адреса вы могли также заметить локальную переменную, которая объявленная в такой способ {id}. Это и есть та самая локальная переменная, которую мы указали в функции. Объясню зачем мы её добавили в адрес маршрута к странице, теперь когда мы будем переходить, например, на страницу для редактирования записи, то нам надо будет просто ввести id записи которую мы хотим отредактировать. Вместо того чтобы брать и указывать локальную переменную с помощью вопросительного знака, как например здесь показано ?id=1, можно просто после слэша поставить номер id поста. И не надо указывать какие-то дополнительные символы и названия переменных. Хорошо, мы смогли определиться, какие функции будет выполнять наш контроллер. А теперь давайте будем наполнять их понемногу. Но перед этим мы должны с вами создать таблицу в базе данных для наших постов. PHP: Junior Kit 293 И делать мы это будем не так как раньше, а с помощью библиотеки Doctrine которая есть в Symfony. Doctrine - это РНР библиотека, которая легко позволяет управлять базой данных с помощью консоли. Поэтому давайте создадим нашу первую таблицу, для этого давайте введем эту команду: php bin/console make:entity После ввода данной команды у вас запуститься меню для создания нового Entity, т.е. объекта для баз данных. Enity - это php скрипт который хранит в себе все данные об таблице которая есть или будет в базе данных. Сначала вы должны будете указать в консоли имя Entity. Дальше после этого вам будет предложено создание полей для таблицы. Для каждого поля надо будет указать такие параметры как имя поля, тип данных поля, уникальные параметры и т.д. Процесс создания нового поля для нового Entity выглядит вот так: Class name of the entity to create or update: > Post New property name (press > title Field type (enter ? to see all types) [string]: > string Field length [255]: > 60 Can this field be null in the database (nullable) (yes/no) [no]: > no PHP: Junior Kit 294 И после того как мы указываем все параметры мы можем ещё раз создать новое поле. Важно только указывать все корректно, чтобы не приходилось делать все заново. То, что указано в квадратных скобках - это то что будет указано по умолчанию если программист просто нажмёт enter. Объясню вам, что значит каждый шаг в создании нового поля. 1 Шаг: Мы указываем название нашего Entity. 2 Шаг: Указываем имя для нового поля. 3 Шаг: Указываем тип данных для этого самого поля. 4 Шаг: Указываем длину для поля. (Длина зависит от того какой тип данных вы укажите) 5 Шаг: Ставим разрешение на то можно ли содержать данному полю в таблице значении NULL. Думаю, вы уже здесь вспомнили об том как это делать в SQL, т.е. с помощью оператора NOT и директивы NULL. По умолчанию значение стоит на no. Когда поле будет создано, вам будет предложено создать ещё одно поле. Сразу хочу сказать, что добавлять поле id не надо, оно уже автоматически добавляется с помощью Doctrine в таблицу. Если вы хотите завершить процесс создания структуры таблицы, тогда просто нажмите enter, после того как создадите все нужные вам поля. Теперь, когда я вам объяснил, как создаются Entity, создайте Entity для постов, которое будет иметь такие поля как title(заголовок), content(контент), author(автор). Да, и это было ваше первое задание. Теперь, если вы это сделали то нам надо создать миграцию для базы данных, чтобы наша таблица появилась в БД. Только перед этим убедитесь, что у вас запущен XAMPP, а также правильны ли все параметры в файле env, который находиться в корневой папке приложения. Чтобы сделать миграцию для баз данных надо ввести эту команду: php bin/console make:migration И что дальше? После этого в вашей базе данных, которая была указана в конфигурации для базы данных, появится таблица с названием PHP: Junior Kit 295 вашего Entity. В нашем случае, нашым Entity является Post. А теперь, когда у нас есть уже таблица в нашей БД, мы можем начать наполнять наши функции кодом. И первой функцией будет createAction(): … use App\Entity\Post; // Чтобы мы могли создать новый объект этого Entity, мы его подключам use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\TextareaTy pe; use Symfony\Component\Form\Extension\Core\Type\SubmitType ; // Подключаем типы данных для полей формы … class PostController { … /** * … */ public function createAction(Request $request) { $post = new Post(); $form = $this- >createFormBuilder($post) ->add("title", TextType::class) ->add("content", Textarea::class) PHP: Junior Kit 296 ->add("author", TextType::class) ->add("save", SubmitType::class) ->getForm(); $form->handleRequest($request); if ($form->isSubmitted() && $form- >isValid()) { // Ниже мы присваем переменным значения // данных которые были введены в форму $title = $form["title"]- >getForm(); $content = $form["content"]- >getForm(); $author = $form["author"]- >getForm(); // Дальше мы уже присваваем значени // для нового поста $post->setTitle($title); $post->setContent($content); $post->setAuthor($author); $em = $this->getDoctrine()- >getManager(); $em->persist($post); $em->flush(); PHP: Junior Kit 297 return $this- >redirectoRoute("home"); } return $this- >render("posts/create.html.twig", array( "form" => $form->createView() )); } } ?> Много кода, но перед этим как я начну вам объяснять, что делает написанный нами код, мы должны создать шаблон для нашей функции, назвав его create.html.wig: {{ form_start(form) }} {{ form_widget(form) }} {{ form_end(form) }} Не забудьте сохранить шаблон в папке templates/post. (Если что, то все шаблоны контроллера, который отвечает за посты как раз и хранятся в этой папке). Ну а теперь, когда у нас есть все файлы, теперь надо объяснить, как работает код написанный в них. Начнём с нашего контроллера и функции, которая внутри него. Во-первых, я думаю, вы заметили что мы подключаем новые компоненты к нашему контроллеру. Это типы полей для нашей формы. Например, первый тип который мы подключаем это TextType. Мы подключаем три типа, это TextType, TextareaType и SubmitType. Объясню, что значат эти типы полей. TextType - это обычное небольшое текстовое поле. PHP: Junior Kit 298 Textarea - это уже полноценное текстовое поле для ввода текста который имеет определенный размер. Например ввод какого-нибудь реферата. SubmitType - это уже кнопка для отправления данных через форму. Кроме того что мы подключили типы полей мы также подключили наш Entity, для того чтобы мы могли создавать записи в данной таблице. Заметьте что в функции есть локальная переменная $request , которая используется для того чтобы можно было делать запросы. Создание нового поста происходит с помощью переменной $post которая является созданным объектом Entity - Post. После создания переменной $post, мы начинаем создавать форму в переменной $form. Для создания формы мы воспользовались функцией createFormBuilder() . (То есть вызвали конструктор форм). Вообще сама функция переводиться как “создать конструктор формы”. Сразу хочу добавить, что создать форму с помощью конструктора форм без какого-нибудь Entity невозможно. Заметьте, что мы указали в локальную переменную функцию Entity которое есть в переменной $post. То есть вообще указали наше Entity в наш конструктор форм. После этого, мы начинаем добавлять поля к нашей форме с помощью функции add(), думаю вы заметили что мы указываем только 2 параметра. Первый параметр это название поля которое мы хотим добавить, второй параметр это тип поля. Если мы создаём поле с помощью конструктора форм, то мы можем добавлять только те поля - которые есть в Entity. То есть, например, если мы хотим с вами добавить поле description , но его нету в самом Entity, то мы получим ошибку. А все потому что мы создаём форму на определенный Entity. Поэтому мы можем добавлять в форму только те поля, которые есть в нашем Entity. После того как мы добавили все поля в нашу форму, мы завершаем создание формы с помощью функции getForm(). PHP: Junior Kit 299 Теперь когда в нашей переменной $form есть создана форма, мы указываем что с помощью локальной переменной $request в функции handleRequest() можно делать запросы через форму. После указания этого параметра, мы создаём логическую конструкцию в условии которого есть проверка - была ли отправлена форма и были ли введены данные в все поля. Эта проверка делается с помощью двух функций isSubmitted() и isValid(). Первая функция проверяет, была ли отправлена форма, а вторая проверяет были ли заполнены все поля а также валидацию формы. И только внутри данной логической конструкции мы начинаем доставать данные, которые были введены в форму. Вы можете увидеть 3 переменные, которым мы присваиваем значения из полей формы. Как мы это делаем? Например, у нас есть переменная $title, которая получает значение из поля title. Делаем мы это обращаясь к нашей форме, обращаясь как к массиву, указывая название нужного поля и используя функцию getData(), для того чтобы достать данные из поля. Когда мы получили значения из полей, мы начали присваивать их объекту нашему Entity для того чтобы можно было потом создать новую запись в базе данных с помощью этого объекта. Это мы сделали с помощью функций, которые были автоматически сгенерированы с помощью консоли. Если вы хотите посмотреть на эти функции, то можете зайти в файл нашего Entity. Там вы сможете найти функции, которые позволяют присваивать значения полям объекта, а также доставать данные из этих полей объекта поста. Например, в коде нашей функции для создания нового поста, для того чтобы присвоить значения для поля title в нашем объекте мы воспользовались функцией setTitle() которая была сгенерирована автоматически в Entity. PHP: Junior Kit 300 Такое же самое мы сделали из другими полями, с помощью их функций для присвоения данных. После того как наш объект уже получил значения полей из формы, мы создали переменную $em в которой мы вызвали менеджер базы данных, чтобы мы могли добавить новую запись в таблицу. Дальше с помощью функции persist() мы указываем, что мы хотим добавить в базу данных. А уже после этого с помощью функции flush() автоматически создаются запросы к базе данных и данные добавляются. Хочу сразу же заметить, что обращались мы к этим функциям с помощью менеджера баз данных, который мы вызвали в переменной $em. Заканчивается наша логическая конструкция тем, что после создания новой записи в таблице, пользователя перенаправит на домашнюю страницу приложения. Перенаправление сработает только тогда, когда запись будет создана. А вообще, функция возвращает шаблон при переходе на страницу, но также я думаю вы заметили что кроме того что функция возвращает шаблон, она также возвращает форму. Функция возвращает шаблон и массив, в котором содержаться переменные для шаблонизатора Twig. После того как шаблон получает эти переменные он может к ним обращаться и работать с ними с помощью шаблонизатора Twig. То есть, с помощью Twig переменных вы можете передавать данные из контроллера в шаблон. Например, посмотрите на этот код: … $test = "Hello world!"; return $this->render("posts/create.html.twig", [ "test" => $test ]); … ?> PHP: Junior Kit 301 После этого в шаблоне я вывожу данную переменную, при этом я обращаюсь к Twig переменной с помощью фигурных скобок: {{ test }} Хочу добавить, что мы можем передавать шаблону столько Twig переменных - сколько нам надо. Хорошо, а теперь вернемся к нашему шаблону с формой. С помощью функций form_start(), form_widget() и form_end() мы создаём форму. Заметьте, что мы указываем Twig переменную с нашей формой как локальную в этих функциях. Все потому что, что для того чтобы создать форму надо переменную содержащую в себе данные об форме. Теперь я кратко объясню, что делает каждая из этих трех функций. form_start() - задает начало формы. form_widget() - показывает содержимое формы, т.е. все поля которые есть в форме. form_end() - задает конец формы. Кроме того, есть отдельные функции, которые позволяют по отдельности работать с каждым элементом формы. Об этом вы можете более детально почитать в официальной документации разработчиков. В такой способ создаются формы с помощью шаблонизатора Twig. Хорошо, теперь вы понимаете тот код, который мы написали. Переходим дальше. У нас есть функция для того чтобы создавать посты, давайте протестируем её, для того чтобы быть уверенным что все работает. Просто перейдите на страницу по созданию нового поста, заполните поля и отправьте данные. Если вас поле отправки данных перенаправило на домашнюю страницу, значит, все работает. Хорошо, дальше у нас идет функция, с помощью которой можно редактировать записи. Функция с помощью которой можно будет редактировать посты будет использовать те же самые функции которые использовались для того чтобы создавать пост, только уже немного по-другому. PHP: Junior Kit 302 Просто посмотрите на код данной функции показанный ниже: … class PostController { … public function editAction($id) { $post = $this->getDoctrine() ->getRepository(Post::class) ->find($id); $form = $this- >createFormBuilder($post) ->add("title", TextType::class) ->add("content", Textarea::class) ->add("author", TextType::class) ->add("save", SubmitType::class) ->getForm(); $post->setTitle($post->getTitle()); $post->setContent($post- >getContent()); $post->setAuthor($post- >getAuthor()); if ($form->isSubmitted() && $form- >isValid()) { $title = $form["title"]- >getData(); PHP: Junior Kit 303 $content = $form["content"]- >getData(); $author = $form["author"]- >getData(); $post->setTitle($title); $post->content($content); $post->author($author); $em = $this->getDoctrine()- >getManager(); $em->flush(); return $this- >redirectToRoute("home"); } return $this- >render("posts/edit.html.twig", [ "form" => $form->createView() ]); } } ?> Здесь уже нам не приходиться создавать новый объект Post с “чистого листа”, мы берем его уже с базы данных. Это делается, вызывая Doctrine и с помощью функции getRepository() мы вызываем наш Entity. А дальше с помощью функции find() мы находим наш пост по id который был указан в адресной строке. Чтобы в нашей форме отображались те данные, которые есть в таблице базы данных, мы с помощью функций для присвоения и PHP: Junior Kit 304 доставания значений задали им значения. Дальше мы создали логическую конструкцию суть которой в том что она просто задала новые значения из формы, а потом сделала запрос к базе данных с помощью менеджера БД. Заметьте, что здесь мы не использовали функцию persist(), поскольку мы не собираемся добавлять новый объект в базу данных, а только хотим обновить существующий. А дальше уже все как в функции с созданием поста, т.е. перенаправление на домашнюю страницу или отображение заданного шаблона при переходе на страницу. Сразу хочу сказать, что код шаблона для данной функции будет таким же самым, как и для функции создания постов. Мы создали 2 функции, осталось теперь осталось ещё 2. Дальше будет намного легче создавать функции. Сейчас мы будем создавать функцию для того чтобы просматривать определенную запись, вот код: … class PostController { … public function viewAction($id) { $post = $this->getDoctrine() ->getRepository(Post::class) ->find($id); return $this- >render("posts/view.html.twig", [ "post" => $post ]); } … } … ?> И код шаблона: |