New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
UnitializedPropertyException when using nullable UploadableField as promoted property #1411
Comments
I don't get what's the difference between the two cases you showed, in terms of properties: in both cases, I see that the properties have the same types and the same predefined values. |
After further investigation, I discovered that it is qualified as a PHP feature that in case of promoted properties the default value ( This makes that the user has to explicitly set the property to null if the class is instantiated via the reflection method which does not execute the constructor, as this bundle does afaik. It confirms the fact that this bundle is not compatible with promoted properties for the file property. Given the PHP RFC content, I don't think it will be changed on their end. I think the change in this bundle are small, but I haven't checked the impact on other classes. When adding something like this at the location in the original post (and fixing the type constraints of the if (null !== $path) {
$mapping->setFile($obj, new File($path, false));
+ } else {
+ $mapping->setFile($obj, null);
} (*) Used test script <?php
class Foo
{
public ?string $test = null;
public function __construct(
?string $test = null
) {
$this->test = $test;
}
}
class Bar
{
public function __construct(
public ?string $test = null
) {}
}
echo "\n=== FOO ===============================================================\n";
$fooRefl = new ReflectionClass(Foo::class);
$fooInst = $fooRefl->newInstanceWithoutConstructor();
var_dump($fooInst->test);
echo "\n=== BAR ===============================================================\n";
$barRefl = new ReflectionClass(Bar::class);
$barInst = $barRefl->newInstanceWithoutConstructor();
var_dump($barInst->test); tjv@5461f0b4a67f:/app$ php test.php
=== FOO ===============================================================
NULL
=== BAR ===============================================================
Fatal error: Uncaught Error: Typed property Bar::$test must not be accessed before initialization in /app/vich_uploader_bundle_1411/test.php:29
Stack trace:
#0 {main}
thrown in /app/test.php on line 29 |
sure, go ahead |
Bug Report
Summary
Currently it's not possible to use a combination of promoted properties and nullable files in an entity class. The InjectListener checks if a filename is available to build the path to the file, when filename is NULL, it obviously does not resolve the path to the file, so it doesn't set the file property to null. In that situation, the property is uninitialized, which make PHP throw an UnitializedPropertyException as soon as I use
->getFile()
on the entity retrieved from the database.When the property is a 'regular' property, everything works fine.
Does not work:
Works:
In this position, it might be possible to explicitly set the property to null when
$path
is null (and the property is nullable and not set)VichUploaderBundle/src/Injector/FileInjector.php
Lines 24 to 26 in 18c6976
While debugging the mentioned situation, I think I also saw a problem like this in the
CleanListener
, but I'm not able to reproduce that at the moment.The text was updated successfully, but these errors were encountered: