La barra de herramientas de mi perfilador no aparece en Symfony 4.3.1

9

En mi .envarchivo, he especificado que el entorno de mi aplicación sea dev y debug para que sea verdadero así:

APP_ENV=dev
APP_DEBUG=true

En mi config/packages/dev/web_profiler.yamlarchivo tengo lo siguiente:

web_profiler:
    toolbar: true
    intercept_redirects: false

framework:
    profiler: { only_exceptions: false }

La ruta interna config/routes/dev/web_profiler.yamlparece estar bien:

web_profiler_wdt:
    resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml'
    prefix: /_wdt

web_profiler_profiler:
    resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml'
    prefix: /_profiler

Entonces, cuando ejecuto el servidor con symfony server:starttodo está bien, pero el generador de perfiles no aparece. ¿Me perdí algo que habilita esa función dentro de Symfony?

Para aclarar, la página está generando una página HTML adecuada con el contenido apropiado. Simplemente no aparece el generador de perfiles.


Mi plantilla base de ramita:

<!DOCTYPE html>
<html lang="en" dir="ltr">
    <head>
        <meta charset="utf-8">
        <title>{% block title %} {% endblock %}</title>
        {{ encore_entry_script_tags('base') }}
        <link rel="icon" type="image/x-icon" href="{{ asset('build/images/favicon.ico') }}" />
        <link href="https://fonts.googleapis.com/css?family=IBM+Plex+Sans:400,500|Playfair+Display:400,700&display=swap" rel="stylesheet">
        {{ encore_entry_link_tags("base") }}
        {% block stylesheet %}{% endblock %}
    </head>
    <body {% if app.request.get('_route') == 'home' %} class='homepage' {% endif %} >
        <header>
            <div id='top-navigation' class='padding-lg__left-md padding-lg__right-md padding-lg__top-sm padding-lg__bottom-sm row row__align-center row__justify-start'>
                <span class='text-color__white text-size__small text-weight__bold margin-lg__right-lg'>Our Mission</span>
                <span class='text-color__white text-size__small text-weight__bold margin-lg__right-lg'>Our Team</span>
                <span class='text-color__white text-size__small text-weight__bold margin-lg__right-lg'>Where the Money Goes</span>
                <span class='text-color__white text-size__small text-weight__bold margin-lg__right-lg'>Community Leadership</span>
                <span class='text-color__white text-size__small text-weight__bold'>Policies</span>
                <span class='text-color__white text-size__small text-weight__bold margin-lg__left-auto icon-set'> <span class='icon size__small color__white margin-lg__right-xsm'>{{ source('@public_path'~asset('build/images/icons/feedback.svg')) }}</span>Submit Feedback</span>
            </div>
            <nav class="padding-lg__top-md padding-lg__bottom-md padding-lg__left-md padding-lg__right-md row row__align-center row__justify-start {% if app.request.get('_route') == 'home' %} homepage {% endif %}">
                <div id='logo'>
                    <a href="{{ url('home') }}">
                        <img src="{{ asset('build/images/logo_placeholder.png') }}" alt="logo">
                    </a>
                </div>
                {% if app.request.get('_route') == 'creator-register' %}

                {% else %}
                    {% if not is_granted('IS_AUTHENTICATED_FULLY') %}
                        <div class='margin-lg__left-auto'>
                            <a href="{{ url('login') }}">
                                <div class='icon-set'>
                                    <span class='icon margin-lg__right-xsm'>
                                        {{ source('@public_path'~asset('build/images/icons/user.svg')) }}
                                    </span>
                                    <span class='nav-item'>Login</span>
                                </div>
                            </a>
                        </div>
                    {% endif %}

                {% endif %}
            </nav>
        </header>
        {% if app.request.get('_route') != 'home' %} <div class='container is_top'> {% endif %}
            {% block body %} {% endblock %}
        {% if app.request.get('_route') != 'home' %} </div> {% endif %}
    </body>
</html>

Firewall Security.yaml:

    firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
            main:
                anonymous: true
                guard:
                    authenticators:
                        - App\Security\LoginFormAuthenticator
                logout:
                    path : logout
                remember_me:
                    secret: '%kernel.secret%'
                    lifetime: 2592000 #<- 30 days in seconds - defaults to one year if you take this out!

