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
-----------------------------------------------------------------------------------------------------------------------
4 Tạo View, Controller và Router
CRUD sẽ làm cho mọi thừ đơn giản, hãy dùng nó để bắt đầu việc ... đọc hiểu. Chạy các lệnh sau:
php app/console doctrine:generate:crud --entity=AplusDemoBundle:Post --route-prefix=post --with-write --format=yml
php app/console cache:clear
Với kiến trúc của Symfony2:
- Model nằm ở /var/www/sfdemo/src/Aplus/DemoBundle/Entity
- View nằm ở /var/www/sfdemo/src/Aplus/DemoBundle/Resources/views (Stylesheet, Image, và JavaScript nằm ở /var/www/sfdemo/src/Aplus/DemoBundle/Resources/views/public)
- Controller nằm ở /var/www/sfdemo/src/Aplus/DemoBundle/Controller
Mặc định Symfony2 dùng template engine là Twig.
Twig định nghĩa 2 cú pháp đặc biệt:
{{ ... }}: "Says something": prints a variable or the result of an expression to the template;Với Twig, chúng ta có thể định nghĩa block. Twig block có thể chứa nội dung mặc định (xem title block bên dưới), nội dung mặc định này có thể được thay thế hoặc được kế thừa.
{% ... %}: "Does something": a tag that controls the logic of the template; it is used to execute statements such as for-loops for example.
4.1.1 Layout
Tạo tập tin “/var/www/sfdemo/src/Aplus/DemoBundle/Resources/views/layout.html.twig” với nội dung:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>{% block title %}Demo Bundle{% endblock %}</title>
<link rel="stylesheet" href="{{ asset('bundles/aplusdemo/css/style.css') }}" />
</head>
<body>
<div id="wrapper">
<div class="content">
{% block content %}
This is a content block.
{% endblock %}
</div>
</div>
</body>
</html>
Ghi chú: Chúng ta có thể thay thế {% block content %} bằng {% block anything %}
4.1.2 Template
Một template cơ bản như sau:
{% extends 'AplusDemoBundle::layout.html.twig' %}
{% block content %}
<!-- original template code goes here -->
{% endblock %}
{% block xyz %}block xyz content{% endblock %}
Ghi chú:
- <!-- original template code goes here --> sẽ thay thế nội dung mặc định của block.
- Nếu muốn kế thừa thì thêm vào {{ parent() }}
Xem router đã được tạo ra với câu lệnh phát sinh CRUD tại /var/www/sfdemo/src/Aplus/DemoBundle/Resources/config/routing/post.yml
Tập tin “/var/www/sfdemo/app/config/routing.yml” sẽ nhập các thiết lập từ “/var/www/sfdemo/src/Aplus/DemoBundle/Resources/config/routing/post.yml”. Hàm path bên dưới phát sinh ra url, với post_new được định nghĩa trong file routing.
<ul>
<li>
<a href="{{ path('post_new') }}">
Create a new entry
</a>
</li>
</ul>
4.3 Controller
Xem controller được tạo ra với câu lệnh phát sinh CRUD tại: “/var/www/sfdemo/src/Aplus/DemoBundle/Controller/PostController.php”.
Giờ lấy ví dụ, chúng ta muốn tạo một yêu cầu ajax với
- Url http://sfdemo.t/app_dev.php/post/delete-comment
- Method: post
thì làm bằng cách nào?
- Thêm “/delete-comment” với requirement method là post vào cuối tập tin “/var/www/sfdemo/src/Aplus/DemoBundle/Resources/config/routing/post.yml”.
post_comment_delete:
pattern: /delete-comment
defaults: { _controller: "AplusDemoBundle:Post:deletecomment" }
requirements: { _method: post }
- Tạo action tên deletemethod ở Post controller (/var/www/sfdemo/src/Aplus/DemoBundle/Controller/PostController.php), với nội dung đại loại như:
public function deletecommentAction()
{
$isAjax = $this->get('Request')->isXMLHttpRequest();
if ($isAjax) {
//...
//return json
$return = array(
'status' => true,
'msg' => 'Comment <b>xyz</b> has been deleted.'
);
return new Response(json_encode($return), 200, array('Content-Type' => 'application/json'));
}
return new Response('This is not ajax!', 400);
}
Ghi chú: nhớ thêm vào tâp tin trên 1 dòng tham chiếu như bên dưới (bởi vì chúng ta sử dụng một class tên là Response):
use Symfony\Component\HttpFoundation\Response;
Không có nhận xét nào:
Đăng nhận xét