将gedmo / doctrine扩展与Codeigniter

时间:2015-07-09 05:31:39

标签: php doctrine-orm codeigniter-3

我已经在我新创建的项目中使用此repo和其他网站的CodeIgniter 3.0项目集成了doctrine orm。

现在,我想使用doctrine扩展,gedmo及其不工作但也没有错误但是当我尝试在数据库上创建一行时,它说created_at不能为null,它有Gedmo / Timestampable来获取当前日期时间。 / p>

这是我的Doctrine.php文件

<?php

if (!defined('BASEPATH')) exit('No direct script access allowed');

use Doctrine\Common\ClassLoader,
    Doctrine\ORM\Configuration,
    Doctrine\ORM\EntityManager,
    Doctrine\Common\Cache\ArrayCache,
    Doctrine\Common\Annotations\AnnotationReader,
    Doctrine\ORM\Mapping\Driver\AnnotationDriver,
    Doctrine\DBAL\Logging\EchoSQLLogger,
    Doctrine\Common\EventManager;

use Gedmo\Timestampable\TimestampableListener,
    Gedmo\Sluggable\SluggableListener;

class Doctrine {

public $em = null;

public function __construct()
{
    // load database configuration from CodeIgniter
    require_once APPPATH.'config/database.php';


    //A Doctrine Autoloader is needed to load the models
    // first argument of classloader is namespace and second argument is path
    // setup models/entity namespace
    $entityLoader = new ClassLoader('models', APPPATH);
    $entityLoader->register();

    foreach (glob(APPPATH.'modules/*', GLOB_ONLYDIR) as $m) {
        $module = str_replace(APPPATH.'modules/', '', $m);
        $entityLoader = new ClassLoader($module, APPPATH.'modules');
        $entityLoader->register();
    }
    //Register proxies namespace
    $proxyLoader = new ClassLoader('Proxies', APPPATH.'Proxies');
    $proxyLoader->register();


    // Set up caches
    $config = new Configuration;
    $cache = new ArrayCache;
    $config->setMetadataCacheImpl($cache);
    $driverImpl = $config->newDefaultAnnotationDriver(array(APPPATH.'models'));
    $config->setMetadataDriverImpl($driverImpl);
    $config->setQueryCacheImpl($cache);

    // Set up entity
    $reader = new AnnotationReader($cache);
    $models = array(APPPATH.'models');
    foreach (glob(APPPATH.'modules/*/models', GLOB_ONLYDIR) as $m)
        array_push($models, $m);
    $driver = new AnnotationDriver($reader, $models);
    $config->setMetadataDriverImpl($driver);

    // Setup Gedmo
    $cachedAnnotationReader = new Doctrine\Common\Annotations\CachedReader(
        $reader, // use reader
        $cache // and a cache driver
    );

    // create a driver chain for metadata reading
    $driverChain = new Doctrine\ORM\Mapping\Driver\DriverChain();

    // load superclass metadata mapping only, into driver chain
    // also registers Gedmo annotations.NOTE: you can personalize it
    Gedmo\DoctrineExtensions::registerAbstractMappingIntoDriverChainORM(
        $driverChain, // our metadata driver chain, to hook into
        $cachedAnnotationReader // our cached annotation reader
    );

    $event = new EventManager;

    $timestampableListener = new TimestampableListener;
    $timestampableListener->setAnnotationReader($cachedAnnotationReader);
    $event->addEventSubscriber($timestampableListener);

    $slugListener = new SluggableListener;
    $slugListener->setAnnotationReader($cachedAnnotationReader);
    $event->addEventSubscriber($slugListener);


    // Proxy configuration
    $config->setProxyDir(APPPATH.'/proxies');
    $config->setProxyNamespace('Proxies');

    // Set up logger
    // $logger = new EchoSQLLogger;
    // $config->setSQLLogger($logger);

    $config->setAutoGenerateProxyClasses( TRUE );

    // 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);
}

}

谁能说出来,我错过了什么?

2 个答案:

答案 0 :(得分:0)

你需要打电话给Gedmo!

        // Set up models loading
    $loader = new ClassLoader('models', APPPATH);
    $loader->register();
    foreach (glob(APPPATH . 'modules/*', GLOB_ONLYDIR) as $m) {
        $module = str_replace(APPPATH . 'modules/', '', $m);
        $loader = new ClassLoader($module, APPPATH . 'modules');
        $loader->register();
    }

    // Set up Gedmo
    $classLoader = new ClassLoader('Gedmo', APPPATH . 'third_party');
    $classLoader->register();
    $evm = new EventManager;
    // timestampable
    $evm->addEventSubscriber(new TimestampableListener);
    // sluggable
    $evm->addEventSubscriber(new SluggableListener);
    // tree
    $evm->addEventSubscriber(new TreeListener);

    // Set up proxies loading
    $loader = new ClassLoader('Proxies', APPPATH . 'Proxies');
    $loader->register();

    // Set up caches
    $config = new Configuration;
    $cache = new ArrayCache;
    $config->setMetadataCacheImpl($cache);

    // Set up models
    $models = array(APPPATH . 'models');
    foreach (glob(APPPATH . 'modules/*/models', GLOB_ONLYDIR) as $m)
        array_push($models, $m);
    // Set up driver
    $driverImpl = $config->newDefaultAnnotationDriver($models);
    $config->setMetadataDriverImpl($driverImpl);
    $config->setQueryCacheImpl($cache);


    // Proxy configuration
    $config->setProxyDir(APPPATH . 'Proxies'); //must be set to chmod 777
    $config->setProxyNamespace('Proxies');

