Symfony 6 induk pengawal kepada suntikan pergantungan pengawal kanak-kanak
P粉208469050
2023-08-17 20:19:03
<p>Saya mempunyai kelas pengawal asas yang mengandungi beberapa kaedah utiliti yang digunakan oleh semua pengawal kanak-kanak. Pada masa ini ia mempunyai 3 kebergantungan, tetapi mungkin terdapat lebih banyak pada masa hadapan. Oleh itu, apabila saya ingin menambah kebergantungan pada pengawal kanak-kanak, saya kini menghadapi masalah di mana saya fikir terdapat terlalu banyak arahan untuk suntikan ketergantungan. </p>
<pre class="brush:php;toolbar:false;">abstract class BaseController memanjangkan AbstractController
{
fungsi awam __build(
baca sahaja dilindungi SerializerInterface $serializer,
dilindungi baca sahaja ValidatorInterface $validator,
baca sahaja ResponseGenerator $responseGenerator,
) {
}
...
}
kelas ChildController memanjangkan BaseController
{
// Semua suntikan kelas ibu bapa diperlukan dalam semua kelas kanak-kanak.
fungsi awam __build(
SerializerInterface $serializer,
ValidatorInterface $validator,
ResponseGenerator $responseGenerator,
peribadi baca sahaja SomeRepository $someRepository,
...masukkan sebarang kebergantungan khusus pengawal kanak-kanak lain di sini.
) {
ibu bapa::__construct($serializer, $validator, $responseGenerator);
}
...
}</pre>
<p>Saya cuba menggunakan <code>$this->container->get('serializer')</code> dalam pengawal asas, tetapi itu tidak berjaya kerana <code>AbstractController: : $container</code> ditakrifkan melalui suntikan, tetapi tidak mempunyai pembina, jadi <code>parent::__construct()</code> Selain itu, ia tidak memberi saya <code>validator</code>, jadi walaupun ia berfungsi, ia hanya menyelesaikan sebahagian daripada masalah. </p>
<p>Saya cuba mencari sifat yang boleh saya gunakan, seperti </p>
<pre class="brush:php;toolbar:false;">abstract class BaseController memanjangkan AbstractController
{
#[Suntikan]
dilindungi baca sahaja SerializerInterface $serializer;
#[Suntikan]
dilindungi baca sahaja ValidatorInterface $validator;</pre>
<p>Tetapi tiada yang serupa ditemui (PHP-DI memilikinya, tetapi Symfony tidak). </p>
<p>Adakah terdapat cara untuk menghapuskan kebergantungan pendua dalam pengawal anak? </p>
Apa yang anda perlukan ialah dipanggil pelanggan perkhidmatan
Dalam Symfony, apabila pengawal mewarisi
AbstractController
, mereka adalah pelanggan perkhidmatan, yang bermaksud mereka disuntik ke dalam bekas kecil yang mengandungi beberapa perkhidmatan biasa (seperti ranting, penyeri bersiri, pembina borang, dll.).Jika anda mahukan beberapa perkhidmatan "biasa" yang akan digunakan oleh pengawal anak anda, anda boleh melanjutkan senarai dengan mengatasinya
getSubscribedServices()
dalam pengawal induk. Atau jika pengawal anda tidak mewarisi pengawal lalai yang disediakan oleh Symfony, anda hanya perlu melaksanakan pengawal anda sendiri:Jika pengawal anda adalah perkhidmatan (saya rasa sudah ada), Symfony akan menggunakan suntikan setter untuk menyuntik bekas ke dalam pengawal anda.
Kod akan kelihatan seperti ini: