私はIPアドレスとIP範囲を保存しているプロジェクトに取り組んでいます。現在、私のRangeエンティティは2つのIPアドレスエンティティ(ネットワークとブロードキャストエンティティ)への参照を持ち、ホストに対するOneToMany関係を持っています。 IPアドレスエンティティは、IP範囲に対するManyToOne関係を持ちます。これはオプションです。私は新しいIP範囲を作成するときにSymfony3永続生成エンティティ
class IPRange {
/**
* @var int
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// relations to other tables
/**
* @var IPAddress
* @ORM\OneToOne(targetEntity="AppBundle\Entity\IPAddress", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\JoinColumn(name="network", referencedColumnName="id", nullable=false)
*/
private $network;
/**
* @var IPAddress
* @ORM\OneToOne(targetEntity="AppBundle\Entity\IPAddress", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\JoinColumn(name="broadcast", referencedColumnName="id", nullable=false)
*/
private $broadcast;
/**
* @var array
* @ORM\OneToMany(targetEntity="AppBundle\Entity\IPAddress", mappedBy="ipRangeId")
*/
private $hosts;
// entity variables
/**
* @var string
* @ORM\Column(name="description", type="string", length=50, nullable=false)
*/
private $description;
/**
* @var int
* @ORM\Column(name="cidr", type="smallint", nullable=false, options={"unsigned"=true})
*/
private $cidr;
/**
* @var string
* @ORM\Column(name="notes", type="text", length=65535, nullable=true)
*/
private $notes;
// getters and setters not shown
}
私の現在の流れ:
class IPAddress {
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// relations to other tables
/**
* @var IPRange
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\IPRange", inversedBy="hosts", cascade={"persist", "remove"})
* @ORM\JoinColumn(name="ip_range_id", referencedColumnName="id", nullable=true)
*/
private $ipRangeId;
// entity variables
/**
* @var mixed
* @ORM\Column(name="ip_address", type="binary", length=16, nullable=false, unique=true)
* @SIAssert\IpPacked(version="all")
*/
private $ipAddress;
/**
* @var string
* @ORM\Column(name="ip_address_text", type="string", length=50, nullable=false)
*/
private $ipAddressText;
/**
* @var int
* @ORM\Column(name="cidr", type="smallint", nullable=false, options={"unsigned"=true})
*/
private $cidr;
/**
* @var mixed
* @ORM\Column(name="gateway", type="binary", length=16, nullable=false)
*/
private $gateway;
/**
* @var string
* @ORM\Column(name="gateway_text", type="string", length=50, nullable=false)
*/
private $gatewayText;
/**
* @var int
* @ORM\Column(name="type", type="smallint", options={"unsigned"=true})
*/
private $type;
/**
* @var string
* @ORM\Column(name="description", type="string", length=50)
*/
private $description;
// getters and setters not shown
}
そして、私のIP範囲エンティティ:ここ
は、私のIPアドレスエンティティである
- は、新たに生成しますIP範囲エンティティ(表示形式)
- フォームから情報を取得
- IP範囲エンティティの場合はnullを持つIPアドレスのエンティティ(ネットワークとブロードキャストIPアドレスエンティティが作成されていないため、IPアドレスの範囲は、まだ、永続化されません)
- は私のIP範囲エンティティ
- は、そのIDと書き換えを取得存続生成有効なIP範囲エンティティを持つ私のすべてのIPアドレスエンティティ
プログラムでエンティティを作成するには多くの手順が必要なので、私は何かを間違っているはずです。
これを行うには、より効率的な方法がありますか?編集
が...私のフォームタイプを追加...
マイIPRangeType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('description', TextType::class, array(
'required' => true,
'label' => 'Description:',
'label_attr' => array(
'class' => 'text-right middle',
),
))
->add('notes', TextareaType::class, array(
'required' => false,
'label' => 'Notes:',
'label_attr' => array(
'class' => 'text-right middle',
),
))
->add('cidr', ChoiceType::class, array(
'required' => true,
'multiple' => false,
'expanded' => false,
'choices' => array (
'IPv4' => [
'/30 (255.255.255.252)' => 30,
'/29 (255.255.255.248)' => 29,
'/28 (255.255.255.240)' => 28,
'/27 (255.255.255.224)' => 27,
'/26 (255.255.255.192)' => 26,
'/25 (255.255.255.128)' => 25,
'/24 (255.255.255.0)' => 24,
'/23 (255.255.254.0)' => 23,
'/22 (255.255.252.0)' => 22,
'/21 (255.255.248.0)' => 21,
'/20 (255.255.240.0)' => 20,
],
'IPv6' => [
'/64 network' => 64,
]
),
'label' => 'CIDR (subnet):',
'label_attr' => array(
'class' => 'text-right middle',
),
))
->add('network', IPAddressType::class, array(
'required' => true,
))
->add('gateway_select', ChoiceType::class, array(
'mapped' => false,
'required' => true,
'multiple' => false,
'expanded' => false,
'choices' => array (
'- enter in valid IP and CIDR -' => 0,
),
'label' => 'Gateway:',
'label_attr' => array(
'class' => 'text-right middle',
),
))
->add('json_data', HiddenType::class, array(
'mapped' => false,
))
;
}
マイIPAddressType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('ipAddress', TextType::class, array(
'required' => true,
'label' => 'IP Address:',
'label_attr' => array(
'class' => 'text-right middle',
),
))
->add('cidr', ChoiceType::class, array(
'required' => true,
'multiple' => false,
'expanded' => false,
'choices' => array (
'IPv4' => [
'/30 (255.255.255.252)' => 30,
'/29 (255.255.255.248)' => 29,
'/28 (255.255.255.240)' => 28,
'/27 (255.255.255.224)' => 27,
'/26 (255.255.255.192)' => 26,
'/25 (255.255.255.128)' => 25,
'/24 (255.255.255.0)' => 24,
'/23 (255.255.254.0)' => 23,
'/22 (255.255.252.0)' => 22,
'/21 (255.255.248.0)' => 21,
'/20 (255.255.240.0)' => 20,
],
'IPv6' => [
'/64 network' => 64,
]
),
'label' => 'CIDR (subnet):',
'label_attr' => array(
'class' => 'text-right middle',
),
))
->add('gateway', TextType::class, array(
'required' => true,
'label' => 'Gateway:',
'label_attr' => array(
'class' => 'text-right middle',
),
))
->add('type', ChoiceType::class, array(
'required' => true,
'multiple' => false,
'expanded' => false,
'choices' => IPAddress::TYPE,
'label' => 'Address Type:',
'label_attr' => array(
'class' => 'text-right middle',
),
))
->add('description', TextType::class, array(
'required' => true,
'label' => 'Description:',
'label_attr' => array(
'class' => 'text-right middle',
),
))
;
$builder->get('ipAddress')
->addModelTransformer(new IPToStringTransformer());
$builder->get('gateway')
->addModelTransformer(new IPToStringTransformer());
}
は、しかし、私は4096のたIPAddressエントリへのエンドユーザーまでを表示したくない実現しました。私は上記の私のタイプコードを追加し、私はIPAddressタイプとしてネットワークを持っています。 CollectionTypeを再訪して、それが役立つかどうかを確認します。 – profm2