答案 1 :(得分:0)

我制作了这个解决方案,用于集成Doctrine 2 + Codeigniter 3 HMVC + composer

我使用composer

安装了Doctrine
"minimum-stability": "stable",
"require": {        
    "doctrine/orm": "2.4.*",
    "gedmo/doctrine-extensions": "2.4.*",
    "phpmailer/phpmailer": "5.2.8"
}

架构

-application
    --config
    --...
    --libraries
    ---Doctrine.php
    --vendor
    --proxies (must be set to 777)
    --composer.json

然后我通过autoload.php文件调用了doctrine $ autoload ['libraries'] = array('doctrine');

然后创建我的Doctrine.php文件,如下所示:

use Doctrine\Common\ClassLoader,
    Doctrine\ORM\Configuration,
    Doctrine\ORM\EntityManager,
    Doctrine\Common\Cache\ArrayCache,
    Doctrine\DBAL\Logging\EchoSQLLogger,
    Doctrine\DBAL\Event\Listeners\MysqlSessionInit,
    Doctrine\ORM\Tools\SchemaTool,
    Doctrine\Common\EventManager,
    Doctrine\Common\Annotations\AnnotationReader,
    Doctrine\ORM\Mapping\Driver\AnnotationDriver,
    Gedmo\Timestampable\TimestampableListener,
    Gedmo\Sluggable\SluggableListener,
    Gedmo\Tree\TreeListener
    ;

class Doctrine {

public $em = null;
public $tool = null;

public function __construct()
{

    // Is the config file in the environment folder?
    if (!defined('ENVIRONMENT') OR !file_exists($file_path = APPPATH . 'config/' . ENVIRONMENT . '/database.php')) {
        $file_path = APPPATH.'config/database.php';
    }
    // load database configuration from CodeIgniter
    require $file_path;


    // Set up class loading. You could use different autoloaders, provided by your favorite framework,
    // if you want to.
    require_once APPPATH.'vendor/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.'proxies');
    $proxiesClassLoader->register();


    foreach (glob(APPPATH . 'modules/*', GLOB_ONLYDIR) as $m) {
        $module = str_replace(APPPATH . 'modules/', '', $m);
        $loader = new ClassLoader($module, APPPATH . 'modules');
        $loader->register();
    }


    $evm = new EventManager;
    // timestampable
    $evm->addEventSubscriber(new TimestampableListener);
    // sluggable
    $evm->addEventSubscriber(new SluggableListener);
    // tree
    $evm->addEventSubscriber(new TreeListener);


    // Set up caches
    $config = new Configuration;
    $cache = new ArrayCache;
    $config->setMetadataCacheImpl($cache);
    $driverImpl = $config->newDefaultAnnotationDriver(array(APPPATH.'models/Entities'));
    $config->setMetadataDriverImpl($driverImpl);
    $config->setQueryCacheImpl($cache);

    $config->setQueryCacheImpl($cache);

    // Proxy configuration
    $config->setProxyDir(APPPATH.'/proxies'); //must be set to 777
    $config->setProxyNamespace('Proxies');

    // Set up logger
    $logger = new EchoSQLLogger;
    $config->setSQLLogger($logger);



    if (ENVIRONMENT == "development") {
        $config->setAutoGenerateProxyClasses( TRUE );
    } else {
        $config->setAutoGenerateProxyClasses( FALSE );
    }


    // Database connection information
    $connectionOptions = array(
        'driver' => 'pdo_mysql',
        'user' =>     $db[$active_group]['username'],
        'password' => $db[$active_group]['password'],
        'host' =>     $db[$active_group]['hostname'],
        'dbname' =>   $db[$active_group]['database']
    );

    // Create EntityManager
    $this->em = EntityManager::create($connectionOptions, $config);


    // Force UTF-8
    $this->em->getEventManager()->addEventSubscriber( new MysqlSessionInit('utf8', 'utf8_unicode_ci'));

    // Schema Tool
    $this->tool = new SchemaTool($this->em);

}
}

它有效,希望这会有所帮助,:)