Phần 1 - Cài đặt, model và CRUD trong Symfony 2

1  Tải về và cài đặt

Tải về “Symfony Standard” tại http://symfony.com/download
Giải nén → đổi tên thư mục Symfony thành sfdemo, sao chép vào thư mục “/var/www”
Mở tập tin “/etc/hosts”, thêm vào “127.0.0.1 sfdemo.t”
Tạo tập tin “/etc/apache2/sites-available/sfdemo.t” với nội dung như sau:

<VirtualHost *:80>
    ServerName sfdemo.t
    DocumentRoot /var/www/sfdemo/web
    DirectoryIndex app.php
    ErrorLog /var/www/logs/sfdemo-error.log
    CustomLog /var/www/logs/sfdemo-access.log combined
    <Directory "/var/www/sfdemo/web">
        AllowOverride All
        Allow from All
    </Directory>
</VirtualHost>

Chạy dòng lệnh:
sudo a2ensite sfdemo.t
sudo /etc/init.d/apache2 reload
Mở trình duyệt web với địa chỉ “http://sfdemo.t/app_dev.php”.

2  Tạo cơ sở dữ liệu, khu vực làm việc

Sửa thông tin kết nối CSDL tại “/var/www/sfdemo/app/config/parameters.yml”

Chạy các dòng lệnh sau:

cd /var/www/sfdemo
php app/console doctrine:database:create
php app/console generate:bundle --namespace=Aplus/DemoBundle --format=yml
   Trả lời một vài câu hỏi được đưa ra:
       Bundle namespace [Aplus/DemoBundle]: Aplus/DemoBundle
       Bundle name [AplusDemoBundle]: AplusDemoBundle
       Target directory [/var/www/sfdemo/src]: /var/www/sfdemo/src
       Configuration format (yml, xml, php, or annotation) [yml]: yml
       Do you want to generate the whole directory structure [no]? yes
       Do you confirm generation [yes]? yes
       Confirm automatic update of your Kernel [yes]? yes
       Confirm automatic update of the Routing [yes]? Yes
php app/console cache:clear

3  Tạo model

Chúng ta sẽ tạo 1 cái blog đơn giản với hai bảng là post và comment.

3.1  Phát sinh các entity

Tạo tập tin “/var/www/sfdemo/src/Aplus/DemoBundle/Resources/config/doctrine/Post.orm.yml” với nội dung:

Aplus\DemoBundle\Entity\Post:
  type: entity
  table: post
  id:
    id:
      type: integer
      generator: { strategy: AUTO }
  fields:
    name:
      type: string
      length: 255
    title:
      type: string
      length: 255
    content:
      type: text
    created_at:
      type: datetime
    updated_at:
      type: datetime
  oneToMany:
    comment:
      targetEntity: Comment
      mappedBy: post

Tạo tập tin “/var/www/sfdemo/src/Aplus/DemoBundle/Resources/config/doctrine/Comment.orm.yml” với nội dung:

Aplus\DemoBundle\Entity\Comment:
  type: entity
  table: comment
  id:
    id:
      type: integer
      generator: { strategy: AUTO }
  fields:
    commenter:
      type: string
      length: 255
    body:
      type: text
    post_id:
      type: integer
    created_at:
      type: datetime
    updated_at:
      type: datetime
  manyToOne:
    post:
      targetEntity: Post
      inversedBy: comment
      joinColumn:
        name: post_id
        referencedColumnName: id

Chạy lệnh sau:

   php app/console doctrine:generate:entities AplusDemoBundle

Lệnh trên sẽ tạo 2 file php tại /var/www/sfdemo/src/Aplus/DemoBundle/Entity
Nếu muốn cập nhật database, sửa ở các tập tin *.orm.yml trước, sau đó chạy lệnh sau:

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

3.2  Viết các model của riêng mình

Sửa các tập tin *.orm.yml phía trên, bổ sung repositoryClass:

Aplus\DemoBundle\Entity\Post:
  type: entity
  repositoryClass: Aplus\DemoBundle\Repository\PostRepository

Chạy lệnh:

php app/console doctrine:generate:entities AplusDemoBundle
Lệnh trên sẽ tạo ra tập tin “/var/www/sfdemo/src/Aplus/DemoBundle/Repository/PostRepository.php” với nội dung:

<?php
namespace Aplus\DemoBundle\Repository;
use Doctrine\ORM\EntityRepository;
/**
* PostRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class PostRepository extends EntityRepository
{
}
Thử tạo một hàm đơn giản thế này:
   function getPostList()
    {
        return array();
    }

Và chúng ta có thể gọi nó ở controller như bên dưới.

public function indexAction()
{
  $em = $this->getDoctrine()->getEntityManager();
        $entities = $em->getRepository('AplusDemoBundle:Post')->getPostList();
        return $this->render('AplusDemoBundle:Post:index.html.twig', array(
                    'entities' => $entities
                ));
}

4  Tạo view, controller và router

Có một cách đơn giản: tạo CRUD, hãy đọc code được tạo ra và hiểu sơ về nó trước.

php app/console doctrine:generate:crud --entity=AplusDemoBundle:Post --route-prefix=post --with-write --format=yml
php app/console cache:clear