• Название:

    05 Занятие №5 MVC, Symfony

  • Размер: 0.68 Мб
  • Формат: PDF
  • или
  • Название: Занятие №5 MVC, Symfony

Занятие №5
MVC, Symfony

О себе








Александр Козлов
• в Симбирсофт с декабря 2010 г.
• отдел веб-разработок
• тимлид, руководитель проектов
Образование:
• УлГУ, Прикладная математика и информатика, 2009 г. (диплом
специалиста)
• МИМ ЛИНК, курс «Управление организацией и персоналом», 2013
г. (сертификат)
Опыт использования технологий
• LAMP – 5 лет
• Symfony 1.x/2.x – 2.5 года
• Yii framework 1.x – 0.5 года
Проекты (PHP): dzangocart, dzangowiki, travelrecords, teamogen,
practicethai, fuseinsurance

Что такое фреймворк?

Фреймворк
Фреймворк (framework) - это каркас,
облегчающий разработку и объединение
разных компонентов большого
программного проекта.

Фреймворк
● готовые компоненты и решения
● основы безопасности

● стандартизация
● сообщество

PHP фреймворки

PHP фреймворки
● Symfony
● Zend

● Yii
● ...

Фреймворк
● Когда использовать?
● “Простые” и “сложные” фреймворки

● CMF и CMS

MVC

MVC
● Модель (Model)
● Представление (View)

● Контроллер (Controller)

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

Модель

Модель
● данные и методы работы с этими
данными

● реагирует на запросы, изменяя своѐ
состояние
● не содержит информации о том, как
можно визуализировать данные

Модель
Что внутри?
● описание структуры данных

● взаимодействие с хранилищем (СУБД)
● бизнес-логика*

Модель
class Attachment extends BaseEntity
{
private $id;
private $attachmentType;
private $post;
public function __construct(User $user, Post $post) {
$this->setUploadDir('/uploads/'.$user->getId().'/'.$post->getId().'/');
}
public function setPost(Post $post = null) {
$this->post = $post;
return $this;
}
public function getPost() {
return $this->post;
}
...

}

Представление

Представление
Отвечает за отображение информации
(визуализацию)

Представление
Что внутри?
● Каркас формата (html, xml, json)

● Вывод данных
● Минимальный набор операторов
(шаблонизатор)

Представление






authorName; ?>


createdAt; ?>
message; ?>





Контроллер

Контроллер
● контролирует ввод данных
пользователем

● использует модель и представление для
реализации необходимой реакции

Контроллер
Что внутри?
● получение данных от пользователя

● передача данных в модель
● получение представления на основе
текущего состояния модели, вывод
результатов пользователю

Контроллер
class UserController extends BaseController
{
public function indexAction() {
$params = $this->_getParams();
$params['activeMenuItem'] = self::USER_MENU_ITEM;
return $params;

}
public function showAction($id) {
$user = $this->getRepository('user')->find($id);
if (!$user || $user->isDeleted()) {
return $this->generateError('user.notFound');
}
return $this->render('Main:index', array('user' => $user));
}
...
}

Варианты реализации MVC

Варианты реализации MVC

Вспомогательные компоненты
● Маршрутизатор
● Сервисы

Маршрутизатор

Маршрутизатор
Основное назначение - определение
контроллера, которому будет передано
управление.

Маршрутизатор
user_list:
pattern: /user
defaults: {_controller: MainBundle:User:index}
user_show:
pattern: /user/{id}
defaults: {_controller: MainBundle:User:show}

Сервисы

Сервисы
● выполняют “глобальные” задачи
● как правило, доступны внутри

контроллеров

Сервисы
class UserController extends BaseController
{
public function sendAction($id, $message) {
$user = $this->getRepository('user')->find($id);
if (!$user || $user->isDeleted()) {
return $this->generateError('user.notFound');
}
$mailer = $this->get('mailer');

return $mailer->send($user->getEmail(), $message);
}
...
}

Типы контроллеров
● frontend
● command (CLI)

● API

Frontend
Типовые задачи:
● вывод html-страниц (или отдельных

блоков)
● обработка запросов отправки форм

Frontend
class UserController extends BaseController
{
public function showAction($id) {
$user = $this->getRepository('user')->find($id);
if (!$user || $user->isDeleted()) {
return $this->generateError('user.notFound');
}
return $this->render('Main:index', array('user' => $user));
}
...
}

Command
Типовые задачи:
● Импорт/экспорт данных

● Фоновые службы
●?

