Mercado Negro | Comunidad Tecnológica

THE TECH ZONE => Lenguajes de Programación => Mensaje iniciado por: franklinrony en Jul 10, 2020, 17:57

Título: Ayuda con componentes de symfony en proyecto web
Publicado por: franklinrony en Jul 10, 2020, 17:57
Hola.
Tengo instalado los siguientes componentes,la mayoria de symfony,
{
  "autoload": {
    "psr-4": {
      "pdes\\": "src/"
    },
    "psr-0": {
      "Bramus\\": "src/",
      "": "src/"
    }
  },
  "require": {
    "symfony/form": "3.4.*",
    "symfony/validator": "3.4.*",
    "symfony/translation": "3.4.*",
    "symfony/twig-bridge": "3.4.*",
    "symfony/security-csrf": "3.4.*",
    "symfony/framework-bundle": "3.4.*",
    "bramus/router": "~1.4",
    "robmorgan/phinx": "^0.10.6",
    "twig/twig": "^2.0",
    "symfony/http-foundation": "^3.4",
    "doctrine/orm": "^2.5",
 "cartalyst/sentinel": "2.0.*",
    "plasticbrain/php-flash-messages": "^1.0",
 "symfony/var-dumper":"^3.4"
  }
}

y esta es la configuracion del archivo donde defino el entorno de Twig, que es el motor de plantilla que estoy usando.

<?php
use Symfony\Component\Form\Forms;
use 
Symfony\Bridge\Twig\Extension\FormExtension;
use 
Symfony\Component\Form\FormRenderer;
use 
Symfony\Bridge\Twig\Form\TwigRendererEngine;
use 
Symfony\Bridge\Twig\Form\TwigRenderer;
use 
Twig\Environment;
use 
Twig\Extension\DebugExtension;
use 
Twig\Loader\FilesystemLoader;
use 
Twig\RuntimeLoader\FactoryRuntimeLoader;
use 
Twig\TwigFunction;
use 
Symfony\Component\Security\Csrf\CsrfTokenManager;
use 
Symfony\Component\HttpFoundation\Session\Session;
use 
Symfony\Component\Security\Csrf\TokenGenerator\UriSafeTokenGenerator;
use 
Symfony\Component\Security\Csrf\TokenStorage\SessionTokenStorage;
use 
Symfony\Component\Translation\Loader\XliffFileLoader;
use 
Symfony\Bridge\Twig\Extension\TranslationExtension;
use 
Symfony\Component\Translation\Translator;
use 
Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension;
use 
Symfony\Component\Form\Extension\Csrf\CsrfExtension;
use 
Symfony\Component\Form\Extension\Validator\ValidatorExtension;
use 
Symfony\Component\Validator\Validation;


// the Twig file that holds all the default markup for rendering forms
// this file comes with TwigBridge
$defaultFormTheme 'form_div_layout.html.twig';
$vendorDirectory realpath(__DIR__.'/../vendor');
// the path to TwigBridge library so Twig can locate the
// form_div_layout.html.twig file
$appVariableReflection = new \ReflectionClass('\Symfony\Bridge\Twig\AppVariable');
$vendorTwigBridgeDirectory dirname($appVariableReflection->getFileName());
// the path to your other templates
$viewsDirectory realpath(__DIR__.'/../src/view');

// creates a Session object from the HttpFoundation component
$session = new Session();
$csrfGenerator = new UriSafeTokenGenerator();
$csrfStorage = new SessionTokenStorage($session);
$csrfManager = new CsrfTokenManager($csrfGenerator$csrfStorage);
// creates the Translator
$translator = new Translator('en');
// somehow load some translations into it
$translator->addLoader('xlf', new XliffFileLoader());
$translator->addResource('array', [
    
'This value should not be blank' => 'Este valor no debe estar vacio',
], 
'fr_FR');
$twig = new Environment(new FilesystemLoader([
    
$viewsDirectory,
    
$vendorTwigBridgeDirectory.'/Resources/views/Form',
    
'debug' => true,

]));
$formEngine = new TwigRendererEngine([$defaultFormTheme], $twig);
$twig->addRuntimeLoader(new FactoryRuntimeLoader([
    
FormRenderer::class => function () use ($formEngine$csrfManager) {
        return new 
FormRenderer($formEngine$csrfManager);
    },
]));

