7

Symfony2Webサイトのバンドルページの一部をオーバーライドする方法をフォローしています。これは面白い:

app / config / config.ymlで設定することにより、サービスのクラス名を保持するパラメーターを独自のクラスに設定できます。もちろん、これは、クラス名がサービスを含むバンドルのサービス構成のパラメーターとして定義されている場合にのみ可能です。

それで私はそれがパラメータを定義していることを調べました、/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Resources/configそしてそれでSymfonyクラスを次のようなもので拡張するのは簡単なはずです:session.xml%session.class%Session

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

私はまだこれをテストしていません。しかし、どうすればrequest特別なサービスで同じことができますか?コードを読みやすくするために、便利なショートカットをいくつか追加したいと思います。

私はこれをservices.xmlファイルで見つけました:

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

これが私のapp.phpです。カスタムリクエストクラスのインスタンスを渡すにはどうすればよいですか?

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

1 に答える 1

14

まあ、それは簡単です。

デフォルトの代わりにのパスapp.phpインスタンスで:YourRequest

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

クラスのデフォルトから拡張したことを確認してくださいRequestYourRequest

追加のサービス定義なしで機能するはずです。


コメントによると、これはIDEのオートコンプリートに問題を引き起こすと考えられています。理論的には、そうすべきではありません。

useコントローラにステートメントを追加するだけです

use src\YourCompany\YourBundle\YourRequest;

そして、実際には、渡す場所で、$requestそのクラスを定義するだけです。

public function yourAction(YourRequest $request)

これにより、オートコンプリートが可能になります。

サービスとして、またはコントローラーからリクエストを取得する場合は、IDEの場合、コメントドキュメントでそのクラスを定義することもできます。

    /** @var $request YourRequest */
    $request = $this->getRequest();
于 2012-08-06T06:32:23.457 に答える