Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

[ObjectMapper] Object to Object mapper component#51741

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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
fabpot merged 1 commit intosymfony:7.3fromsoyuka:feat/automapper
Mar 24, 2025

Conversation

soyuka
Copy link
Contributor

@soyukasoyuka commentedSep 25, 2023
edited by chalasr
Loading

QA
Branch?7.3
Bug fix?no
New feature?yes
Deprecations?no
LicenseMIT
Doc PRTBD this description will be used as docs

Why ?

In the train back fromAPI Platform Con and after watching@weaverryan conference about API Platform's feature that helpsseparating Doctrine Entities from POPOs, we had the feeling that such a component is definitely missing from the Symfony ecosystem. Current implementations (automapper-plus, janephp/automapper) are good but feel to complicated when you want something accessible (DX and complexity). Here we're not trying to have exceptional performance, we just want an accessible API with few mandatory features. Basically those are:

  • map properties from a class/object to another class/object (Map(target: A::class))
  • configure the property name each property is mapped to (Map(target: 'prop'))
  • change the value during transformation (Map(transform: 'ucfirst'))
  • control whether the value should be mapped or not (Map(if: 'boolval'))
  • reuse objects if possible (works better with doctrine UOW)

Other implementation details:

  • if a property exists in B, it'll "automatically" be mapped (doesn't handle type errors, should we ?)
  • if a property doesn't exists in B it'll "automatically"not be mapped

The rest is not "auto".

Mapper Component

The Mapper component allows you to map an object to another object,
facilitating the mapping using attributes.

Usage

useSymfony\Component\ObjectMapper\ObjectMapper;useSymfony\Component\ObjectMapper\Attributes\Map;// This maps class `A` to class `B`.#[Map(B::class)]class A{// This maps A::foo to B::bar.    #[Map(target:'bar')]publicstring$foo;// This calls ucfirst on A::transform    #[Map(transform:'ucfirst')]publicstring$name;// This doesn't map A::bar if it's value is falsy.    #[Map(if:'boolval')]publicbool$bar =false;}$mapper =newObjectMapper();$mapper->map(newA);

TheMap attribute has the following signature:

#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)]finalclass Map{/**     *     * @param null|string|class-string                                  $source     The property or the class to map to     * @param null|string|class-string                                  $target     The property or the class to map from     * @param string|callable(mixed $value, object $object): bool       $if         A Symfony service name or a callable that instructs whether to map     * @param CallableType|CallableType[]                               $transform  A Symfony service name or a callable that transform the value during mapping     */publicfunction__construct(publicreadonly ?string$source =null,publicreadonly ?string$target =null,publicreadonlymixed$if =null,publicreadonlymixed$transform =null    ){    }}

if andtransform are callable or Symfony services, not that we need to introduce an interface for services to implement, this will follow if we want to introduce the component inside the Framework Bundle.

The mapper also takes a$source argument if one needs to update an object instead of creating a new one:

$b =newB;$mapper =newObjectMapper();$mapper->map(newA,$b);

TODO

  • AutoMapper or Automapper or something else?ObjectMapper
  • max depth? Supports recursivity,maxDepth is for serializers.

Spomky, SzymonKaminski, raphael-geffroy, matyo91, oallain, kermitsxb, ker0x, fbourigault, webda2l, kbond, and 41 more reacted with thumbs up emojidunglas, weaverryan, jdreesen, FabienWebavenir, WebMamba, ker0x, ging-dev, LucasLaurensMLP, ste93cry, welcoMattic, and 12 more reacted with hooray emojiKorbeil, Tiriel, rogeriolino, Koc, kaznovac, and Neirda24 reacted with confused emojidamienalexandre, ktherage, vincentchalamon, ging-dev, theofidry, BafS, mrossard, DjordyKoert, IndraGunawan, mikelgoig, and 2 more reacted with eyes emoji
@carsonbot
Copy link

Hey!

To help keep things organized, we don't allow "Draft" pull requests. Could you please click the "ready for review" button or close this PR and open a new one when you are done?

Note that a pull request does not have to be "perfect" or "ready for merge" when you first open it. We just want it to be ready for a first review.

Cheers!

Carsonbot

@soyukasoyuka marked this pull request as ready for reviewSeptember 25, 2023 10:08
@carsonbotcarsonbot added this to the6.4 milestoneSep 25, 2023
Copy link
Member

@weaverryanweaverryan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

In addition to the API Platform usecase, this would help with people using form DTO's... which is a cool idea, but kind of a pain in practice due to the mapping.

So, I'm very interested in this. If done well, it would enable us to more strongly recommend the DTO pattern without sacrificing DX (due to all the boring mapping you normally do)

dunglas, smnandre, ktherage, mtarld, evertharmeling, sstok, kbond, 94noni, meandmymonkey, IssamRaouf, and tacman reacted with thumbs up emoji
@soyukasoyuka changed the base branch from6.4 to7.0September 26, 2023 07:46
@Tiriel
Copy link
Contributor

Sorry guys, noob question here, but I was not at the conf so I didn't get the rationale.
Il love the syntax, but I fail to see the point of thisin the general Symfony components.

I see the point for APIP or such solutions, but I can't see why it should be a Symfony component, as I don't see the value it can provide compared to a basic custom mapper. And I don't see why we would want to get rid of custom mappers in generic projects if there's no gain except "one less class insrc, 5 more invendor". Especially since performance was not the primary issue in mind here. Ok, coding mappers is boring, but in that case, shouldn't the replacement be as simple (or even simpler) AND as fast AND as secure?

Other than that, once again, the DX is awesome, maybe except one or two small details.

damienalexandre, welcoMattic, ktherage, apiv-thomas, kaznovac, and Korbeil reacted with thumbs up emoji

@weaverryan
Copy link
Member

I see the point for APIP or such solutions, but I can't see why it should be a Symfony component, as I don't see the value it can provide compared to a basic custom mapper. And I don't see why we would want to get rid of custom mappers in generic projects if there's no gain

That's a fair question. In practice, in a rich DTO system, when I have objects with relationships, things often get more complex than one class for the mapping. For example, I'm mappingProduct ->ProductDto and there is aProduct.category that should be mapped to aProductDto... and so from my mapper code fromProduct ->ProductDto, I also want to call the mapping code fromCategory ->CategoryDto. Or are other people not running into this?

Also, even if the solution is simple, there is some advantage to having a core interface & system for mapping. For API Platform, it opens up the possibility of mapping a DTO with#[ApiResource] and saying "get fetch the data from theProduct" entity. Because there is a central mapping system, it can use that to convert between theProduct andProductDto. If we don't have a central system (even if the problem is not that complex), we can't introduce features like that into API Platform's core. We could also document using DTO's in other places (like the form system) more readily due to there being a central way of handling that mapping part.

evertharmeling reacted with thumbs up emoji

@soyuka
Copy link
ContributorAuthor

soyuka commentedSep 26, 2023
edited
Loading

@weaverryan I also really liked your examples with the User DTOs (mapping password etc.) which are quite out of the scope of API Platform but are really useful within Symfony or with custom controllers altogether. Maybe we can share these?

Actually it's been quite some time that many Symfony users think that an AutoMapper component inside Symfony would be quite useful. I started a prototype after discussing with Ryan and therefore wanted to propose this as a component to help our community members.

@weaverryan
Copy link
Member

@weaverryan I also really liked your examples with the User DTOs (mapping password etc.) which are quite out of the scope of API Platform but are really useful within Symfony or with custom controllers altogether. Maybe we can share these?

Sure :). Whether it's API Platform or using DTOs with forms, here are some requirements I had for a mapper:

A)User.plainPassword -> maps to ->User.password but we need to go through the password hasher
B) Same as above, but only map ifUser.plainPassword is notnull (don’t try to hash an empty string and override the existing hashed password)
C) Mapping A -> B, but B has some extra property on it that depends on, let’s say… 3 different properties on A and needs a service to calculate the final value.
D) Mapping fromUserDto ->User and because this is a PATCH operation / edit page,UserDto.id=5 and so we should actually query the database forUser whereid=5 instead of creating a new instance.
E) Same as above, but with a relation:ProductDto.category is aCategoryDto andProductDto.category.id=9. So when mappingProductDto.category ->Product.category, theCategory entity will be loaded from somewhere else (e..g database) but not instantiated.

@Tiriel
Copy link
Contributor

First, thanks for your time!

That's a fair question. In practice, in a rich DTO system, when I have objects with relationships, things often get more complex than one class for the mapping. For example, I'm mappingProduct ->ProductDto and there is aProduct.category that should be mapped to aProductDto... and so from my mapper code fromProduct ->ProductDto, I also want to call the mapping code fromCategory ->CategoryDto. Or are other people not running into this?

