The PHP Practitioner 07 - PDO (2)
29 Dec 2019 | Laracast PHPLaracasts - 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