Skip to content

Conversation

@avalanche123
Copy link

Here is an updated implementation, as discussed.
Testing was the real hard part and I don't think I got the dumper testing right:)
Feedback is much appreciated

@avalanche123
Copy link
Author

need to fix coding standards:)

@fabpot
Copy link
Owner

fabpot commented Oct 3, 2010

I had a closer look and the problem here is that we don't cover all cases; like when using a factory to create the service for instance. But this case is covered when creating the service directly from ContainerBuilder. So, the behavior is not the same and not complete if you use the dumper.

@avalanche123
Copy link
Author

That's a very good point, thanks. I think I have an idea or two on how this could be fixed without runtime instanceof checks, so let me try it again. I'll ping you with a new request, and will close this one for now. Thanks again for taking time to review it.

@avalanche123
Copy link
Author

just committed another attempt:) This time, I move all interface application into a dedicated functions, which reads as a list of if ($instance instanceof ...) checks, with method call.
Should cover all inconsistencies.
Another issue I found and fixed was in ContainerBuilder::createService() - interface injectors were blindly adding method calls to Definition, but since service could be not shared, that would mean that each time we instantiated a new non-shared service instance, interface injectors would have added the same method calls over and over again.

@fabpot
Copy link
Owner

fabpot commented Oct 5, 2010

I have not tested the code, but just by reading it, it looks much better now.

Some comments:

The only "problem" I see now is that there is one more method call each time you get a service.

@fabpot
Copy link
Owner

fabpot commented Oct 5, 2010

Why do you have a removeInterfaceInjectors() method? I think this is unnecessary.

@avalanche123
Copy link
Author

updated according to feedback:) Some major improvements and optimizations

@avalanche123
Copy link
Author

This is it, please review and share concerns

@fabpot
Copy link
Owner

fabpot commented Oct 20, 2010

