Dev/Programming
[php] 코드이그나이터 (Codeigniter) 에서 ORM(Object-Relational Mapping) 사용하기
2019. 4. 1. 11:30출처 : https://www.cikorea.net/bbs/view/tip?idx=21004&lists_style= (본인 작성)
준비물 :
컴포저
컴포저로 설치 된 코드이그나이터 (본인은 3.1.10 에서 진행했습니다.)
MariaDB
(추가) PHP 7.1 버전 이상 .. (본인은 7.3에서 진행했습니다.)
그럼 시작하도록 하겠습니다.
packgist 에서 검색하면 제일 많이 사용한 ORM 이라면서 Doctrine 이 최상단에 나옵니다. 이걸 설치할 겁니다.
composer require doctrine/orm
php composer.phar require doctrine/orm
로 컴포저를 통해 doctrine 을 설치합니다.
이후 vendor 디렉토리에서 composer.json 을 설정해줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 | { "require": { "codeigniter/framework": "^3.1", "doctrine/orm": "*" }, "autoload": { "psr-4": { "": "vendor/codeigniter/framework/application/models/Entities" } }
} |
autoload 에서 저 경로는 수정해주셔도 됩니다.
키에 해당하는 저 "" 는 네임스페이스가 되는 것 같은데, 저기에 값을 넣어주게되면 오토로딩이 제대로 안되는 것 같아요.
다른 분들은 어떠실지 모르겠네요.
(컴포저 업데이트하게되면 vendor/composer/autoload_psr4.php 여기에 해당 오토로딩 위치가 나오게 되니 참고하시면 됩니다.)
아무튼 저렇게 수정해주고
컴포저에 composer update 혹은 심볼릭 링크 안 거신 저 같은 분들은
php composer.phar update
이런식으로 설치하면 의존성 패키지랑 같이 설치가 됩니다.
이후
vendor/codeigniter/framework/application/libraries
이쪽으로 가셔서 Doctrine.php 를 생성해 주고 아래와 같이 코드를 넣습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <?php use Doctrine\Common\ClassLoader, Doctrine\ORM\Configuration, Doctrine\ORM\EntityManager, Doctrine\Common\Cache\ArrayCache, Doctrine\DBAL\Logging\EchoSQLLogger;
class Doctrine {
public $em = null;
public function __construct() { // load database configuration from CodeIgniter require_once APPPATH.'config/database.php';
// Set up class loading. You could use different autoloaders, provided by your favorite framework, // if you want to. require_once APPPATH.'../../../doctrine/common/lib/Doctrine/Common/ClassLoader.php';
$doctrineClassLoader = new ClassLoader('Doctrine', APPPATH.'libraries'); $doctrineClassLoader->register(); $entitiesClassLoader = new ClassLoader('models', rtrim(APPPATH, "/" )); $entitiesClassLoader->register(); $proxiesClassLoader = new ClassLoader('Proxies', APPPATH.'models/proxies'); $proxiesClassLoader->register();
// Set up caches $config = new Configuration; $cache = new ArrayCache; $config->setMetadataCacheImpl($cache); // composer 의 경로를 확인하면서 수정해주세요. $driverImpl = $config->newDefaultAnnotationDriver(array(APPPATH.'models/Entities')); $config->setMetadataDriverImpl($driverImpl); $config->setQueryCacheImpl($cache);
// Proxy configuration $config->setProxyDir(APPPATH.'/models/proxies'); $config->setProxyNamespace('Proxies');
// Set up logger // 이 부분의 주석을 해제하면 쿼리가 나옵니다. //$logger = new EchoSQLLogger; //$config->setSQLLogger($logger);
$config->setAutoGenerateProxyClasses( TRUE );
// Load the database configuration from CodeIgniter require APPPATH . 'config/database.php';
// Database connection information $connectionOptions = array( 'driver' => 'pdo_mysql', 'user' => $db['default']['username'], 'password' => $db['default']['password'], 'host' => $db['default']['hostname'], 'dbname' => $db['default']['database'] );
// Create EntityManager $this->em = EntityManager::create($connectionOptions, $config); } } |
주석 잘 유의 하시고 해당 코드를 넣어주세요.
그 다음 해당 위치에서 ../../../../bin/doctrine 를 실행 한번 해줍니다. 이건 사실 정상적으로 동작하는 건지는 잘 모르겠는데
실행했을 경우 별다른 메세지가 나오지 않는다면 정상적으로 경로가 맞다고 볼 수 있겠습니다.
이후에 아까 composer.json 에 설정해둔
1 2 3 4 5 | "autoload": { "psr-4": { "": "vendor/codeigniter/framework/application/models/Entities" } } |
이 위치로 가서 ORM 으로 연동할 php 파일을 만듭니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php
/** * @Entity @Table(name="product") **/
class Product {
/** @Id @Column(type="integer") @GeneratedValue **/ protected $sn;
/** @Column(type="string") **/ protected $name;
public function getName() { return $this->name; }
} |
사용하시는 테이블 명, 클래스 명을 유의해서 넣어주세요. 주석처럼 보이는 저 곳에 값을 넣어주지않으면 에러가 납니다.
그리고 주석에 해당하는 부분에 테이블 명을 꼭 넣어주어야되고, Id 부분에는 Primary Key를 꼭 넣어달라고 하네요.
마지막으로 config/autoload.php 에서 library 쪽에 Doctrine 을 추가해주거나
$this->load->library('doctrine'); 이런식으로 로드를 해주면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public function doctrine() { //오토로딩 안되서 임시방편으로 했던 방법.. //include_once APPPATH.'models/Entities/Product.php'; $em = $this->doctrine->em;
$product = $em->find('Product', 1);
if ($product === null) { echo "No product found.\n"; exit(1); }
echo sprintf("%s\n", $product->getName());
} |
컨트롤러 쪽에서 이런식으로 테스트를 진행했는데 잘 나오네요.
doctrine 에 대한 자세한 사용방법은
여기서 확인해주세요.
'Dev > Programming' 카테고리의 다른 글
홈스테드, 발렛 없이 라라벨 설치하기 (with WSL) (0) | 2019.12.20 |
---|---|
[javascript] 상위 이벤트 전파 막기 (0) | 2019.12.17 |
[javascript] 숨겨진 글자 강제로 클립보드로 복사하기 (0) | 2018.11.30 |
[javascript] 파일 읽기 (0) | 2018.08.09 |
[regex] 비밀번호 유효성 체크 및 정규식 표현 (0) | 2017.11.20 |