okapon/doctrine-set-type-bundle

为 Symfony2 应用程序提供 Doctrine2 对 MySQL SET 类型的支持。

安装量: 154,170

依赖者: 0

建议者: 0

安全: 0

星标: 11

关注者: 2

分支: 10

开放问题: 3

类型:symfony-bundle

v0.5.0 2017-01-29 07:09 UTC

This package is auto-updated.

Last update: 2024-09-22 14:13:37 UTC


README

DoctrineSetTypeBundle 为您的 Symfony2 或 Symfony3 应用程序提供对 MySQL SET 类型的支持。

Latest Stable Version Total Downloads Build Status Scrutinizer Code Quality Code Coverage

License

特性

  • mysql 的 SET 类型映射
  • SET 类型验证
  • Doctrine 迁移

要求

  • PHP ~5.5
  • Symfony ~2.6 或 ~3.0
  • Doctrine ~2.3

支持的平台

  • MySQL

安装

步骤 1: 下载包

使用 composer

$ composer require okapon/doctrine-set-type-bundle "0.5.0"

步骤 2: 启用 Bundle

然后,通过在项目的 app/AppKernel.php 文件中添加以下行来启用 Bundle

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...

            new Okapon\DoctrineSetTypeBundle\OkaponDoctrineSetTypeBundle(),
        );

        // ...
    }

    // ...
}

步骤 3: 启用 mapping_type

为了使用 MySQL SET 类型,在 app/config/confing.yml 中添加以下行

doctrine:
    dbal:
        mapping_types:
            set: string

用法

创建您的 SET 类型类

示例:UserGroupType 类

此类是一个示例,用户有多个组,这些组是 mysql set 类型。

然后,创建 UserGroupType 并扩展 AbstractSetType。

<?php

namespace AppBundle\DBAL\Types;

use Okapon\DoctrineSetTypeBundle\DBAL\Types\AbstractSetType;

class UserGroupType extends AbstractSetType
{
    const GROUP1 = 'group1';
    const GROUP2 = 'group2';
    const GROUP3 = 'group3';

    /**
     * {@inheritdoc}
     */
     protected $name = 'UserGroupType'; // This is Optional. Automatically registered shord class name.

    /**
     * define your SET type.
     */
    protected static $choices = [
        self::GROUP1 => 'Group 1',
        self::GROUP2 => 'Group 2',
        self::GROUP3 => 'Group 3',
    ];
}

或者,您可以在实体中定义 set 类型定义,通过覆盖 AbstractSetType::getChoices() 方法。

class UserGroupType extends AbstractSetType
{
    public static function getChoices()
    {
        return User::getGroupChoices();
    }
}

class User
{
    public static function getGroupChoices()
    {
        return [
            self::GROUP1 => 'Group 1',
            self::GROUP2 => 'Group 2',
            self::GROUP3 => 'Group 3',
        ];
    }
}

注册您的类型

config.yml 中注册 UserGroupType

doctrine:
    dbal:
        ## ...
        types:
            UserGroupType: AppBundle\DBAL\Types\UserGroupType

向实体添加映射数据

这是一个注解示例。

<?php

namespace AppBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;
use Okapon\DoctrineSetTypeBundle\Validator\Constraints as DoctrineAssert;
use AppBundle\DBAL\Types\UserGroupType;

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity
 */
class User
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="username", type="string", length=50)
     */
    private $username;

    /**
     * @var array
     *
     * @DoctrineAssert\SetType(class="AppBundle\DBAL\Types\UserGroupType")
     * @ORM\Column(name="groups", type="UserGroupType", nullable=true) // mapping_type
     */
    private $groups;

    // ...

    /**
     * Set groups
     *
     * @param array $groups
     * @return User
     */
    public function setGroups(array $groups)
    {
        $this->groups = $groups;

        return $this;
    }

    /**
     * Get groups
     *
     * @return array
     */
    public function getGroups()
    {
        return $this->groups;
    }
}

您可以使用数组设置 User 实体的 Groups。

$user->setGroups([UserGroupType::GROUP1, UserGroupType::GROUP2]);

您还可以通过添加以下注解来验证您的类型。

    /**
     * @DoctrineAssert\SetType(class="AppBundle\DBAL\Types\UserGroupType")
     */
    private $groups;

构建表单

null 传递给第二个参数。

SetTypeGuesser 扩展 ChoiseType 并将字段渲染为复选框。

因此,您可以使用选择字段类型选项。(请参阅 选择字段类型

$builder->add('groups', null, [
    'required' => true,
    'invalid_message' => 'Given values are invalid!!'
]);

Doctrine 迁移

以下 SQL 将执行。

CREATE TABLE user (
    id INT AUTO_INCREMENT NOT NULL,
    username varchar(50) COLLATE utf8_unicode_ci NOT NULL,
    groups set('group1','group2') DEFAULT NULL COMMENT '(DC2Type:UserGroupType)',
    PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB