Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Структура расслоения - Symfony — обзор возможностей с примерами

Лекция



Это продолжение увлекательной статьи про symfony .

...

команды.

composer require symfony/security

Symfony — Сервисный контейнер

В любом приложении объекты имеют тенденцию увеличиваться с ростом приложения. По мере увеличения объектов зависимость между объектами также увеличивается. Зависимость объекта должна быть обработана правильно для успешного приложения.

Как уже говорилось в главе «Компоненты», Symfony предоставляет простой и эффективный компонент DependencyInjection для обработки зависимости объекта. Служебный контейнер — это контейнер объектов с правильно разрешенной зависимостью между ними. Давайте узнаем, как использовать компонент DependencyInjection в этой главе.

Давайте создадим класс Greeter . Цель класса Greeter — приветствовать пользователя, как показано в следующем примере.

$greeter = new Greeter('Hi'); 
$greeter->greet('Jon'); // print "Hi, Jon" 

Полный код класса Greeter выглядит следующим образом.

class Greeter { 
   private $greetingText; 
   
   public function __construct($greetingText) { 
      $this->greetingText = $greetingText; 
   }  
   public function greet($name) { 
      echo $this->greetingText . ", " . $name . "\r\n"; 
   } 
}

Теперь давайте добавим класс Greeter в сервисный контейнер. Symfony предоставляет ContainerBuilder для создания нового контейнера. Как только контейнер создан, класс Greeter может быть зарегистрирован в нем с помощью метода register контейнера.

use Symfony\Component\DependencyInjection\ContainerBuilder; 
$container = new ContainerBuilder(); 
$container 
   ->register('greeter', 'Greeter') 
   ->addArgument('Hi');

Здесь мы использовали статический аргумент для указания текста приветствия, Привет. Symfony также обеспечивает динамическую настройку параметров. Чтобы использовать динамический параметр, нам нужно выбрать имя и указать его между%, а параметр можно установить с помощью метода setParameter контейнера.

$container = new ContainerBuilder(); 
$container 
   ->register('greeter', 'Greeter') 
   ->addArgument('%greeter.text%');  
$container->setParameter('greeter.text', 'Hi');

Мы зарегистрировали класс Greeter с правильной настройкой. Теперь мы можем попросить контейнер предоставить правильно сконфигурированный объект Greeter, используя метод get контейнера.

$greeter = $container->get('greeter'); 
$greeter->greet('Jon'); // prints "Hi, Jon" 

Мы успешно зарегистрировали класс, добавили его в контейнер, извлекли его из контейнера и использовали. Теперь давайте создадим другой класс User , который использует класс Greeter и посмотрим, как его зарегистрировать.

class User { 
   private $greeter;  
   public $name; 
   public $age;  
   
   public function setGreeter(\Greeter $greeter) { 
      $this->greeter = $greeter; 
   }  
   public function greet() { 
      $this->greeter->greet($this->name); 
   } 
}

Класс User получает класс Greeter, используя один из его метода setter, setGreeter . Для этого сценария Symfony предоставляет метод addMethodCall и класс Reference для ссылки на другой класс, как показано в следующем коде.

use Symfony\Component\DependencyInjection\Reference;  
$container 
   ->register('user', 'User') 
   ->addMethodCall('setGreeter', array(new Reference('greeter'))); 

Наконец, мы зарегистрировали два класса, Greeter и User, имеющие тесные связи между ними. Теперь мы можем безопасно извлечь объект User с правильно настроенным классом Greeter из контейнера, как показано в следующем коде.

$container->setParameter('greeter.text', 'Hi'); 
$user = $container->get('user'); 
$user->name = "Jon"; 
$user->age = 20; 
$user->greet(); // Prints "Hi, Jon"

Мы видели, как настроить объект в контейнере, используя сам PHP. Symfony предоставляет и другие механизмы. Это файлы конфигурации XML и YAML. Давайте посмотрим, как настроить контейнер с использованием YAML. Для этого установите компоненты symfony / config и symfony / yaml вместе с компонентами symfony / dependency -jection .

cd /path/to/dir 
mkdir dependency-injection-example 
cd dependency-injection-example 
composer require symfony/dependency-injection 
composer require symfony/config 
composer require symfony/yaml

