Comments (3)
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.
Moreover, if you're not able to propose a solution in the bundle codebase, I guess we should conclude that the problem is PHP itself, so impossible to solve on our end.
from vichuploaderbundle.
After further investigation, I discovered that it is qualified as a PHP feature that in case of promoted properties the default value (null
in this case) does not belong to the property, but to the parameter in the constructor, as described here and referenced here. The script (*) below confirms that the property is not set after instantiation via reflection.
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 setFile
method), I think the issue would be resolved. (I can create a PR if this kind of solution is OK for you, of course)
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
from vichuploaderbundle.
I can create a PR if this kind of solution is OK for you
sure, go ahead
from vichuploaderbundle.
Related Issues (20)
- delete_on_update does not remove the original file HOT 2
- Warning: file_exists(): open_basedir restriction in effect. Use relative paths?
- Support for Symfony 7 HOT 6
- Entity association not deleted when removing file HOT 3
- Deprecation notice in `CacheWarmer::warmUp()` with Symfony 6.4 HOT 1
- download_uri should use publicUrl when using FlysytemStorage HOT 1
- Removing a file from within the message queue handler HOT 7
- Namer is required in configuration from 2.2 to 2.3 HOT 2
- Problem during reading with flysystem HOT 4
- Invalid Schema error while installing the bundle on Symfony 7 HOT 1
- The option "required" does not exist ? HOT 3
- Installation instructions are outdated HOT 2
- Document how to get s3 URL HOT 2
- Issue with VichUploader: unsupported MIME type "image/jpeg" HOT 7
- Install dose not register in bundle.php HOT 1
- Problem with delete when using multiple mappings on one entity HOT 1
- Using pure Annotation Does not Upload the actual file. @Vich\UploadableField HOT 3
- File injection on load not working reliabely with lazy ghost objects
- How to use metadata with VichUploader HOT 9
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from vichuploaderbundle.