// creates the validator - details will vary
$validator Validation::createValidator();

$formFactory Forms::createFormFactoryBuilder()
    ->
addExtension(new HttpFoundationExtension())
    ->
addExtension(new ValidatorExtension($validator))
    ->
addExtension(new CsrfExtension($csrfManager))
    ->
getFormFactory();

//Funcion agregar assets
$twig->addFunction(new TwigFunction('asset', function ($asset) {
    global 
$url;
    return 
sprintf($url.'assets/%s'ltrim($asset'/'));
}));
// ... (see the previous CSRF Protection section for more information)
// adds the FormExtension to Twig
$twig->addExtension(new FormExtension(new TwigRenderer($formEngine,$csrfManager)));
$twig->addExtension(new TranslationExtension($translator));
$twig->addExtension(new DebugExtension());

//variables globales
$twig->addGlobal('session'$session);
$twig->addGlobal('test'hola);
?>

El detalle que cuando desde un controlado hago una accion:editar,borrar, deseo que aparezca un flash session y se muestre en la vista. siguiendo la documentacion de symfony utilizo el siguiente metodo.
              $session->getFlashBag()->add('info','Usuario creado con exito');


el problema que al tratar de mostrar la variable esta no se visualiza en la vista, ya probe con {{ app.session}} que es la sugerencia que aparece en la documentacion de symfony, pero no se si solo es aplicable al framework y no a los componentes,asi estoy usando el twig-bridge.?

al hacer un vardump de la session esta muestra el contenido, pero no logro mostrarlo en la vista.
Título: Re:Ayuda con componentes de symfony en proyecto web
Publicado por: thedarkness en Jul 11, 2020, 10:56
Ya me habia sucedido algo parecido pero en Laravel, me imagino que utiliza una forma de llamado tipo render() para poder saber que vista utiliza, si es asi por ejemplo si estas en el home y queres mostrar algo seria asi

Cita
echo $this->template->render('home/home', array('nombre' => 'FranklinRony'));

Y en el template deberia de quedar

Cita
Mi nombre es {{ nombre }}
Título: Re:Ayuda con componentes de symfony en proyecto web
Publicado por: franklinrony en Jul 11, 2020, 19:39
Cita de: thedarkness en Jul 11, 2020, 10:56Ya me habia sucedido algo parecido pero en Laravel, me imagino que utiliza una forma de llamado tipo render() para poder saber que vista utiliza, si es asi por ejemplo si estas en el home y queres mostrar algo seria asi

Cita
echo $this->template->render('home/home', array('nombre' => 'FranklinRony'));

Y en el template deberia de quedar

Cita
Mi nombre es {{ nombre }}

Hola, te comento que ya lo consegui. me lleve casi medio dia, pero con la documentacion
https://symfony.com/doc/current/components/http_foundation/sessions.html#flash-messages
 y prueba y error encontre que debo usar lo que se llaman variables globales en el motor de plantilla. dejo aqui el codigo

en el archivo donde se configura el entorno de twig,agregar esta linea

//variables globales que se utilizan en toda la plantilla
$twig->addGlobal('session', $session);

donde $session representa una instancia de esta clase (hay que tener el componente HttpFoundation instalado)
Symfony\Component\HttpFoundation\Session\Session;

al final el codigo me quedo asi
<?php
use Symfony\Component\Form\Forms;
use 
Symfony\Bridge\Twig\Extension\FormExtension;
use 
Symfony\Component\Form\FormRenderer;
use 
Symfony\Bridge\Twig\Form\TwigRendererEngine;
use 
Symfony\Bridge\Twig\Form\TwigRenderer;
use 
Twig\Environment;
use 
Twig\Extension\DebugExtension;
use 
Twig\Loader\FilesystemLoader;
use 
Twig\RuntimeLoader\FactoryRuntimeLoader;
use 
Twig\TwigFunction;
use 
Symfony\Component\Security\Csrf\CsrfTokenManager;
use 
Symfony\Component\HttpFoundation\Session\Session;
use 
Symfony\Component\Security\Csrf\TokenGenerator\UriSafeTokenGenerator;
use 
Symfony\Component\Security\Csrf\TokenStorage\SessionTokenStorage;
use 
Symfony\Component\Translation\Loader\XliffFileLoader;
use 
Symfony\Bridge\Twig\Extension\TranslationExtension;
use 
Symfony\Component\Translation\Translator;
use 
Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension;
use 
Symfony\Component\Form\Extension\Csrf\CsrfExtension;
use 
Symfony\Component\Form\Extension\Validator\ValidatorExtension;
use 
Symfony\Component\Validator\Validation;



// the Twig file that holds all the default markup for rendering forms
// this file comes with TwigBridge
$defaultFormTheme 'form_div_layout.html.twig';
$vendorDirectory realpath(__DIR__.'/../vendor');
// the path to TwigBridge library so Twig can locate the
// form_div_layout.html.twig file
$appVariableReflection = new \ReflectionClass('\Symfony\Bridge\Twig\AppVariable');
$vendorTwigBridgeDirectory dirname($appVariableReflection->getFileName());
// the path to your other templates
$viewsDirectory realpath(__DIR__.'/../src/view');

// creates a Session object from the HttpFoundation component
$session = new Session();
$csrfGenerator = new UriSafeTokenGenerator();
$csrfStorage = new SessionTokenStorage($session);
$csrfManager = new CsrfTokenManager($csrfGenerator$csrfStorage);
// creates the Translator
$translator = new Translator('en');
// somehow load some translations into it
$translator->addLoader('xlf', new XliffFileLoader());
$translator->addResource('array', [
    
'This value should not be blank' => 'Este valor no debe estar vacio',
], 
'fr_FR');
//configurar entorno y habilitar depuracion 'debug' => true. cambiar a false para deshabilitar
//se debe utilizar dump(variable) para mostra la informacion de la variable en la vista
$twig = new Environment(new FilesystemLoader([
    
$viewsDirectory,
    
$vendorTwigBridgeDirectory.'/Resources/views/Form',
]),array(
    
'debug' => true,
    
'cache'=>$cache,
        )
);

$formEngine = new TwigRendererEngine([$defaultFormTheme], $twig);
$twig->addRuntimeLoader(new FactoryRuntimeLoader([
    
FormRenderer::class => function () use ($formEngine$csrfManager) {
        return new 
FormRenderer($formEngine$csrfManager);
    },
]));

// creates the validator - details will vary
$validator Validation::createValidator();

$formFactory Forms::createFormFactoryBuilder()
    ->
addExtension(new HttpFoundationExtension())
    ->
addExtension(new ValidatorExtension($validator))
    ->
addExtension(new CsrfExtension($csrfManager))
    ->
getFormFactory();

//Funcion agregar assets
$twig->addFunction(new TwigFunction('asset', function ($asset) {
    global 
$url;
    return 
sprintf($url.'assets/%s'ltrim($asset'/'));
}));
// ... (see the previous CSRF Protection section for more information)
// agregar Extensiones para utilizar on Twig
$twig->addExtension(new FormExtension(new TwigRenderer($formEngine,$csrfManager)));
$twig->addExtension(new TranslationExtension($translator));
$twig->addExtension(new DebugExtension());

//variables globales que se utilizan en toda la plantilla
$twig->addGlobal('session'$session);
?>

ya con eso se puede utilizar desde la vista
{% if session.flashbag.has('success') %}
        <div class="alert alert-success" role="alert">
                {% for mensaje in session.flashbag.get('success') %}
                    {{ mensaje }}
                {% endfor %}
        </div>
        {% endif %}
y en el controller basta con colocar esta linea
              $session->getFlashBag()->add('success','Usuario creado con exito');

Veo que se parece mucho la logica de symfony con laravel, aun que yo estoy usando solo componentes, pero ya cuando me pase a laravel veo que no me va costar demasiado entenderle.

Otra cosa @thedarkness tu sabes como se usa la inyeccion de dependencias en php? que tengo por alli otra duda siempre de symfony pero me puse a leer la documentacion y no le entendi esa parte
Título: Re:Ayuda con componentes de symfony en proyecto web
Publicado por: thedarkness en Jul 12, 2020, 15:01
Excelente que lo hayas resuelto bien ahi.

@franklinrony creo que podemos ver en otro post lo de la inyección de dependencia.