Конфигурация YAML будет записана в отдельном файле services.yml . Конфигурация YAML состоит из двух разделов, параметров и сервисов . Раздел Parameters определяет все обязательные параметры. Раздел Сервисы определяет все объекты. Раздел служб дополнительно разделен на несколько разделов, а именно: класс, аргументы и вызовы . Класс указывает фактический класс. Аргументы определяют аргументы конструктора. Наконец, вызовы определяют методы установки. На другой класс можно ссылаться с помощью символа @, @greeter.

parameters: 
   greeter.text: 'Hello' 
services: 
   greeter: 
      class: Greeter
      arguments: ['%greeter.text%'] 
   user: 
      class: User 
      calls: 
         - [setGreeter, ['@greeter']] 

Теперь services.yml может быть загружен и настроен с использованием FileLoader и YamlFileLoader, как показано в следующем коде.

use Symfony\Component\Config\FileLocator; 
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;  

$yamlContainer = new ContainerBuilder(); 
$loader = new YamlFileLoader($yamlContainer, new FileLocator(__DIR__)); 
$loader->load('services.yml');  

$yamlUser = $yamlContainer->get('user'); 
$yamlUser->name = "Jon"; 
$yamlUser->age = 25; 
$yamlUser->greet(); 

Полный список кодов выглядит следующим образом.

main.php

greetingText = $greetingText; 
      }  
      public function greet($name) { 
         echo $this->greetingText . ", " . $name . "\r\n"; 
      } 
   }  
   class User { 
      private $greeter;  
      public $name; 
      public $age;  
      
      public function setGreeter(\Greeter $greeter) { 
         $this->greeter = $greeter; 
      }  
      public function greet() { 
         $this->greeter->greet($this->name); 
      } 
   }  
   $container = new ContainerBuilder(); 
   $container 
      ->register('greeter', 'Greeter') 
      ->addArgument('%greeter.text%');  
   $container 
      ->register('user', 'User') 
      ->addMethodCall('setGreeter', array(new Reference('greeter')));
   
   $container->setParameter('greeter.text', 'Hi'); 
   $greeter = $container->get('greeter'); 
   $greeter->greet('Jon'); 
   
   $user = $container->get('user'); 
   $user->name = "Jon"; 
   $user->age = 20; 
   $user->greet();  
   
   $yamlContainer = new ContainerBuilder(); 
   $loader = new YamlFileLoader($yamlContainer, new FileLocator(__DIR__)); 
   $loader->load('services.yml');  

   $yamlHello = $yamlContainer->get('greeter'); 
   $yamlHello->greet('Jon'); 
   
   $yamlUser = $yamlContainer->get('user'); 
   $yamlUser->name = "Jon"; 
   $yamlUser->age = 25; 
   $yamlUser->greet();  
?>

services.yml

parameters: 
   greeter.text: 'Hello' 
services: 
   greeter: 
      class: Greeter 
      arguments: ['%greeter.text%'] 
   user: 
      class: User 
      calls: 
         - [setGreeter, ['@greeter']] 

Веб-фреймворк Symfony широко использует компонент внедрения зависимостей. Все компоненты связаны централизованным сервисным контейнером. Веб-фреймворк Symfony предоставляет контейнер во всем его контроллере через свойство контейнера . Через него мы можем зарегистрировать весь объект, например, регистратор, почтовик и т. Д.

$logger = $this->container->get('logger'); 
$logger->info('Hi'); 

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

cd /path/to/app 
php bin/console debug:container

В приветственном веб-приложении, созданном в главе по установке, содержится около 200+ объектов.

Symfony — События и EventListener

Symfony обеспечивает программирование на основе событий через свой компонент EventDispatcher . Любое корпоративное приложение нуждается в программировании на основе событий для создания настраиваемого приложения. События являются одним из основных инструментов взаимодействия объектов друг с другом. Без событий объект не взаимодействует эффективно.

Процесс программирования, основанного на событиях, можно обобщить следующим образом: — объект, называемый источником события, просит центральный диспетчерский объект зарегистрировать событие, например, user.registered. Один или несколько объектов, называемых слушателем, запрашивают у центрального объекта диспетчера, что он хочет прослушать определенное событие, например, user.registered. В какой-то момент времени исходный объект Event просит центральный диспетчерский объект отправить событие, скажем, user.registered вместе с объектом Event вместе с необходимой информацией. Центральный диспетчер информирует все объекты слушателя о событии, например, user.registered и его объект Event *.

