Sên trong Symfony là gì?

Khi tạo một bình luận mới, sẽ thật tuyệt nếu ngày

  1. $ symfony console make:entity Conference
5 sẽ được đặt tự động thành ngày và giờ hiện tại

Doctrine có nhiều cách khác nhau để thao tác với các đối tượng và thuộc tính của chúng trong vòng đời của chúng [trước khi hàng trong cơ sở dữ liệu được tạo, sau khi hàng được cập nhật,…]

Xác định các cuộc gọi lại vòng đời

Khi hành vi không cần bất kỳ dịch vụ nào và chỉ được áp dụng cho một loại thực thể, hãy xác định lệnh gọi lại trong lớp thực thể

patch_file

  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;

Sự kiện

  1. $ symfony console make:entity Conference
6 được kích hoạt khi đối tượng được lưu trữ lần đầu tiên trong cơ sở dữ liệu. Khi điều đó xảy ra, phương thức
  1. $ symfony console make:entity Conference
7 được gọi và ngày giờ hiện tại được sử dụng cho giá trị của thuộc tính
  1. $ symfony console make:entity Conference
5

Thêm sên vào hội nghị

Các URL cho hội nghị không có ý nghĩa.

  1. $ symfony console make:entity Conference
9. Quan trọng hơn, chúng phụ thuộc vào chi tiết triển khai [khóa chính trong cơ sở dữ liệu bị rò rỉ]

Còn việc sử dụng các URL như

  1. $ symfony console make:migration
0 thì sao? .
  1. $ symfony console make:migration
1 là cái mà chúng tôi gọi là sên hội nghị

Thêm một thuộc tính

  1. $ symfony console make:migration
2 mới cho các hội nghị [một chuỗi 255 ký tự không thể rỗng]

  1. $ symfony console make:entity Conference

Tạo tệp di chuyển để thêm cột mới

  1. $ symfony console make:migration

Và thực hiện di chuyển mới đó

  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
1

Có một lỗi? . Tại sao? . Hãy khắc phục điều đó bằng cách điều chỉnh quá trình di chuyển

patch_file

  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
4

Mẹo ở đây là thêm cột và cho phép nó là

  1. $ symfony console make:migration
3, sau đó đặt sên thành giá trị không phải
  1. $ symfony console make:migration
3 và cuối cùng, thay đổi cột sên thành không cho phép
  1. $ symfony console make:migration
3

Ghi chú

Đối với một dự án thực tế, sử dụng

  1. $ symfony console make:migration
8 có thể là không đủ. Trong trường hợp đó, chúng ta sẽ cần sử dụng Slugger “thật”

Quá trình di chuyển sẽ chạy tốt ngay bây giờ

  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
1

Vì ứng dụng sẽ sớm sử dụng sên để tìm từng hội nghị, hãy tinh chỉnh thực thể Hội nghị để đảm bảo rằng các giá trị sên là duy nhất trong cơ sở dữ liệu

patch_file

  1. $ symfony console make:entity Conference
0

Vì chúng tôi đang sử dụng trình xác thực để đảm bảo tính duy nhất của sên, chúng tôi cần thêm thành phần Trình xác thực Symfony

  1. $ symfony console make:entity Conference
1

Như bạn có thể đoán, chúng ta cần thực hiện điệu nhảy di cư

  1. $ symfony console make:migration
  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
1

Tạo sên

Tạo một slug đọc tốt trong một URL [trong đó bất kỳ thứ gì ngoài các ký tự ASCII phải được mã hóa] là một nhiệm vụ đầy thách thức, đặc biệt đối với các ngôn ngữ không phải là tiếng Anh. Làm thế nào để bạn chuyển đổi

  1. $ symfony console make:migration
9 thành
  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
10 chẳng hạn?

Thay vì phát minh lại bánh xe, hãy sử dụng thành phần Symfony

  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
11, giúp giảm bớt thao tác với các chuỗi và cung cấp một slugger

  1. $ symfony console make:entity Conference
0

Thêm phương thức

  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
12 vào lớp
  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
13 tính toán sên dựa trên dữ liệu hội nghị

patch_file

  1. $ symfony console make:entity Conference
1

Phương pháp

  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
12 chỉ tính toán sên khi sên hiện tại trống hoặc được đặt thành giá trị
  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
15 đặc biệt. Tại sao chúng ta cần giá trị đặc biệt của
  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
15? . Vì vậy, chúng tôi cần một giá trị không trống để cho ứng dụng biết rằng chúng tôi muốn sên được tạo tự động