Resultados en php bin/console debug:router | grep _profiler:

  _profiler_home             ANY      ANY      ANY    /_profiler/                        
  _profiler_search           ANY      ANY      ANY    /_profiler/search                  
  _profiler_search_bar       ANY      ANY      ANY    /_profiler/search_bar              
  _profiler_phpinfo          ANY      ANY      ANY    /_profiler/phpinfo                 
  _profiler_search_results   ANY      ANY      ANY    /_profiler/{token}/search/results  
  _profiler_open_file        ANY      ANY      ANY    /_profiler/open                    
  _profiler                  ANY      ANY      ANY    /_profiler/{token}                 
  _profiler_router           ANY      ANY      ANY    /_profiler/{token}/router          
  _profiler_exception        ANY      ANY      ANY    /_profiler/{token}/exception       
  _profiler_exception_css    ANY      ANY      ANY    /_profiler/{token}/exception.css 

Por último controlador de la página de inicio:

<?php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class HomepageController extends AbstractController{

    /**
    * @Route("/", name="home")
    */

    public function output(){
        return $this->render('homepage/home.html.twig',[
            'title' => 'yo',
        ]);
    }
}

?>

Public / index.php agregado:

<?php

use App\Kernel;
use Symfony\Component\Debug\Debug;
use Symfony\Component\HttpFoundation\Request;

require dirname(__DIR__).'/config/bootstrap.php';

if ($_SERVER['APP_DEBUG']) {
    umask(0000);

    Debug::enable();
}

if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? $_ENV['TRUSTED_PROXIES'] ?? false) {
    Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_ALL ^ Request::HEADER_X_FORWARDED_HOST);
}

if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? $_ENV['TRUSTED_HOSTS'] ?? false) {
    Request::setTrustedHosts([$trustedHosts]);
}

$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
Majo0od
fuente
Haga un ctrl-u en su navegador y verifique que tiene una página html apareciendo. La barra solo estará presente para una página real.
Cerad
1
1. ¿puede verificar en la pestaña de red de su navegador (F12 en ff y chrome), que tal vez se haya cargado alguna ruta _profiler? (en caso afirmativo, está cargado pero invisible). 2. es el paquete del generador de perfiles web activo, ejecute bin/console debug:event-dispatcher kernel.responsedonde con -128 prioridad debe haber WebDebugToolbarListener::onKernelResponse. si no es así, verifique config / bundles.php, que debería contener WebProfilerBundle. Si.
Jakumi el
2
@ Majo0od si descubrió que las condiciones en la línea 102 hacen que el oyente deje de funcionar, ¿qué ha intentado llevar a cabo? ¿A cuál de estas condiciones se evalúa true?
Nico Haase,
1
Modificar temporalmente WebDebugToolbarListener.php. En la línea 109 agregue esto antes de la declaración de devolución: echo 'Mode: ', $this->mode, " XDebTok: ", $response->headers->has('X-Debug-Token'), " IsRedir: ", $response->isRedirection(); die();e informe la devolución de eso.
yivi
1
Agregue una cadena falsa (por ejemplo, "abc") en la parte superior de "config / packages / dev / web_profiler.yaml" para ver si obtiene un error. Tal vez el archivo no se lea en absoluto.
Jannes Botis el

Respuestas:

7

Es muy difícil, si no imposible, depurar esto remotamente. El problema exacto está relacionado con algo específico en su configuración local, y alguien sin acceso a su proyecto no tendría la oportunidad de ver exactamente qué está mal.

Algunos consejos generales y específicos de solución de problemas para su situación:

1er. Vuelva a instalar el paquete del generador de perfiles

Si bien es inusual, la instalación podría ser descorchada. Asegúrese de que su paquete de perfiladores esté bien.

Primero quítelo ( composer remove profiler), y luego instálelo nuevamente:) composer require --dev profiler.

2do. Comprueba la configuración

Use el comando de consola de Symfony para verificar su configuración.

Primero para el perfilador incorporado:

$ bin/console debug:config framework profiler

Lo que debería devolver algo como esto:

Current configuration for "framework.profiler"
==============================================

only_exceptions: false
enabled: true
collect: true
only_master_requests: false
dsn: 'file:%kernel.cache_dir%/profiler'

Y luego para la barra de herramientas del generador de perfiles:

$ bin/console debug:config web_profiler

Que debería devolver algo como:

Current configuration for extension with alias "web_profiler"
=============================================================

web_profiler:
    toolbar: true
    intercept_redirects: false
    excluded_ajax_paths: '^/((index|app(_[\w]+)?)\.php/)?_wdt'

3er. Revisa el contenedor

Compruebe cómo se instanciará el servicio Profiler:

$ bin/console debug:container profiler --show-arguments

Espera algo como esto:

Information for Service "profiler"
==================================

 Profiler.

 ---------------- -------------------------------------------------------------------------------------
  Option           Value
 ---------------- -------------------------------------------------------------------------------------
  Service ID       profiler
  Class            Symfony\Component\HttpKernel\Profiler\Profiler
  Tags             monolog.logger (channel: profiler)
                   kernel.reset (method: reset)
  Calls            add, add, add, add, add, add, add, add, add, add, add, add, add, add, add, add, add
  Public           yes
  Synthetic        no
  Lazy             no
  Shared           yes
  Abstract         no
  Autowired        no
  Autoconfigured   no
  Arguments        Service(profiler.storage)
                   Service(monolog.logger.profiler)
                   1
 ---------------- -------------------------------------------------------------------------------------