I do have the same "problem" on a regular basis. In fact, pretty much every time I give a Symfony training (like twice a month at least), since it's pretty much part of the application we build as an exercice for the trainings at SL.

And again, I don't deny the DX gain on this, maybe it needs a bit more work (like, does it work when mapping collections, or nested collections?). But maybe I'm wrong, but I can't see something relying this much on Reflection being as effective as the boring solution, even with Mappers for nested properties. If you tell me the accepted tradeof is perf vs DX, why not, but I'm not sure it'll be used that much then, and so I'm back to my first question.

Also, even if the solution is simple, there is some advantage to having a core interface & system for mapping. For API Platform, it opens up the possibility of mapping a DTO with#[ApiResource] and saying "get fetch the data from theProduct" entity. Because there is a central mapping system, it can use that to convert between theProduct andProductDto. If we don't have a central system (even if the problem is not that complex), we can't introduce features like that into API Platform's core. We could also document using DTO's in other places (like the form system) more readily due to there being a central way of handling that mapping part.

Again, no question how it could be useful for APIP. But in that case IMHO it should stay in APIP.
Your examples seem typical to me of the common problems we have indeed by the way, but maybe I'm just not on point, but I still don't see the benefit of centralized Mapper for these either in its current design, except for DX (which is already great, but not enough IMHO).

Basically, if the perf question is resolved, and the gain is substantial not only for DX, I'm all for it. Otherwise, I'm not sure.

damienalexandre, Korbeil, and yceruto reacted with thumbs up emoji

@Korbeil
Copy link
Contributor

