Tìm hiểu về Symfony

Symfony

Symfony là gì?

Định nghĩa này thực sự cho thấy những ý tưởng chính, đằng sau việc tạo ra Symfony:

Symfony is a set of PHP Components, a Web Application framework, a Philosophy, and a Community — all working together in harmony.

Symfony là một PHP framework miễn phí để xây dựng ứng dụng web. Nhưng Symfony không được coi là một fullstack web framework như Laravel, Rails, ...(bao gồm mọi thứ như: Truy cập cơ sở dữ liệu hoặc công cụ Templating, có thể không cần thiết nếu xây dựng một API), mà nó là tập hợp nhiều thành phần (component) kết hợp hài hoà với nhau theo nhiều cách, để tạo thành một ứng dụng web hoàn chỉnh. Bạn có thể "create your own framework", đáp ứng nhu cầu riêng của bản thân hay những nhu cầu đặc biệt phức tạp của khách hàng. Đó là lý do Symfony được dùng làm nền tảng cho nhiều hệ thống, cũng chính là nguồn gốc của cái tên Symfony – Symphony (bản giao hưởng), với vô vàn các nhạc cụ cùng hòa thanh để tạo nên những giai điệu du dương.

Những điểm nổi bật

  • được module hoá nhờ vào các thành phần component phân tách, tinh giản tối đa để khởi động 1 dự án web cơ bản, lí tưởng cho cả micro-services (dù thực sự phiên bản chuẩn nhất của Symfony thích hợp với loại 1 khối monolith) hay APIs. Khả năng co dãn tùy biến khá cao, có thể mở rộng dễ dàng và tiện lợi.
  • Không bị ràng buộc với một hệ thống cơ sở dữ liệu cụ thể / ORM, công cụ tạo khuôn mẫu,...
  • Công cụ phát triển và debug: Framework này sở hữu riêng một panel hiện đại, có khả năng khái quát các vấn đề như: theo dõi các cuộc gọi ajax, truy vấn SQL, tốc độ render, ...
    web-interface
  • Tuy được viết bằng PHP – ngôn ngữ thiết kế phi chuẩn và lỏng lẻo… song Symfony luôn không ngừng tập trung vào việc cải thiện kinh nghiệm phát triển và hiệu suất, sử dụng các tính năng PHP mới nhất (PHP Benchmarks), và mang các quy tắc chuẩn hóa ra làm nguyên tắc hàng đầu của mình, như: PSR-2 (code styling), PSR-3 (Logger interface), PSR-4 (autoloader), PSR-6 (caching interface), PSR-11 (service container)...
  • clean code theo OOP Design Patterns như: Dependency Injection,... Các Design Patterns trong Symfony 2.
    symfony_design
  • cộng đồng đông đảo, tài liệu đầy đủ, các hệ sinh thái như API Platform. EasyAdminBundle hay Sylius.

Cài đặt ví dụ

  1. Điều đầu tiên cài đặt "symfony cli" bằng cách chạy lệnh:
    curl -sS https://get.symfony.com/cli/installer | bash
    Chúng ta cũng phải cài đặt composer và php 7. Để tìm hiểu cách cài đặt composer, hãy xem tại đây.

  2. Tạo một ứng dụng bằng cách chạy:
    symfony new --full symfony_project

  3. Sau đó để chạy trên môi trường development:
    cd symfony_project
    symfony server:start

  4. Nếu bạn mở http://127.0.0.1:8000/ trong trình duyệt web của mình, bạn sẽ thấy trang chào mừng của Symfony.
    Screen-Shot-2021-09-26-at-20.29.44
    P/S: bạn cũng có thể cài đặt Symfony bằng:
    composer create-project symfony/skeleton symfony_project

  5. Trong file .env chon DATABASE_URL ứng với CSDL của bạn.

  6. tạo Entity "Book":
    symfony console make:entity
    và trả lời các câu hỏi:

Book;
name;string;50;no;
isbn:string;50;no;
author;255;no;
year;integer;yes
category;string;30;no

Nhập enter để kết thúc quá trình tạo thực thể. Sau đó, sẽ tạo "src/Entity/Book.php", trông giống như sau:
Screen-Shot-2021-09-26-at-21.31.12
và "src/Repository/BookRepository.php" trông giống như sau:
Screen-Shot-2021-09-26-at-21.32.53

  1. Bước tiếp theo là tạo bảng tương ứng trong cơ sở dữ liệu, sử dụng Migrations:
    symfony console doctrine:migrations:diff
    Theo mặc định, Migrations sẽ được đặt trong thư mục "src/migrations", chạy:
    symfony console doctrine:migrations:migrate
    và giờ bạn đã có bảng Book trong CSDL.

  2. Giờ chúng ta sẽ tạo 1 số dữ liệu giả:
    symfony console doctrine:migrations:generate
    Mở tệp đã tạo và thay thế hàm "up" bằng các nội dung sau:

public function up(Schema $schema) : void
{
    // this up() migration is auto-generated, please modify it to your needs
    $this->addSql("INSERT INTO book ('name', 'isbn', 'author', 'year', 'category') VALUES ('Programming PHP', '0596006810', 'Rasmus Lerdorf,  Kevin Tatroe, Peter MacIntyre', 2006, 'Programming'), ('PHP Cookbook', '0596101015', 'Adam Trachtenberg,  David Sklar', 2006, 'Programming'), ('PHP Design Patterns', '0596101015', 'Aaron Saray', 2009, 'Programming')");
}
  1. Giờ chạy:
    symfony console doctrine:migrations:migrate
    và dữ liệu của bạn sẽ được tạo.

  2. Tạo CRUD:
    symfony console make:crud
    và trả lời các câu hỏi:

Book;
BookController;

sẽ thấy tạo các file sau:
Screen-Shot-2021-09-26-at-22.10.49
Truy cập vào "http://127.0.0.1:8000/book/", sẽ thấy như sau:
Screen-Shot-2021-09-26-at-22.14.28

  1. Giờ thì bạn có thể thêm validation vào các trường của "src/Form/BookType.php", thêm Security,... hoặc xem profiler ở bottom để debug.
    P/S: tham khảo thêm: https://symfony.com/doc/current/index.html

Một số best practices cho Symfony

  • Không tạo bundle để tổ chức ứng dụng:
    Trước đây, Symfony khuyến khích lập trình viên tổ chức ứng dụng thành các Bundle, tức là các khối code có chức năng chuyên biệt (modules), ví dụ như FrontendBundle cho phần Frontend của customer và client, BackendBundle cho admin và manager... Nhưng từ phiên bản Symfony 4 khuyến khích sử dụng namespace PHP để tổ chức code thay vì bundle.

  • Sử dụng YAML để cấu hình các services, Autowiring để tự động hoá quản lý các service trong container với cấu hình tối thiểu:
    Autowiring là một tính năng đọc giúp bạn không cần phải cấu hình các services một cách rõ ràng và đơn giản hóa việc bảo trì ứng dụng. Sử dụng nó kết hợp với tự động định cấu hình services như: Twig extensions, event subscribers, ...

  • Sử dụng Annotations để mapping với các Entity, cấu hình Routing trong Controller:
    Các comment trong Symfony có chuẩn và được đọc, gọi là Annotations.
    Trong các ứng dụng thông thường, ta sẽ khai báo 1 routing, mapping với 1 controller qua 1 URL. Nhưng trong Symfony ta có 1 cách khác: khai báo phần routing ngay comment của controller action. Bạn có thể cấu hình cả Locale, Caching, Security, ... ở annotations.

  • Sử dụng Form dưới dạng Class, xác định validation trong Form Class:
    Symfony khuyến khích tạo FormType Class cho phép sử dụng lại chúng trong các phần khác nhau của ứng dụng, giúp đơn giản hóa mã và bảo trì. Bên cạnh đó, việc gắn các validation vào các trường của Form Class thay vì object sẽ ngăn validation bị conflict trong các form khác hoặc những nơi khác mà object được sử dụng.

  • Tham khảo thêm: https://symfony.com/doc/current/best_practices.html

Tổng kết

Hi vọng bài viết cho bạn cái nhìn tổng quan về Symfony cũng như những lợi ích mà bạn có thể thấy được khi sử dụng framework này.