У світі веброзробки існує багато фреймворків, але два з них особливо популярні: Laravel і Symfony. Laravel люблять за чистоту синтаксису та прискорену розробку, а Symfony сильний гнучкою архітектурою для складних додатків. Обидва PHP-фреймворки підтримують стандарти та найкращі практики веброзробки, такі, як PSR і SOLID. Для власників бізнесу, які прагнуть створити ефективний онлайн-проєкт для своєї компанії, вибір одного з них буде в будь-якому разі вдалим, але все ж таки існують важливі нюанси, що допоможуть вам зрозуміти, який із фреймворків — Laravel чи Symfony — більше підійде під потреби вашого бізнесу та сприятиме його успіху.
Коротко про Symfony
Symfony — це один із найстаріших PHP-фреймворків, який досі слугує основою для багатьох якісних PHP-проєктів. Створений у 2005 році, Symfony заснований на принципах модульності, повторного використання і розширюваності. Його основні компоненти можуть використовуватися як окремі бібліотеки або разом у вигляді єдиного фреймворку. Порівняно з Laravel, Symfony може здатися трохи складнішим через більшу кількість варіантів і налаштувань, але саме завдяки їм він дає змогу створювати складні та масштабовані застосунки.
Коротко про Laravel
Laravel — більш молодий, але дуже популярний фреймворк для створення вебдодатків на PHP, який базується на деяких компонентах Symfony. Створений у 2011 році, він відомий своїм чудовим синтаксисом, який робить створення якісних продуктів легшим. Laravel має безліч переваг, таких як зручний маршрутизатор URL, шаблонізатор Blade для інтерфейсів, ORM Eloquent для роботи з базою даних, система міграцій і вбудована безпека. Детально про Laravel ми розповіли статті.
Порівняння фреймворків Laravel і Symfony
Встановлення та налаштування
Основні файли сучасних PHP-фреймворків можна встановити за допомогою менеджера пакетів composer. Для Laravel ви можете використовувати команду "composer create-project --prefer-dist laravel/laravel project_name", а для Symfony — "composer create-project symfony/website-skeleton project_name". "Project_name" слід замінити ім'ям вашого проєкту, яке також буде використовуватися як ім'я директорії, де composer розмістить дані. Обидва фреймворки також надають свої інсталятори. Для 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-файлів, що відповідають за маршрутизацію, або, що дуже зручно, за допомогою анотацій:
namespace App\Controller;
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 може мати такий вигляд:
Schema::create('tests', function (Blueprint $table) {
$table->bigIncrements('id'); });
Клас Test матиме наступний вигляд:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Test extends Model
{
protected $table = 'tests';
}
Бачимо, що всі моделі в Laravel успадковують клас Model. У Symfony ж робота з міграціями здійснюється через Doctrine ORM. Тут ми можемо працювати тільки з PHP-класами та анотаціями. Отже, приклад коду для класу Test буде виглядати наступним чином:
namespace App\Entity;
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:
$tests = App\Test::where('id', '<', 100)
->orderBy('id', 'desc')
->take(10)
->get();
У Symfony часто використовуваний код подібного типу винесений в спеціальні класи — репозиторії. Тіло самого методу матиме наступний вигляд:
$tests = $this->createQueryBuilder('t')
->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:
Blade:
Що стосується front-endу, то Laravel також забезпечує підтримку Vue.js з коробки, що відкриває додаткові можливості. Проте, в сучасному web немає перешкод для використання будь-якого PHP back-end фреймворку в поєднанні з JavaScript front-end фреймворком, таким як React, Angular або Vue.js.
Висновок
У цій статті ми порівняли два популярних PHP-фреймворки: Laravel і Symfony. Неможливо виокремити лідера серед них, оскільки кожен має свої переваги і свій шлях розвитку. Обидва фреймворки дають змогу розширити базовий функціонал за допомогою пакетів composer і підходять як для простих невеликих сайтів, так і для високонавантажених вебпроєктів.
Якщо ваша головна мета — швидке розгортання, легкість підтримки та масштабування, то Laravel може бути ідеальним вибором для вашого бізнесу. Наша компанія спеціалізується на веброзробці на Laravel з 2017 року, забезпечуючи професійний підхід і успішну реалізацію проєктів будь-якої складності. Раді будемо допомогти!
Читайте також інші статті в нашому блозі
Готові розпочати? Зв'яжіться з нами!
Україна, Житомир
вул. Вітрука 9в
Пн – Пт 9.00 – 19.00
Poland, Warsaw, 00-842
Łucka street 15/204
Пн – Пт 9.00 – 19.00