Skip to content

Commit

Permalink
Drop older doctrine persistence, allow collections 2.0, update psalm,…
Browse files Browse the repository at this point in the history
… incresing it to level 2 and avoid deprecations (#889)
  • Loading branch information
jordisala1991 committed Mar 5, 2023
1 parent 80c776d commit 5b37d65
Show file tree
Hide file tree
Showing 54 changed files with 829 additions and 770 deletions.
27 changes: 14 additions & 13 deletions composer.json
Expand Up @@ -23,8 +23,8 @@
"require": {
"php": "^7.4 || ^8.0",
"cocur/slugify": "^4.0",
"doctrine/collections": "^1.6",
"doctrine/persistence": "^2.0 || ^3.0",
"doctrine/collections": "^1.6 || ^2.0",
"doctrine/persistence": "^3.0.2",
"sonata-project/doctrine-extensions": "^1.13 || ^2.0",
"sonata-project/form-extensions": "^1.4",
"symfony/config": "^4.4.11 || ^5.4 || ^6.0",
Expand All @@ -41,13 +41,14 @@
"twig/twig": "^2.14 || ^3.0"
},
"require-dev": {
"doctrine/annotations": "^1.13.2",
"doctrine/doctrine-bundle": "^2.3.2",
"doctrine/mongodb-odm": "^2.2",
"doctrine/orm": "^2.9",
"dama/doctrine-test-bundle": "^6.7",
"doctrine/doctrine-bundle": "^2.7",
"doctrine/mongodb-odm": "^2.4",
"doctrine/orm": "^2.14",
"friendsofphp/php-cs-fixer": "^3.4",
"knplabs/knp-menu": "^3.0",
"knplabs/knp-menu-bundle": "^3.0",
"masterminds/html5": "^2.7",
"matthiasnoback/symfony-config-test": "^4.2",
"matthiasnoback/symfony-dependency-injection-test": "^4.0",
"phpstan/extension-installer": "^1.0",
Expand All @@ -56,10 +57,10 @@
"phpstan/phpstan-strict-rules": "^1.0",
"phpstan/phpstan-symfony": "^1.0",
"phpunit/phpunit": "^9.5",
"psalm/plugin-phpunit": "^0.17",
"psalm/plugin-symfony": "^3.0",
"psalm/plugin-phpunit": "^0.18",
"psalm/plugin-symfony": "^4.0 || ^5.0",
"rector/rector": "^0.15",
"sonata-project/admin-bundle": "^4.9",
"sonata-project/admin-bundle": "^4.14",
"sonata-project/block-bundle": "^4.11",
"sonata-project/doctrine-orm-admin-bundle": "^4.0",
"symfony/asset": "^4.4 || ^5.4 || ^6.0",
Expand All @@ -70,12 +71,12 @@
"symfony/security-csrf": "^4.4 || ^5.4 || ^6.0",
"symfony/twig-bundle": "^4.4 || ^5.4 || ^6.0",
"symfony/yaml": "^4.4 || ^5.4 || ^6.0",
"vimeo/psalm": "^4.7.2"
"vimeo/psalm": "^4.7.2 || ^5.0"
},
"conflict": {
"doctrine/mongodb-odm": "<2.2",
"doctrine/orm": "<2.9",
"sonata-project/admin-bundle": "<4.9",
"doctrine/mongodb-odm": "<2.4",
"doctrine/orm": "<2.14",
"sonata-project/admin-bundle": "<4.14",
"sonata-project/block-bundle": "<4.11",
"sonata-project/doctrine-orm-admin-bundle": "<4.0"
},
Expand Down
8 changes: 8 additions & 0 deletions phpstan-baseline.neon
Expand Up @@ -3,3 +3,11 @@ parameters:
- # https://github.com/phpstan/phpstan-strict-rules/issues/130
message: '#^Call to static method PHPUnit\\Framework\\Assert::.* will always evaluate to true\.$#'
path: tests/
- # https://github.com/phpstan/phpstan-symfony/issues/322
message: "#^Parameter \\#1 \\$context of method Sonata\\\\ClassificationBundle\\\\Model\\\\CategoryManagerInterface\\:\\:getRootCategoriesForContext\\(\\) expects Sonata\\\\ClassificationBundle\\\\Model\\\\ContextInterface\\|null, Sonata\\\\ClassificationBundle\\\\Model\\\\CategoryInterface\\|Sonata\\\\ClassificationBundle\\\\Model\\\\ContextInterface given\\.$#"
count: 1
path: src/Form/Type/CategorySelectorType.php
- # https://github.com/phpstan/phpstan-symfony/issues/322
message: "#^Parameter \\#2 \\$category of method Sonata\\\\ClassificationBundle\\\\Form\\\\Type\\\\CategorySelectorType\\:\\:childWalker\\(\\) expects Sonata\\\\ClassificationBundle\\\\Model\\\\CategoryInterface, Sonata\\\\ClassificationBundle\\\\Model\\\\CategoryInterface\\|Sonata\\\\ClassificationBundle\\\\Model\\\\ContextInterface given\\.$#"
count: 1
path: src/Form/Type/CategorySelectorType.php
4 changes: 4 additions & 0 deletions phpunit.xml.dist
Expand Up @@ -30,6 +30,10 @@ It's auto-generated by sonata-project/dev-kit package.
<listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener"/>
</listeners>

<extensions>
<extension class="DAMA\DoctrineTestBundle\PHPUnit\PHPUnitExtension" />
</extensions>

<php>
<ini name="precision" value="8" />
<env name="SYMFONY_DEPRECATIONS_HELPER" value="max[self]=0" />
Expand Down
2 changes: 1 addition & 1 deletion psalm.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<psalm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://getpsalm.org/schema/config" errorLevel="3" resolveFromConfigFile="true" xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd">
<psalm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://getpsalm.org/schema/config" errorLevel="2" resolveFromConfigFile="true" xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd" findUnusedBaselineEntry="true" findUnusedCode="false">
<projectFiles>
<directory name="src"/>
<directory name="tests"/>
Expand Down
20 changes: 20 additions & 0 deletions src/Admin/Filter/CategoryFilter.php
Expand Up @@ -52,6 +52,26 @@ public function getDefaultOptions(): array
];
}