The code looks better now and performance should also be much better
(especially if you don't use interface injections at all;).) But still, if you
have many injectors, for each service the container creates, the container
still needs to execute one more method and a bunch of 'if' statements (one per
configured interface). That's still too much to me. The DIC is the heart of
Symfony2, and it needs to add as little overhead as possible (it should be
nearly as fast as if you were creating the instances by hand).

So, the problem is basically how to speed up the container dump back to PHP.

I had a look at the DIC code again, and I think I have a solution. For
performance reasons, the container (as used by the Symfony2 kernel) is always
frozen
(http://github.com/fabpot/symfony/blob/master/src/Symfony/Component/HttpKernel/Kernel.php#L390),
which means that when dumping the container to PHP, the class names for all
services are known
(http://github.com/fabpot/symfony/blob/master/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php#L294).

In such a case, we can determine the interfaces when dumping the container and
add the method calls accordingly. It means that for that specific case, we
won't have any overhead, which is great!

Your current code is still needed though just in case someone dumps a
container that is not frozen.

To sump up, if the container is frozen, we are able to dump the actual method
calls (with no overhead at runtime -- always the case when using the Symfony2
Kernel), if not, we just fallback to runtime checks.

Does it sound good?

And here is another question as a bonus: What about removing the possibility
to dump a non-frozen container to PHP? I haven't look at that, but I think
this can be a good thing.

@avalanche123
Copy link
Author

Haha, I think that would be great - removing the ability to dump non-frozen containers.
That was the main reason the implementation became so complicated.
Also, how about creating a FrozenContainer class. And it would not allow for addition of new services or definitions.
That way we could just type hint the DumperInterface::dump() to only accept instances of that class, instead of using if statements.
The API I'm thinking is something like Container::getFrozenContainer() which returns a FrozenContainer instance based on the original Container
Then we could do something like PHPDumper::dump(Container::getFrozenContainer()) in the Kernel bootstrap. Which would also enforce all dependency injection to be done through configs of during the Bundle::boot() execution.
The only problem with configuration time interface injection is factory-method with factory-service, which prevents us from knowing the service class before its instantiated. Unless, maybe, we keep the class attribute as required in DI configuration, even with factory-service and factory-method combo.

@fabpot
Copy link
Owner

fabpot commented Oct 20, 2010

I don't see the problem with factories as this is the responsibility of the factory to create the service.

@avalanche123
Copy link
Author

ok, so we would just ignore interface injectors for factories then.

@fabpot
Copy link
Owner

fabpot commented Oct 20, 2010

Yes

@avalanche123
Copy link
Author

Ok, makes sense. I will work on the implementation over the weekend, and we can then discuss.

@avalanche123
Copy link
Author

just updated the implementation to take isFrozen() into account, also restricted ContainerBuilder from adding new services or definitions if it was frozen.

@fabpot
Copy link
Owner

fabpot commented Nov 30, 2010

merged.

I know that the DIC is not yet covered in the documentation but can you write a small tutorial about interface injection for the documentation? Thanks.

@avalanche123
Copy link
Author

will do this week, thanks!

fabpot added a commit that referenced this pull request Jul 30, 2023
This PR was squashed before being merged into the 1.0-dev branch (closes #43).

Discussion
----------

Create PSR-7 messages using PSR-17 factories

Use any implementation of the justs approved PSR-17 to build PSR-7 HTTP messages.

Commits
-------

dd81b4b Create PSR-7 messages using PSR-17 factories
fabpot added a commit that referenced this pull request Jul 30, 2023
…he monorepo (fabpot, dunglas, KorvinSzanto, xabbuh, aimeos, ahundiak, Danielss89, rougin, csunolgomez, Jérôme Parmentier, mtibben, Nyholm, ajgarlag, uphlewis, samnela, grachevko, nicolas-grekas, tinyroy, danizord, Daniel Degasperi, rbaarsma, Ekman, 4rthem, derrabus, mleczakm, iluuu1994, Tobion, chalasr, lemon-juice, franmomu, cidosx, erikn69, AurelienPillevesse)

This PR was merged into the 6.4 branch.

Discussion
----------

[PsrHttpMessageBridge] Import the bridge into the monorepo

| Q             | A
| ------------- | ---
| Branch?       | 6.4
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| Tickets       | N/A
| License       | MIT
| Doc PR        | TODO

⚠️ Don't squash!

I propose to import the `symfony/psr-http-message-bridge` package into the Symfony monorepo for further maintenance.

Commits
-------

e40dd66 [PsrHttpMessageBridge] Patch return types and fix CS
266c09f [PsrHttpMessageBridge] Import the bridge into the monorepo
0c0323a Add 'src/Symfony/Bridge/PsrHttpMessage/' from commit '581ca6067eb62640de5ff08ee1ba6850a0ee472e'
581ca60 Prepare release 2.3.1
45d0349 Fix CS
6410dda bug #122 Don't rely on Request::getPayload() to populate the parsed body (nicolas-grekas)
ef03b6d Don't rely on Request::getPayload() to populate the parsed body
3c62b81 minor #120 Prepare release 2.3.0 (derrabus)
96acbfd Prepare release 2.3.0
7eedd34 feature #119 Implement ValueResolverInterface (derrabus)
0b54b85 Implement ValueResolverInterface
6b2f5df feature #117 Leverage `Request::getPayload()` to populate the parsed body of PSR-7 requests (AurelienPillevesse)
3a8caad Leverage `Request::getPayload()` to populate the parsed body of PSR-7 requests
18c9e82 minor #118 Add native types where possible (derrabus)
4fd4323 Add native types where possible
28a732c minor #115 Prepare the 2.2.0 release (derrabus)
7944831 cs fix
99ddcaa Prepare the 2.2.0 release
8a5748d feature #113 Bump psr/http-message version (erikn69)
ec83c1c Bump psr/http-message version
694016e feature #114 Drop support for Symfony 4 (derrabus)
b360b35 Drop support for Symfony 4
998d8d2 minor #111 Adjustments for PHP CS Fixer 3 (derrabus)
5fa5f62 Adjustments for PHP CS Fixer 3
a125b93 minor #110 Add PHP 8.2 to CI (derrabus)
4592df2 Add PHP 8.2 to CI
4617ac3 bug #109 perf: ensure timely flush stream buffers (cidosx)
8c8a75b perf: ensure timely flush stream buffers
d444f85 Update changelog
155a7ae bug #107 Ignore invalid HTTP headers when creating PSR7 objects (nicolas-grekas)
9a78a16 Ignore invalid HTTP headers when creating PSR7 objects
bdb2871 minor #104 Add missing .gitattributes (franmomu)
808561a Add missing .gitattributes
316f5cb bug #103 Fix for wrong type passed to moveTo() (lemon-juice)
7f3b5c1 Fix for wrong type passed to moveTo()
22b37c8 minor #101 Release v2.1.2 (chalasr)
c382d76 Release v2.1.2
c81476c feature #100 Allow Symfony 6 (chalasr)
c7a0be3 Allow Symfony 6
df83a38 minor #98 Add PHP 8.1 to CI (derrabus)
b2bd334 Add PHP 8.1 to CI
824711c minor #99 Add return types to fixtures (derrabus)
f8f70fa Add return types to fixtures
d558dcd minor #97 Inline $tmpDir (derrabus)
d152649 Inline $tmpDir
f12a9e6 minor #96 Run PHPUnit on GitHub Actions (derrabus)
ab64c69 Run PHPUnit on GitHub Actions
c901299 bug #95 Allow `psr/log` 2 and 3 (derrabus)
8e13ae4 Allow psr/log 2 and 3
26068fa Minor cleanups
87fabb9 Fix copyright year
3d9241f minor #92 remove link to sensio extra bundle which removed psr7 support (Tobion)
7078739 remove link to sensio extra bundle which removed psr7 support
81db2d4 feature #89 PSR HTTP message converters for controllers (derrabus)
aa26e61 PSR HTTP message converters for controllers
e62b239 minor #91 Fix CS (derrabus)
2bead22 Fix CS
488df9b minor #90 Fix CI failures with Xdebug 3 and test on PHP 7.4/8.0 as well (derrabus)
a6697fd Fix CI failures with Xdebug 3 and test on PHP 7.4/8.0 as well
c62f7d0 Update branch-alias
51a21cb Update changelog
a20fff9 bug #87 Fix populating server params from URI in HttpFoundationFactory (nicolas-grekas)
4933e04 bug #86 Create cookies as raw in HttpFoundationFactory (nicolas-grekas)
66095a5 Fix populating server params from URI in HttpFoundationFactory
42cca49 Create cookies as raw in HttpFoundationFactory
cffb3a8 bug #85 Fix BinaryFileResponse with range to psr response conversion (iluuu1994)
5d5932d Fix BinaryFileResponse with range to psr response conversion
e44f249 bug #81 Don't normalize query string in PsrHttpFactory (nicolas-grekas)
bc25829 Don't normalize query string in PsrHttpFactory
df735ec bug #78 Fix populating default port and headers in HttpFoundationFactory (mleczakm)
4f30401 Fix populating default port and headers in HttpFoundationFactory
1309b64 bug #77 fix conversion for https requests (4rthem)
e86de3f minor #79 Allow installation on php 8 (derrabus)
9243f93 Allow installation on php 8.
d336c73 fix conversion for https requests
126903c Fix format of CHANGELOG.md
ce709cd feature #75 Remove deprecated code (fabpot)
dfc5238 Remove deprecated code
9d3e80d bug #72 Use adapter for UploadedFile objects (nicolas-grekas)
a4f9f6d Use adapter for UploadedFile objects
ec7892b Fix CHANGELOG, bump branch-alias
7ab4fe4 minor #70 Updated CHANGELOG (rbaarsma)
9ad4bcc Updated CHANGELOG
c4c904a minor #71 Cleanup after bump to Symfony v4.4 (nicolas-grekas)
e9a9557 Cleanup after bump to Symfony v4.4
3d10a6c feature #66 Add support for streamed Symfony request (Ekman)
df26630 Add support for streamed Symfony request
5aa8ca9 bug #69 Allow Symfony 5.0 (rbaarsma)
1158149 Allow Symfony 5.0
81ae86d Merge branch '1.1'
a33352a bug #64 Fixed createResponse (ddegasperi)
7a4b449 minor #65 Fix tests (ajgarlag)
19905b0 Fix tests
580de38 Fixed createResponse
9ab9d71 minor #63 Added links to documentation (Nyholm)
59b9406 Added links to documentation
c1cb51c feature #50 Add support for streamed response (danizord)
4133c7a bug #48 Convert Request/Response multiple times (Nyholm)
8564bf7 Convert Request/Response multiple times
7cc1605 Add support for streamed response
aebc14b feature #62 bump to PHP 7.1 (nicolas-grekas)
8e10923 bump to PHP 7.1
5e5e0c3 Revert "Undeprecate DiactorosFactory for 1.1"
921f866 Undeprecate DiactorosFactory for 1.1
8592ca3 bug #61 removed 'Set-Cookie' from header when it is already converted to a Symfony header cookie (tinyroy)
dd1111e removed 'Set-Cookie' from header when it is already converted to a Symfony header cookie
ba672d8 bump branch-alias
5f9a032 typo
f2c48c5 fix tests
3a52e44 bug #59 Fix SameSite attribute conversion from PSR7 to HttpFoundation (ajgarlag)
5ee1f8f Fix SameSite attribute conversion from PSR7 to HttpFoundation
f6d7d3a bug #58 [Bugfix] Typo header set-sookie (grachevko)
16eb6e1 minor #57 Excluded tests from classmap (samnela)
36a8065 Deprecate DiactorosFactory, use nyholm/psr7 for tests
5076934 bug #54 Fix #51 (compatability issue with zendframework/zend-diactoros ^2.0) (uphlewis)
757ea81 [Bugfix] Typo header set-sookie
25f9c3a Excluded tests from classmap
8ff61e5 Fix compatability issue with "zendframework/zend-diactoros": "^2.0." (#51)
53c15a6 updated CHANGELOG
c821241 bumped version to 1.1
f26d01f minor #47 Updated changelog (Nyholm)
c2282e3 Updated changelog
eddd6c8 feature #43 Create PSR-7 messages using PSR-17 factories (ajgarlag)
dd81b4b Create PSR-7 messages using PSR-17 factories
f11f173 feature #45 Fixed broken build (Nyholm)
8780dd3 Fixed broken build
c2b7579 bug #30 Fix the request target in PSR7 Request (mtibben)
94fcfa5 Fix the request target in PSR7 Request
64640ee minor #38 Run PHP 5.3 tests on Precise (Lctrs)
64c0cb0 Run PHP 5.3 tests on Precise
b209840 minor #32 Allow Symfony 4 (dunglas)
97635f1 Allow Symfony 4
147a238 minor #31 test suite compatibility with PHPUnit 6 (xabbuh)
f5c46f0 test suite compatibility with PHPUnit 6
66085f2 preparing 1.0 release
533d3e4 added a CHANGELOG for 1.0
14269f9 bug #28 Fix REQUEST_METHOD on symfony request (csunol)
98ab85a Fix REQUEST_METHOD on symfony request
29be4f8 updated LICENCE year
d2db47c removed obsolete CHANGELOG file
1c30b17 bug #22 Fixes #16 Symfony Request created without any URI (rougin)
a59c572 Fixes #16 Symfony Request created without any URI
7a5aa92 bug #23 Fixes #9 Bridge error when no file is selected (ahundiak, Danielss89)
a1a631a Update assert error message
e5d62e6 Fixes based on code-review
101b608 Handles null file in createrequest bridge.
d16c63c bug #18 Allow multiple calls to Request::getContent() (aimeos)
9624b8b Allow multiple calls to Request::getContent()
9c747c4 Merge pull request #19 from xabbuh/travis-config
a388c43 update Travis CI configuration
ac5cd86 minor #14 Remove use of deprecated 'deep' parameter in tests (KorvinSzanto)
305c0fe Remove use of deprecated 'deep' parameter
3664dc0 minor #7 Test Diactoros Factory with PHP 5.4 (dunglas)
bab1530 Test Diactoros Factory with PHP 5.4
d7660b8 Suggest psr/http-message-implementation
dc7e308 removed the branch alias for now as we are pre 1.0
3f8977e feature #1 Initial support (dunglas)
ca41146 Initial support
01b110b added the initial set of files
This pull request was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants