Saya telah membuat layanan saya sendiri dan saya perlu memasukkan EntityManager doktrin, tetapi saya tidak melihat itu __construct()
dipanggil di layanan saya, dan injeksi tidak berfungsi.
Ini kode dan konfigurasinya:
<?php
namespace Test\CommonBundle\Services;
use Doctrine\ORM\EntityManager;
class UserService {
/**
*
* @var EntityManager
*/
protected $em;
public function __constructor(EntityManager $entityManager)
{
var_dump($entityManager);
exit(); // I've never saw it happen, looks like constructor never called
$this->em = $entityManager;
}
public function getUser($userId){
var_dump($this->em ); // outputs null
}
}
Ini services.yml
di bundel saya
services:
test.common.userservice:
class: Test\CommonBundle\Services\UserService
arguments:
entityManager: "@doctrine.orm.entity_manager"
Saya telah mengimpor .yml itu di config.yml
aplikasi saya seperti itu
imports:
# a few lines skipped, not relevant here, i think
- { resource: "@TestCommonBundle/Resources/config/services.yml" }
Dan ketika saya memanggil layanan di pengontrol
$userservice = $this->get('test.common.userservice');
$userservice->getUser(123);
Saya mendapatkan objek (bukan null), tetapi $this->em
di UserService adalah null, dan seperti yang telah saya sebutkan, konstruktor di UserService tidak pernah dipanggil
Satu hal lagi, Controller dan UserService berada dalam bundel yang berbeda (saya benar-benar membutuhkannya agar proyek tetap teratur), tetapi tetap saja: semuanya berfungsi dengan baik, saya bahkan dapat menelepon
$this->get('doctrine.orm.entity_manager')
dalam kontroler yang sama yang saya gunakan untuk mendapatkan UserService dan mendapatkan objek EntityManager yang valid (bukan null).
Sepertinya saya kehilangan bagian konfigurasi atau beberapa link antara UserService dan konfigurasi Doctrine.
sumber
__constructor
juga kesalahannya.Jawaban:
Metode konstruktor kelas Anda harus dipanggil
__construct()
, bukan__constructor()
:sumber
public function __construct(EntityManagerInterface $entityManager)
Untuk referensi modern, di Symfony 2.4+, Anda tidak dapat lagi memberi nama argumen untuk metode Injeksi Konstruktor. Menurut dokumentasi Anda akan meneruskan:
Dan kemudian mereka akan tersedia dalam urutan mereka terdaftar melalui argumen (jika ada lebih dari 1).
sumber
Catatan pada Symfony 3.3 EntityManager disusutkan. Gunakan EntityManagerInterface sebagai gantinya.
sumber
Sejak 2017 dan Symfony 3.3 Anda dapat mendaftarkan Repositori sebagai layanan , dengan segala kelebihan yang dimilikinya.
Periksa posting saya Cara menggunakan Repositori dengan Doctrine as Service di Symfony untuk penjelasan yang lebih umum.
Untuk kasus khusus Anda, kode asli dengan penyetelan akan terlihat seperti ini:
1. Gunakan dalam layanan atau Kontroler Anda
2. Buat repositori kustom baru
3. Daftarkan layanan
sumber