Tôi đã sử dụng một giải pháp hơi khác với các dịch vụ phụ huynh của Symfony2.
Trước hết, tôi tạo một dịch vụ gốc, một lớp GenericRepository
hiển thị một vài phương pháp và giúp cuộc sống dễ dàng hơn trong trường hợp chúng tôi muốn cấu trúc lại mã của chúng tôi trong tương lai.
services.yml
acme_core.generic_repository:
abstract: true
class: Acme\Bundle\CoreBundle\Repository\GenericRepository
arguments: [@doctrine.orm.entity_manager]
Acme\Bundle\CoreBundle\Repository\GenericRepository
<?php
namespace Acme\Bundle\CoreBundle\Repository;
use Doctrine\ORM\EntityManager;
/**
* Class GenericRepository
* @package Acme\Bundle\CoreBundle\Repository
*/
abstract class GenericRepository {
/**
* @var EntityManager
*/
private $entityManager;
/**
* @param EntityManager $entityManager
*/
public function __construct(EntityManager $entityManager) {
$this->entityManager = $entityManager;
}
/**
* @return EntityManager
*/
public function getEntityManager() {
return $this->entityManager;
}
/**
* @return \Doctrine\DBAL\Connection
*/
public function getConnection() {
return $this->getEntityManager()->getConnection();
}
/**
* @return string
*/
abstract function getTable();
}
Bây giờ chúng ta muốn xác định một kho lưu trữ mới:
services.yml
# Repositories
acme_product.repository.product_batch:
parent: acme_core.generic_repository
class: Acme\Bundle\ProductBundle\Repository\ProductBatchRepository
Acme\Bundle\ProductBundle\Repository\ProductBatchRepository
<?php
namespace Acme\Bundle\ProductBundle\Repository;
use Acme\Bundle\CoreBundle\Repository\GenericRepository;
/**
* Class ProductBatchRepository
* @package Acme\Bundle\ProductBundle\Repository
*/
class ProductBatchRepository extends GenericRepository {
/**
* @param int $batchId
* @return integer The number of affected rows.
*/
public function deleteBatch($batchId) {
$table = $this->getTable();
return $this->getConnection()->delete($table, [
'id' => $batchId
]);
}
/**
* {@inheritdoc}
*/
public function getTable() {
return 'product_batch';
}
}
Phương pháp deleteBatch()
tạo ra và thực hiện các truy vấn sau đây:
DELETE FROM product_batch WHERE id = ?
Cuối cùng trong bộ điều khiển của chúng tôi:
public function deleteAction() {
$batchId = $this->getRequest()->get('batchId');
$affectedRows = $this->get('acme_product.repository.product_batch')->deleteBatch($batchId);
return $this->render(/**/);
}
Để biết thêm thông tin và quản lý thực thể/kết nối cách sử dụng, vui lòng tham khảo tài liệu chính thức: http://doctrine-orm.readthedocs.org/en/latest/reference/native-sql.html
Xin lỗi, tôi có nghĩa là kho lưu trữ không được liên kết với bất kỳ pháp nhân nào. Vì vậy, tại sao điều siêu dữ liệu? – gremo
@Gremo trong trường hợp đó nó sẽ có ý nghĩa để chỉ cần tạo ra một dịch vụ bổ sung và tiêm một kết nối cơ sở dữ liệu chính nó. – gilden
sau khi tiêm database_connection tôi chỉ nên tạo một lớp kế thừa từ EntityRepository, tôi có đúng không? – gremo