Thứ ba, 03/09/2013 | 00:00 GMT+7

Cách sử dụng Symfony2 để thực hiện các hoạt động CRUD trên VPS (Phần 1)


Về Symfony

Symfony là một khung công tác phát triển web PHP open-souce - một bộ công cụ và phương pháp giúp bạn xây dựng các ứng dụng tuyệt vời. Một số đặc điểm của khuôn khổ này là tốc độ, tính linh hoạt, khả năng mở rộng và tính ổn định. Bạn có thể sử dụng nó cho một ứng dụng web hoàn chỉnh mà còn cho các chức năng nhỏ hơn cần thiết cho dự án của bạn.

Trong hướng dẫn trước , ta đã biết cách cài đặt Symfony2 Standard Distribution và cấu hình nó hoạt động trên VPS của bạn. Trong phần này và phần hướng dẫn tiếp theo, ta sẽ tạo một ứng dụng Symfony nhỏ thực hiện một số thao tác CRUD (tạo, đọc, cập nhật, xóa) cơ bản trên mô hình dữ liệu của ta . Hướng dẫn này giả định bạn đã làm theo các bước từ bài viết trước và bạn có thể tiếp tục từ nơi nó đã dừng lại.

Dữ liệu ta sẽ làm việc với các trang tin tức . Ta sẽ tạo một thực thể (đóng role là mô hình dữ liệu của ta cho các trang tin tức) và học cách đọc và hiển thị nó. Trong phần tiếp theo, ta sẽ học cách thực hiện các thao tác khác, cụ thể là thêm, cập nhật và xóa các trang tin tức. Nhưng trước tiên, ta cần tạo một gói.

Một gói trong Symfony là một folder nơi bạn lưu giữ tất cả các file cần thiết cho một chức năng cụ thể trong ứng dụng của bạn . Điều này bao gồm các file PHP, bảng định kiểu, file javascript, v.v. Trong ứng dụng của ta , ta sẽ chỉ tạo một gói chịu trách nhiệm cho mọi thứ liên quan đến các trang tin tức. Nếu ta cũng muốn có một blog, ta có thể tạo một group cụ thể chịu trách nhiệm về điều đó.

Điều thú vị về các gói là chúng cũng hoạt động giống như các plugin (ngay cả chức năng cốt lõi của Symfony cũng được sắp xếp trong các gói). Điều này nghĩa là bạn có thể tự tạo các gói mới sẽ chứa tất cả mã cho một tính năng cụ thể hoặc bạn có thể đăng ký một gói bên ngoài do người khác tạo. Vì vậy, trước khi bắt đầu xử lý dữ liệu của ta , hãy tạo một gói trống trong dòng lệnh vì Symfony Standard Distribution cung cấp cơ sở gọn gàng này. Điều này nghĩa là bạn không cần phải tạo tất cả các folder và đăng ký gói với Symfony theo cách thủ công - tất cả điều này sẽ được thực hiện tự động.

Vì vậy, để tự động tạo một gói, hãy chuyển đến folder chính của ứng dụng của bạn, trong trường hợp của ta là Symfony:

cd /var/www/Symfony

Chạy lệnh sau để tạo một gói mới có tên, NewsBundle:

php app/console generate:bundle --namespace=Foo/NewsBundle --format=yml

Làm theo hướng dẫn trên màn hình và chấp nhận các tùy chọn mặc định. Lệnh này sẽ tạo một gói có tên NewsBundle thuộc về nhà cung cấp Foo . Bạn có thể chọn bất kỳ cách đặt tên nhà cung cấp nào bạn muốn (điều này đại diện cho bạn về cơ bản) nhưng bạn cần đảm bảo tên gói kết thúc bằng từ Bundle . Ngoài ra, lệnh chỉ định định dạng cấu hình cho gói trong các file YAML.

Trong nền, cấu trúc folder cho gói của bạn được tạo (tại src / Foo / NewsBundle ) và gói được đăng ký với phần còn lại của ứng dụng.

Thực thể

Nếu bạn đã làm theo tất cả các bước trong hướng dẫn trước, kết nối database của bạn đã được cấu hình . Nếu không, bạn có thể chỉnh sửa file thông số.yml:

nano /var/www/Symfony/app/config/parameters.yml

Và ở đó, bạn có thể chỉ định thông tin database của bạn . Nếu bạn đã tạo database , bạn có thể bỏ qua bước tiếp theo. Tuy nhiên, bạn có thể cho phép Symfony tự động tạo database trùng với thông tin trong file này bằng lệnh sau:

php app/console doctrine:database:create

Bây giờ, để làm việc với mô hình dữ liệu của ta (trang tin tức), ta cần tạo một thứ gọi là Thực thể. Về cơ bản, đây là một lớp PHP định nghĩa tất cả thông tin về các trang tin tức của ta . Symfony có một công cụ dòng lệnh tiện lợi mà ta sẽ sử dụng và một công cụ tuyệt vời khác để tạo các bảng database thực tế phù hợp với mô hình dữ liệu này.

Vì vậy, hãy chạy lệnh sau từ dòng lệnh để tạo thực thể có tên là Tin tức:

php app/console doctrine:generate:entity

Làm theo hướng dẫn trên màn hình. Điều đầu tiên bạn cần chỉ định là tên, mặc dù là tên phím tắt. Đối với ta , nó sẽ là FooNewsBundle: News (tên thực thể nằm sau dấu hai chấm nhưng bạn cần chỉ định cả gói mà nó thuộc về). Tiếp theo, để quản lý cấu hình, hãy tiếp tục và chọn yml .

Sau đó, bạn sẽ thêm các thuộc tính lớp (sẽ trùng với các cột của bảng) cho mô hình dữ liệu của ta . Hãy thêm tiêu đề (chuỗi, 255), nội dung (văn bản) và ngày tạo (ngày giờ). Tiếp theo, không cần repository nên hãy chọn không và sau đó xác nhận việc tạo. Thực thể hiện đã được tạo.

Nếu bạn muốn xem nó trông như thế nào, bạn có thể khám phá file lớp thực thể mới được tạo:

nano /var/www/Symfony/src/Foo/NewsBundle/Entity/News.php

Tiếp theo, hãy để Symfony tạo bảng database sẽ lưu trữ các trang tin tức của ta dựa trên thực thể mới được tạo này. Chạy lệnh sau:

php app/console doctrine:schema:update --force

Lệnh này sẽ lấy thông tin từ thực thể và tạo bảng dựa trên đó. Bạn sẽ nhận được một xác nhận đơn giản: "Đã cập nhật schemas database thành công!" 1 "truy vấn đã được thực thi " . Bây giờ, nếu bạn nhìn vào database , bạn sẽ thấy một bảng có tên là Tin tức với 4 cột (id, title, body và create_date) tất cả phù hợp với một thuộc tính trong lớp thực thể Tin tức .

Đọc dữ liệu

Vì database của ta trống, hãy sử dụng phpmyadmin hoặc dòng lệnh để chèn 2 hàng kiểm tra mà ta có thể đọc bằng ứng dụng Symfony mới của ta . Sau đó, ta sẽ xem cách sử dụng ứng dụng để thêm nội dung mới nhưng hiện tại, bạn có thể chạy các lệnh sau trong terminal mysql để thêm 2 hàng:

use symfony;
INSERT INTO News (title,body,created_date)
    VALUES ('News title 1', 'Some body text', NOW());
INSERT INTO News (title,body,created_date)
    VALUES ('News title 2', 'Another body text', NOW());

Bây giờ ta có một số nội dung giả, hãy tạo một lộ trình để ánh xạ yêu cầu của user đối với một trang tin cụ thể tới Bộ điều khiển Symfony.

Tệp định tuyến chính trong ứng dụng của bạn được tìm thấy trong folder ứng dụng / cấu hình nhưng bạn cũng có thể xác định các luật định tuyến cụ thể cho gói của bạn trong file routing.yml nằm trong cấu trúc folder gói:

nano /var/www/Symfony/src/Foo/NewsBundle/Resources/config/routing.yml

Hãy xóa luật đã có và thêm một luật khác thay thế:

foo_news_show:
    pattern:  /news/{id}
    defaults: { _controller: FooNewsBundle:Default:show }

Tên của luật này là foo_news_show và nó sẽ được kích hoạt khi trình duyệt yêu cầu www.example.com/Symfony/web/ app_dev.php / news / {id} , {id} là ký tự đại diện cho một ID được chuyển động của yêu cầu trang tin tức. Theo mặc định , ta chỉ định Bộ điều khiển và phương thức nào sẽ được gọi. Trong trường hợp này, nó sẽ là DefaultController được tìm thấy trong file DefaultController.php và phương thức showAction bên trong nó (bây giờ ta sẽ phải tạo).

Ta đã chỉ định ở đây DefaultController vì file của nó đã có ở đó, được tạo tự động bởi Symfony khi ta tạo gói. Vì vậy, ta cũng có thể sử dụng nó. Những gì ta phải làm bây giờ là tạo phương thức sẽ sử dụng lớp thực thể Tin tức và thư viện database Doctrine để yêu cầu trang tin tức và sau đó chuyển nó trong một biến vào file mẫu Twig. Vì vậy, hãy chỉnh sửa file DefaultController.php :

nano /var/www/Symfony/src/Foo/NewsBundle/Controller/DefaultController.php

Trong file này, bạn sẽ thấy phương thức indexAction () đã được xác định. Bên dưới nó, hãy khai báo phương thức showAction () :

public function showAction($id) {
      $news = $this->getDoctrine()
            ->getRepository('FooNewsBundle:News')
            ->find($id);
      if (!$news) {
        throw $this->createNotFoundException('No news found by id ' . $id);
      }
    
      $build['news_item'] = $news;
      return $this->render('FooNewsBundle:Default:news_show.html.twig', $build);
    }

Hàm này sử dụng Doctrine để truy xuất thực thể tin tức với ID đã được truyền (ném một ngoại lệ nếu không tìm thấy tin tức) và chuyển đối tượng tin tức cùng với file mẫu news_show.html.twig mà ta phải tạo tiếp theo. Mã này khá đơn giản. Vì vậy, ta hãy làm điều đó.

