2012-08-06 11 views
6

Estoy siguiendo la página How to Override any Part of a Bundle en el sitio web de Symfony 2. Esto es interesante:¿Extiende el servicio de solicitud de Symfony 2?

puede establecer el parámetro de la celebración de nombre de la clase del servicio a su propia clase estableciéndola en app/config/config.yml. Por supuesto, esto es solo posible si el nombre de la clase se define como un parámetro en la configuración del servicio del paquete que contiene el servicio.

Así que miré a /vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Resources/config y me encontré con que session.xml es la definición %session.class% parámetro, por lo que debe ser fácil de extender Symfony Session clase con algo como:

namespace Acme\HelloBundle\Component\HttpFoundation; 

use Symfony\Component\HttpFoundation\Session; 

class ExtendedSession extends Session 
{ 
    public function setSuccessFlashText($text, array params = array()) 
    { 
     parent::setFlash('success', $this->getTranslator()->trans($text, $params); 
    } 
} 

Me di no probado esto todavía. ¿Pero cómo puedo hacer lo mismo con el servicio especial request? Me gustaría agregar algunos accesos directos convenientes para hacer que mi código sea más fácil de leer.

He encontrado esto en services.xml archivo:

<!-- 
     If you want to change the Request class, modify the code in 
     your front controller (app.php) so that it passes an instance of 
     YourRequestClass to the Kernel. 
     This service definition only defines the scope of the request. 
     It is used to check references scope. 
    --> 
    <service id="request" scope="request" synthetic="true" /> 

Aquí es mi app.php. ¿Cómo se supone que debo pasar una instancia de mi clase de solicitud personalizada?

require_once __DIR__.'/../app/bootstrap.php.cache'; 
require_once __DIR__.'/../app/AppKernel.php'; 
//require_once __DIR__.'/../app/AppCache.php'; 

use Symfony\Component\HttpFoundation\Request; 

$kernel = new AppKernel('prod', false); 
$kernel->loadClassCache(); 
//$kernel = new AppCache($kernel); 
$kernel->handle(Request::createFromGlobals())->send(); 
+0

'web/app.php' - no lo hace ¿tener tal? O_o –

+0

@thecatontheflat lol: D Estaba mirando la carpeta '/ app' ... voy a actualizar la pregunta entonces. – gremo

Respuesta

13

Bueno, es simple.

En su app.php sólo tiene que pasar instancia de en lugar de por defecto:

require_once __DIR__.'/../app/bootstrap.php.cache'; 
require_once __DIR__.'/../app/AppKernel.php'; 
//require_once __DIR__.'/../app/AppCache.php'; 

use src\YourCompany\YourBundle\YourRequest; 

$kernel = new AppKernel('prod', false); 
$kernel->loadClassCache(); 
//$kernel = new AppCache($kernel); 
$kernel->handle(YourRequest::createFromGlobals())->send(); 

Sólo hay que asegurarse, que se extendía desde predeterminado Request en clase.

Debería funcionar sin definiciones de servicio adicionales.


Según los comentarios, hay pensamientos de que esto causará problemas con el autocompletado de IDE. En teoría, no debería.

En su controlador que acaba de añadir use comunicado

use src\YourCompany\YourBundle\YourRequest; 

Y en la acción, donde se pasa $request, simplemente definir su clase:

public function yourAction(YourRequest $request) 

Esto le dará la terminación automática.

En caso si usted desea conseguir petición como un servicio o de un controlador, por IDE también puede definir su clase en el comentario de documentación:

/** @var $request YourRequest */ 
    $request = $this->getRequest(); 
+0

Mhm ... parece tan fácil, lo intentaré! Entonces, lo único malo de esto, supongo, es que no puede obtener las funciones de autocompletado de IDE ... – gremo

+0

Siempre puede. Actualizado mi respuesta –

+0

Quiero decir con '$ this-> getRequest()' ... – gremo