Записки о symfony 3

Как установить установщик?

php -r "readfile('https://symfony.com/installer');" > symfony

Как установить symfony?

symfony new project-name

Как установить старый symfony?

symfony new old-project-name 2.8

Как настроить PhpStorm?

  • устанавливаем плагин Symfony Plugin
  • устанавливаем плагин PHP Annotations
  • ставим галочку Languages & Frameworks > PHP > Symfony > Enable Plugin for this Project
  • на этой же вкладке меняем пути на var/cache/dev/appDevUrlGenerator.php и var/cache/dev/translations

Как создать простую страницу?

Создаём класс (файл src/AppBundle/Controller/MainController.php).

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MainController extends Controller
{
}

Добавляем в класс метод:

/**
 * @Route("/")
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function showAction()
{
    return $this->render('main/show.html.twig');
}

где - @Route("/") устанавливает путь по которому будет срабатывать контроллер, а main/show.html.twig это путь к шаблону (файл app/Resources/views/main/show.html.twig)

Остаётся только создать файл app/Resources/views/main/show.html.twig с нужным содержимым.

Как зайти на dev-версию сайта?

http://example.com/app_dev.php/

Как сбросить кеш на prod версии?

php bin/console cache:clear --env prod

Как сделать наследуемые шаблоны с помощью twig?

Создаём базовый шаблон: app/Resources/views/base.html.twig с содержимым:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
        <link rel="icon" type="image/x-icon" href="{{ asset('favicon.ico') }}" />
    </head>
    <body>
        {% block body %}{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
</html>

Создаём шаблон главной страницы: app/Resources/views/main/show.html.twig с содержимым:

{% extends 'base.html.twig' %}

{% block body %}
    Main page!
{% endblock %}

Как отдать json?

Создаём в контроллере метод:

/**
 * @Route("/json")
 * @return \Symfony\Component\HttpFoundation\JsonResponse
 */
public function getJsonAction()
{
    $jsonData = [
        'success' => true,
        'time'    => time(),
    ];
    return new JsonResponse($jsonData);
}

Как сделать обработку динамической части пути?

Создаём в контроллере метод:

/**
 * @Route("/news/{id}")
 * @param $id
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function newsItemAction($id)
{
    return $this->render('news/item.html.twig', ['id' => $id]);
}

Создаём шаблон app/Resources/views/news/item.html.twig:

{% extends 'base.html.twig' %}

{% block body %}
    Новость {{ id }}
{% endblock %}

Как сделать валидацию динамической части url?

Пропускаем только путь в котором в id содержатся только цифры:

@Route("/news/{id}", requirements={"id": "\d+"})

Как вставить в twig-шаблоне ссылку на динамический url?

Добавляем в контроллер имя:

@Route("/news/{id}", name="news_item")

Добавляем в шаблон ссылку:

<a href="{{ path('news_item', {'id': 123}) }}">Новость</a>

Как определить ограниченный список вариантов динамической части url?

@Route("/lang/{lang}", requirements={"lang":"ru|en"})

Как подключить дополнительный js-файл в дочернем шаблоне:

Базовый шаблон (файл base.html.twig):

...
{% block javascripts %}
    <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
{% endblock %}
...

Дочерний шаблон:

{% extends 'base.html.twig' %}

{% block javascripts %}
    {{ parent() }}
    <script src="{{ asset('js/main.js') }}"></script>
{% endblock %}