

В эпоху существования большого количества PHP-фреймворков перед разработчиком часто возникает вопрос: какой вариант выбрать для реализации своего проекта? Многие уже сделали свой выбор и нашли наиболее удобную для себя программную среду, но некоторым трудно найти ответ. Давайте рассмотрим и сравним некоторые функциональные возможности двух популярных фреймворков - Symfony и Laravel.
Коротко о Laravel
Laravel - это популярный фреймворк для разработки веб-приложений на PHP. Одной из особенностей Laravel является его прекрасный синтаксис, который позволяет разработчикам легко создавать высококачественные продукты. Он базируется на некоторых компонентах Symfony, используя их в качестве основы. Этот фреймворк имеет много преимуществ, таких как удобный маршрутизатор для легкой обработки URL-запросов, система шаблонов (Blade) для создания чистых интерфейсов, Eloquent ORM для простой работы с базой данных, система миграций для управления базой данных и встроенная безопасность, которая защищает ваше приложение от потенциальных угроз. Подробно о Laravel мы рассказали в статье.
Коротко о Symfony
Symfony является одним из самых старых PHP-фреймворков. Впервые выпущен в 2005 году, он стал основой для многих высококачественных PHP-проектов. Symfony был разработан французской компанией SensioLabs и основан на принципах модульности, повторного использования и расширяемости. Основные компоненты Symfony можно использовать как отдельные библиотеки или пользоваться всем фреймворком. По сравнению с Laravel, Symfony может показаться немного сложнее, так как предоставляет больше вариантов и настроек.
Сравнение фреймворков Laravel и Symfony
Установка и настройка
Основные файлы современных PHP-фреймворков можно установить с помощью менеджера пакетов сomposer. Для установки Laravel вы можете использовать команду "composer create-project --prefer-dist laravel/laravel project_name", а для Symfony - "composer create-project symfony/website-skeleton project_name". Вместо "project_name" следует указать имя вашего проекта, которое также будет использоваться в качестве имени директории, где сomposer разместит данные. Оба фреймворка также предоставляют свои инсталляторы. Для Laravel это "laravel new project_name", а для Symfony - "symfony new project_name". Чтобы установить эти инсталляторы, вы можете выполнить одну команду: "composer global require laravel/installer" для Laravel и "wget https://get.symfony.com/cli/installer
-O - | bash" для Symfony. Таким образом, процесс установки базового функционала сводится к минимуму и не требует большого вмешательства разработчика, что экономит время при старте новых проектов.
Оба фреймворка тепер поддерживают файл .env для конфигурации, в котором хранятся пары ключ-значение. Однак, в дополнение к этому, Symfony также поддерживает файлы yaml для настройки маршрутизации, сервисов и других параметров. Формат yaml очень удобен в использовании и позволяет указывать значения параметров конфигурации в виде многомерного массива.
Маршрутизация
Список маршрутов приложения и привязка к контроллерам могут быть определены по-разному в обоих фреймворках. Например, чтобы указать в Laravel, что маршрут "/test" должен обрабатываться методом test контроллера TestController, в файле маршрутизации routes/api.php необходимо указать: Route:get('/test', 'TestController@test')->name('test_name').
Для Symfony то же самое можно сделать с помощью файлов yaml, отвечающих за маршрутизацию, или, что очень удобно, с помощью аннотаций:
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class TestController {
/**
* @Route("/test", name="test_name")
*/
public function test() {
return new Response('Some test text');
}
}
Использование контроллеров имеет множество преимуществ. Например, в пути маршрута "/test" можно задать динамические параметры, такие как "/test/{id}". При этом в сигнатуре контроллера нужно указать параметр $id, и его значение будет автоматически извлечено из пути. Также, динамическим параметрам можно задать формат с помощью регулярных выражений, например, чтобы $id было только целым числом. Оба фреймворка имеют функциональные возможности для объединения маршрутов в группы и присвоения им префиксов, также можно устанавливать HTTP-методы, по которым будут доступны эти маршруты. Кроме того, оба фреймворка предоставляют удобную поддержку для работы с GET- и POST-параметрами.
Миграции и ORM
Обе системы предлагают удобный набор консольных команд для работы с миграциями проекта, но ключевое отличие между Laravel и Symfony заключается именно в подходе к работе с ними. В Laravel мы сами должны создавать миграции и следить за синхронизацией структуры базы данных и PHP-классов. Например, код миграции в Laravel может выглядеть так:
$table->bigIncrements('id');
});
Класс Test будет иметь следующий вид:
use Illuminate\Database\Eloquent\Model;
class Test extends Model
{
protected $table = 'tests';
}
Мы видим, что все модели в Laravel наследуют класс Model. В Symfony же работа с миграциями осуществляется через Doctrine ORM. Здесь мы можем работать только с PHP-классами и аннотациями. Таким образом, пример кода для класса Test будет выглядеть следующим образом:
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
*/
class Test
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
}
После создания сущности Test мы можем запустить создание миграции, где Symfony сама создаст выполняемый SQL-код для создания таблицы "tests" с колонкой "id". Более того, нам не нужно так внимательно следить за синхронизацией структуры базы данных и PHP-классов, так как при создании миграций фреймворк сравнивает текущую структуру базы данных с ожидаемой на основе текущих PHP-классов и создает весь необходимый SQL. Стоит отметить, что для выборок из базы данных в обоих фреймворках предусмотрены ORM. В Laravel за это отвечает Eloquent. Таким образом, например, приведенный ниже код позволяет получить коллекцию объектов класса Test:
->orderBy('id', 'desc')
->take(10)
->get();
В Symfony часто используется код подобного типа, вынесенный в специальные классы - репозитории. Тело самого метода будет иметь следующий вид:
->where('t.id < :id')
->setParameter('id', 100)
->orderBy('t.id', 'DESC')
->setMaxResults(10)
->getQuery()
->execute();
В этом случае будет возвращен массив объектов класса Test, и за это будет ответственна Doctrine ORM. Как для Eloquent, так и для Doctrine характерно использование шаблона проектирования Fluent Interface, что можно увидеть из названий методов, таких как "where", "orderBy" и другие.
Шаблонизаторы
Symfony работает с Twig, в то время как Laravel использует Blade. Их функционал очень схож, но синтаксис немного отличается. Оба шаблонизатора поддерживают переопределение блоков, наследование файлов, циклы и многое другое. Если вы знакомы с одним из шаблонизаторов, то с другим разберетесь без особых проблем. Отличия станут видны на примерах кода.
Twig:
<html>
<head>
<meta charset="UTF-8">
<title>{% block title %}Test Application{% endblock %}</title>
</head>
<body>
<div id="sidebar">
{% block sidebar %}
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog">Blog</a></li>
</ul>
{% endblock %}
</div>
<div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>
Blade:
<html>
<head>
<meta charset="UTF-8">
<title>@yield('title')</title>
</head>
<body>
<div id="sidebar">
@section('sidebar')
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog">Blog</a></li>
</ul>
@show
</div>
<div id="content">
@yield('content')
</div>
</body>
</html>
Что касается front-end'а, то Laravel также предоставляет поддержку Vue.js из коробки, что открывает дополнительные возможности. Однако, в современном вебе не является невозможным использовать любой PHP back-end фреймворк в сочетании с JavaScript front-end фреймворком, таким как React, Angular или Vue.js.
Общий вывод заключается в том, что из двух больших фреймворков, Laravel и Symfony, невозможно выделить лучший, а только тот, который лучше подходит для конкретных потребностей. Несмотря на то, что они имеют разные стратегии создания веб-приложений, ни одну из реализаций нельзя назвать плохой. Оба фреймворка позволяют значительно расширить базовый функционал для своих нужд, а большое количество пакетов, которые устанавливаются с помощью composer, помогает в этом. Как Laravel, так и Symfony можно использовать как для небольших сайтов, так и для highload, в том числе благодаря встроенным системам кеширования и высокой производительности. Каждый из них потенциально хорошо расширяемый, поэтому после того, как вы выбрали фреймворк для нового проекта, дальнейшее развитие зависит только от вас.
Также мы хотим напомнить, что наша компания предоставляет услуги по веб-разработке
на основе обоих фреймворков. Мы работаем с 2017 года и за это время накопили значительный опыт и имеем широкий выбор готовых решений. Будем рады помочь вам реализовать любые проекты для вашего бизнеса.
Статьи, которые могут вас также заинтересовать

Готовы Начать? Дайте нам знать!
Poland, Warsaw, 00-842
Łucka street 15/204
Пн-Пт 9.00 - 19.00