-
-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Added documentation about profiler matchers #2785
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,3 +5,4 @@ Profiler | |
:maxdepth: 2 | ||
|
||
data_collector | ||
matchers |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,164 @@ | ||
.. index:: | ||
single: Profiling; Matchers | ||
|
||
How to use Matchers to enable the Profiler | ||
========================================== | ||
|
||
By default, the profiler is only activated in the development environment. But | ||
it's imaginable that a developer always wants to see the profiler, even in | ||
production. Another situation may be to show the profiler when an admin has | ||
logged in. You can enable the profiler in these situations by using matchers. | ||
|
||
Using the build-in Matcher | ||
-------------------------- | ||
|
||
Symfony2 provides a | ||
:class:`build-in matcher <Symfony\\Component\\HttpFoundation\\RequestMatcher>` | ||
which can match paths and IPs. For instance, only show the profiler when | ||
accessing the page with the ``168.0.0.1`` ip. Then, the profiler can be | ||
configured to something like this: | ||
|
||
.. configuration-block:: | ||
|
||
.. code-block:: yaml | ||
|
||
# app/config/config.yml | ||
framework: | ||
# ... | ||
profiler: | ||
matcher: | ||
ip: 168.0.0.1 | ||
|
||
.. code-block:: xml | ||
|
||
<!-- app/config/config.xml --> | ||
<framework:config> | ||
<framework:profiler | ||
ip="168.0.0.1" | ||
/> | ||
</framework:config> | ||
|
||
.. code-block:: php | ||
|
||
// app/config/config.php | ||
$container->loadFromExtension('framework', array( | ||
'profiler' => array( | ||
'ip' => '168.0.0.1', | ||
), | ||
)); | ||
|
||
You can also set a ``path`` option to define the path on which the profiler | ||
should be enabled. For instance, setting it to `^/admin/` will enable the | ||
profiler only for the ``/admin/`` urls. | ||
|
||
Creating a Custom Matcher | ||
------------------------- | ||
|
||
You can also create a custom matcher. This is a service that checks whether | ||
the profiler should be enabled or not. To create that service, create a class | ||
which implements | ||
:class:`Symfony\\Component\\HttpFoundation\\RequestMatcherInterface`. This | ||
interface requires one method: | ||
:method:`Symfony\\Component\\HttpFoundation\\RequestMatcherInterface::matches`. | ||
This method returns a falsey value to disable the profiler, any other value | ||
enables the profiler. | ||
|
||
To enable the profiler when a ``ROLE_SUPER_ADMIN`` is logged in, you can use | ||
something like:: | ||
|
||
// src/Acme/DemoBundle/Profiler/SuperAdminMatcher.php | ||
namespace Acme\DemoBundle\Profiler; | ||
|
||
use Symfony\Component\Security\Core\SecurityContext; | ||
use Symfony\Component\HttpFoundation\Request; | ||
use Symfony\Component\HttpFoundation\RequestMatcherInterface; | ||
|
||
class SuperAdminMatcher implements RequestMatcherInterface | ||
{ | ||
protected $securityContext; | ||
|
||
public function __construct(SecurityContext $securityContext) | ||
{ | ||
$this->securityContext = $securityContext; | ||
} | ||
|
||
public function matches(Request $request) | ||
{ | ||
return $this->securityContext->isGranted('ROLE_SUPER_ADMIN'); | ||
} | ||
} | ||
|
||
Then, you need to configure the service: | ||
|
||
.. configuration-block:: | ||
|
||
.. code-block:: yaml | ||
|
||
parameters: | ||
acme_demo.profiler.matcher.super_admin.class: Acme\DemoBundle\Profiler\SuperAdminMatcher | ||
|
||
services: | ||
acme_demo.profiler.matcher.super_admin: | ||
class: "%acme_demo.profiler.matcher.super_admin.class%" | ||
arguments: [@security.context] | ||
|
||
.. code-block:: xml | ||
|
||
<parameters> | ||
<parameter | ||
key="acme_demo.profiler.matcher.super_admin.class" | ||
>Acme\DemoBundle\Profiler\SuperAdminMatcher</parameter> | ||
</parameters> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For me this looks pretty ugly. <parameters>
<parameter key="acme_demo.profiler.matcher.super_admin.class">
Acme\DemoBundle\Profiler\SuperAdminMatcher
</parameter>
</parameters> Is what I prefer. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. it looks really ugly, but your solution won't work AFAIK. Whitespaces aren't removed from parameter values, |
||
|
||
<services> | ||
<service id="acme_demo.profiler.matcher.super_admin" | ||
class="%acme_demo.profiler.matcher.super_admin.class%"> | ||
<argument type="service" id="security.context" /> | ||
</services> | ||
|
||
.. code-block:: php | ||
|
||
use Symfony\Component\DependencyInjection\Definition; | ||
use Symfony\Component\DependencyInjection\Reference; | ||
|
||
$container->setParameter( | ||
'acme_demo.profiler.matcher.super_admin.class', | ||
'Acme\DemoBundle\Profiler\SuperAdminMatcher' | ||
); | ||
|
||
$container->setDefinition('acme_demo.profiler.matcher.super_admin', new Definition( | ||
'%acme_demo.profiler.matcher.super_admin.class%', | ||
array(new Reference('security.context')) | ||
); | ||
|
||
Now the service is registered, the only thing left to do is configure the | ||
profiler to use this service as the matcher: | ||
|
||
.. configuration-block:: | ||
|
||
.. code-block:: yaml | ||
|
||
# app/config/config.yml | ||
framework: | ||
# ... | ||
profiler: | ||
matcher: | ||
service: acme_demo.profiler.matcher.super_admin | ||
|
||
.. code-block:: xml | ||
|
||
<!-- app/config/config.xml --> | ||
<framework:config> | ||
<framework:profiler | ||
service="acme_demo.profiler.matcher.super_admin" | ||
/> | ||
</framework:config> | ||
|
||
.. code-block:: php | ||
|
||
// app/config/config.php | ||
$container->loadFromExtension('framework', array( | ||
'profiler' => array( | ||
'service' => 'acme_demo.profiler.matcher.super_admin', | ||
), | ||
)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
false
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no falsey value, so
0
,array()
,null
andfalse
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I changed it to false at sha: 826197b. The reason is that even though the implementation (i.e. the class in Symfony that calls
matches
and uses its value) allows for a "falsey" value, theRequestMatcherInterface::matches
states that this method returns a boolean.Obviously, small detail - but I wanted to explain why I chose to change it :).
Thanks!