Các khung nhìn được tìm thấy trong gói bên dưới folder Tài nguyên / chế độ xem bên trong một folder khác được đặt tên theo Bộ điều khiển sử dụng chúng - trong trường hợp của ta là Mặc định . Vì vậy, hãy tạo một file mới có tên news_show.html.twig :

nano /var/www/Symfony/src/Foo/NewsBundle/Resources/views/Default/news_show.html.twig

Và dán mã mẫu sau:

{{ news_item.Title }}
{{ news_item.Body }}

<h1>{{ news_item.Title }}</h1>
{{ news_item.Body }}

Đây là một file html với ngôn ngữ tạo khuôn mẫu Twig. Ta sẽ không đi vào chi tiết ở đây về Twig trong Symfony vì vậy hãy thoải mái đọc thêm về nó ở đây . Bây giờ, nếu bạn trỏ trình duyệt của bạn đến www.example.com/Symfony/web/ app_dev.php / news / 1, bạn sẽ thấy tin tức với ID 1.

Bây giờ ta hãy tạo một danh sách tất cả các trang tin tức bằng cách tạo một luật định tuyến khác và phương pháp Controller. Mở cùng một file routing.yml mà bạn đã chỉnh sửa trước đó:

nano /var/www/Symfony/src/Foo/NewsBundle/Resources/config/routing.yml

Và thêm những thứ sau:

foo_news_home:
    pattern:  /news/
    defaults: { _controller: FooNewsBundle:Default:index }

Tuyến đường này sẽ kích hoạt phương thức indexAction () của DefaultController, vì vậy ta hãy chỉnh sửa nó (nếu bạn nhớ nó đã có trong file Controller nên ta chỉ cần sửa đổi nó):

nano /var/www/Symfony/src/Foo/NewsBundle/Controller/DefaultController.php

Loại bỏ đối số được chỉ định ở đó theo mặc định ( $ name ) và mã bên trong chính phương thức. Thay vào đó, hãy dán những thứ sau:

$news = $this->getDoctrine()
            ->getRepository('FooNewsBundle:News')
            ->findAll();
      if (!$news) {
        throw $this->createNotFoundException('No news found');
      }
    
      $build['news'] = $news;
      return $this->render('FooNewsBundle:Default:news_show_all.html.twig', $build);

Tương tự như phương pháp ta đã tạo trước đây, phương pháp này sẽ tìm tất cả tin tức trong bảng và chuyển chúng vào file mẫu news_show_all.html.twig . Vì vậy, hãy tạo file này trong cùng folder với file ta đã tạo trước đó:

nano /var/www/Symfony/src/Foo/NewsBundle/Resources/views/Default/news_show_all.html.twig

Và lặp qua mảng đối tượng $ news để hiển thị tất cả các tiêu đề tin tức:

{% for new in news %}

<h3>{{ new.Title }}</h3>

{% endfor %}

Bây giờ, nếu bạn truy cập www.example.com/Symfony/web/ app_dev.php / news /, bạn sẽ thấy 2 tiêu đề tin tức mà ta đã thêm vào bảng theo cách thủ công. Hãy cũng sử dụng hệ thống định tuyến Symfony để thêm các liên kết xung quanh các tiêu đề này sẽ dẫn đến các trang tương ứng mà ta đã tạo trước đó. Vì vậy, thay thế những điều sau:

<h3>{{ new.Title }}</h3>

Với cái này:

<h3><a href="{{ path('foo_news_show', {'id':  new.Id  }) }}">{{ new.Title }}</a></h3>

Đây là một cách tiện dụng để tạo liên kết bên trong mẫu Twig. Về cơ bản, bạn chỉ định tuyến đường nào sẽ sử dụng và giá trị của ký tự đại diện mà tuyến đường mong đợi - trong trường hợp này là ID được tìm thấy trong đối tượng tin tức. Bây giờ nếu bạn làm mới trang, các tiêu đề sẽ chuyển thành liên kết đến các trang tương ứng của chúng.

Kết luận

Trong hướng dẫn này, ta đã biết các gói Symfony là gì và cách tạo chúng. Ta cũng đã bắt đầu ứng dụng nhỏ cần tương tác với các trang tin tức của ta trong database . Đối với điều này, ta đã xác định một lớp Thực thể phù hợp với cấu trúc bảng và ta đã sử dụng Doctrine để truy cập thông tin và điền các đối tượng thực thể. Ngoài ra, ta cũng đã sử dụng hệ thống định tuyến Symfony để kết nối yêu cầu trình duyệt với các phương thức Bộ điều khiển PHP, sau đó yêu cầu dữ liệu và hiển thị lại cho trình duyệt trong mẫu Twig.

Trong hướng dẫn tiếp theo và cuối cùng, ta sẽ xem xét việc tạo, cập nhật và xóa các trang tin tức.

Bài viết gửi bởi: Danny

Tags:

Các tin liên quan