해리의 데브로그

The PHP Practitioner 07 - PDO (2)

|

Laracasts - The PHP Practitioner 강의를 듣고 정리한 포스팅 입니다.

1. PDO Refactoring

앞 포스팅 코드를 기반으로 refactoring을 진행할 수 있음. 데이터베이스에 연결 & 쿼리 실행 + 데이터 갖고오기의 코드를 database라는 디렉토리 내에 각각 세분화 시킬 수 있음.

  • Connection.php - 데이터 베이스 연결
  • QueryBuilder.php - 쿼리 실행 + 데이터 갖고오기

Static method는 인스턴스를 생성하지 않고도 전역으로 접근할 수 있게 함. :: 는 static method임을 지칭함

// Connection.php
class Connection
{
    # way to make a method accessible globally without requiring instance
    public static function make()
    {
        try {
            return new PDO('mysql:host=localhost;dbname=mytodo;', 'root', '111111');
        } catch (PDOException $e) {
            die($e->getMessage());
        }
    }
}

// general method
$connection = new Connection();
$connection->make();

// static method
$Connection::make();

2. QueryBuilder.php

PDO 객체를 외부로부터 받아 생성자 메서드인 __construct의 인자로 할당시킴. 모든 데이터를 가지고오는 selectAll 함수를 QueryBuilder 의 메서드로 생성

// QueryBuilder.php
<?php

class QueryBuilder
{
    protected $pdo;

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    public function selectAll($table)
    {
        $statement = $this->pdo->prepare("select * from {$table}");
        $statement->execute();
        return $statement->fetchAll(PDO::FETCH_CLASS);
    }
}

3. Bootstrap.php

Connection.php & QueryBuilder.php는 데이터베이스를 다루는 코드로 index.php에서 해당 파일들을 require 로 호출하는 것은 선호되는 모습은 아님.

따라서 behind the scence 을 관장하는 bootstrap.php 파일을 생성하여 Connection.php와 QueryBuilder.php를 연결시키는 로직을 작성

<?php

# bootstrap: responsible for behind the scene
require 'database/Connection.php';
require 'database/QueryBuilder.php';

// option 1.
//$pdo = Connection::make();
//$query = new QueryBuilder($pdo);

// option 2.
//$query = new QueryBuilder(Connection::make());

// option 3.
return new QueryBuilder(
    Connection::make()
);

4. index.php

  • bootstrap.php
    • Connection::make : 스태틱 메서드인 make 가 호출되며 make 는 PDO 객체를 반환함.
    • bootstrap.php는 make 로 부터 반환된 PDO 객체를 바탕으로 QueryBuilder 인스턴스 객체를 반환하여 반환 값을 $query 변수에 저장
  • $query (QueryBuilder 인스턴스 객체가 저장된 변수) 에서 모든 데이터를 갖고오는 메서드 selectAll 을 호출하며, 이때 테이블명에 해당하는 todos 를 파라미터로 넘김.
  • 해당 로직의 값을 $tasks 에 저장시키며, 렌더링된 값이 index.view.php 를 통해 표시됨.
<?php

$query = require 'bootstrap.php';

$tasks = $query->selectAll('todos');

require 'index.view.php';

Comments