radnan/rdn-doctrine

Zend Framework 2 Doctrine ORM桥接器

v1.1.3 2014-09-30 12:00 UTC

This package is not auto-updated.

Last update: 2024-09-24 00:15:23 UTC


README

RdnDoctrine ZF2模块是一个连接到Doctrine ORM库的简单桥接器。

如何安装

  1. 使用composer需要radnan/rdn-doctrine

    $ composer require radnan/rdn-doctrine:1.*
  2. 通过在application.config.php文件中包含它来激活模块

    <?php
    
    return array(
        'modules' => array(
            'RdnDoctrine',
            // ...
        ),
    );

依赖项

本模块依赖于以下模块:RdnConsoleRdnDatabaseRdnFactory

如何使用

可以使用rdn_entity_managers配置选项通过RdnDoctrine\EntityManagerManager服务定位器注册实体管理器。

<?php

return array(
	'rdn_entity_managers' => array(
		'factories' => array(),
		'invokables' => array(),
	),
);

您还可以使用managers键通过简单的配置选项快速生成实体管理器

<?php

return array(
	'rdn_entity_managers' => array(
		'managers' => array(
			'App' => array(
				/* configuration options */
			),
		),
	),
);

配置实体管理器就这么简单!这里我们已配置了一个名为App的实体管理器。假设我们的模块名称也是App,则库将为您设置一些合理的默认值,您都可以覆盖。

默认情况下,管理器将期望您的实体位于App\Entity命名空间内(或更一般地<MANAGER-NAME>\Entity)。

配置文档

控制器插件

一旦配置了实体管理器,您就可以使用entity()插件从您的控制器中访问实体管理器或实体存储库。

由于您可以使用不同的名称注册多个实体管理器,默认情况下,插件将获取与模块名称相同的实体管理器

namespace App\Controller;

use App\Entity;

class User
{
	public function createAction()
	{
		$user = new Entity\User;
		$user->setEmail('pot@example.com');

		$this->entity()->persist($user);
		$this->entity()->flush();
	}
}

为了访问实体存储库,我们调用相同的entity($name)插件,但这次我们提供了一个实体名称

namespace App\Controller;

use App\Entity;

class User
{
	public function editAction()
	{
		$id = $this->params('user-id');

		$user = $this->entity('User')->find($id);

		/**
		 * Alternatively we can be more explicit and request the
		 * User entity within the App module
		 */
		$user = $this->entity('App:User')->find($id);
	}
}

RdnDoctrine\EntityManager\AliasResolver服务用于在未提供别名时解析别名。例如,如果给出的是User而不是App:User

代码补全

如果您想为此插件添加代码补全,请在您的AbstractController类中包含以下内容

namespace App\Controller;

use Zend\Mvc\Controller\AbstractActionController;

/**
 * @method \Doctrine\ORM\EntityRepository|\Doctrine\ORM\EntityManager entity(\string $name = null) Get the entity manager or a repository for given entity name.
 */
abstract class AbstractController extends AbstractActionController
{
}

然后,只需从该抽象控制器扩展您的控制器。

控制台命令

该模块还附带一组控制台命令,用于管理数据库模式和生成代理。

您可以通过运行vendor/bin/console来运行和控制doctrine:命名空间中的控制台命令以获取帮助。

共享实体

通常您将有一个模块包含所有常用实体,例如用户实体等。您还将使用与该模块相同的名称为您的应用程序注册单个实体管理器。

然后,您将为您的站点的每个部分创建单独的模块。每个模块都将依赖由通用模块提供的实体,并提供自己的实体。但所有模块都将使用单个共享实体管理器。

假设我们的通用模块名为App,我们还有一个名为Foo的模块。在这种情况下,Foo模块的配置将如下所示

<?php

return array(
	'rdn_entity_managers' => array(
		'managers' => array(
			'App' => array(
				'table_prefixes' => array(
					'Foo' => 'foo__',
				),
			),
		),

		'modules' => array(
			'Foo' => 'App',
		),
	),
);

这将向App实体管理器添加由Foo(在Foo\Entity命名空间中)提供的实体,并指示所有插件在Foo模块内使用App实体管理器。

namespace Foo\Controller;

class Bar
{
	public function editAction()
	{
		// We can now access the Foo entity repositories
		$bar = $this->entity('Bar')->find($id);
		// - OR - more explicitly
		$bar = $this->entity('Foo:Bar')->find($id);

		// We can also access the App entity repositories
		$user = $this->entity('User')->find($id);
		// - OR - more explicitly
		$user = $this->entity('App:User')->find($id);

		// We have access to the shared entity manager
		$this->entity()->flush();
	}
}