В программировании на основе событий у нас есть четыре типа объектов: источник события, прослушиватель событий, даже диспетчер событий и само событие.

Давайте напишем простое приложение, чтобы понять концепцию.

Шаг 1 — Создайте проект, пример события-диспетчера .

cd /path/to/dir 
mkdir event-dispatcher-example 
cd event-dispatcher-example 
composer require symfony/event-dispatcher 

Шаг 2 — Создать класс .User .

class User { 
   public $name; 
   public $age; 
}  

$user = new User(); 
$user->name = "Jon"; 
$user->age = 25

Шаг 3 — Создать событие UserRegisteredEvent .

use Symfony\Component\EventDispatcher\Event;  
class UserRegisteredEvent extends Event {
   const NAME = 'user.registered';  
   protected $user;  
   
   public function __construct(User $user) { 
      $this-

Здесь UserRegisteredEvent имеет доступ к объекту User . Название мероприятия — user.registered .

Шаг 4 — Создайте слушателя, UserListener .

class UserListener { 
   public function onUserRegistrationAction(Event $event) { 
      $user = $event->getUser(); 
         echo $user->name . "\r\n"; 
         echo $user->age . "\r\n"; 
   } 
}  
$listener = new UserListener(); 

Шаг 5 — Создайте объект диспетчера событий.

use Symfony\Component\EventDispatcher\EventDispatcher;  
$dispatcher = new EventDispatcher(); 

Шаг 6 — Соедините слушатель и событие, используя объект диспетчера и его метод, addListener .

$dispatcher 
   ->addListener( 
      UserRegisteredEvent::NAME,  
      array($listener, 'onUserRegistrationAction'));  

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

$dispatcher 
   ->addListener( 
      UserRegisteredEvent::NAME,  
      
      function(Event $event) { 
         $user = $event->getUser(); 
         echo $user->name . "\r\n"; 
      }); 

Шаг 7 — Наконец, запустить / отправить событие, используя метод диспетчера событий, dispatch .

 $dispatcher->dispatch(UserRegisteredEvent::NAME, $event);

Полный список кодов выглядит следующим образом.

main.php

user = $user; 
      }  
      public function getUser() { 
         return $this->user; 
      } 
   }  
   class UserListener { 
      public function onUserRegistrationAction(Event $event) { 
         $user = $event->getUser(); 
         echo $user->name . "\r\n"; 
         echo $user->age . "\r\n"; 
      } 
   } 
   $user = new User(); 
   $user->name = "Jon"; 
   $user->age = 25;  

   $event = new UserRegisteredEvent($user); 
   $listener = new UserListener();  

   $dispatcher = new EventDispatcher();  
   $dispatcher 
      ->addListener( 
         UserRegisteredEvent::NAME, 
         
         function(Event $event) { 
            $user = $event->getUser(); 
            echo $user->name . "\r\n"; 
         });  
   $dispatcher 
      ->addListener( 
         UserRegisteredEvent::NAME, array($listener, 'onUserRegistrationAction'));

   $dispatcher->dispatch(UserRegisteredEvent::NAME, $event); 
?>

Результат

Jon 
Jon 
25

Веб-фреймворк Symfony имеет много событий, и можно зарегистрировать прослушиватель этих событий и запрограммировать его соответствующим образом. Одним из примеров события является kernel.exception, а соответствующее событие — GetResponseForExceptionEvent , которое содержит объект ответа (вывод веб-запроса). Это используется для перехвата исключения и изменения ответа с помощью общей информации об ошибке, а не для отображения ошибки времени выполнения для пользователей.

Symfony — Выражение

Как мы уже говорили ранее, язык выражений является одной из характерных особенностей приложения Symfony. Выражение Symfony в основном создается для использования в среде конфигурации. Это позволяет непрограммисту настраивать веб-приложение без особых усилий. Давайте создадим простое приложение для проверки выражения.

Шаг 1 — Создать проект, выражение-язык-пример .

cd /path/to/dir 
mkdir expression-language-example 
cd expression-language-example 
composer require symfony/expression-language 

