public function execute(InputInterface $input, OutputInterface $output)
 {
     $entityManager = $this->getContainer()->get('doctrine')->getManager();
     $menuLink = new MenuLink();
     $menuLink->setName($input->getOption('label'));
     $url = $input->getOption('url') ? $input->getOption('url') : null;
     $menuLink->setUrl($url);
     $entityManager->persist($menuLink);
     $entityManager->flush();
     $aclProvider = $this->getContainer()->get('security.acl.provider');
     $roleSecurityIdentity = new RoleSecurityIdentity($input->getOption('role'));
     $devRoleSecurityIdentity = new RoleSecurityIdentity('ROLE_DEV');
     $objectIdentity = ObjectIdentity::fromDomainObject($menuLink);
     $acl = $aclProvider->createAcl($objectIdentity);
     $acl->insertObjectAce($roleSecurityIdentity, MaskBuilder::MASK_VIEW);
     $acl->insertObjectAce($devRoleSecurityIdentity, MaskBuilder::MASK_OPERATOR);
     $aclProvider->updateAcl($acl);
     $output->writeln('<info>MenuLink #' . $menuLink->getId() . ' created.</info>');
     return 0;
 }
 /**
  * {@inheritDoc}
  */
 public function load(ObjectManager $manager)
 {
     $mainLink = new MenuLink();
     $mainLink->setName('Main');
     $mainLink->setUrl(null);
     $manager->persist($mainLink);
     $inventoryActionLink = new MenuLink();
     $inventoryActionLink->setName('Inventory Actions');
     $inventoryActionLink->setUrl('/inventory_action');
     $inventoryActionLink->setRouteMatches(['tid', 'bin_sku_count', 'sales_item', 'show/bin']);
     $manager->persist($inventoryActionLink);
     $inventoryLogLink = new MenuLink();
     $inventoryLogLink->setName('Inventory Logs');
     $inventoryLogLink->setUrl('/inventory_log');
     $inventoryLogLink->setRouteMatches(['inventory_tid_edit', 'inventory_tid_movement', 'inventory_tid_transform', 'inventory_sku_adjustment', 'inventory_sku_movement', 'inventory_sku_transform']);
     $manager->persist($inventoryLogLink);
     $inventoryAuditLink = new MenuLink();
     $inventoryAuditLink->setName('Inventory Audit');
     $inventoryAuditLink->setUrl('/inventory_audit');
     $manager->persist($inventoryAuditLink);
     $adminLink = new MenuLink();
     $adminLink->setName('Admin Options');
     $adminLink->setUrl('/admin');
     $adminLink->setRouteMatches(['organization', 'user', 'office', 'department', 'menu_item', 'menu_link']);
     $manager->persist($adminLink);
     $adminInventoryLink = new MenuLink();
     $adminInventoryLink->setName('Admin Inventory');
     $adminInventoryLink->setUrl('/admin_inventory');
     $adminInventoryLink->setRouteMatches(['part', 'part_category', 'part_group', 'bin', 'bin_type', 'inventory_movement_rule']);
     $manager->persist($adminInventoryLink);
     $adminAccountingLink = new MenuLink();
     $adminAccountingLink->setName('Admin Accounting');
     $adminAccountingLink->setUrl('/admin_accounting');
     $adminAccountingLink->setRouteMatches(['client', 'customer', 'inbound_order', 'outbound_order']);
     $manager->persist($adminAccountingLink);
     $reportingLink = new MenuLink();
     $reportingLink->setName('Reporting');
     $reportingLink->setUrl('/reporting');
     $reportingLink->setRouteMatches(['reporting/single_query_report']);
     $manager->persist($reportingLink);
     $manager->flush();
     $aclProvider = $this->container->get('security.acl.provider');
     $devRoleSecurityIdentity = new RoleSecurityIdentity('ROLE_DEV');
     $adminRoleSecurityIdentity = new RoleSecurityIdentity('ROLE_ADMIN');
     $leadRoleSecurityIdentity = new RoleSecurityIdentity('ROLE_LEAD');
     $userRoleSecurityIdentity = new RoleSecurityIdentity('ROLE_USER');
     $objectIdentity = ObjectIdentity::fromDomainObject($mainLink);
     $acl = $aclProvider->createAcl($objectIdentity);
     $acl->insertObjectAce($userRoleSecurityIdentity, MaskBuilder::MASK_VIEW);
     $acl->insertObjectAce($devRoleSecurityIdentity, MaskBuilder::MASK_OPERATOR);
     $aclProvider->updateAcl($acl);
     $objectIdentity = ObjectIdentity::fromDomainObject($inventoryActionLink);
     $acl = $aclProvider->createAcl($objectIdentity);
     $acl->insertObjectAce($userRoleSecurityIdentity, MaskBuilder::MASK_VIEW);
     $acl->insertObjectAce($devRoleSecurityIdentity, MaskBuilder::MASK_OPERATOR);
     $aclProvider->updateAcl($acl);
     $objectIdentity = ObjectIdentity::fromDomainObject($inventoryLogLink);
     $acl = $aclProvider->createAcl($objectIdentity);
     $acl->insertObjectAce($userRoleSecurityIdentity, MaskBuilder::MASK_VIEW);
     $acl->insertObjectAce($devRoleSecurityIdentity, MaskBuilder::MASK_OPERATOR);
     $aclProvider->updateAcl($acl);
     $objectIdentity = ObjectIdentity::fromDomainObject($inventoryAuditLink);
     $acl = $aclProvider->createAcl($objectIdentity);
     $acl->insertObjectAce($leadRoleSecurityIdentity, MaskBuilder::MASK_VIEW);
     $acl->insertObjectAce($devRoleSecurityIdentity, MaskBuilder::MASK_OPERATOR);
     $aclProvider->updateAcl($acl);
     $objectIdentity = ObjectIdentity::fromDomainObject($adminLink);
     $acl = $aclProvider->createAcl($objectIdentity);
     $acl->insertObjectAce($adminRoleSecurityIdentity, MaskBuilder::MASK_VIEW);
     $acl->insertObjectAce($devRoleSecurityIdentity, MaskBuilder::MASK_OPERATOR);
     $aclProvider->updateAcl($acl);
     $objectIdentity = ObjectIdentity::fromDomainObject($adminInventoryLink);
     $acl = $aclProvider->createAcl($objectIdentity);
     $acl->insertObjectAce($adminRoleSecurityIdentity, MaskBuilder::MASK_VIEW);
     $acl->insertObjectAce($devRoleSecurityIdentity, MaskBuilder::MASK_OPERATOR);
     $aclProvider->updateAcl($acl);
     $objectIdentity = ObjectIdentity::fromDomainObject($adminAccountingLink);
     $acl = $aclProvider->createAcl($objectIdentity);
     $acl->insertObjectAce($adminRoleSecurityIdentity, MaskBuilder::MASK_VIEW);
     $acl->insertObjectAce($devRoleSecurityIdentity, MaskBuilder::MASK_OPERATOR);
     $aclProvider->updateAcl($acl);
     $objectIdentity = ObjectIdentity::fromDomainObject($reportingLink);
     $acl = $aclProvider->createAcl($objectIdentity);
     $acl->insertObjectAce($userRoleSecurityIdentity, MaskBuilder::MASK_VIEW);
     $acl->insertObjectAce($devRoleSecurityIdentity, MaskBuilder::MASK_OPERATOR);
     $aclProvider->updateAcl($acl);
     $this->addReference('mainLink', $mainLink);
     $this->addReference('inventoryActionLink', $inventoryActionLink);
     $this->addReference('inventoryLogLink', $inventoryLogLink);
     $this->addReference('inventoryAuditLink', $inventoryAuditLink);
     $this->addReference('adminLink', $adminLink);
     $this->addReference('adminInventoryLink', $adminInventoryLink);
     $this->addReference('adminAccountingLink', $adminAccountingLink);
     $this->addReference('reportingLink', $reportingLink);
 }