2012-08-06 22 views
6

Symfony 2 Web sitesinde How to Override any Part of a Bundle sayfasını takip ediyorum. Bu ilginç:Symfony 2 istek servisini genişletiyor musunuz?

Sen app/config/config.yml bunu ayarlayarak kendi sınıfına hizmetin sınıf adı tutan parametre ayarlayabilirsiniz. Bu, eğer sınıf adı, hizmeti içeren paketin servisinde konfigürasyonunda bir parametre olarak tanımlanmışsa, sadece mümkündür.

Yani ben /vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Resources/config bakıp i session.xml %session.class% parametreyi tanımlayan olduğunu buldum ve böyle bir şeyle Symfony'nin Session sınıfını genişletmek için kolay olmalıdır:

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); 
    } 
} 

Henüz bu test din't. Ama request özel servisiyle aynı şeyi nasıl yapabilirim? Kodumun okunmasını kolaylaştırmak için bazı kullanışlı kısayollar eklemek istiyorum.

<!-- 
     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" /> 

İşte benim app.php geçerli:

ben services.xml dosyada buldum. Özel istek sınıfımın bir örneğini nasıl geçirmem gerekiyor?

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': Ayrıca comment doc onun sınıfını tanımlayabilirsiniz IDE için bir hizmet olarak veya bir kontrol cihazından isteği almak istiyorsanız durumunda

, Böyle var? O_o –

+0

@thecatontheflat lol: '/ app' klasörüne bakıyordum ... o zaman soruyu güncelleyeceğim. – gremo

cevap

13

Eh, bu basittir. Gelen

senin app.php sadece varsayılan yerine örneğini pass:

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(); 

Sadece sağlamak, sen sınıfta varsayılan Request uzanan söyledi.

Ek servis tanımları olmadan çalışmalıdır.


Yorumlara göre, bunun IDE otomatik tamamlama ile ilgili sorunlara neden olacağı düşüncesi vardır. Teoride - yapmamalı. Kumandanızda olarak

sadece sadece kendi sınıfını tanımlamak,

use src\YourCompany\YourBundle\YourRequest; 

Ve $request geçmesi eylem, içinde use ifadeyi ekleyin:

public function yourAction(YourRequest $request) 

Bu size otomatik tamamlama verecektir. Bunu yapmazsanız -

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

Mhm ... çok kolay görünüyor, deneyeceğim! O zaman sadece kötü bir şey, sanırım, IDE otomatik tamamlama özelliklerini alamazsınız ... – gremo

+0

Her zaman yapabilirsiniz. Benim cevabımı güncelledim –

+0

Ben $ this-> getRequest() 'ile demek ... – gremo