Mục tiêu
Như tôi thấy, mục tiêu của bạn trong trường hợp này gấp đôi:
- tạo và duy trì một kết nối duy nhất / có thể tái sử dụng cho mỗi cơ sở dữ liệu
- đảm bảo rằng kết nối đã được thiết lập đúng cách
Giải pháp
Tôi khuyên bạn nên sử dụng cả hàm ẩn danh và mẫu xuất xưởng để xử lý kết nối PDO. Việc sử dụng nó sẽ như thế này:
$provider = function()
{
$instance = new PDO('mysql:......;charset=utf8', 'username', 'password');
$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$instance->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
return $instance;
};
$factory = new StructureFactory( $provider );
Sau đó, trong một tệp khác hoặc thấp hơn trong cùng một tệp:
$something = $factory->create('Something');
$foobar = $factory->create('Foobar');
Bản thân nhà máy sẽ trông giống như sau:
class StructureFactory
{
protected $provider = null;
protected $connection = null;
public function __construct( callable $provider )
{
$this->provider = $provider;
}
public function create( $name)
{
if ( $this->connection === null )
{
$this->connection = call_user_func( $this->provider );
}
return new $name( $this->connection );
}
}
Bằng cách này sẽ cho phép bạn có một cấu trúc tập trung, đảm bảo rằng kết nối chỉ được tạo khi được yêu cầu. Nó cũng sẽ làm cho quá trình kiểm tra đơn vị và bảo trì dễ dàng hơn nhiều.
Nhà cung cấp trong trường hợp này sẽ được tìm thấy ở đâu đó ở giai đoạn bootstrap. Cách tiếp cận này cũng sẽ cung cấp một vị trí rõ ràng để xác định cấu hình mà bạn sử dụng để kết nối với DB.
Hãy nhớ rằng đây là một ví dụ cực kỳ đơn giản . Bạn cũng có thể được lợi khi xem hai video sau:
Ngoài ra, tôi thực sự khuyên bạn nên đọc hướng dẫn thích hợp về việc sử dụng PDO (có một nhật ký hướng dẫn trực tuyến không tốt).