Khi tạo một bình luận mới, sẽ thật tuyệt nếu ngày
5 sẽ được đặt tự động thành ngày và giờ hiện tại
$ symfony console make:entity Conference
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
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
Sự kiện
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
$ 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
$ symfony console make:entity Conference
5
$ symfony console make:entity Conference
Thêm sên vào hội nghị
Các URL cho hội nghị không có ý nghĩa.
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ỉ]
$ symfony console make:entity Conference
Còn việc sử dụng các URL như
0 thì sao? .
$ symfony console make:migration
1 là cái mà chúng tôi gọi là sên hội nghị
$ symfony console make:migration
Thêm một thuộc tính
2 mới cho các hội nghị [một chuỗi 255 ký tự không thể rỗng]
$ symfony console make:migration
$ symfony console make:entity Conference
Tạo tệp di chuyển để thêm cột mới
$ symfony console make:migration
Và thực hiện di chuyển mới đó
1
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
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
4
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
Mẹo ở đây là thêm cột và cho phép nó là
3, sau đó đặt sên thành giá trị không phải
$ symfony console make:migration
3 và cuối cùng, thay đổi cột sên thành không cho phép
$ symfony console make:migration
3
$ symfony console make:migration
Ghi chú
Đối với một dự án thực tế, sử dụng
8 có thể là không đủ. Trong trường hợp đó, chúng ta sẽ cần sử dụng Slugger “thật”
$ symfony console make:migration
Quá trình di chuyển sẽ chạy tốt ngay bây giờ
1
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
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
0
$ symfony console make:entity Conference
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
Như bạn có thể đoán, chúng ta cần thực hiện điệu nhảy di cư
$ symfony console make:migration
1
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
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
9 thành
$ symfony console make:migration
10 chẳng hạn?
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
Thay vì phát minh lại bánh xe, hãy sử dụng thành phần Symfony
11, giúp giảm bớt thao tác với các chuỗi và cung cấp một slugger
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
0
$ symfony console make:entity Conference
Thêm phương thức
12 vào lớp
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
13 tính toán sên dựa trên dữ liệu hội nghị
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
patch_file
1
$ symfony console make:entity Conference
Phương pháp
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ị
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
15 đặc biệt. Tại sao chúng ta cần giá trị đặc biệt của
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
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
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
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
5, thuộc tính
$ symfony console make:entity Conference
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
$ symfony console make:migration
12
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
Nhưng vì phương pháp này phụ thuộc vào việc triển khai
40, nên chúng tôi không thể thêm sự kiện
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
41 như trước đây [chúng tôi không có cách nào để thêm slugger]
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
Thay vào đó, hãy tạo một trình nghe thực thể Doctrine
src/EntityListener/ConferenceEntityListener. php
2
$ symfony console make:entity Conference
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 [
43]
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;
Đị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
3
$ symfony console make:entity Conference
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ị
2 thay vì hội nghị
$ symfony console make:migration
46 cho các tuyến đường
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -7,6 +7,7 @@ use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity[repositoryClass=CommentRepository::class]
+ * @ORM\HasLifecycleCallbacks[]
*/
class Comment
{
@@ -106,6 +107,14 @@ class Comment
return $this;
}
+ /**
+ * @ORM\PrePersist
+ */
+ public function setCreatedAtValue[]
+ {
+ $this->createdAt = new \DateTime[];
+ }
+
public function getConference[]: ?Conference
{
return $this->conference;