5

Silex アプローチの基本は、すべてのアプリケーション ロジックを 1 つのファイルにまとめることです。しかし、私のアプリケーションは 20 を超えるコントローラーを持つことができます。そこで、ルーターを管理するための便利なマップが必要です。

私の質問は、別のファイルへのルーターを作成できるソリューションを検索することです。最良の場合、ファイルは YAML タイプである必要があります。

# config/routing.yml

_home:
    pattern: /
    defaults: { _controller: MyProject\Controller\MyController::index }

しかし、ネイティブも良いケースです(私にとって):

$routes = new RouteCollection();

$routes->add(
    'home',
    new Route('/', array('controller' => 'MyProject\Controller\MyController::index')
));

return $routes;

2 番目のケースの問題は、ルーティングのルールごとにmatch()関数を使用する必要があることです。それはまったく明らかではありません。

この問題を解決する方法は何ですか? 条件は、Symfony2 の既存の API Silex またはコンポーネントを使用することです。

小さなメモ:

Controller クラスにControllerProviderInterfaceを使用しません。これは独立したクラスです。

4

4 に答える 4

10

まず、Silex の基本は、すべてを 1 つのファイルに収めることではありません。Silex の基本は、独自の「フレームワーク」、つまりアプリケーションを編成する独自の方法を作成することです。

「自分でアーキテクチャの決定をすべて行うことに慣れている場合は silex を使用し、そうでない場合はフルスタックの Symfony2 を使用してください。」-- ダスティン・ウィトル

詳細については、Silex の作成者によって作成されたこのブログ投稿を参照してください。


あなたの問題を解決する方法

基本的に必要なのは、Yaml ファイルを解析し、解析された各ルートから設定patternを取得することです。defaults._controller

Yaml ファイルを解析するには、Symfony2の Yaml コンポーネントを使用できます。ルートを Silex に追加するために使用できる配列が返されます。

// parse the yaml file
$routes = ...;
$app = new Silex\Application();

foreach ($routes as $route) {
    $app->match($route['pattern'], $route['defaults']['_controller']);
}

// ...
$app->run();
于 2013-02-03T20:25:30.420 に答える
5

他の方法は機能するかもしれませんが、実際には簡単な解決策はないため、ここに私の方法を追加すると思いました。追加FileLocator/YamlFileLoader追加すると、yaml ファイルを読み取り/解析するためだけに、アプリケーションに不要な大量の負荷がかかります。

作曲

まず、関連ファイルを含める必要があります。symfony YAML コンポーネント、およびSilex に積極的に取り組んでいる誰かによる本当にシンプルで便利な構成サービス プロバイダー

"require": {
    "symfony/yaml": "~2.3",
    "igorw/config-service-provider": "1.2.*"
}

ファイル

ルート ファイルが次のようになっているとします ( routes.yml)。

config.routes:
  dashboard:
    pattern:  /
    defaults: { _controller: 'IndexController::indexAction' }
    method:   GET

登録

各 yaml ファイルを個別に登録します。ファイルの最初のキーは、変数の下で使用できる名前$appです (pimple サービス ロケーターによって処理されます)。

$this->register(new ConfigServiceProvider(__DIR__."/../config/services.yml"));
$this->register(new ConfigServiceProvider(__DIR__."/../config/routes.yml"));
// any more yaml files you like

ルート

これらのルートは、次を使用して取得できます。

$routes = $app['config.routes']; // See the first key in the yaml file for this name
foreach ($routes as $name => $route)
{
    $app->match($route['pattern'], $route['defaults']['_controller'])->bind($name)->method(isset($route['method'])?$route['method']:'GET');    
}

->bind()たとえば、小枝内で使用する URL に「名前を付ける」ことができます。
->method()POST | を指定できます。得る。ルートでメソッドが指定されていない場合、デフォルトで 'GET' に 3 項を指定したことに注意してください。

于 2013-08-05T22:01:58.053 に答える
0

わかりました、それが私がそれを解決した方法です。

このメソッドは私のアプリケーションの一部であり、run()の前に呼び出されます:

# /src/Application.php

...

protected function _initRoutes()
{
    $locator = new FileLocator(__DIR__.'/config');
    $loader = new YamlFileLoader($locator);

    $this['routes'] = $loader->load('routes.yml');
}

Application クラスは私自身のもので、Silex\Application を拡張しています。

構成ファイル:

# /src/config/routes.yml
home:
    pattern: /
    defaults: { _controller: '\MyDemoSite\Controllers\DefaultController::indexAction' }

それは私にとってはうまくいきます!

更新日:

コレクションを追加するには、これが正しいオプションだと思います。

$this['routes']->addCollection($loader->load('routes.yml'));

より柔軟に。

于 2013-02-05T20:34:48.283 に答える