@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
