Creando tus propieas funciones de expresión

Nuevo en la versión 1.3: @DI\SecurityFunction fue añadida en 1.3.

Incluso aunque las expresiones integradas ya te permiten hacer mucho, hay casos donde querrás añadir una función de expresión personalizada.

Supón que quieres comprobar que un usuario tiene una determinada IP, lo podrías hacer usando esta expresión container.get("request").getIp() == "127.0.0.1". sin embargo, si duplicas esto en varias acciones, se vuelve en mucho que escribir. Además, ¿qué pasa si quieres añadir otra IP? Tendrías que editar todos los sitios donde utilices esta expresión. Por lo tanto, en vez de la expresión anterior, añades otra función isLocalUser(), misma que puedes utilizar en tus expresiones.

<?php

namespace Acme\DemoBundle\Security;

use Symfony\Component\DependencyInjection\ContainerInterface;
use JMS\DiExtraBundle\Annotation as DI;

/** @DI\Service */
class RequestAccessEvaluator
{
    private $container;

    /**
     * @DI\InjectParams({
     *     "container" = @DI\Inject("service_container"),
     * })
     */
    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    /** @DI\SecurityFunction("isLocalUser") */
    public function isLocalUser()
    {
        return $this->container->get('request')->getIp() === '127.0.0.1';
    }
}

Nota

Si estás utilizando anotaciones para configurar el servicio (@DI\Service) asegurate de que la ruta a tu archivo es escaneado por el JMSDiExtraBundle. Para más información, por favor, ve configurando JMSDiExtraBundle.

Bifúrcame en GitHub