教义オブジェクトのラaapl . exeフサaapl . exeクルを管理する
教义オブジェクトのラaapl . exeフサaapl . exeクルを管理する
新しくコメントをした際には,自動的に現在の日時がcreatedAt
としてセットされると良いですね。
学说はデータベースに追加されるときや更新されるときといったライフサイクルにおいてオブジェクトやプロパティを操作するいろいろな方法があります。
ラ@ @フサ@ @クルのコ@ @ルバックを定義する
サービスの依存が必要なく,エンティティを1つしか操作しないときは,エンティティクラスにコールバックを定義すると良いでしょう:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
——/ src /实体/ Comment.php+ + + b / src /实体/ Comment.php@@ -7,6 +7,7 @@ use Doctrine\DBAL\Types\Types;使用Doctrine\ORM\Mapping作为ORM;# (ORM \实体(repositoryClass: CommentRepository::类))+ # (ORM \ HasLifecycleCallbacks)class注释{#[ORM\Id] @@ -91,6 +92,12 @@ class注释返回$this;}+ # (ORM \ PrePersist)+公共函数setCreatedAtValue+ {+ $this->createdAt = new \DateTimeImmutable();+}+公共函数getConference(): ?会议{返回$this->会议;
ORM \ PrePersist
は,最初にデ,タベ,スに保存されたときにトリガ,として呼ばれるベントです。この@ @ベントの際にsetCreatedAtValue ()
メソッドが呼ばれ,現在の日時がcreatedAt
プロパティにセットされます。
カンファンレンスへスラッグを追加する
/会议/ 1
といったカンファレンスのurlは特に意味はありません。これはデタベスのプラマリキといった実装の詳細に依るものになっています。
代わりに- 2020 /会议/巴黎
といったurlはどうですか?こらの方が良いですね。巴黎- 2020
はカンファレンスのスラッグと呼んでいます。
カンファレンスに鼻涕虫
プロパティを追加しましょう(255文字の長さで可空でない型です):
1
$ob娱乐下载symfony控制台make:实体会议
新しいカラムを追加するのでマグレションファルを作成しましょう:
1
$ob娱乐下载Symfony控制台make:迁移
新しいマ:
1
$ob娱乐下载Symfony控制台原则:迁移:迁移
エラ,になりましたが,想定内のことです。先程スラッグは零
にならないように指定したのですが,マ零
となってしまうからです。修正してみましょう:
12 3 4 5 6 7 8 9 10 11 12 13
——/迁移/ Version00000000000000.php+ + + b /迁移/ Version00000000000000.php@@ -20,7 +20,9 @@ final类Version00000000000000 extends AbstractMigration公共函数up(Schema $ Schema): void{//这个up()迁移是自动生成的,请根据您的需要修改它- $this->addSql('ALTER TABLE conference ADD slug VARCHAR(255) NOT NULL');+ $this->addSql('ALTER TABLE conference ADD slug VARCHAR(255)');+ $this->addSql("UPDATE conference SET slug=CONCAT(LOWER(city), '-', year)");+ $this->addSql('ALTER TABLE conference ALTER COLUMN slug SET NOT NULL');}公共函数关闭(Schema $ Schema):无效
ここでは,カラムを追加し,零
を許容した後に,スラッグに零
でない値をセットします。最後に,スラッグのカラムを零
不可にしています。
请注意
実際のプロジェクトでは,CONCAT(LOWER(城市),'-',年)
ではなく,“本当の”スラッグを使用する必要があります。
これでマ:
1
$ob娱乐下载Symfony控制台原则:迁移:迁移
これで各カンファレンスを探すためにスラッグを使うようにしたので,カンファレンスエンティティを修正して,スラッグがデータベース上でユニークになるようにしましょう:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
——/ src /实体/ Conference.php+ + + b / src /实体/ Conference.php@@ -6,8 +6,10 @@使用App\Repository\ConferenceRepository;使用原则\常见\ \ ArrayCollection集合;使用原则\常见\集合\集合;使用Doctrine\ORM\Mapping作为ORM;+使用Syob娱乐下载mfony \桥\学说\验证器\ \ UniqueEntity约束;# (ORM \实体(repositoryClass: ConferenceRepository::类))+ #【UniqueEntity(“鼻涕虫”)]class Conference {#[ORM\Id] @@ -27,7 +29,7 @@ class Conference #[ORM\OneToMany(mappedBy: ' Conference ', targetEntity: Comment::class, orphanRemoval: true)] private Collection $comments;#[ORM\列(长度:255)]+ #[ORM\列(类型:'string',长度:255,唯一:true)]字符串$slug = null;公共函数__construct()
既にわかっているとは思いますが,ここでマグレションをする必要があります:
1
$ob娱乐下载Symfony控制台make:迁移
1
$ob娱乐下载Symfony控制台原则:迁移:迁移
スラッグを生成する
URLはASCII文字以外を変換する必要があり,正しくスラッグを生成することは,英語圏以外の言語にとって難しいです。例えば,e
をe
に変換する必要があります。
車輪の再発明をせずにSob娱乐下载ymfonyの字符串
コンポ,ネントを使いましょう。文字列からスラッグを生成する方法が実装されています。
会议
クラスに,カンファレンスの情報からスラッグを生成するcomputeSlug ()
メソッドを追加します:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
——/ src /实体/ Conference.php+ + + b / src /实体/ Conference.php@@ -7,6 +7,7 @@使用Doctrine\Common\Collections\ArrayCollection;使用原则\常见\集合\集合;使用Doctrine\ORM\Mapping作为ORM;使用Syob娱乐下载mfony \桥\学说\验证器\ \ UniqueEntity约束;+使用Syob娱乐下载mfony轰\组件\字符串\ \ SluggerInterface;#[ORM\Entity(repositoryClass: ConferenceRepository::class)] #[UniqueEntity('slug')] @@ -47,6 +48,13 @@ class Conference return $this->id;}+公共函数computeSlug+ {+ if (!$这->鼻涕虫|| '-' === $this->slug) {+ $ this - >蛞蝓=(字符串)重击者- >蛞蝓((字符串)这个美元)- >低();+}+}+公共函数getCity(): ?string{返回$this->city;
computeSlug ()
メソッドは,現在のスラッグが何も指定していないか-
と値が渡ったときのみ動作します。-
の値は,バックエンドでカンファレンスを追加するときにスラッグが必須となるので使用します。空ではないこの特別な値でアプリケ,ションにスラッグを自動生成させることができます。
複雑なラ@ @フサ@ @クルのコ@ @ルバックを定義する
createdAt
プロパティのように鼻涕虫
も更新時にcomputeSlug ()
メソッドを呼べば自動的にセットされるようにした方が良いですね。
このメソッドはSluggerInterface
の実装に依存していますので,以前のようにprePersist
ベントに追加することはできません。
代わりに教义エンティティのリスナ,を作成しましょう:
新しくカンファレンスが追加されたとき(perPersist ()
)と更新されたとき(preUpdated ()
)に,スラッグは更新されます。
コンテナにサ,ビスを設定する
まだ,ob娱乐下载Symfonyの鍵となるコンポ,ネントdiコンテナにいて話していませんでした。このコンテナは,サビスを作成したり必要なときに电子邮箱ンジェクトしたりといった管理を行います:
サビスは“グロバル”なオブジェクトで,メラやロガやスラッグ作成などの機能を提供します。これらは主义のエンティティの卫道士ンスタンスのようなデ,タオブジェクトとは違います。
実際は,必要なときにサービスが自動的にインジェクトされるのでコンテナを直接使うことはあまりありません。コンテナは型宣言によってコントロ,ラの引数のオブジェクトを注入します。
前のステップで▪ベントリスナ▪がどうやって登録されたか不思議に思いませんでしたか?コンテナがその役割を担っていました。クラスが特定のインターフェースを実装すると,コンテナは,そのクラスがどうやって登録されるか知ることになるのです。
しかしここでは,クラスはインターフェースの実装や基底クラスの拡張をしていないので,ob娱乐下载Symfonyは自動的に設定することができません。代わりに,アトリビュ,トを使って,ob娱乐下载Symfonyコンテナに登録します:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
——/ src / EntityListener / ConferenceEntityListener.php+ + + b / src / EntityListener / ConferenceEntityListener.php@@ -3,9 +3,13 @@名称空间的应用程序\ EntityListener;使用App \实体\会议;+使用原则\包\ DoctrineBundle \ \ AsEntityListener属性;使用原则\ ORM \ \ LifecycleEventArgs事件;+使用原则\ ORM \事件;使用Syob娱乐下载mfony轰\组件\字符串\ \ SluggerInterface;+#[AsEntityListener(event: Events::prePersist, entity: Conference::class)]+#[AsEntityListener(event: Events::preUpdate, entity: Conference::class)]类ConferenceEntityListener{公共函数__construct(
请注意
教义のイベントリスナーとSymfonyob娱乐下载のイベントリスナーは同じように見えますが,内部では異なるインフラストラクチャーを使っており別物ですので注意してください。
アプリケ,ションでスラッグを使用する
バックエンドでさらにカンファレンスを追加したり,既に登録されているものの年や都市を変更してみましょう。-
を値として使用しなければ,スラッグは更新されません。
最後に行う変更として,コントロ,ラ,やテンプレ,トでカンファレンスのid
を指定する代わりにスラッグ
を使用するように修正しましょう:
12 34 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
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -20,7 +20,7 @@类ConferenceController扩展AbstractController]);}- #[路线(“/会议/ {id}”,名字:“会议”))+ #[路线(“/会议/{蛞蝓}”,名字:“会议”))公共函数show(Request $ Request, Conference $ Conference, CommentRepository $ CommentRepository): Response {$offset = max(0, $ Request ->query->getInt('offset', 0));——/模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -18,7 +18,7 @@Guestbook
{% for conference in conferences %}- - {{conference}}
. Id})}}">{{conference}}+ - {{conference}}
.{% endfor %}
. {% endfor %}
.——/模板/会议/ index.html.twig+ + + b /模板/会议/ index.html.twig@@ -8,7 +8,7 @@{% for conference in meetings %} {{conference}}
. {% for conference in meetings %}
{{conference}- 查看 . id})}}+ 查看 . slug})}} {% endfor %} {% endblock %}——/模板/会议/ show.html.twig+ + + b /模板/会议/ show.html.twig@@ -22,10 +22,10 @@{% endfor %} {% if previous >= 0 %}- > . id, offset: previous})}}"> previous . id, offset: previous}+ < / >{% endif %} {% if next < comments|length %}- 下一个 . id, offset: next})}}+ 下一个 . > . > . >{% endif %} {% else %} 本次会议尚未发布任何评论
これでカンファレンスのペ,ジへスラッグから辿ることができるようになりました:
より深く学ぶために
- 教义ベントシステム(ラフサクルコルバックとリスナとエンティティリスナとラフサクルサブスクラバ);
- 字符串コンポ,ネントのドキュメント;
- サ,ビスコンテナ;
- ob娱乐下载Symfonyサ,ビスのCheat Sheet.