img
scroll
#

Ключові відмінності між Laravel і Symfony

Uk Ru En
Стаття
#0002
Ключові відмінності між Laravel і Symfony - зображення №2

В епоху існування великої кількості 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-фреймворків можна встановити за допомогою менеджера пакетів 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:

<!DOCTYPE html>
<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:

<!DOCTYPE html>
<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 з коробки, що відкриває додаткові можливості. Проте, в сучасному web не є неможливим використовувати будь-який PHP back-end фреймворк в поєднанні з JavaScript front-end фреймворком, таким як React, Angular або Vue.js.

Загальний висновок полягає в тому, що з двох великих фреймворків, Laravel і Symfony, неможливо виділити найкращий, але лише той, який краще підходить для конкретних потреб. Хоча вони мають різні стратегії створення веб-додатка, ні одну з реалізацій не можна назвати поганою. Обидва фреймворки дозволяють істотно розширити базовий функціонал для своїх потреб, а велика кількість пакетів, які встановлюються за допомогою composer, допомагають у цьому. Як Laravel, так і Symfony можна використовувати як для невеликих сайтів, так і для highload в тому числі завдяки вбудованим системам кешування і високій продуктивності. Кожен з них потенційно добре розширюваний, тому після того, як ви вибрали фреймворк для нового проекту, подальший розвиток залежить тільки від вас.

Також ми хочемо нагадати, що наша компанія надає послуги з веб-розробки на основі обох фреймворків. Ми працюємо з 2017 року і за цей час набули значного досвіду та маємо широкий вибір готових рішень. Будемо раді допомогти вам реалізувати будь-які проєкти для вашого бізнесу.


Блог
#0002

Статті, які можуть вас також зацікавити

Що таке верстка сайту простими словами?
У цій статті ми розглянемо поняття верстки, її складові, а також її важливість та невід'ємну роль у веб-індустрії.
CMS або фреймворк - що вибрати?
CMS або фреймворк - що вибрати?
У наш час, коли технології все більше та більше проникають у наше повсякденне життя, актуальність питання "фреймворк чи CMS?" стає все більш очевидною.
Як підключити API Paypal?
Як підключити API Paypal?
PayPal - це один з найбільш інноваційних і популярних платіжних сервісів, який змінив уявлення про фінансові транзакції в інтернеті.
Що таке вебдодатки та як вони функціонують?
Є декілька думок з приводу вебдодатків – деякі вважають, що це всі сайти, а деякі, що до них відносяться лише ті, що дозволяють користувачам взаємодіяти з інтерфейсом та даними.
Зв'яжіться з нами
#0013

Готові розпочати? Повідомте нас про це!

Телефон:
+38 (096) 880 99 00
Адреса:

Україна, Житомир
вул. Вітрука 9в

Графік:

Пн-Пт 9.00 - 19.00

Телефон:
+48 570 337 815
Адреса:

Poland, Warsaw, 00-842
Łucka street 15/204

Графік:

Пн-Пт 9.00 - 19.00

Зв'яжіться з нами
#0000

Залишилися запитання?

Будь ласка, заповніть наведену нижче форму, і наші спеціалісти зв'яжуться з вами якнайшвидше!
Обов'язкове поле
Обов'язкове поле
Обов'язкове поле
Обов'язкове поле