Xác định một cuộc gọi lại vòng đời phức tạp

Đối với thuộc tính

  1. $ symfony console make:entity Conference
5, thuộc tính
  1. $ symfony console make:migration
2 sẽ được đặt tự động bất cứ khi nào hội nghị được cập nhật bằng cách gọi phương thức
  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
12

Nhưng vì phương pháp này phụ thuộc vào việc triển khai

  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
40, nên chúng tôi không thể thêm sự kiện
  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
41 như trước đây [chúng tôi không có cách nào để thêm slugger]

Thay vào đó, hãy tạo một trình nghe thực thể Doctrine

src/EntityListener/ConferenceEntityListener. php

  1. $ symfony console make:entity Conference
2

Lưu ý rằng slug được cập nhật khi một hội nghị mới được tạo [_______142] và bất cứ khi nào nó được cập nhật [

  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
43]

Định cấu hình Dịch vụ trong Vùng chứa

Cho đến bây giờ, chúng tôi vẫn chưa nói về một thành phần chính của Symfony, bộ chứa tiêm phụ thuộc. Container chịu trách nhiệm quản lý các dịch vụ. tạo chúng và tiêm chúng bất cứ khi nào cần

Một dịch vụ là một đối tượng “toàn cầu” cung cấp các tính năng [e. g. một người đưa thư, một người khai thác gỗ, một slugger, v.v. ] không giống như các đối tượng dữ liệu [e. g. Các thực thể Doctrine]

Bạn hiếm khi tương tác trực tiếp với vùng chứa vì nó tự động đưa vào các đối tượng dịch vụ bất cứ khi nào bạn cần. chẳng hạn, vùng chứa đưa vào các đối tượng đối số của bộ điều khiển khi bạn nhập gợi ý cho chúng

Nếu bạn thắc mắc làm thế nào trình xử lý sự kiện được đăng ký ở bước trước, thì bây giờ bạn đã có câu trả lời. thùng chứa. Khi một lớp triển khai một số giao diện cụ thể, vùng chứa biết rằng lớp đó cần được đăng ký theo một cách nhất định

Thật không may, tự động hóa không được cung cấp cho mọi thứ, đặc biệt là các gói của bên thứ ba. Trình nghe thực thể mà chúng tôi vừa viết là một ví dụ như vậy;

Chúng ta cần khai báo một phần bộ nghe trong vùng chứa. Hệ thống dây phụ thuộc có thể được bỏ qua vì vùng chứa vẫn có thể đoán được, nhưng chúng ta cần thêm một số thẻ theo cách thủ công để đăng ký trình nghe với bộ điều phối sự kiện Doctrine

patch_file

  1. $ symfony console make:entity Conference
3

Ghi chú

Đừng nhầm lẫn giữa người nghe sự kiện Doctrine và người nghe sự kiện Symfony. Ngay cả khi chúng trông rất giống nhau, chúng không sử dụng cùng một cơ sở hạ tầng dưới mui xe

Sử dụng sên trong ứng dụng

Hãy thử thêm nhiều hội nghị hơn vào phần phụ trợ và thay đổi thành phố hoặc năm của hội nghị hiện có;

Thay đổi cuối cùng là cập nhật bộ điều khiển và các mẫu để sử dụng hội nghị

  1. $ symfony console make:migration
2 thay vì hội nghị
  1. --- a/src/Entity/Comment.php
  2. +++ b/src/Entity/Comment.php
  3. @@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
  4. /**
  5. * @ORM\Entity[repositoryClass=CommentRepository::class]
  6. + * @ORM\HasLifecycleCallbacks[]
  7. */
  8. class Comment
  9. {
  10. @@ -106,6 +107,14 @@ class Comment
  11. return $this;
  12. }
  13. + /**
  14. + * @ORM\PrePersist
  15. + */
  16. + public function setCreatedAtValue[]
  17. + {
  18. + $this->createdAt = new \DateTime[];
  19. + }
  20. +
  21. public function getConference[]: ?Conference
  22. {
  23. return $this->conference;
46 cho các tuyến đường

Slug trong PHP là gì?

Slug là mã định danh duy nhất, có thể đọc được của con người , được sử dụng để xác định tài nguyên thay vì mã định danh ít người đọc hơn như id.

Làm cách nào để tạo một con sên trong PHP?

Đây là cách nó có thể được thực hiện. ?

Cái nào sau đây được xây dựng trong hàm twig?

Hàm .
thuộc tính
khối
hằng số
xe đạp
html_classes
bao gồm

Chủ Đề