You need to change it to
$aceIdProperty = new
\ReflectionProperty('Symfony\Component\Security\Acl\Domain\Entry', 'id');
because this class contains the "id" property.
Kind regards,
Johannes
On Mon, Apr 4, 2011 at 7:47 PM, Gustavo Adrian
<[email protected]>wrote:
> @Johannes: Following your advice, I've changed this on the
> MutableAclProvider class (beginning at line 779):
>
> $aceIdProperty = new \ReflectionProperty($ace, 'id');
> $aceIdProperty->setAccessible(true);
> $aceIdProperty->setValue($ace, intval($aceId));
>
> to this:
>
> $aceIdProperty = new \ReflectionProperty(get_class($ace), 'id');
> $aceIdProperty->setAccessible(true);
> $aceIdProperty->setValue($ace, intval($aceId));
>
> It gives me again the exception:
>
> "ReflectionException: Property
> Symfony\Component\Security\Acl\Domain\FieldEntry::$id does not exist"
>
>
> 2011/4/4 Johannes Schmitt <[email protected]>
>
>> I don't think that we need to change the visibility or need to add
>> setters, we just need to pass the fully-qualified class name of the entry
>> class when getting the reflection property instead of passing the object
>> instance.
>>
>> Kind regards,
>> Johannes
>>
>>
>>
>> On Mon, Apr 4, 2011 at 6:19 PM, Gustavo Adrian <
>> [email protected]> wrote:
>>
>>> For now I just changed the visibility of the Entry::$id property to
>>> protected, and now it works fine. Your suggestion should work too, but I
>>> think in this special case it's better to change the visibility instead of
>>> adding setters. A user shouldn't change directly a value of a property of an
>>> Entry instance. This is handled by the AclProvider. What do you think?
>>>
>>>
>>> Thanks a lot for your comments and the useful info!
>>>
>>>
>>>
>>>
>>> 2011/4/4 Yader Hernandez <[email protected]>
>>>
>>>> Oh I see.
>>>>
>>>> There is in my opinion, a better way of handling this.
>>>>
>>>> Instead of accessing a private property which defeats the purpose of it
>>>> being private in the first place, a call to a setter method would work.
>>>> This would allow us to think more abstractly and less on implementation.
>>>>
>>>> But it looks like those were not put into place so maybe changing the
>>>> scope might work just as easily.
>>>>
>>>> Anyway, if the setters were in place, using ReflectionMethod::invoke()
>>>> would work for what you need.
>>>>
>>>> Check out the example that is already provided there:
>>>> http://us.php.net/manual/en/reflectionmethod.invoke.php
>>>>
>>>>
>>>>
>>>> On Mon, Apr 4, 2011 at 11:18 AM, Gustavo Adrian <
>>>> [email protected]> wrote:
>>>>
>>>>> It's a bug in PHP. As I said before... I'm having this problem when I
>>>>> try to update FieldEntry objects (Field ACEs). Lines 779, 780 and 781 of
>>>>> MutableAclProvider uses:
>>>>>
>>>>> $aceIdProperty = new \ReflectionProperty($ace, 'id');
>>>>> $aceIdProperty->setAccessible(true);
>>>>> $aceIdProperty->setValue($ace, intval($aceId));
>>>>>
>>>>> First line throws an exception saying "id" property doesn't exist. With
>>>>> your code, it's the same thing. It doesn't show any inherited private
>>>>> property. Read the second comment on the PHP bug.
>>>>>
>>>>> 2011/4/4 Yader Hernandez <[email protected]>
>>>>>
>>>>>> No need to change the visibility. You can flag what you need.
>>>>>>
>>>>>> class Foo {
>>>>>> public $foo = 1;
>>>>>> protected $bar = 2;
>>>>>> private $baz = 3;
>>>>>> }
>>>>>> $foo = new Foo();
>>>>>> $reflect = new ReflectionClass($foo);
>>>>>> $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC |
>>>>>> ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE);
>>>>>>
>>>>>> foreach ($props as $prop) {
>>>>>> echo $prop->getName();
>>>>>> }
>>>>>>
>>>>>> echo "\n";
>>>>>> var_dump($props);
>>>>>> echo "\n";
>>>>>>
>>>>>>
>>>>>> Output:
>>>>>> ------------
>>>>>>
>>>>>> array(3) {
>>>>>> [0]=>
>>>>>> object(ReflectionProperty)#3 (2) {
>>>>>> ["name"]=>
>>>>>> string(3) "foo"
>>>>>> ["class"]=>
>>>>>> string(3) "Foo"
>>>>>> }
>>>>>> [1]=>
>>>>>> object(ReflectionProperty)#4 (2) {
>>>>>> ["name"]=>
>>>>>> string(3) "bar"
>>>>>> ["class"]=>
>>>>>> string(3) "Foo"
>>>>>> }
>>>>>> [2]=>
>>>>>> object(ReflectionProperty)#5 (2) {
>>>>>> ["name"]=>
>>>>>> string(3) "baz"
>>>>>> ["class"]=>
>>>>>> string(3) "Foo"
>>>>>> }
>>>>>> }
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Mon, Apr 4, 2011 at 9:26 AM, Gustavo Adrian <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> I've finally found the issue of this one. It seems to be a bug of
>>>>>>> PHP:
>>>>>>>
>>>>>>>
>>>>>>> http://stackoverflow.com/questions/1495600/reflectionclassgetproperty-for-a-private-property-in-an-inhertited-class
>>>>>>>
>>>>>>> http://bugs.php.net/bug.php?id=47808
>>>>>>>
>>>>>>>
>>>>>>> I'm using Ubuntu with PHP 5.3.3.
>>>>>>>
>>>>>>> What should we do with this one? it's a very annoying bug while
>>>>>>> trying to update an ACL with Field ACEs. Changing the visibility of
>>>>>>> properties ("id" in this case) on the Entry class from private to
>>>>>>> protected
>>>>>>> fixes the issue. I don't know if there's another case like this one on
>>>>>>> other
>>>>>>> properties.
>>>>>>>
>>>>>>>
>>>>>>> 2011/3/30 Gustavo Adrian <[email protected]>
>>>>>>>
>>>>>>>> Hi all,
>>>>>>>>
>>>>>>>> I had random exceptions about serialization with the Entry class.
>>>>>>>> I've noticed all its properties are private. Also, FieldEntry extends
>>>>>>>> from
>>>>>>>> Entry, so when I want to do something like this to delete a FieldEntry:
>>>>>>>>
>>>>>>>> $classFieldACEs = $acl->getClassFieldACEs( $field );
>>>>>>>>
>>>>>>>> // $classFieldACE is the ACE I want to delete
>>>>>>>> foreach ( $classFieldACEs as $index => $classFieldACE )
>>>>>>>> {
>>>>>>>> if ( $ace->getId() === $classFieldACE->getId() )
>>>>>>>> {
>>>>>>>> $acl->deleteClassACE( $index );
>>>>>>>>
>>>>>>>> break;
>>>>>>>> }
>>>>>>>> }
>>>>>>>>
>>>>>>>> Here I get an "Property
>>>>>>>> Symfony\Component\Security\Acl\Domain\FieldEntry::$id does not exist"
>>>>>>>> exception.
>>>>>>>>
>>>>>>>> Should we change the visibility of these properties to protected?
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks in advance!
>>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> If you want to report a vulnerability issue on symfony, please send
>>>>>>> it to security at symfony-project.com
>>>>>>>
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "symfony developers" group.
>>>>>>> To post to this group, send email to [email protected]
>>>>>>> To unsubscribe from this group, send email to
>>>>>>> [email protected]
>>>>>>> For more options, visit this group at
>>>>>>> http://groups.google.com/group/symfony-devs?hl=en
>>>>>>>
>>>>>>
>>>>>> --
>>>>>> If you want to report a vulnerability issue on symfony, please send it
>>>>>> to security at symfony-project.com
>>>>>>
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "symfony developers" group.
>>>>>> To post to this group, send email to [email protected]
>>>>>> To unsubscribe from this group, send email to
>>>>>> [email protected]
>>>>>> For more options, visit this group at
>>>>>> http://groups.google.com/group/symfony-devs?hl=en
>>>>>>
>>>>>
>>>>> --
>>>>> If you want to report a vulnerability issue on symfony, please send it
>>>>> to security at symfony-project.com
>>>>>
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "symfony developers" group.
>>>>> To post to this group, send email to [email protected]
>>>>> To unsubscribe from this group, send email to
>>>>> [email protected]
>>>>> For more options, visit this group at
>>>>> http://groups.google.com/group/symfony-devs?hl=en
>>>>>
>>>>
>>>> --
>>>> If you want to report a vulnerability issue on symfony, please send it
>>>> to security at symfony-project.com
>>>>
>>>> You received this message because you are subscribed to the Google
>>>> Groups "symfony developers" group.
>>>> To post to this group, send email to [email protected]
>>>> To unsubscribe from this group, send email to
>>>> [email protected]
>>>> For more options, visit this group at
>>>> http://groups.google.com/group/symfony-devs?hl=en
>>>>
>>>
>>> --
>>> If you want to report a vulnerability issue on symfony, please send it to
>>> security at symfony-project.com
>>>
>>> You received this message because you are subscribed to the Google
>>> Groups "symfony developers" group.
>>> To post to this group, send email to [email protected]
>>> To unsubscribe from this group, send email to
>>> [email protected]
>>> For more options, visit this group at
>>> http://groups.google.com/group/symfony-devs?hl=en
>>>
>>
>> --
>> If you want to report a vulnerability issue on symfony, please send it to
>> security at symfony-project.com
>>
>> You received this message because you are subscribed to the Google
>> Groups "symfony developers" group.
>> To post to this group, send email to [email protected]
>> To unsubscribe from this group, send email to
>> [email protected]
>> For more options, visit this group at
>> http://groups.google.com/group/symfony-devs?hl=en
>>
>
> --
> If you want to report a vulnerability issue on symfony, please send it to
> security at symfony-project.com
>
> You received this message because you are subscribed to the Google
> Groups "symfony developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/symfony-devs?hl=en
>
--
If you want to report a vulnerability issue on symfony, please send it to
security at symfony-project.com
You received this message because you are subscribed to the Google
Groups "symfony developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/symfony-devs?hl=en