Шаг 2 — Создайте объект выражения.

use Symfony\Component\ExpressionLanguage\ExpressionLanguage; 
$language = new ExpressionLanguage();

Шаг 3 — Проверьте простое выражение.

echo "Evaluated Value: " . $language->evaluate('10 + 12') . "\r\n" ; 
echo "Compiled Code: " . $language->compile('130 % 34') . "\r\n" ;

Шаг 4 — Выражение Symfony настолько мощное, что может перехватывать объект PHP и его свойства также на языке выражений.

class Product { 
   public $name; 
   public $price; 
} 
$product = new Product(); 
$product->name = 'Cake'; 
$product->price = 10;  

echo "Product price is " . $language 
   ->evaluate('product.price', array('product' => $product,)) . "\r\n";  
echo "Is Product price higher than 5: " . $language 
   ->evaluate('product.price > 5', array('product' => $product,)) . "\r\n"; 

Здесь выражения product.price и product.price> 5 пересекают цену свойства объекта $ product и оценивают результат.

Полное кодирование выглядит следующим образом.

main.php

evaluate('10 + 12') . "\r\n" ; 
   echo "Compiled Code: " . $language->compile('130 % 34') . "\r\n" ;  
   
   class Product { 
      public $name; 
      public $price; 
   }  
   $product = new Product(); 
   $product->name = 'Cake'; 
   $product->price = 10;  

   echo "Product price is " . $language 
      ->evaluate('product.price', array('product' => $product,)) . "\r\n"; 
   echo "Is Product price higher than 5: " . $language 
      ->evaluate('product.price > 5', array('product' => $product,)) . "\r\n"; 
?> 

Результат

Evaluated Value: 22 
Compiled Code: (130 % 34) 
Product price is 10 
Is Product price higher than 5: 1

Symfony — Связки

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

Пакет может быть упакован специально для приложения, такого как AdminBundle (раздел администратора), BlogBundle (блог сайта) и т. Д. Такие пакеты не могут совместно использоваться приложением. Вместо этого мы можем смоделировать определенную часть приложения, такую ​​как блоги, как универсальный пакет, так что мы можем просто скопировать пакет из одного приложения в другое приложение для повторного использования функциональности блога.

Структура расслоения

Основная структура пучка заключается в следующем.

  • Контроллер — Все контроллеры должны быть размещены здесь.

  • DependencyInjection — Здесь необходимо разместить весь код и конфигурацию, связанные с внедрением зависимостей.

  • Resources / config — конфигурации, связанные с пакетом, находятся здесь.

  • Ресурсы / Представление — Связанные шаблоны представления помещены здесь.

  • Ресурсы / общедоступные — здесь размещены связанные с пакетом таблицы стилей, скрипты Java, изображения и т. Д.

  • Тесты — файлы связанных с модулем тестов находятся здесь.

Контроллер — Все контроллеры должны быть размещены здесь.

DependencyInjection — Здесь необходимо разместить весь код и конфигурацию, связанные с внедрением зависимостей.

Resources / config — конфигурации, связанные с пакетом, находятся здесь.

Ресурсы / Представление — Связанные шаблоны представления помещены здесь.

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

Тесты — файлы связанных с модулем тестов находятся здесь.

Создание пакета

Давайте создадим простой пакет TutorialspointDemoBundle в нашем приложении HelloWorld .

Шаг 1 — Выберите пространство имен. Пространство имен пакета должно включать имя поставщика и имя пакета. В нашем случае это Tutorialspoint \ DemoBundle .

Шаг 2 — Создайте пустой класс, TutorialspointDemoBundle , расширив класс Bundle и поместите его в каталог src / Tutorialspoint / DemoBundle .

namespace Tutorialspoint\DemoBundle; 
use Symfony\Component\HttpKernel\Bundle\Bundle;  

class TutorialspointDemoBundle extends Bundle { 
}

Шаг 3 — Зарегистрируйте класс в списке пакетов, поддерживаемых приложением в классе AppKernel .

public function registerBundles() { 
   $bundles = array( 
      // ... 
      // register your bundle 
      new Tutorialspoint\DemoBundle\TutorialspointDemoBundle(), 
   ); 
   return $bundles; 
}

