Tuần vừa qua mình mới join vào dự án ec-cube là một cms xây dựng dựa trên symfony framework, trong bài viết này mình sẽ hướng dẫn các bạn xây dựng ứng dụng CRUD cơ bản.
Giới thiệu
Symfony is a set of PHP Components, a Web Application framework, a Philosophy, and a Community — all working together in harmony.
- Symfony framework: Một PHP framework hàng đầu để tạo các trang web và ứng dựng web. Được xây dựng dựng dựa trên các Symfony Component.
- Symfony component: Tập các thành phần tách rời và có thể tái sử dụng, một số ứng dụng PHP được xây dựng như Drupal, phpBB, eZ Publish…
- Community: Cộng đồng khoảng hơn 600.000 developers đến từ hơn 120 quốc gia.
- Philosophy: Thúc đẩy tính chuyên nghiệp, thực tiễn tốt nhất, tiêu chuẩn hóa và khả năng tương tác của các ứng dụng.
Cài đặt
Chạy lên command line
wget https://get.symfony.com/cli/installer -O - | bash
Cài đặt nó trên global:
mv /home/linhdn1198/.symfony/bin/symfony /usr/local/bin/symfony
Kiểm tra version
Tạo project mới
symfony new my_project_name
hoặccomposer create-project symfony/website-skeleton my_project_name
Bắt đầu
Cài đặt một số component
composer require annotations
: Cho phép bạn sử dụng chú thích để định nghĩa 1 route VD:composer require twig
: Template cho phép bạn sử dụng một số cú pháp đặc thù ngoài view.composer require symfony/maker-bundle --dev
: Cho phép bạn thực hiện lệnh command make để tạo entity, controller, form …composer require symfony/orm-pack
: Hỗ trợ thao tác với database.composer require form validator security-csrf
: Hỗ trợ tạo form, validate dữ liệu và bảo mật csrf cho form.
Các thành phần trong symfony
- Entity: Lớp này sử dụng Doctrine để tạo các thực thể và giao tiếp với CSDL.
@ORMEntity(repositoryClass="AppRepositorySimNumberRepository")
: Định nghĩa lớp Repository cho Entity.@ORMId()
Set $id là khóa chính.@ORMGeneratedValue()
Set giá trị tự sinh.@ORMColumn(type="integer")
Set kiểu dữ liệu.- Ngoài ra còn có quan hệ:
@OneToMany
,@ManyToOne
,@ManyToMany
…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Entity</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Doctrine<span class="token punctuation"></span>ORM<span class="token punctuation"></span>Mapping</span> <span class="token keyword">as</span> <span class="token constant">ORM</span><span class="token punctuation">;</span> <span class="token comment">/** * @ORMEntity(repositoryClass="AppRepositorySimNumberRepository") */</span> <span class="token keyword">class</span> <span class="token class-name">SimNumber</span> <span class="token punctuation">{</span> <span class="token comment">/** * @ORMId() * @ORMGeneratedValue() * @ORMColumn(type="integer") */</span> <span class="token keyword">private</span> <span class="token variable">$id</span><span class="token punctuation">;</span> <span class="token comment">/** * @ORMColumn(type="string", length=14) */</span> <span class="token keyword">private</span> <span class="token variable">$number</span><span class="token punctuation">;</span> <span class="token comment">/** * @ORMColumn(type="decimal", precision=10, scale=0) */</span> <span class="token keyword">private</span> <span class="token variable">$price</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token operator">?</span>int <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">id</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getNumber</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token operator">?</span>string <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">number</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">setNumber</span><span class="token punctuation">(</span>string <span class="token variable">$number</span><span class="token punctuation">)</span><span class="token punctuation">:</span> self <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">number</span> <span class="token operator">=</span> <span class="token variable">$number</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getPrice</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token operator">?</span>string <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">price</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">setPrice</span><span class="token punctuation">(</span>string <span class="token variable">$price</span><span class="token punctuation">)</span><span class="token punctuation">:</span> self <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">price</span> <span class="token operator">=</span> <span class="token variable">$price</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
- Repository: Lớp kế thừa
ServiceEntityRepository.php
trong lớp này lại kế thừaEntityRepository.php
có định nghĩa các hàm cơ bản find(), findOneBy(), findAll(), findBy().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Repository</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Entity<span class="token punctuation"></span>SimNumber</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Doctrine<span class="token punctuation"></span>Bundle<span class="token punctuation"></span>DoctrineBundle<span class="token punctuation"></span>Repository<span class="token punctuation"></span>ServiceEntityRepository</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Doctrine<span class="token punctuation"></span>Persistence<span class="token punctuation"></span>ManagerRegistry</span><span class="token punctuation">;</span> <span class="token comment">/** * @method SimNumber|null find($id, $lockMode = null, $lockVersion = null) * @method SimNumber|null findOneBy(array $criteria, array $orderBy = null) * @method SimNumber[] findAll() * @method SimNumber[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) */</span> <span class="token keyword">class</span> <span class="token class-name">SimNumberRepository</span> <span class="token keyword">extends</span> <span class="token class-name">ServiceEntityRepository</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span>ManagerRegistry <span class="token variable">$registry</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">parent</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">__construct</span><span class="token punctuation">(</span><span class="token variable">$registry</span><span class="token punctuation">,</span> SimNumber<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
- Controller: Trong controller có thể định tuyến các route
@Route("<url>", name="<name_route>", methods={"<GET, POST...>"})
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Controller</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Entity<span class="token punctuation"></span>SimNumber</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Form<span class="token punctuation"></span>SimNumberType</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Repository<span class="token punctuation"></span>SimNumberRepository</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation"></span>Bundle<span class="token punctuation"></span>FrameworkBundle<span class="token punctuation"></span>Controller<span class="token punctuation"></span>AbstractController</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation"></span>Component<span class="token punctuation"></span>HttpFoundation<span class="token punctuation"></span>Request</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation"></span>Component<span class="token punctuation"></span>HttpFoundation<span class="token punctuation"></span>Response</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation"></span>Component<span class="token punctuation"></span>Routing<span class="token punctuation"></span>Annotation<span class="token punctuation"></span>Route</span><span class="token punctuation">;</span> <span class="token comment">/** * @Route("/sim-number") */</span> <span class="token keyword">class</span> <span class="token class-name">SimNumberController</span> <span class="token keyword">extends</span> <span class="token class-name">AbstractController</span> <span class="token punctuation">{</span> <span class="token comment">/** * @Route("/", name="sim_number_index", methods={"GET"}) */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">index</span><span class="token punctuation">(</span>SimNumberRepository <span class="token variable">$simNumberRepository</span><span class="token punctuation">)</span><span class="token punctuation">:</span> Response <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">render</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'sim_number/index.html.twig'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'sim_numbers'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$simNumberRepository</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">findAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
- Form: Lớp này để tạo ra form với method add(‘<name_input>’, ‘<type_input>’, [<opstions>])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation"></span>Form</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">App<span class="token punctuation"></span>Entity<span class="token punctuation"></span>SimNumber</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation"></span>Component<span class="token punctuation"></span>Form<span class="token punctuation"></span>AbstractType</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation"></span>Component<span class="token punctuation"></span>Form<span class="token punctuation"></span>FormBuilderInterface</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation"></span>Component<span class="token punctuation"></span>OptionsResolver<span class="token punctuation"></span>OptionsResolver</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation"></span>Component<span class="token punctuation"></span>Form<span class="token punctuation"></span>Extension<span class="token punctuation"></span>Core<span class="token punctuation"></span>Type<span class="token punctuation"></span>TextType</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation"></span>Component<span class="token punctuation"></span>Form<span class="token punctuation"></span>Extension<span class="token punctuation"></span>Core<span class="token punctuation"></span>Type<span class="token punctuation"></span>NumberType</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation"></span>Component<span class="token punctuation"></span>Form<span class="token punctuation"></span>Extension<span class="token punctuation"></span>Core<span class="token punctuation"></span>Type<span class="token punctuation"></span>SubmitType</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">SimNumberType</span> <span class="token keyword">extends</span> <span class="token class-name">AbstractType</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">buildForm</span><span class="token punctuation">(</span>FormBuilderInterface <span class="token variable">$builder</span><span class="token punctuation">,</span> <span class="token keyword">array</span> <span class="token variable">$options</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$builder</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">add</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'number'</span><span class="token punctuation">,</span> TextType<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'attr'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'class'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'form-control'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span><span class="token function">add</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'price'</span><span class="token punctuation">,</span> NumberType<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'attr'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'class'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'form-control'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">configureOptions</span><span class="token punctuation">(</span>OptionsResolver <span class="token variable">$resolver</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$resolver</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">setDefaults</span><span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token single-quoted-string string">'data_class'</span> <span class="token operator">=</span><span class="token operator">></span> SimNumber<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
- Twig: Là một template cho phép viết các cú pháp ngắn gọi, dễ đọc, thân thiện. Một số cú pháp cơ bản.
{{ ... }}
: Dùng để hiển thị nội dung của biến hoặc kết quả của biểu thức điều kiện.{% ... %}
: Dùng để xử lý mội vài logic điều kiện, vòng lặp.{# ... #}
: Được dùng để comment.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token doctype"><!DOCTYPE html></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>html</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>UTF-8<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>title</span><span class="token punctuation">></span></span>{% block title %}Welcome!{% endblock %}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>title</span><span class="token punctuation">></span></span> {% block stylesheets %}{% endblock %} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>container<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> {% block body %}{% endblock %} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> {% block javascripts %}{% endblock %} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>html</span><span class="token punctuation">></span></span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | {% extends 'base.html.twig' %} {% block title %}SimNumber index{% endblock %} {% block body %} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h1</span><span class="token punctuation">></span></span>SimNumber index<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h1</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>table table-border table-hover<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>thead</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tr</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>th</span><span class="token punctuation">></span></span>Id<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>th</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>th</span><span class="token punctuation">></span></span>Number<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>th</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>th</span><span class="token punctuation">></span></span>Price<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>th</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>th</span><span class="token punctuation">></span></span>actions<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>th</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>thead</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tbody</span><span class="token punctuation">></span></span> {% for sim_number in sim_numbers %} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tr</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>td</span><span class="token punctuation">></span></span>{{ sim_number.id }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>td</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>td</span><span class="token punctuation">></span></span>{{ sim_number.number }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>td</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>td</span><span class="token punctuation">></span></span>{{ sim_number.price }}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>td</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>td</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{{ path(<span class="token punctuation">'</span>sim_number_show<span class="token punctuation">'</span>, {<span class="token punctuation">'</span>id<span class="token punctuation">'</span>: sim_number.id}) }}<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>btn btn-outline-info<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>show<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{{ path(<span class="token punctuation">'</span>sim_number_edit<span class="token punctuation">'</span>, {<span class="token punctuation">'</span>id<span class="token punctuation">'</span>: sim_number.id}) }}<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>btn btn-outline-warning<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>edit<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>td</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span> {% else %} <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tr</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>td</span> <span class="token attr-name">colspan</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>4<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>no records found<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>td</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span> {% endfor %} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tbody</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>table</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{{ path(<span class="token punctuation">'</span>sim_number_new<span class="token punctuation">'</span>) }}<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>btn btn-primary<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Create new<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>a</span><span class="token punctuation">></span></span> {% endblock %} |
Bắt đầu xây dựng
- Khởi động server symfony dưới local
symfony server:start
- Chỉnh sửa file .env
DATABASE_URL=mysql://db_user:[email protected]:3306/db_name?serverVersion=5.7
- Cấu hình của tôi là
DATABASE_URL=mysql://root:[email protected]:3306/symfony?serverVersion=5.7
- Tạo entity bằng lệnh sau
php bin/console make:entity SimNumber
- Sau khi tạo xong entity ta vào phpmyadmin tạo databse với tên đã config trong file .env và bắt đầu gen database.
php bin/console doctrine:schema:update --dump-sql
Debug xem câu lệnh tạo databasephp bin/console doctrine:schema:update --force
Tiên hành update database
- Bây giờ có database rồi, ta dùng cmd make crud, nó sẽ gen cho chúng ta đầy đủ các file và mã nguồn cho chức năng crud
- Ở đây tôi custom lại url /sim/number -> /sim-number trong file src/Controller/SimNumberController.php line 13->15
1 2 3 4 | <span class="token comment">/** * @Route("/sim-number") */</span> |
- Để cho giao diện dễ nhìn hơn tôi có thêm bootstrap vào file templates/base.html.twig và chỉnh sửa một chút giao diện.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token doctype"><!DOCTYPE html></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>html</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>UTF-8<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>title</span><span class="token punctuation">></span></span>{% block title %}Welcome!{% endblock %}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css<span class="token punctuation">"</span></span> <span class="token attr-name">integrity</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm<span class="token punctuation">"</span></span> <span class="token attr-name">crossorigin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>anonymous<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> {% block stylesheets %}{% endblock %} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>container<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> {% block body %}{% endblock %} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://code.jquery.com/jquery-3.2.1.slim.min.js<span class="token punctuation">"</span></span> <span class="token attr-name">integrity</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN<span class="token punctuation">"</span></span> <span class="token attr-name">crossorigin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>anonymous<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script language-javascript" /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js<span class="token punctuation">"</span></span> <span class="token attr-name">integrity</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q<span class="token punctuation">"</span></span> <span class="token attr-name">crossorigin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>anonymous<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script language-javascript" /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js<span class="token punctuation">"</span></span> <span class="token attr-name">integrity</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl<span class="token punctuation">"</span></span> <span class="token attr-name">crossorigin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>anonymous<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script language-javascript" /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> {% block javascripts %}{% endblock %} <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>html</span><span class="token punctuation">></span></span> |
- Bây giờ vào đường dẫn http://127.0.0.1:8000/sim-number/ để xem kết quả nào ~