Symfony - ดู Engine
View Layer คือเลเยอร์การนำเสนอของแอปพลิเคชัน MVC มันแยกตรรกะของแอปพลิเคชันออกจากตรรกะการนำเสนอ
เมื่อคอนโทรลเลอร์ต้องการสร้าง HTML, CSS หรือเนื้อหาอื่น ๆ ระบบจะส่งต่องานไปยังเครื่องมือสร้างเทมเพลต
เทมเพลต
เทมเพลตเป็นไฟล์ข้อความที่ใช้ในการสร้างเอกสารที่เป็นข้อความเช่น HTML, XML เป็นต้นใช้เพื่อประหยัดเวลาและลดข้อผิดพลาด
โดยค่าเริ่มต้นแม่แบบสามารถอยู่ในตำแหน่งที่แตกต่างกันสองแห่ง -
app/Resources/views/- ไดเร็กทอรีมุมมองของแอปพลิเคชันสามารถมีเค้าโครงและเทมเพลตของแอปพลิเคชันของคุณ นอกจากนี้ยังลบล้างเทมเพลตบันเดิลของบุคคลที่สาม
vendor/path/to/Bundle/Resources/views/ - บันเดิลของบุคคลที่สามแต่ละชุดมีเทมเพลตในไดเร็กทอรี "Resources / views /"
Twig Engine
Symfony ใช้ภาษาเทมเพลตที่มีประสิทธิภาพที่เรียกว่า Twig. Twig ช่วยให้คุณเขียนเทมเพลตที่กระชับและอ่านได้ในลักษณะที่ง่ายมาก เทมเพลต Twig นั้นเรียบง่ายและจะไม่ประมวลผลแท็ก PHP Twig ดำเนินการควบคุมช่องว่างแซนด์บ็อกซ์และการหลบหนี HTML อัตโนมัติ
ไวยากรณ์
Twig มีไวยากรณ์พิเศษสามประเภท -
{{ ... }} - พิมพ์ตัวแปรหรือผลลัพธ์ของนิพจน์ไปยังเทมเพลต
{% ... %} - แท็กที่ควบคุมตรรกะของเทมเพลต ส่วนใหญ่จะใช้เพื่อเรียกใช้ฟังก์ชัน
{# ... #}- ไวยากรณ์ความคิดเห็น ใช้เพื่อเพิ่มความคิดเห็นเดียวหรือหลายบรรทัด
เทมเพลตฐานกิ่งไม้อยู่ที่ “app/Resources/views/base.html.twig”.
ตัวอย่าง
มาดูตัวอย่างง่ายๆโดยใช้ twig engine
StudentController.php
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class StudentController extends Controller {
/**
* @Route("/student/home")
*/
public function homeAction() {
return $this->render('student/home.html.twig');
}
}
ที่นี่ render() เมธอดแสดงเทมเพลตและทำให้เนื้อหานั้นเป็นอ็อบเจ็กต์การตอบสนอง
ตอนนี้ย้ายไปที่ไดเร็กทอรี "views" และสร้างโฟลเดอร์ "student" และภายในโฟลเดอร์นั้นให้สร้างไฟล์ "home.html.twig" เพิ่มการเปลี่ยนแปลงต่อไปนี้ในไฟล์
home.html.twig
//app/Resources/views/student/home.html.twig
<h3>Student application!</h3>
คุณสามารถรับผลลัพธ์ได้โดยขอ url“ http: // localhost: 8000 / student / home”
โดยค่าเริ่มต้น Twig จะมาพร้อมกับรายการแท็กฟิลเตอร์และฟังก์ชันต่างๆมากมาย มาดูรายละเอียดทีละเรื่อง
แท็ก
Twig รองรับแท็กที่สำคัญดังต่อไปนี้ -
ทำ
doแท็กทำหน้าที่คล้ายกับนิพจน์ทั่วไปโดยมีข้อยกเว้นว่าจะไม่พิมพ์อะไรเลย ไวยากรณ์มีดังนี้ -
{% do 5 + 6 %}
รวม
คำสั่ง include ประกอบด้วยเทมเพลตและส่งคืนเนื้อหาที่แสดงผลของไฟล์นั้นไปยังเนมสเปซปัจจุบัน ไวยากรณ์มีดังนี้ -
{% include 'template.html' %}
ขยาย
คุณสามารถใช้แท็กขยายเพื่อขยายเทมเพลตจากเทมเพลตอื่นได้ ไวยากรณ์มีดังนี้ -
{% extends "template.html" %}
บล็อก
บล็อกทำหน้าที่เป็นตัวยึดตำแหน่งและแทนที่เนื้อหา ชื่อบล็อกประกอบด้วยอักขระที่เป็นตัวอักษรและตัวเลขคละกันและขีดล่าง ตัวอย่างเช่น,
<title>{% block title %}{% endblock %}</title>
ฝัง
embedแท็กทำการรวมทั้งรวมและขยาย ช่วยให้คุณสามารถรวมเนื้อหาของเทมเพลตอื่นได้ นอกจากนี้ยังช่วยให้คุณสามารถแทนที่บล็อกใด ๆ ที่กำหนดไว้ภายในเทมเพลตที่รวมอยู่ด้วยเช่นเมื่อขยายเทมเพลต ไวยากรณ์มีดังนี้ -
{% embed “new_template.twig” %}
{# These blocks are defined in “new_template.twig" #}
{% block center %}
Block content
{% endblock %}
{% endembed %}
กรอง
ส่วนตัวกรองช่วยให้คุณสามารถใช้ตัวกรอง Twig ปกติกับบล็อกข้อมูลเทมเพลตได้ ตัวอย่างเช่น,
{% filter upper %}
symfony framework
{% endfilter %}
ในที่นี้ข้อความจะเปลี่ยนเป็นตัวพิมพ์ใหญ่
สำหรับ
Forloop ดึงข้อมูลแต่ละรายการตามลำดับ ตัวอย่างเช่น,
{% for x in 0..10 %}
{{ x }}
{% endfor %}
ถ้า
ifคำสั่งใน Twig นั้นคล้ายกับ PHP นิพจน์ประเมินว่าเป็นจริงหรือเท็จ ตัวอย่างเช่น,
{% if value == true %}
<p>Simple If statement</p>
{% endif %}
ฟิลเตอร์
Twig มีตัวกรอง ใช้เพื่อแก้ไขเนื้อหาก่อนที่จะแสดงผล ต่อไปนี้เป็นตัวกรองที่น่าสนใจบางส่วน
ความยาว
ตัวกรองความยาวจะส่งกลับความยาวของสตริง ไวยากรณ์มีดังนี้ -
{% if name|length > 5 %}
...
{% endif %}
ต่ำกว่า
ตัวกรองล่างจะแปลงค่าเป็นตัวพิมพ์เล็ก ตัวอย่างเช่น,
{{ 'SYMFONY'|lower }}
มันจะให้ผลลัพธ์ดังต่อไปนี้ -
symfony
ในทำนองเดียวกันคุณสามารถลองใช้ตัวพิมพ์ใหญ่
แทนที่
ตัวกรองการแทนที่จะจัดรูปแบบสตริงที่กำหนดโดยการแทนที่ตัวยึดตำแหน่ง ตัวอย่างเช่น,
{{ "tutorials point site %si% and %te%."|replace({'%si%': web, '%te%': "site"}) }}
มันจะให้ผลลัพธ์ดังต่อไปนี้ -
tutorials point website
หัวข้อ
ตัวกรองหัวเรื่องจะส่งคืนค่าเวอร์ชันของชื่อเรื่อง ตัวอย่างเช่น,
{{ 'symfony framework '|title }}
มันจะให้ผลลัพธ์ดังต่อไปนี้ -
Symfony Framework
จัดเรียง
ตัวกรองการเรียงลำดับจะจัดเรียงอาร์เรย์ ไวยากรณ์มีดังนี้ -
{% for user in names|sort %}
...
{% endfor %}
ตัดแต่ง
ตัวกรองการตัดแต่งจะตัดช่องว่าง (หรืออักขระอื่น ๆ ) จากจุดเริ่มต้นและจุดสิ้นสุดของสตริง ตัวอย่างเช่น,
{{ ' Symfony! '|trim }}
มันจะให้ผลลัพธ์ดังต่อไปนี้ -
Symfony!
ฟังก์ชั่น
Twig รองรับฟังก์ชั่น ใช้เพื่อให้ได้ผลลัพธ์ที่เฉพาะเจาะจง ต่อไปนี้เป็นฟังก์ชัน Twig ที่สำคัญ
แอตทริบิวต์
attributeสามารถใช้ฟังก์ชันเพื่อเข้าถึงแอตทริบิวต์ "ไดนามิก" ของตัวแปร ไวยากรณ์มีดังนี้ -
{{ attribute(object, method) }}
{{ attribute(object, method, arguments) }}
{{ attribute(array, item) }}
ตัวอย่างเช่น,
{{ attribute(object, method) is defined ? 'Method exists' : 'Method does not exist' }}
คงที่
ฟังก์ชัน Constant จะส่งคืนค่าคงที่สำหรับสตริงที่ระบุ ตัวอย่างเช่น,
{{ constant('Namespace\\Classname::CONSTANT_NAME') }}
วงจร
ฟังก์ชันวัฏจักรจะวนรอบบนอาร์เรย์ของค่า ตัวอย่างเช่น,
{% set months = [‘Jan’, ‘Feb’, ‘Mar’] %}
{% for x in 0..12 %}
{ cycle(months, x) }}
{% endfor %}
วันที่
แปลงอาร์กิวเมนต์เป็นวันที่เพื่อให้สามารถเปรียบเทียบวันที่ได้ ตัวอย่างเช่น,
<p>Choose your location before {{ 'next Monday'|date('M j, Y') }}</p>
มันจะให้ผลลัพธ์ดังต่อไปนี้ -
Choose your location before May 15, 2017
อาร์กิวเมนต์ต้องอยู่ในรูปแบบวันที่และเวลาที่รองรับของ PHP
คุณสามารถส่งเขตเวลาเป็นอาร์กิวเมนต์ที่สองได้
การถ่ายโอนข้อมูล
ฟังก์ชันการถ่ายโอนข้อมูลจะทิ้งข้อมูลเกี่ยวกับตัวแปรเทมเพลต ตัวอย่างเช่น,
{{ dump(user) }}
สูงสุด
ฟังก์ชัน max จะส่งคืนค่าที่มากที่สุดของลำดับ ตัวอย่างเช่น,
{{ max(1, 5, 9, 11, 15) }}
นาที
ฟังก์ชัน min ส่งคืนค่าที่น้อยที่สุดของลำดับ ตัวอย่างเช่น,
{{ min(1, 3, 2) }}
รวม
ฟังก์ชัน include ส่งคืนเนื้อหาที่แสดงผลของเทมเพลต ตัวอย่างเช่น,
{{ include('template.html') }}
สุ่ม
ฟังก์ชันสุ่มสร้างค่าสุ่ม ตัวอย่างเช่น,
{{ random([‘Jan’, ‘Feb’, ‘Mar’, ‘Apr’]) }}
{# example output: Jan #}
พิสัย
ฟังก์ชัน Range ส่งคืนรายการที่มีความก้าวหน้าทางคณิตศาสตร์ของจำนวนเต็ม ตัวอย่างเช่น,
{% for x in range(1, 5) %}
{{ x }},
{% endfor %}
มันจะให้ผลลัพธ์ดังต่อไปนี้ -
1,2,3,4,5
เลย์เอาต์
เค้าโครงแสดงถึงส่วนทั่วไปของหลายมุมมองเช่นส่วนหัวของหน้าและส่วนท้าย
การสืบทอดแม่แบบ
เทมเพลตสามารถใช้กับเทมเพลตอื่นได้ เราสามารถบรรลุสิ่งนี้ได้โดยใช้แนวคิดการสืบทอดแม่แบบ การสืบทอดเทมเพลตช่วยให้คุณสามารถสร้างเทมเพลต "เค้าโครง" พื้นฐานที่มีองค์ประกอบทั่วไปทั้งหมดของเว็บไซต์ที่กำหนดเป็นบล็อก
ลองมาเป็นตัวอย่างง่ายๆเพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับการสืบทอดเทมเพลต
ตัวอย่าง
พิจารณาเทมเพลตพื้นฐานที่“ app / Resources / views / base.html.twig” เพิ่มการเปลี่ยนแปลงต่อไปนี้ในไฟล์
base.html.twig
<!DOCTYPE html>
<html>
<head>
<meta charset = "UTF-8">
<title>{% block title %}Parent template Layout{% endblock %}</title>
</head>
</html>
ตอนนี้ย้ายไปยังแฟ้มดัชนีแม่แบบตั้งอยู่ที่“app / ทรัพยากรธรรมชาติ / views / default / index.html.twig” เพิ่มการเปลี่ยนแปลงต่อไปนี้
index.html.twig
{% extends 'base.html.twig' %}
{% block title %}Child template Layout{% endblock %}
ที่นี่ {% extends %}แท็กแจ้งให้เครื่องมือสร้างเทมเพลตเพื่อประเมินเทมเพลตพื้นฐานก่อนซึ่งจะตั้งค่าโครงร่างและกำหนดบล็อก จากนั้นเทมเพลตลูกจะแสดงผล เทมเพลตลูกสามารถขยายโครงร่างพื้นฐานและแทนที่บล็อกหัวเรื่องได้ ตอนนี้ขอ url“ http: // localhost: 8000” และคุณจะได้รับผลลัพธ์
สินทรัพย์
เนื้อหาจะจัดการการสร้าง URL และการกำหนดเวอร์ชันของเนื้อหาเว็บเช่นสไตล์ชีต CSS ไฟล์ JavaScript และไฟล์รูปภาพ
JavaScript
หากต้องการรวมไฟล์ JavaScript ให้ใช้ไฟล์ javascripts แท็กในเทมเพลตใดก็ได้
{# Include javascript #}
{% block javascripts %}
{% javascripts '@AppBundle/Resources/public/js/*' %}
<script src="{{ asset_url }}"></script>
{% endjavascripts %}
{% endblock %}
สไตล์ชีต
หากต้องการรวมไฟล์สไตล์ชีตให้ใช้ไฟล์ stylesheets แท็กในเทมเพลตใดก็ได้
{# include style sheet #}
{% block stylesheets %}
{% stylesheets 'bundles/app/css/*' filter = 'cssrewrite' %}
<link rel = "stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
{% endblock %}
รูปภาพ
ในการรวมรูปภาพคุณสามารถใช้แท็กรูปภาพ มีกำหนดดังนี้
{% image '@AppBundle/Resources/public/images/example.jpg' %}
<img src = "{{ asset_url }}" alt = "Example" />
{% endimage %}
สินทรัพย์ผสม
คุณสามารถรวมไฟล์หลาย ๆ ไฟล์เป็นไฟล์เดียว ซึ่งจะช่วยลดจำนวนคำขอ HTTP และสร้างประสิทธิภาพของส่วนหน้ามากขึ้น
{% javascripts
'@AppBundle/Resources/public/js/*'
'@AcmeBarBundle/Resources/public/js/form.js'
'@AcmeBarBundle/Resources/public/js/calendar.js' %}
<script src = "{{ asset_url }}"></script>
{% endjavascripts %}