Y luego para el web_toolbar:

# bin/console debug:container web_profiler.debug_toolbar --show-arguments

Por algo como esto:

Information for Service "web_profiler.debug_toolbar"
====================================================

 WebDebugToolbarListener injects the Web Debug Toolbar.

 ---------------- ------------------------------------------------------------------------
  Option           Value
 ---------------- ------------------------------------------------------------------------
  Service ID       web_profiler.debug_toolbar
  Class            Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener
  Tags             kernel.event_subscriber
                   container.hot_path
  Public           no
  Synthetic        no
  Lazy             no
  Shared           yes
  Abstract         no
  Autowired        no
  Autoconfigured   no
  Arguments        Service(twig)

                   2
                   Service(router.default)
                   ^/((index|app(_[\w]+)?)\.php/)?_wdt
                   Service(web_profiler.csp.handler)
 ---------------- ------------------------------------------------------------------------

(Nota la 2 que, que habilita la barra de herramientas).

4to. Verifique el despachador de eventos.

La barra de herramientas de depuración web se inyecta durante el kernel.responseevento. Verifique que la devolución de llamada esté correctamente enganchada:

$ bin/console debug:event-dispatcher kernel.response

Lo que devolverá algo como esto:

Registered Listeners for "kernel.response" Event
================================================

 ------- -------------------------------------------------------------------------------------------- ----------
  Order   Callable                                                                                     Priority
 ------- -------------------------------------------------------------------------------------------- ----------
  #1      ApiPlatform\Core\Hydra\EventListener\AddLinkHeaderListener::onKernelResponse()               0
  #2      Symfony\Component\HttpKernel\EventListener\ResponseListener::onKernelResponse()              0
  #3      Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelResponse()          0
  #4      Symfony\Component\WebLink\EventListener\AddLinkHeaderListener::onKernelResponse()            0
  #5      Symfony\Component\Security\Http\RememberMe\ResponseListener::onKernelResponse()              0
  #6      ApiPlatform\Core\HttpCache\EventListener\AddHeadersListener::onKernelResponse()              -1
  #7      Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelResponse()              -100
  #8      Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener::onKernelResponse()   -128
  #9      Symfony\Component\HttpKernel\EventListener\TestSessionListener::onKernelResponse()           -128
  #10     Symfony\Component\HttpKernel\EventListener\DisallowRobotsIndexingListener::onResponse()      -255
  #11     Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelResponse()               -1000
  #12     Symfony\Component\HttpKernel\EventListener\StreamedResponseListener::onKernelResponse()      -1024
 ------- -------------------------------------------------------------------------------------------- ----------

Notifique el elemento #7, que es el recopilador Profiler (que, entre otras cosas, incluirá el X-Debug-Tokenencabezado en la respuesta, que luego será verificado por la Barra de herramientas de depuración web, que es el elemento#8 en la lista anterior.

Si alguno de los controles anteriores falla

Tendrás que concentrarte en esa parte específica para descubrir por qué está fallando. ¿Quizás algún otro paquete interfiere? ¿Un problema con uno de los archivos de configuración?

Todo sale

... pero aún no funciona? Bueno, eso es raro. Asegúrese de que su plantilla devuelta tenga una </body>etiqueta y que la respuesta devuelta tenga text/htmlcontenido. Pero si todo lo anterior se verifica ... debería funcionar.


En un comentario dices que framework.profiler.collect se establece en falso al realizar estas comprobaciones.

Póngalo en verdadero cambiando config/packages/dev/web_profiler.yamlasí:

framework:
    profiler:
        only_exceptions: false
        collect: true
yivi
fuente
3
Lo que se destacó fue: debug:config framework profilerregresócollect: false
Majo0od
Intente agregar la configuración de framework.profiler.collectlo que dice true.
yivi
1
¡¡¡ESTÁ VIVO!!! ¡Finalmente! ¡Ahora ha vuelto! ¡Gracias por toda la depuración y ayuda!
Majo0od
Quién sabía que una sola línea podría estropear todo. ¿Históricamente no necesitamos agregar collect : truesi recuerdo correctamente? ¿Es esto nuevo?
Majo0od
Gracias por todos estos pasos! Resulté que creé una plantilla que no extendía la base, por lo que en realidad no estaba devolviendo HTML / Javascript, sino solo texto sin formato.
Alexander Varwijk