Tìm Hiểu Chung Về Symfony
I. Tìm hiểu chung . 1. Symfony là gì ? Symfony là một framework Open Source viết bằng ngôn ngữ lập trình PHP5. Symfony giúp phát triển ứng dụng web thiết kế theo yêu cầu. Một cộng đồng rộng lớn các lập trình viên đảm bảo về khả năng phát triển, tính linh động, tự do và tiết kiệm chi phí ...
I. Tìm hiểu chung .
1. Symfony là gì ?
Symfony là một framework Open Source viết bằng ngôn ngữ lập trình PHP5. Symfony giúp phát triển ứng dụng web thiết kế theo yêu cầu. Một cộng đồng rộng lớn các lập trình viên đảm bảo về khả năng phát triển, tính linh động, tự do và tiết kiệm chi phí cho các dự án được phát triển với Symfony, đây cũng là những đặc tính mà Sutunam luôn chú trọng đưa vào các giải pháp Open Source của mình. Trên hết, cùng với Drupal, phpBB và ezPublish, Symfony2 hiện đang là một trong những phiên bản hệ thống quản trị nội dung (CMS) mới nhất được viết bằng PHP. Symfony giúp khách hàng đạt được những mục tiêu như: Một mã nguồn linh hoạt, dễ dàng nâng cấp bảo trì Tối ưu hóa hiệu quả hiệu suất công việc (tương hợp Varnish, HTTP accelerator) Kiểm soát bảo mật hoàn hảo (chứng thực điện tử, eBanking) Tự do sáng tạo, tích hợp ứng dụng và module…
2. Đối tượng có thể sử dụng symfony:
Symfony là một giải pháp lý tưởng giúp khai thác tiềm năng của PHP: hiện nay, gần 80 % các website được lập trình bằng PHP và công nghệ này đang được nhiều công ty lớn như Facebook hay Wikipedia rất ưa chuộng. Nhờ hai ưu điểm: cộng đồng sử dụng rộng rãi và cấu trúc đáng tin cậy, Symfony là một giải pháp đặc biệt thích hợp đối với những doanh nghiệp triển khai hoặc duy trì các dự án có quy mô vừa hoặc lớn với thời hạn dài hoặc trung bình. Với các dự án phát triển bằng framework Symfony, Sutunam đảm bảo mang đến cho khách hàng những dự án đáng tin cậy, hiệu quả và luôn luôn đổi mới, điều này đặc biệt phù hợp với các trang web có traffic cao. Đó cũng chính là lý do những công ty tin học hàng đầu như TF1, M6WEB… đều lựa chọn Symfony.
3. Cấu trúc project của symfony :
Cũng giống như đại đa số các framework php khác Symfony tổ chức code theo mô hình MVC design pattern. Pattern này chia code thành ba tầng: Model bao gồm business logic (database nằm ở tầng này). Bạn đã thấy rằng symfony chứa tất cả các class và file liên quan đến Model trong thư mục lib/model. View là những gì tương tác với người dùng (template engine là một phần của tầng này). Trong symfony, tầng View được tạo bởi PHP templates. Các file này nằm trong các thư mục templates khác nhau mà chúng ta sẽ thấy ở các phần sau trong ngày hôm nay. Controller thực hiện việc lấy dữ liệu từ Model và chuyển cho View để hiển thị ở client. Khi chúng ta cài symfony trong ngày đầu tiên, chúng ta đã thấy rằng mọi yêu cầu được điều khiển bởi file front controllers (index.php và frontend_dev.php). Những file front controllers này sẽ tìm actions tương ứng để thực hiện yêu cầu đó. Như chúng ta thấy hôm qua, các action được nhóm lại trong module.
II. Một Số thành phần , cấu trúc cần biết khi làm việc với symfony
- Schema**
Symfony là một framework hướng đối tượng, chúng ta muốn thao tác với đối tượng bất cứ khi nào có thể. Ví dụ, thay vì viết câu lệnh SQL để nhận một bản ghi từ cơ sở dữ liệu, ta muốn sử dụng objects. Thông tin về relational database phải được chuyển thành một object model. Điều đó có thể thực hiện với một ORM tool, symfony cung cấp sẵn 2 công cụ: Propel và Doctrine. Trong bài viết này, chúng ta sẽ sử dụng Doctrine. ORM cần thông tin mô tả các bảng và quan hệ giữa chúng để tạo class tương ứng. Có hai cách để tạo một schema mô tả: từ một cơ sở dữ liệu có sẵn hoặc tự tạo nó. Ở đây chúng ta sẽ tự tạo một ví dụ về cơ sở dữ liệu: file config/doctrine/schema.yml :
File schema.yml chứa thông tin về tất cả các bảng và cột tương ứng. Mỗi cột được mô tả bao gồm:
type: kiểu dữ liệu của cột (boolean, integer, float, decimal, string, array, object,blob, clob, timestamp, time, date, enum, gzip) notnull: true nếu cột đó là bắt buộc unique: true nếu bạn muốn tạo một unique index cho cột. Ngoài ra trong file này ta còn có thể nêu ra mối quan hệ giữa các object với nhau :
Như ví dụ trên đối tượng BetyoloBet có mối quan hệ với rất nhiều đối tượn như BetyoloSide hay BetyoloCategory.
2. ORM
Nhờ những mô tả về cơ sở dữ liệu trong file schema.yml , chúng ta có thể sử dụng của Doctrine để sinh các câu SQL cần thiết để tạo các bảng trong cơ sở dữ liệu: Để tạo câu SQL, trước tiên bạn cầu build model từ file schema.
Sau khi đã có model, bạn có thể tạo và insert SQL.
Để tạo các bảng trong cơ sở dữ liệu, chúng ta chạy lệnh doctrine:insert-sql:
Như vậy chỉ bằng các bước đơn giản với symfony framework chúng ta đã có thể tạo dựng đc CSDL với các đối tượng và đầy đủ các mỗi quan hệ giữa các đối tượng đó .
3. Routing
Nếu bạn click xem một công việc từ một trang, URL có thể sẽ có kiểu như: /job/show/id/1. Nếu bạn đã từng phát triển một website bằng PHP, có lẽ bạn sẽ quen với URLs kiểu /job.php?id=1 (job ở đây là ví dụ về một object). Symfony xử lý URLs như thế nào? Làm thế nào để symfony biết được action nào được gọi dựa trên URL? Tại sao request->getParameter('id') trả về id của đối tượng job ? Nhưng trước tiên, chúng ta hãy nói về URLs. Trong một web context, mỗi URL xác định duy nhất một web resource. Khi bạn truy cập một URL, bạn yêu cầu trình duyệt lấy resource xác định bởi URL đó. Do URL là giao diện tương tác giữa website và người dùng, nên nó cần chứa một vài thông tin hữu ích về resource mà nó tham chiếu đến. Nhưng URLs "truyền thống" không thực sự mô tả resource, nó phơi bày ra cấu trúc bên trong của ứng dụng. Người dùng không quan tâm đến việc website được phát triển bằng ngôn ngữ nào và dữ liệu được chứa trong cơ sở dữ liệu ra sao.Việc lộ rõ cấu trúc bên trong còn tạo ra các vấn đề về bảo mật: người dùng có thể đoán được URL của các resources mà anh ta không được phép truy cập? Tất nhiên, lập trình viên phải bảo mật cho những khu vực này, nhưng tốt nhất là hãy ẩn đi các thông tin nhạy cảm. URLs trong symfony quan trọng đến mức chúng ta có một framework riêng để quản lý chúng:routing framework. Routing quản lý internal URIs và external URLs. Khi có một request đến, routing phân tích URL và chuyển thành internal URI. **Cấu hình Routing** Sự tương ứng giữa internal URIs và external URLs được ghi trong file routing.yml: File routing.yml chứa thông tin về các route. Một route bao gồm tên (homepage), pattern (/:module/:action/*), và một vài tham số (nằm sau từ khóa param). Khi có một request, routing sẽ so sánh URL với các pattern đã có. Route tìm thấy đầu tiên sẽ được sử dụng, do đó thứ tự trong routing.yml rất quan trọng. Chúng ta sẽ xem xét vài ví dụ để hiểu rõ hơn cách hoạt động của nó. Khi bạn request trang chủ, có URL là /job , route đầu tiên phù hợp là default_index. Trong một pattern, chuỗi nằm sau dấu hai chấm (:) là một biến, vì thế pattern /:module có nghĩa là: /theo sau là một chuỗi nào đó. Trong ví dụ của chúng ta, biến module có giá trị là job. Giá trị này có thể nhận bằng cách request->getParameter('module'). Route này cũng xác định sẵn một giá trị mặc định cho biến action. Vì thế, với mọi URLs tương ứng với route này, tham số actionluôn có giá trị là index. Nếu bạn request trang /job/show/id/1, symfony sẽ match với pattern cuối cùng:/:module/:action/. Ở pattern này, dấu () tương ứng với tập các cặp biến/giá trị cách nhau bởi dấu (/): Requirements Trong ngày đầu tiên, chúng ta đã nói về validation và error handling. Hệ thống routing có sẵn tính năng validation. Mỗi biến trong pattern được validate bởi một regular expression xác định trong mục requirements của route . Route Class Mỗi route xác định trong file routing.yml được chuyển đổi thành một object của lớp sfRoute. Có thể đổi lớp này bằng lớp khác xác định trong mục class của route. Ta đã biết rằng giao thức HTTP có vài "methods": GET, POST, HEAD, DELETE, và PUT. 3 method đầu được hỗ trợ bởi tất cả các trình duyệt, trong khi 2 method sau thì không. Để route chỉ match với một loại request methods nào đó, bạn có thể đổi route class thànhsfRequestRoute và thêm một giá trị cho biến sf_method trong requirements: file apps/frontend/routing.yml:
Object Route Class Mỗi internal URI cho một job thật là dài và bất tiện khi viết, nhưng như chúng ta đã biết ở phần trước, có thể thay đổi route class. Với job route, ta nên dùng lớp sfDoctrineRoute để mô tả các Doctrine objects và collections of Doctrine objects: Ở đây, option model xác định lớp Doctrine model (JobeetJob) liên quan đến route, và optiontype cho biết route này liên quan đến 1 object (bạn có thể dùng list nếu route mô tả tập các objects).