AutoMapper is a subject we hold close to heart here at JoliCode ❤️ (remember#30248? 4 years old already) and I would like to highlight another approach to the one exposed here.

I worked on bringingAutoMapper, previously in the JanePHP organization, now in JoliCode's in Symfony as a standalone component:Korbeil#1

It has not been opened on the Symfony repository yet as an excess of precaution and a will to bring something pre-approved (#30248 was a ton of work and never got merged so we were careful not to make the same mistake). It has been discussed on Symfony's Slack with some core maintainers but that didn't bring real feedback nor reviews.

If we step back for a sec, we all know that the Serializer revamp will not be merged before 7.1 at best. Beside, the current AutoMapper implementation looks quick and simple as it allows to map only DTO together. Meanwhile, we could take more time to consider my PR and deliver a complete and performant AutoMapper with the new Serializer implementation where the normalization part could leverage this AutoMapper and bring even more speed to the new Serializer#51718.

Performance should always be taken into account as a primary feature - we use Symfony on huge and heavy workload applications and it's not ok to have some features doing runtime Reflection with no cache. Code using such components would need to be hardly challenged from code reviews. And that’s why we do think AST is a very powerful way to get this performance.

Current implementations (automapper-plus, janephp/automapper) are good but feel to complicated when you want something accessible.

Could you elaborate on this statement? While your implementation is really nice and easy to read / maintain, from an user perspective, jolicode/automapper is as simple and accessible:

$automapper->map(source, target);

We all must keep in mind the benefit for Symfony's users, no matter what is our company, or the code ownership. Currently, we have 2 different suggestions for a new AutoMapper component, let's work together to leverage the best of both and bring something useful to the users.

welcoMattic, xavierlacot, Tiriel, matthieuwerner, ternel, pyrech, joelwurtz, Guikingone, qboot, SzymonKaminski, and 17 more reacted with thumbs up emojimatthieuwerner, ging-dev, and jorismak reacted with heart emoji

@joelwurtz

This comment was marked as duplicate.

@weaverryan
Copy link
Member

Current implementations (automapper-plus, janephp/automapper) are good but feel to complicated when you want something accessible.
Could you elaborate on this statement? While your implementation is really nice and easy to read / maintain, from an user perspective, jolicode/automapper is as simple and accessible:

I tried using the janephp/automapper (maybe the jolicode one has improved?) but I had a very hard time with A, B, D & E from this list -#51741 (comment)

So yes, the interface is simple. I found customizing my mapping to be really hard / impossible in some cases. But these are things that can be improved :). I am more interested that there IS a solution that exists, not which one... though I'd love to collaborate on the DX for whatever is decided.

smnandre, soyuka, OskarStark, dunglas, and ktherage reacted with thumbs up emoji

@smnandre
Copy link
Member

Probably a minor point, but i'd suggest to drop the "Auto" part of the component, and maybe keep it for the implementation.

The AutoMapper component allows you to map an object to another object,

For me if Symfony provide such component, i expect it to have a basic interface, hiding all the complexity / configuration behind.... including the possibility to use plain manual PHP / service code in implementations.

So maybe just name itMapper ? WDTY ?

namespace Symfony/Component/Mapper;class Automapperimplements MapperInterface

(ObectMapper does not provide much more, and impede potential evolutions)

soyuka, kbond, ktherage, GregoireHebert, sazzabi-fcms, valtzu, and LucasLaurens reacted with thumbs up emojityx reacted with heart emoji

@soyuka
Copy link
ContributorAuthor

After some discussions I:

  • renamed the component toMapper
  • introduced recursivity support (no need to control maxDepth here this is not a serializer)
  • I want to change attributes to simplify even more the developer experience and try to cover a few cases people brought to me (thanks !!)

I've kept my old implementation here in case we want to track evolution. The description and title will be updated shortly.

Old implementation```use Symfony\Component\AutoMapper\AutoMapper;
use Symfony\Component\AutoMapper\Attributes\MapIf;
use Symfony\Component\AutoMapper\Attributes\MapTo;
use Symfony\Component\AutoMapper\Attributes\MapWith;

// This maps classA to classB.
#[MapTo(B::class)]
class A
{
// This maps A::foo to B::bar.
#[MapTo('bar')]
public string $foo;

// This calls strtoupper on A::transform#[MapWith('ucfirst')]public string $name;// This doesn't map A::bar if it's value is falsy.#[MapIf('boolval')]public bool $bar = false;

}

$mapper = new AutoMapper();
$mapper->map(new A);

</details>
damienalexandre, smnandre, and Zuruuh reacted with thumbs up emoji

@soyukasoyuka changed the title[AutoMapper] Object to Object mapper component[Mapper] Object to Object mapper componentSep 27, 2023
@sazzabi-fcms
Copy link

Hi, I have some suggestions. I think that in the attributes, the use of "Map" is redundant (MapTo, MapWith, MapIf, etc..). I think you can drop the "Map" prefix

Also, I suggest to drop the MapWith, and change the "To" attribute to be able to "transform" a value before applying it :
#[To(property: '...', classes: {B::class, C::class}, transform: {'ucfirst', ...})]
In this case, all parameters are not required :

  • if you don't specify 'property', Automapper will find property with similar name
  • if you don't specify 'classes', mapping will be valid for all #[Map()] attributes in the class
  • if you don't specify 'transform', value will be ported as is
soyuka, phcorp, LucasLaurens, and etshy reacted with thumbs up emoji

@dbu
Copy link
Contributor

dbu commentedSep 27, 2023

cool idea!
some thoughts:

  • this does have some overlap with (de) serializer. could we see the serializer as a special case of the Mapper? serializer maps object to array, this mapper maps object to object...
  • it could be interesting to have an interface for the metadata loader. annotations in the code is one way to define this, but metadata could also be written in an xml or yaml format. even if initially only annotations are supported, isolating the metadata loading behind an interface would allow to add other loaders.
  • how about supporting accessor / setter methods and "virtual properties" that only exist as method but have no explicit field on a class? accessors methods could also be an alternative to the transformer callbacks

@pounard
Copy link
Contributor

Hi, I have some suggestions. I think that in the attributes, the use of "Map" is redundant (MapTo, MapWith, MapIf, etc..). I think you can drop the "Map" prefix

To,With andIf are too common words, they could be used as attribute names by any other kind of API for different needs. I think theMap prefix probably should be kept, in case people start using attributes from other namespace along. Or they simply could be more specific ?

@pounard
Copy link
Contributor

pounard commentedSep 27, 2023
edited
Loading

If I understood it well, by design, a class can be mapped only to one another class ? Isn't it a very drastic limitation ? I could want to map an entity to more than one kind of DTO, for example:

  • some custom action form,
  • another custom action form,
  • various API endpoints with different schemas,
  • ...

Is this achievable with the code in its current state ?

@soyukasoyukaforce-pushed thefeat/automapper branch 5 times, most recently from4ad6548 toee21586CompareDecember 6, 2024 13:37
mykiwi added a commit to SymfonyCon/2024-talks that referenced this pull requestDec 11, 2024
Copy link
Member

@nicolas-grekasnicolas-grekas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Here are some suggestions

Copy link
Member

@nicolas-grekasnicolas-grekas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

LGTM thanks. Please squash + rebase while fixing my comments.

Copy link
Contributor

@mtarldmtarld left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

With minor comments 🙂

@soyuka
Copy link
ContributorAuthor

@nicolas-grekas rebased

@soyukasoyukaforce-pushed thefeat/automapper branch 2 times, most recently fromceb4a5a tob2acce8CompareMarch 17, 2025 08:48
Copy link
Member

@fabpotfabpot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Some random/minor comments while reading the code.

@fabpot
Copy link
Member

Thank you@soyuka.

onEXHovia, GromNaN, jdreesen, chapterjason, divine, vasilvestre, ker0x, f1amy, Kocal, and loverg-c reacted with thumbs up emojialanpoulain, chapterjason, IndraGunawan, zyberspace, ThomasBerends, ker0x, senzowayne, jdreesen, nikophil, loic425, and 4 more reacted with hooray emoji

@fabpotfabpot merged commit21b4dd7 intosymfony:7.3Mar 24, 2025
1 check was pending
@OskarStark
Copy link
Contributor

Congrats 🎉

Oviglo reacted with hooray emoji

soyuka pushed a commit to soyuka/symfony that referenced this pull requestMar 25, 2025
…t (soyuka)This PR was squashed before being merged into the 7.3 branch.Discussion----------[ObjectMapper] Object to Object mapper component| Q             | A| ------------- | ---| Branch?       | 7.3| Bug fix?      | no| New feature?  | yes| Deprecations? | no| License       | MIT| Doc PR        | TBD this description will be used as docs## Why ?In the train back from [API Platform Con](https://api-platform.com/con/2023/) and after watching `@weaverryan` conference about API Platform's feature that helps [separating Doctrine Entities from POPOs](https://symfonycasts.com/screencast/api-platform-extending/state-options), we had the feeling that such a component is definitely missing from the Symfony ecosystem. Current implementations (automapper-plus, janephp/automapper) are good but feel to complicated when you want something accessible (DX and complexity). Here we're not trying to have exceptional performance, we just want an accessible API with few mandatory features. Basically those are:- map properties from a class/object to another class/object (`Map(target: A::class)`)- configure the property name each property is mapped to (`Map(target: 'prop')`)- change the value during transformation (`Map(transform: 'ucfirst')`)- control whether the value should be mapped or not (`Map(if: 'boolval')`)- reuse objects if possible (works better with doctrine UOW)Other implementation details:- if a property exists in B, it'll "automatically" be mapped (doesn't handle type errors, should we ?)- if a property doesn't exists in B it'll "automatically" **not** be mappedThe rest is not "auto".## Mapper ComponentThe Mapper component allows you to map an object to another object,facilitating the mapping using attributes.### Usage```phpuse Symfony\Component\ObjectMapper\ObjectMapper;use Symfony\Component\ObjectMapper\Attributes\Map;// This maps class `A` to class `B`.#[Map(B::class)]class A{    // This maps A::foo to B::bar.    #[Map(target: 'bar')]    public string $foo;    // This calls ucfirst on A::transform    #[Map(transform: 'ucfirst')]    public string $name;    // This doesn't map A::bar if it's value is falsy.    #[Map(if: 'boolval')]    public bool $bar = false;}$mapper = new ObjectMapper();$mapper->map(new A);```The `Map` attribute has the following signature:```php#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)]final class Map{    /**     *     * `@param` null|string|class-string                                  $source     The property or the class to map to     * `@param` null|string|class-string                                  $target     The property or the class to map from     * `@param` string|callable(mixed $value, object $object): bool       $if         A Symfony service name or a callable that instructs whether to map     * `@param` CallableType|CallableType[]                               $transform  A Symfony service name or a callable that transform the value during mapping     */    public function __construct(        public readonly ?string $source = null,        public readonly ?string $target = null,        public readonly mixed $if = null,        public readonly mixed $transform = null    ){    }}````if` and `transform` are callable or Symfony services, not that we need to introduce an interface for services to implement, this will follow if we want to introduce the component inside the Framework Bundle.The mapper also takes a `$source` argument if one needs to update an object instead of creating a new one:```php$b = new B;$mapper = new ObjectMapper();$mapper->map(new A, $b);```## TODO- [x] AutoMapper or Automapper or something else? `Mapper` component with an `AutoMapper` implementation.- [x] max depth? Supports recursivity, `maxDepth` is for serializers.Commits-------3f99b03 [ObjectMapper] Object to Object mapper component
*
* @return list<Mapping>
*/
public function create(object $object, ?string $property = null, array $context = []): array;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

@soyuka Shouldn't a@throws MappingException be added to this interface too since ReflectionObjectMapperMetadataFactory are throwing some ? I can do the PR if you agree with

fabpot added a commit that referenced this pull requestMar 26, 2025
…(soyuka)This PR was merged into the 7.3 branch.Discussion----------[FrameworkBundle] Binding for Object Mapper component| Q             | A| ------------- | ---| Branch?       | 7.3| Bug fix?      | no| New feature?  | yes| Deprecations? | no| Issues        |Fix#51741 (comment)| License       | MITTODO:Update UPGRADE-*.md and src/**/CHANGELOG.md filesNeeds:#51741 please check only the last commit as I didn't yet squashed the commits of the Component.Commits-------133d2b0 [FrameworkBundle] Object Mapper component bindings
symfony-splitter pushed a commit to symfony/framework-bundle that referenced this pull requestMar 26, 2025
…(soyuka)This PR was merged into the 7.3 branch.Discussion----------[FrameworkBundle] Binding for Object Mapper component| Q             | A| ------------- | ---| Branch?       | 7.3| Bug fix?      | no| New feature?  | yes| Deprecations? | no| Issues        |Fixsymfony/symfony#51741 (comment)| License       | MITTODO:Update UPGRADE-*.md and src/**/CHANGELOG.md filesNeeds:symfony/symfony#51741 please check only the last commit as I didn't yet squashed the commits of the Component.Commits-------133d2b09730 [FrameworkBundle] Object Mapper component bindings
mykiwi added a commit to SymfonyLive/paris-2025-talks that referenced this pull requestMar 28, 2025
@fabpotfabpot mentioned this pull requestMay 2, 2025
javiereguiluz added a commit to symfony/symfony-docs that referenced this pull requestMay 9, 2025
This PR was squashed before being merged into the 7.3 branch.Discussion----------[ObjectMapper] Add componentDocuments the object mapper component from*symfony/symfony#51741Commits-------9ea1585 [ObjectMapper] Add component
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers

@onEXHoviaonEXHoviaonEXHovia left review comments

@ging-devging-devging-dev left review comments

@OskarStarkOskarStarkOskarStark left review comments

@weaverryanweaverryanweaverryan left review comments

@priyadipriyadipriyadi left review comments

@pounardpounardpounard left review comments

@GromNaNGromNaNGromNaN left review comments

@VincentLangletVincentLangletVincentLanglet left review comments

@Cafeine42Cafeine42Cafeine42 left review comments

@mtarldmtarldmtarld approved these changes

@ycerutoycerutoyceruto left review comments

@smnandresmnandresmnandre left review comments

@fabpotfabpotfabpot approved these changes

@dunglasdunglasdunglas approved these changes

@chalasrchalasrchalasr approved these changes

@joelwurtzjoelwurtzjoelwurtz approved these changes

@welcoMatticwelcoMatticwelcoMattic approved these changes

@maxbeckersmaxbeckersmaxbeckers approved these changes

@nicolas-grekasnicolas-grekasnicolas-grekas approved these changes

@xabbuhxabbuhAwaiting requested review from xabbuh

@lyrixxlyrixxAwaiting requested review from lyrixx

@kbondkbondAwaiting requested review from kbond

@jderussejderusseAwaiting requested review from jderusse

@stofstofAwaiting requested review from stof

Assignees
No one assigned
Labels
Feature❄️ Feature FreezeImportant Pull Requests to finish before the next Symfony "feature freeze"Status: Reviewed
Projects
None yet
Milestone
7.3
Development

Successfully merging this pull request may close these issues.

33 participants
@soyuka@carsonbot@Tiriel@weaverryan@Korbeil@joelwurtz@smnandre@sazzabi-fcms@dbu@pounard@Pierstoval@simondaigre@rogeriolino@jamesisaac@walva@faizanakram99@priyadi@maxbeckers@fabpot@OskarStark@dunglas@nicolas-grekas@GromNaN@stof@welcoMattic@yceruto@onEXHovia@mtarld@chalasr@Cafeine42@VincentLanglet@ging-dev@wouterj

[8]ページ先頭

©2009-2025 Movatter.jp