/**
* @return array<string, mixed>
*/
public function getFormOptions(): array
{
return [
'field_type' => $this->getFieldType(),
'field_options' => $this->getOption('choices', [
'choices' => $this->getChoices(),
'choice_translation_domain' => false,
]),
'label' => $this->getLabel(),
];
}

/**
* @psalm-suppress DeprecatedClass
*
* NEXT_MAJOR: Remove this method.
*/
public function getRenderSettings(): array
{
return [DefaultType::class, [
Expand Down
20 changes: 20 additions & 0 deletions src/Admin/Filter/CollectionFilter.php
Expand Up @@ -51,6 +51,26 @@ public function getDefaultOptions(): array
];
}

/**
* @return array<string, mixed>
*/
public function getFormOptions(): array
{
return [
'field_type' => $this->getFieldType(),
'field_options' => $this->getOption('choices', [
'choices' => $this->getChoices(),
'choice_translation_domain' => false,
]),
'label' => $this->getLabel(),
];
}

/**
* @psalm-suppress DeprecatedClass
*
* NEXT_MAJOR: Remove this method.
*/
public function getRenderSettings(): array
{
return [DefaultType::class, [
Expand Down
7 changes: 6 additions & 1 deletion src/Block/Service/AbstractClassificationBlockService.php
Expand Up @@ -15,6 +15,7 @@

use Sonata\AdminBundle\Admin\AdminInterface;
use Sonata\AdminBundle\FieldDescription\FieldDescriptionInterface;
use Sonata\AdminBundle\Form\FormMapper as AdminFormMapper;
use Sonata\AdminBundle\Form\Type\ModelListType;
use Sonata\BlockBundle\Block\Service\AbstractBlockService;
use Sonata\BlockBundle\Form\Mapper\FormMapper;
Expand Down Expand Up @@ -50,6 +51,10 @@ public function __construct(Environment $twig, ContextManagerInterface $contextM
*/
final protected function getFormAdminType(FormMapper $formMapper, AdminInterface $admin, string $formField, string $field, array $fieldOptions = [], array $adminOptions = []): FormBuilderInterface
{
if (!$formMapper instanceof AdminFormMapper) {
throw new \InvalidArgumentException('Classification blocks require to be used in the Admin context');
}

/** @phpstan-var FieldDescriptionOptions $adminOptions */
$adminOptions = array_merge([
'edit' => 'list',
Expand All @@ -66,7 +71,7 @@ final protected function getFormAdminType(FormMapper $formMapper, AdminInterface
'required' => false,
], $fieldOptions);

return $formMapper->create($formField, ModelListType::class, $fieldOptions);
return $formMapper->getFormBuilder()->create($formField, ModelListType::class, $fieldOptions);
}

/**
Expand Down
9 changes: 2 additions & 7 deletions src/Document/CategoryManager.php
Expand Up @@ -95,13 +95,13 @@ public function getRootCategoriesForContext(?ContextInterface $context = null):

public function getAllRootCategories(bool $loadChildren = true): array
{
/** @var CategoryInterface[] $rootCategories */
$rootCategories = $this->getDocumentManager()
->createQueryBuilder($this->getClass())
->field('parent')
->equals(null)
->getQuery()
->execute();
\assert(\is_array($rootCategories));

$categories = [];

Expand Down Expand Up @@ -170,14 +170,14 @@ protected function loadCategories(ContextInterface $context): void
return;
}

/** @var CategoryInterface[] $categories */
$categories = $this->getDocumentManager()
->createQueryBuilder($this->getClass())
->field('context')
->equals($context->getId())
->sort('parent')
->getQuery()
->execute();
\assert(\is_array($categories));

if (0 === \count($categories)) {
// no category, create one for the provided context
Expand Down Expand Up @@ -206,11 +206,6 @@ protected function loadCategories(ContextInterface $context): void
$categoryId = $category->getId();
\assert(null !== $categoryId);
$this->categories[$contextId][$categoryId] = $category;

$parent = $category->getParent();
if (null !== $parent) {
$parent->addChild($category);
}
}

if (null !== $root) {
Expand Down
2 changes: 1 addition & 1 deletion src/Document/CollectionManager.php
Expand Up @@ -60,8 +60,8 @@ public function getByContext(string $contextId, ?bool $enabled = true): array
->equals($enabled);
}

/** @var CollectionInterface[] $result */
$result = $queryBuilder->getQuery()->execute();
\assert(\is_array($result));

return $result;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Document/TagManager.php
Expand Up @@ -60,8 +60,8 @@ public function getByContext(string $contextId, ?bool $enabled = true): array
->equals($enabled);
}

/** @var TagInterface[] $result */
$result = $queryBuilder->getQuery()->execute();
\assert(\is_array($result));

return $result;
}
Expand Down
8 changes: 1 addition & 7 deletions src/Entity/CategoryManager.php
Expand Up @@ -13,7 +13,6 @@

namespace Sonata\ClassificationBundle\Entity;

use Doctrine\DBAL\Types\Types;
use Doctrine\Persistence\ManagerRegistry;
use Sonata\ClassificationBundle\Model\CategoryInterface;
use Sonata\ClassificationBundle\Model\CategoryManagerInterface;
Expand Down Expand Up @@ -146,7 +145,7 @@ public function getBySlug(string $slug, ?string $contextId = null, ?bool $enable
->andWhere('c.slug = :slug')->setParameter('slug', $slug);

if (null !== $contextId) {
$queryBuilder->andWhere('c.context = :context')->setParameter('context', $contextId, Types::OBJECT);
$queryBuilder->andWhere('c.context = :context')->setParameter('context', $contextId);
}
if (null !== $enabled) {
$queryBuilder->andWhere('c.enabled = :enabled')->setParameter('enabled', $enabled);
Expand Down Expand Up @@ -196,11 +195,6 @@ protected function loadCategories(ContextInterface $context): void
$categoryId = $category->getId();
\assert(null !== $categoryId);
$this->categories[$contextId][$categoryId] = $category;

$parent = $category->getParent();
if (null !== $parent) {
$parent->addChild($category);
}
}

$this->categories[$contextId] = $rootCategories;
Expand Down
51 changes: 31 additions & 20 deletions src/Form/Type/CategorySelectorType.php
Expand Up @@ -17,15 +17,16 @@
use Sonata\ClassificationBundle\Form\ChoiceList\CategoryChoiceLoader;
use Sonata\ClassificationBundle\Model\CategoryInterface;
use Sonata\ClassificationBundle\Model\CategoryManagerInterface;
use Sonata\ClassificationBundle\Model\ContextInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;

/**
* Select a category.
*
* @author Thomas Rabaix <thomas.rabaix@sonata-project.org>
*
* @psalm-suppress MissingTemplateParam https://github.com/phpstan/phpstan-symfony/issues/320
*/
final class CategorySelectorType extends AbstractType
{
Expand All @@ -47,29 +48,39 @@ public function configureOptions(OptionsResolver $resolver): void

/**
* @return array<array-key, string>
*
* @phpstan-param Options<array{
* context: ContextInterface|null,
* category: CategoryInterface|null,
* }> $options
* @psalm-param Options $options
*/
public function getChoices(Options $options): array
{
if (!$options['category'] instanceof CategoryInterface) {
$category = $options['category'];

if (null === $category) {
return [];
}

if (null === $options['context']) {
$categories = $this->manager->getAllRootCategories();
$context = $options['context'];

if (null === $context) {
$rootCategories = $this->manager->getAllRootCategories();
} else {
$categories = $this->manager->getRootCategoriesForContext($options['context']);
$rootCategories = $this->manager->getRootCategoriesForContext($context);
}

$choices = [];

foreach ($categories as $category) {
$context = $category->getContext();
$categoryId = $category->getId();
\assert(null !== $context && null !== $categoryId);
foreach ($rootCategories as $rootCategory) {
$context = $rootCategory->getContext();
$rootCategoryId = $rootCategory->getId();
\assert(null !== $context && null !== $rootCategoryId);

$choices[$categoryId] = sprintf('%s (%s)', $category->getName() ?? '', $context->getId() ?? '');
$choices[$rootCategoryId] = sprintf('%s (%s)', $rootCategory->getName() ?? '', $context->getId() ?? '');

$this->childWalker($category, $options, $choices);
$this->childWalker($rootCategory, $category, $choices);
}

return $choices;
Expand All @@ -88,23 +99,23 @@ public function getBlockPrefix(): string
/**
* @param array<array-key, string> $choices
*/
private function childWalker(CategoryInterface $category, Options $options, array &$choices, int $level = 2): void
private function childWalker(CategoryInterface $rootCategory, CategoryInterface $category, array &$choices, int $level = 2): void
{
if ($category->getChildren()->isEmpty()) {
if ($rootCategory->getChildren()->isEmpty()) {
return;
}

foreach ($category->getChildren() as $child) {
$childId = $child->getId();
\assert(null !== $childId);
foreach ($rootCategory->getChildren() as $childCategory) {
$childCategoryId = $childCategory->getId();
\assert(null !== $childCategoryId);

if ($options['category'] instanceof CategoryInterface && $options['category']->getId() === $childId) {
if ($category->getId() === $childCategoryId) {
continue;
}

$choices[$childId] = sprintf('%s %s', str_repeat('-', 1 * $level), $child->getName() ?? '');
$choices[$childCategoryId] = sprintf('%s %s', str_repeat('-', 1 * $level), $childCategory->getName() ?? '');

$this->childWalker($child, $options, $choices, $level + 1);
$this->childWalker($childCategory, $category, $choices, $level + 1);
}
}
}
2 changes: 1 addition & 1 deletion src/Resources/config/doctrine/BaseCategory.mongodb.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mongo-mapping xmlns="http://doctrine-project.org/schemas/odm/doctrine-mongo-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/odm/doctrine-mongo-mapping http://doctrine-project.org/schemas/odm/doctrine-mongo-mapping.xsd">
<doctrine-mongo-mapping xmlns="https://doctrine-project.org/schemas/odm/doctrine-mongo-mapping" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://doctrine-project.org/schemas/odm/doctrine-mongo-mapping https://www.doctrine-project.org/schemas/odm/doctrine-mongo-mapping.xsd">
<mapped-superclass name="Sonata\ClassificationBundle\Document\BaseCategory">
<field name="name" type="string" field-name="name"/>
<field name="enabled" type="boolean" field-name="enabled"/>
Expand Down
2 changes: 1 addition & 1 deletion src/Resources/config/doctrine/BaseCategory.orm.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xsi="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<doctrine-mapping xmlns="https://doctrine-project.org/schemas/orm/doctrine-mapping" xsi="https://www.w3.org/2001/XMLSchema-instance" schemaLocation="https://doctrine-project.org/schemas/orm/doctrine-mapping https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<mapped-superclass name="Sonata\ClassificationBundle\Entity\BaseCategory">
<field name="name" type="string" column="name"/>
<field name="enabled" type="boolean" column="enabled" default="false"/>
Expand Down
2 changes: 1 addition & 1 deletion src/Resources/config/doctrine/BaseCollection.orm.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xsi="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<doctrine-mapping xmlns="https://doctrine-project.org/schemas/orm/doctrine-mapping" xsi="https://www.w3.org/2001/XMLSchema-instance" schemaLocation="https://doctrine-project.org/schemas/orm/doctrine-mapping https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<mapped-superclass name="Sonata\ClassificationBundle\Entity\BaseCollection">
<field name="name" type="string" column="name"/>
<field name="enabled" type="boolean" column="enabled" default="false"/>
Expand Down
2 changes: 1 addition & 1 deletion src/Resources/config/doctrine/BaseContext.mongodb.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mongo-mapping xmlns="http://doctrine-project.org/schemas/odm/doctrine-mongo-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/odm/doctrine-mongo-mapping http://doctrine-project.org/schemas/odm/doctrine-mongo-mapping.xsd">
<doctrine-mongo-mapping xmlns="https://doctrine-project.org/schemas/odm/doctrine-mongo-mapping" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://doctrine-project.org/schemas/odm/doctrine-mongo-mapping https://www.doctrine-project.org/schemas/odm/doctrine-mongo-mapping.xsd">
<mapped-superclass name="Sonata\ClassificationBundle\Document\BaseContext">
<field name="name" type="string" field-name="name"/>
<field name="enabled" type="boolean" field-name="enabled"/>
Expand Down

0 comments on commit 5b37d65

Please sign in to comment.