Command
class LdapImportUsersCommand extends ContainerAwareCommand
{
protected function execute() {
$userRepository = $this->getContainer()->get('user.repository');
$ldapManager = $this->getContainer()->get('ldap.ldap_manager');
$ldapUsers = $ldapManager->getUsers();
foreach ($ldapUsers as $ldapUser) {
$user = new User();
$user->setUsername($ldapUser['username'][0]);
$user->setName($ldapUser['name'][0]);
$user->setSurname($ldapUser['surname'][0]);
$userRepository->save($user);
$output->writeln($ldapUser['username'][0]);
}
$output->writeln('done');
}
}

API
Типовые задачи:
● Взаимодействие с внешними приложениями

● Интеграция с компонентами приложения
через AJAX

API
class APIController extends BaseAPIController
{
public function userAction($id) {
$user = $this->getRepository('user')->find($id);

if (!$user || $user->isDeleted()) {
return $this->generateError('user.notFound');
}
return json_encode(array('user' => $user));
}
...
}

Варианты реализации модели
● ActiveRecord
● ORM

Шаблонизаторы
● PHP
● Twig

● Smarty
● XSLT

Symfony

Почему symfony?
● компонентный подход
● MVC, DI, IoC, ORM, …

● сообщество
● composer
● Twig

Symfony: инструментарий
● LAMP (php 5.3+)
● git

● composer

Symfony: установка
composer create-project symfony/framework-standardedition /projects/sf/ "2.5.*"

Symfony: установка

Symfony: установка

ServerName symfony
ServerAlias symfony
DocumentRoot /projects/sf/web

Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all



Symfony: установка
cd /projects/sf/
chmod -R 777 app/logs/
chmod -R 777 app/cache/
Добавляем в файл /etc/hosts запись:

127.0.0.1

symfony

Перезапускаем apache:
sudo service apache2 restart

Symfony: установка
http://symfony/app_dev.php

Symfony: установка

Symfony: структура
● app/ (конфигурация приложения)
● src/ (код приложения)

● vendor/ (сторонние библиотеки)
● web/ (корневая директория приложения)

Symfony: структура

Symfony: структура

Symfony: структура

Symfony: структура

Symfony: bundles
● bundle - пакет/плагин
● свои контроллеры, свои шаблоны, свои

модели, своя конфигурация и т.д.
● Acme/DemoBundle

Symfony: bundles









Command
Controller
DependencyInjection
EventListener
Form
Resources
Tests
Twig

Symfony: окружение
● app.php VS app_dev.php
● config_prod.yml VS config_dev.yml

● панель отладки

Symfony: маршрутизация

Symfony: маршрутизация
● /src/Acme/DemoBundle/Resources/config/routing.yml
● формат YAML
● аннотации

Symfony: маршрутизация
_welcome:
path:

/

defaults: { _controller: AcmeDemoBundle:Welcome:index }

_demo_secured:
resource: "@AcmeDemoBundle/Controller/SecuredController.php“
type:

annotation

_demo:
resource: "@AcmeDemoBundle/Controller/DemoController.php“
type:

annotation

prefix:

/demo

Symfony: маршрутизация
class DemoController extends Controller
{
/**
* @Route("/hello/{name}", name="_demo_hello")

* @Template()
*/
public function helloAction($name)
{

return array('name' => $name);
}

...

}

Symfony: модель
● /src/Acme/DemoBundle/Entity/ (Doctrine)
● /src/Acme/DemoBundle/Model/ (Propel)

Symfony: контроллер
namespace Acme\DemoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class WelcomeController extends Controller
{
public function indexAction()
{
/*
* The action's view can be rendered using render() method
* or @Template annotation as demonstrated in DemoController.
*
*/
return $this->render('AcmeDemoBundle:Welcome:index.html.twig');
}
}

Symfony: ресурсы
/src/Acme/DemoBundle/Resources/

Symfony: шаблоны
● /src/Acme/DemoBundle/Resources/views/
● /app/Resources/views/

● Twig

Symfony: шаблоны
{% extends "AcmeDemoBundle::layout.html.twig" %}

{% block title "Symfony - Contact form" %}

{% block content %}

{{ form_errors(form) }}
{{ form_row(form.email) }}

{{ form_row(form.message) }}
{{ form_rest(form) }}




{% endblock %}

Symfony: команды
/src/Acme/DemoBundle/Command/HelloWorldCommand.php
cd /projects/sf/
php app/console acme:hello
Hello World!

Материалы
https://github.com/hiend/simbirsoft_examples/tree/ch05/symfony

Задание
● Установить в свой LAMP фреймворк
Symfony.

● Сгенерировать каркас приложения.
● Изменить вывод на странице (например,
заменить логотип symfony в верхней
части страницы).

THE END