Skip to content

Commit

Permalink
feature #625 Use the PropertyAccessor component instead of our custom…
Browse files Browse the repository at this point in the history
… solution (javiereguiluz)

This PR was squashed before being merged into the master branch (closes #625).

Discussion
----------

Use the PropertyAccessor component instead of our custom solution

Commits
-------

b8d0684 Use the PropertyAccessor component instead of our custom solution
  • Loading branch information
javiereguiluz committed Dec 10, 2015
2 parents 5392796 + b8d0684 commit 9d05a99
Show file tree
Hide file tree
Showing 13 changed files with 208 additions and 388 deletions.
41 changes: 1 addition & 40 deletions Configuration/Configurator.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

use Doctrine\ORM\Mapping\ClassMetadata;
use JavierEguiluz\Bundle\EasyAdminBundle\Reflection\EntityMetadataInspector;
use JavierEguiluz\Bundle\EasyAdminBundle\Reflection\ClassPropertyReflector;

/**
* Completes the entities configuration with the information that can only be
Expand All @@ -27,7 +26,6 @@ class Configurator
private $backendConfig = array();
private $entitiesConfig = array();
private $inspector;
private $reflector;
private $defaultEntityFields = array();

private $defaultEntityFieldConfiguration = array(
Expand Down Expand Up @@ -66,11 +64,10 @@ class Configurator
'time' => 'time',
);

public function __construct(array $backendConfig, EntityMetadataInspector $inspector, ClassPropertyReflector $reflector)
public function __construct(array $backendConfig, EntityMetadataInspector $inspector)
{
$this->backendConfig = $backendConfig;
$this->inspector = $inspector;
$this->reflector = $reflector;
}

/**
Expand Down Expand Up @@ -122,8 +119,6 @@ public function getEntityConfiguration($entityName)
$entityConfiguration['new']['fields'] = $this->getFieldsForFormBasedViews('new', $entityConfiguration);
$entityConfiguration['search']['fields'] = $this->getFieldsForSearchAction($entityConfiguration);

$entityConfiguration = $this->introspectGettersAndSetters($entityConfiguration);

$entityConfiguration = $this->processFieldTemplates($entityConfiguration);

$this->entitiesConfig[$entityName] = $entityConfiguration;
Expand Down Expand Up @@ -441,40 +436,6 @@ private function getFieldFormat($fieldType)
}
}

/**
* Introspects the getters and setters for the fields used by all views.
* This preprocessing saves a lot of further processing when accessing or
* setting the value of the entity properties.
*
* @param array $entityConfiguration
*
* @return array
*/
private function introspectGettersAndSetters($entityConfiguration)
{
foreach (array('new', 'edit', 'list', 'show', 'search') as $view) {
$fieldsConfiguration = $entityConfiguration[$view]['fields'];

foreach ($fieldsConfiguration as $fieldName => $fieldConfiguration) {
$getter = $this->reflector->getGetter($entityConfiguration['class'], $fieldName);
$fieldConfiguration['getter'] = $getter;

$setter = $this->reflector->getSetter($entityConfiguration['class'], $fieldName);
$fieldConfiguration['setter'] = $setter;

$isPublic = $this->reflector->isPublic($entityConfiguration['class'], $fieldName);
$fieldConfiguration['isPublic'] = $isPublic;

$fieldConfiguration['isReadable'] = $getter || $isPublic;
$fieldConfiguration['isWritable'] = $setter || $isPublic;

$entityConfiguration[$view]['fields'][$fieldName] = $fieldConfiguration;
}
}

return $entityConfiguration;
}

/**
* Determines the template used to render each backend element. This is not
* trivial because templates can depend on the entity displayed and they
Expand Down
6 changes: 1 addition & 5 deletions Controller/AdminController.php
Original file line number Diff line number Diff line change
Expand Up @@ -390,11 +390,7 @@ private function updateEntityProperty($entity, $property, $value)

$this->dispatch(EasyAdminEvents::PRE_UPDATE, array('entity' => $entity, 'newValue' => $value));

if (null !== $setter = $fieldsMetadata[$property]['setter']) {
$entity->{$setter}($value);
} else {
$entity->{$property} = $value;
}
$this->get('property_accessor')->setValue($entity, $value);

$this->em->persist($entity);
$this->em->flush();
Expand Down
108 changes: 0 additions & 108 deletions Reflection/ClassPropertyReflector.php

This file was deleted.

2 changes: 1 addition & 1 deletion Resources/config/services.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
<services>
<service id="easyadmin.twig.extension" class="JavierEguiluz\Bundle\EasyAdminBundle\Twig\EasyAdminTwigExtension" public="false">
<argument type="service" id="easyadmin.configurator" />
<argument type="service" id="property_accessor" />
<argument>%kernel.debug%</argument>
<tag name="twig.extension" />
</service>

<service id="easyadmin.configurator" class="JavierEguiluz\Bundle\EasyAdminBundle\Configuration\Configurator">
<argument>%easyadmin.config%</argument>
<argument type="service" id="easyadmin.metadata_inspector" />
<argument type="service" id="easyadmin.property_reflector" />
</service>

<service id="easyadmin.metadata_inspector" class="JavierEguiluz\Bundle\EasyAdminBundle\Reflection\EntityMetadataInspector" public="false">
Expand Down
17 changes: 10 additions & 7 deletions Tests/Configuration/ConfiguratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ class ConfiguratorTest extends CommonPhpUnitTestCase
{
private $extension;
private $inspector;
private $reflector;

public function setUp()
{
Expand All @@ -33,9 +32,6 @@ public function setUp()
$inspectorStub = $this->getMockBuilder('JavierEguiluz\Bundle\EasyAdminBundle\Reflection\EntityMetadataInspector')->disableOriginalConstructor()->getMock();
$inspectorStub->method('getEntityMetadata')->willReturn($entityMetadataStub);
$this->inspector = $inspectorStub;

$reflectorStub = $this->getMockBuilder('JavierEguiluz\Bundle\EasyAdminBundle\Reflection\ClassPropertyReflector')->disableOriginalConstructor()->getMock();
$this->reflector = $reflectorStub;
}

/**
Expand All @@ -45,8 +41,10 @@ public function testGetEntityConfiguration($inputFixtureFilepath, $outputFixture
{
$backendConfig = Yaml::parse(file_get_contents($inputFixtureFilepath));
$backendConfig['easy_admin']['entities'] = $this->extension->getEntitiesConfiguration($backendConfig['easy_admin']['entities']);
$configurator = new Configurator($backendConfig['easy_admin'], $this->inspector, $this->reflector);

$configurator = new Configurator($backendConfig['easy_admin'], $this->inspector);
$configuration = $configurator->getEntityConfiguration('TestEntity');

// Yaml component dumps empty arrays as hashes, fix it to increase configuration readability
$yamlConfiguration = str_replace('{ }', '[]', Yaml::dump($configuration));

Expand All @@ -68,7 +66,7 @@ public function provideConfigurationFiles($fixturesDir)
public function testEmptyConfiguration()
{
$backendConfig = array('easy_admin' => null);
$configurator = new Configurator($backendConfig, $this->inspector, $this->reflector);
$configurator = new Configurator($backendConfig, $this->inspector);
$configurator->getEntityConfiguration('TestEntity');
}

Expand All @@ -79,7 +77,12 @@ public function testEmptyConfiguration()
public function testAccessingAnUnmanagedEntity()
{
$backendConfig = array('easy_admin' => array('entities' => array('AppBundle\\Entity\\TestEntity')));
$configurator = new Configurator($backendConfig, $this->inspector, $this->reflector);
$configurator = new Configurator($backendConfig, $this->inspector);
$configurator->getEntityConfiguration('UnmanagedEntity');
}
}


class TestEntity {
// empty class needed for test fixtures
}
2 changes: 1 addition & 1 deletion Tests/Configuration/fixtures/input/admin_001.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
# CONFIGURATION
easy_admin:
entities:
- AppBundle\Entity\TestEntity
- JavierEguiluz\Bundle\EasyAdminBundle\Tests\Configuration\TestEntity
2 changes: 1 addition & 1 deletion Tests/Configuration/fixtures/output/config_001.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
class: AppBundle\Entity\TestEntity
class: JavierEguiluz\Bundle\EasyAdminBundle\Tests\Configuration\TestEntity
label: TestEntity
name: TestEntity
edit:
Expand Down

0 comments on commit 9d05a99

Please sign in to comment.