Это все, что нужно для создания пустого пакета, а все остальные понятия такие же, как и у приложения. Symfony также предоставляет консольную команду generate: bundle для упрощения процесса создания нового пакета, который заключается в следующем.

php bin/console generate:bundle --namespace = Tutorialspoint/DemoBundle

Результат

Welcome to the Symfony bundle generator!

Are you planning on sharing this bundle across multiple applications? [no]: no  

Your application code must be written in bundles. This command helps 
you generate them easily.  

Give your bundle a descriptive name, like BlogBundle. 
Bundle name [Tutorialspoint/DemoBundle]:   

In your code, a bundle is often referenced by its name. It can be the 
concatenation of all namespace parts but it's really up to you to come 
up with a unique name (a good practice is to start with the vendor name). Об этом говорит сайт https://intellect.icu  . 
Based on the namespace, we suggest TutorialspointDemoBundle.  

Bundle name [TutorialspointDemoBundle]:  
Bundles are usually generated into the src/ directory. Unless you're 
doing something custom, hit enter to keep this default!
Target Directory [src/]:   

What format do you want to use for your generated configuration?  

Configuration format (annotation, yml, xml, php) [annotation]:

Bundle generation

> Generating a sample bundle skeleton into app/../src/Tutorialspoint/DemoBundle 
   created ./app/../src/Tutorialspoint/DemoBundle/ 
   created ./app/../src/Tutorialspoint/DemoBundle/TutorialspointDemoBundle.php 
   created ./app/../src/Tutorialspoint/DemoBundle/Controller/ 
   created ./app/../src/Tutorialspoint/DemoBundle/Controller/DefaultController.php 
   created ./app/../tests/TutorialspointDemoBundle/Controller/   
   created ./app/../tests/TutorialspointDemoBundle/Controller/DefaultControllerTest.php 
   created ./app/../src/Tutorialspoint/DemoBundle/Resources/views/Default/   
   created ./app/../src/Tutorialspoint/DemoBundle/Resources/views/Default/index.html.twig 
   created ./app/../src/Tutorialspoint/DemoBundle/Resources/config/ 
   created ./app/../src/Tutorialspoint/DemoBundle/Resources/config/services.yml 
> Checking that the bundle is autoloaded 
> Enabling the bundle inside app/AppKernel.php 
   updated ./app/AppKernel.php 
> Importing the bundle's routes from the app/config/routing.yml file 
   updated ./app/config/routing.yml 
> Importing the bundle's services.yml from the app/config/config.yml file 
   updated ./app/config/config.yml 
Everything is OK! Now get to work :).  

Создание простого веб-приложения

В этой главе объясняется, как создать простое приложение в среде Symfony. Как уже говорилось ранее, вы знаете, как создать новый проект в Symfony.

Мы можем взять пример «студенческих» деталей. Давайте начнем с создания проекта с именем «student» с помощью следующей команды.

symfony new student

После выполнения команды создается пустой проект.

контроллер

Symfony основан на паттерне разработки Model-View-Controller (MVC). MVC — это программный подход, который отделяет логику приложения от представления. Контроллер играет важную роль в Symfony Framework. Все веб-страницы в приложении должны обрабатываться контроллером.

Класс DefaultController находится в «src / AppBundle / Controller» . Там вы можете создать свой собственный класс Controller.

Перейдите в папку «src / AppBundle / Controller» и создайте новый класс StudentController .

Ниже приведен основной синтаксис для класса StudentController .

StudentController.php

namespace AppBundle\Controller; 
use Symfony\Component\HttpFoundation\Response;  
class StudentController { 
} 

Теперь вы создали StudentController. В следующей главе мы подробнее обсудим контроллер.

Создать маршрут

Как только Контроллер был создан, нам нужно направить на конкретную страницу. Маршрутизация отображает URI запроса на метод конкретного контроллера.

Ниже приведен основной синтаксис для маршрутизации.

namespace AppBundle\Controller;  
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;  

class StudentController { 
   /** 
      * @Route("/student/home") 
   */ 
   public function homeAction() { 
      return new Response('Student details application!'); 
   } 
}

В приведенном выше синтаксисе @Route («/ student / home») является маршрутом. Он определяет шаблон URL для страницы.

homeAction () — это метод действия, в котором вы можете построить страницу и вернуть объект Response.

Мы подробно рассмотрим маршрутизацию в следующей главе. Теперь запросите URL «http: // localhost: 8000 / student / home», и он даст следующий результат.

Результат

Symfony — обзор возможностей с примерами

Symfony — Контроллеры

Контроллер отвечает за обработку каждого запроса, поступающего в приложение Symfony. Контроллер читает информацию из запроса. Затем создает и возвращает объект ответа клиенту.

Согласно Symfony, класс DefaultController находится в «src / AppBundle / Controller» . Это определяется следующим образом.

DefaultController.php



Здесь компонент HttpFoundation определяет объектно-ориентированный уровень для спецификации HTTP, а FrameworkBundle содержит большую часть «базовой» функциональности инфраструктуры.

Объект запроса

Класс Request является объектно-ориентированным представлением сообщения HTTP-запроса.

Создание объекта запроса

Запрос может быть создан с помощью метода createFromGlobals () .

use Symfony\Component\HttpFoundation\Request; 
$request = Request::createFromGlobals();

Вы можете смоделировать запрос, используя Globals. Вместо того чтобы создавать запрос на основе глобальных переменных PHP, вы также можете имитировать запрос.

$request = Request::create( 
   '/student', 
   'GET', 
   array('name' => 'student1') 
);

Здесь метод create () создает запрос на основе URI, метода и некоторых параметров.

Переопределение объекта запроса

Вы можете переопределить глобальные переменные PHP, используя метод overrideGlobals () . Это определяется следующим образом.

$request->overrideGlobals();

Доступ к объекту запроса

Доступ к веб-странице можно получить в контроллере (метод действия) с помощью метода getRequest () базового контроллера.

$request = $this->getRequest();

Идентификация объекта запроса

Если вы хотите идентифицировать запрос в вашем приложении, метод PathInfo вернет уникальный идентификатор URL запроса. Он определяется следующим образом.

$request->getPathInfo();

Объект ответа

Единственное требование к контроллеру — вернуть объект Response. Объект Response содержит всю информацию из данного запроса и отправляет ее обратно клиенту.

Ниже приведен простой пример.

пример

