我通过Composer集成了Doctrine 2模块“doctrine-orm-module”等清洁项目ZendSkeletonApplication。 Doctrine CLI可以在vendor / bin中运行。
我有'应用'和'博客'模块,我的模块配置:
<?php
namespace Blog;
return array(
'router' => array(
'routes' => array(
'post' => array(
'type' => 'segment',
'options' => array(
'route' => '/post[/:action][/:id]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'Blog\Controller\Post',
'action' => 'index',
),
),
),
),
),
'controllers' => array(
'invokables' => array(
'Blog\Controller\Post' => 'Blog\Controller\PostController'
),
),
'view_manager' => array(
'template_path_stack' => array(
'blog' => __DIR__ . '/../view',
),
),
'doctrine' => array(
'driver' => array(
__NAMESPACE__ . '_driver' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
'cache' => 'array',
'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
),
'orm_default' => array(
'drivers' => array(
__NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
)
)
)
)
);
如何从YAML文件生成每个模块的实体以及如何配置我的模块数组以使用YAML?例如,我在ZendSkeletonApplication / mapping / yml中拥有我的所有.yml文件,并且很少.yml文件具有Blog模块实体的定义,很少有应用程序模块实体的定义。
我的实体位于博客模块的Blog / src / Blog / Entity文件夹中。所有我想在Doctrine CLI中只需一次调用generate-entities从所有.yml文件创建所有实体,这些文件放在mapping / yml文件夹中?可能吗?任何人都可以提供带有doctrine配置的简单示例吗?
答案 0 :(得分:2)
以下方法快速而肮脏的方法对我有用:
将以下行添加到... vendor \ doctrine \ doctrine-module \ bin \ doctrine-module.php:
$driverImpl = new \Doctrine\ORM\Mapping\Driver\YamlDriver(
array("YOUR_PATH_TO_YAML_FILES"));
/* @var $em \Doctrine\ORM\EntityManager */
$em = $application->getServiceManager()->get('doctrine.entitymanager.orm_default');
$em->getConfiguration()->setMetadataDriverImpl($driverImpl);
//...old code...
/* @var $cli \Symfony\Component\Console\Application */
$cli = $application->getServiceManager()->get('doctrine.cli');
现在您可以在命令行界面上使用doctrine-module.php来调用
orm:generate-entities --generate-annotations=1 PATH_TO_YOUR_ENTITY_CLASSES
注意命名空间。 YAML驱动程序期望namespace.entity.dcm.yml是\ Namespace \ Entity YAML文件的名称。该工具将为您创建PATH_TO_YOUR_ENTITY_CLASSES \ Namespace \ Entity.php。
如果您想更频繁地使用此方法,可以更清楚地沿着这些行和add a new command to the cli扩展Doctrine \ ORM \ Tools \ Console \ CommandGenerateEntitiesCommand。
答案 1 :(得分:2)
在module.config.php上以这种方式配置您的学说驱动程序
'doctrine' => array(
'driver' => array(
'orm_default' => array(
'drivers' => array(
'Application\Entity' => 'application_entities_yaml'
//replace Application by your module namespace
),
),
'application_entities_yaml' => array(
'class' => 'Doctrine\ORM\Mapping\Driver\YamlDriver',
'paths' => array(__DIR__ . '/../src/' .__NAMESPACE__. '/Yml/')
//should be where are yours Yml files.
),
),
),
答案 2 :(得分:1)
要解决此问题,请确保已生成为其指定命名空间的实体。你的命令行应该是这样的:
vendor/doctrine/doctrine-module/bin/doctrine-module orm:convert-mapping annotation module/MyNamespace/src/ --namespace="MyNamespace\Entity\\" --from-database
如果没有选项 - namespace ,您的实体将不在命名空间内,因此该学说无法找到您的实体。
从这里你可以使用像orm:generate-repositories(你需要配置指定存储库名称的实体)这样的其他doctrine命令,如下所示:
<?php
namespace MyNamespace\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="MyNamespace\Repository\UserRepository")
*/
class User
{
.....
}
答案 3 :(得分:0)
DoctrineModule
没有正式支持实体生成。使用ORM的本机CLI(./vendor/bin/doctrine
)生成实体,然后将它们移动到模块中的所需位置。