출처 : https://www.cikorea.net/bbs/view/tip?idx=21004&lists_style=

 

준비물 :

컴포저

컴포저로 설치 된 코드이그나이터 (본인은 3.1.10 에서 진행했습니다.)

MariaDB

(추가) PHP 7.1 버전 이상 .. (본인은 7.3에서 진행했습니다.)

 

그럼 시작하도록 하겠습니다.

packgist 에서 검색하면 제일 많이 사용한 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 에 대한 자세한 사용방법은

https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/cookbook/integrating-with-codeigniter.html

여기서 확인해주세요.