use Symfony\Component\HttpFoundation\Response; 
$response = new Response(‘Default'.$name, 10);

Вы можете определить объект Response в JSON следующим образом.

$response = new Response(json_encode(array('name' => $name))); 
$response->headers->set('Content-Type', 'application/json');

Конструктор ответа

Конструктор содержит три аргумента —

  • Содержание ответа
  • Код статуса
  • Массив заголовков HTTP

Ниже приведен основной синтаксис.

use Symfony\Component\HttpFoundation\Response;  
$response = new Response( 
   'Content', 
   Response::HTTP_OK, 
   array('content-type' => 'text/html') 
); 

Например, вы можете передать аргумент содержимого как,

$response->setContent(’Student details’);

Точно так же вы можете передать и другие аргументы.

Отправка ответа

Вы можете отправить ответ клиенту, используя метод send () . Это определяется следующим образом.

$response->send();

Чтобы перенаправить клиента на другой URL, вы можете использовать класс RedirectResponse .

Это определяется следующим образом.

use Symfony\Component\HttpFoundation\RedirectResponse;  
$response = new RedirectResponse('http://tutorialspoint.com/'); 

FrontController

Один файл PHP, который обрабатывает каждый запрос, поступающий в ваше приложение. FrontController выполняет маршрутизацию разных URL-адресов во внутренние части приложения.

Ниже приведен основной синтаксис FrontController.

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response;  

$request = Request::createFromGlobals();  
$path = $request->getPathInfo(); // the URI path being requested 

if (in_array($path, array('', '/')))  { 
   $response = new Response(’Student home page.'); 
} elseif (‘/about’ === $path) { 
   $response = new Response(’Student details page’); 
} else { 
   $response = new Response('Page not found.', Response::HTTP_NOT_FOUND); 
} 
$response->send();

Здесь функция in_array () ищет в массиве конкретное значение.

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

Маршрутизация отображает URI запроса на метод конкретного контроллера. В общем, любой URI состоит из следующих трех частей:

  • Имя хоста
  • Сегмент пути
  • Сегмент запросов

Например, в URI / URL http://www.tutorialspoint.com/index?q=data, www.tutorialspoint.com — сегмент имени хоста, index — сегмент пути, а q = data — сегмент запроса. Как правило, маршрутизация проверяет сегмент страницы с набором ограничений. Если какое-либо ограничение совпадает, то оно возвращает набор значений. Одним из основных значений является контроллер.

Аннотации

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

Ниже приведен пример аннотации.

/** 
   * @Route(“/student/home”) 
*/ 
public function homeAction() { 
   // ... 
} 

Концепции маршрутизации

Рассмотрим класс StudentController, созданный в проекте «student».

StudentController.php

// src/AppBundle/Controller/StudentController.php 
namespace AppBundle\Controller;  

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 

class StudentController extends Controller { 
   /** 
      * @Route(“/student/home”) 
   */ 
   public function homeAction() { 
      // ... 
   }  
    
   /** 
      * @Route(“/student/about”) 
   */ 
   public function aboutAction() { 
   } 
} 

Здесь маршрутизация выполняется в два этапа. Если вы идете в / student / home , первый маршрут совпадает, затем выполняется homeAction () . В противном случае, если вы перейдете в / student / about , второй маршрут будет найден, а затем выполняется aboutAction () .

Добавление подстановочных знаков

Предположим, у вас есть нумерованный список записей о студентах с такими URL-адресами, как / student / 2 и / student / 3 для страниц 2 и 3 соответственно. Затем, если вы хотите изменить путь к маршруту, вы можете использовать форматы подстановочных знаков.

пример

// src/AppBundle/Controller/BlogController.php 
namespace AppBundle\Controller;  

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;  

class StudentController extends Controller {
   /**      
      * @Route(“/student/{page}", name = “student_about”, requirements = {"page": "\d+"})
   */ 
   public function aboutAction($page) { 
      // ... 
   } 
} 

Здесь \ d + является регулярным выражением, которое соответствует цифре любой длины.

Назначить заполнитель

Вы можете назначить значение заполнителя в маршрутизации. Это определяется следующим образом.

// src/AppBundle/Controller/BlogController.php 
namespace AppBundle\Controller;  

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;  

class StudentController extends Controller { 
   /**      
      * @Route(“/student/{page}", name = “student_about”, requirements = {"page": "\d+"})
   */ 
    
   public function aboutAction($page = 1) { 
      // ... 
   } 
}

Здесь, если вы перейдете к / student, маршрут student_about будет соответствовать, и $ page по умолчанию будет иметь значение 1.

Перенаправление на страницу

Если вы хотите перенаправить пользователя на другую страницу, используйте методы redirectToRoute () и redirect () .

public function homeAction() { 
   // redirect to the "homepage" route 
   return $this->redirectToRoute('homepage');  
   
   // redirect externally 
   \return $this->redirect('http://example.com/doc'); 
}

Генерация URL

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

class StudentController extends Controller { 
   public function aboutAction($name) { 
      // ...  
      // /student/student-names 
      $url = $this->generateUrl( 
         ‘student_name’, 
         array(‘name’ =>
         ’student-names’) 
      ); 
   } 
}

StudentController

Рассмотрим простой пример маршрутизации в классе StudentController следующим образом.

StudentController.php

Project: '.$name.'' 
      ); 
   } 
}

Теперь запросите URL «http: // localhost: 8000 / student / home», и он даст следующий результат.

Symfony — обзор возможностей с примерами

Точно так же вы можете создать другой маршрут для aboutAction () .

Symfony — Просмотр движка

Уровень представления — это уровень представления приложения MVC. Он отделяет логику приложения от логики представления.

Когда контроллеру необходимо сгенерировать HTML, CSS или любой другой контент, он направляет задачу в механизм шаблонов.

Шаблоны

Шаблоны — это, в основном, текстовые файлы, используемые для создания любых текстовых документов, таких как HTML, XML и т. Д. Он используется для экономии времени и уменьшения количества ошибок.

По умолчанию шаблоны могут находиться в двух разных местах:

app / Resources / views / — Каталог представлений приложения может содержать макеты и шаблоны вашего приложения. Он также переопределяет сторонние шаблоны пакетов.

vendor / path / to / Bundle / Resources / views / — Каждый сторонний пакет содержит свои шаблоны в своем каталоге «Resources / views /».

Twig Engine

Symfony использует мощный язык шаблонов, который называется Twig . Twig позволяет очень легко создавать краткие и удобочитаемые шаблоны. Шаблоны Twig просты и не будут обрабатывать теги PHP. Twig выполняет управление пробелами, изолированную среду и автоматическое экранирование HTML.

Синтаксис

Twig содержит три типа специального синтаксиса —

  • {{…}} — печатает переменную или результат выражения в шаблон.

  • {% …%} — тег, который управляет логикой шаблона. Он в основном используется для выполнения функции.

  • {# … #} — Синтаксис комментариев. Используется для добавления однострочных или многострочных комментариев.

{{…}} — печатает переменную или результат выражения в шаблон.

{% …%} — тег, который управляет логикой шаблона. Он в основном используется для выполнения функции.

{# … #} — Синтаксис комментариев. Используется для добавления однострочных или многострочных комментариев.

Базовый шаблон ветки находится в «app / Resources / views / base.html.twig» .

пример

Давайте рассмотрим простой пример с использованием движка ветки.

StudentController.php

render('student/home.html.twig'); 
   } 
}

Здесь метод render () визуализирует шаблон и помещает это содержимое в объект Response.

Теперь перейдите в каталог «views» и создайте папку «student», а внутри этой папки создайте файл «home.html.twig». Добавьте следующие изменения в файл.

home.html.twig

//app/Resources/views/student/home.html.twig  

Student application!

Вы можете получить результат, запросив URL «http: // localhost: 8000 / student / home».

По умолчанию Twig поставляется с длинным списком тегов, фильтров и функций. Давайте пройдемся по одному подробно.

Теги

Twig поддерживает следующие важные теги —

Делать

Тег do выполняет функции, аналогичные регулярному выражению, за исключением того, что он ничего не печатает. Его синтаксис выглядит следующим образом —

{% do 5 + 6 %} 

Включают

Оператор include включает шаблон и возвращает отображаемое содержимое этого файла в текущее пространство имен. Его синтаксис выглядит следующим образом —

{% include 'template.html' %}

Расширяет

Тег extends может использоваться для расширения шаблона из другого. Его синтаксис выглядит следующим образом —

{% extends "template.html" %}

блок

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

{% block title %}{% endblock %}

встраивать

Тег embed выполняет комбинацию включений и расширений. Это позволяет вам включать содержимое другого шаблона. Это также позволяет вам переопределить любой блок, определенный внутри включенного шаблона, например, при расширении шаблона. Его синтаксис выглядит следующим образом —

{% embed “new_template.twig” %} 
   {# These blocks are defined in “new_template.twig" #} 
   {% block center %} 
      Block content 
   {% endblock %} 
{% endembed %} 

Фильтр

Разделы фильтров позволяют применять обычные фильтры Twig к блоку данных шаблона. Например,

{% filter upper %} 
   symfony framework 
{% endfilter %} 

Здесь текст будет изменен на верхний регистр.

За

Для цикла извлекает каждый элемент в последовательности. Например,

{% for x in 0..10 %} 
   {{ x }} 
{% endfor %}

Если

Оператор if в Twig похож на PHP. Выражение оценивается как истинное или ложное. Например,

{% if value == true %} 
   

Simple If statement

{% endif %}

фильтры

Веточка содержит фильтры. Он используется для изменения содержимого перед его отображением. Ниже приведены некоторые из известных фильтров.

длина

Фильтр длины возвращает длину строки. Его синтаксис выглядит следующим образом —

{% if name|length > 5 %} 
   ... 
{% endif %} 

ниже

Нижний фильтр

продолжение следует...

Продолжение:


Часть 1 Symfony — обзор возможностей с примерами
Часть 2 Структура расслоения - Symfony — обзор возможностей с примерами
Часть 3 Макеты - Symfony — обзор возможностей с примерами
Часть 4 AJAX — рабочий пример - Symfony — обзор возможностей с
Часть 5 Workflow - Symfony — обзор возможностей с примерами

создано: 2020-10-11
обновлено: 2024-11-14
37



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Фреймворки. Famworks ( программная платформа)

Термины: Фреймворки. Famworks ( программная платформа)