最初の Symfony ページを作成する


新しいページの作成 (HTML 出力でも JSON 出力でも) は、単純な「2 ステップ」の操作です:

  1. #ルートの作成#: ルートは、ページを指す URL (#/about## など) #)、同時にコントローラーにマッピングされます。

  2. #コントローラの作成
  3. :Controller( コントローラ)は、ページを構築するために作成する関数です。送信されたリクエストリクエスト情報を取得し、それを使用して HTML コンテンツ、JSON 文字列、またはその他の ## を含む Symfony Response オブジェクトを作成する必要があります。 # インターネット上のすべてのインタラクションが HTTP リクエストから始まるのと同じように、あなたのタスクは純粋かつ単純です。リクエストを理解し、応答を返すことです。

ページの作成: ルートとコントローラー

始める前に、必ず読んでください。

symfony のインストールと設定

の章を参照すると、すでにブラウザーで Symfony プログラムにアクセスできます。 # 新しいものを作成するとします。

/lucky/number

# #ページ。ランダムなラッキーナンバーを生成して出力するために使用されます。次に、最初にクラスを作成し、誰かが /lucky/number:

// src/AppBundle/Controller/LuckyController.phpnamespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;use Symfony\Component\HttpFoundation\Response; class LuckyController{
    /**
     * @Route("/lucky/number")
     */
    public function numberAction()
    {
        $number = rand(0, 100);         return new Response(
            '<html><body>Lucky number: '.$number.'</body></html>'
        );
    }}
# にアクセスしたときに実行されるメソッドを追加します。

始める前にテスト

##http://localhost:8000/lucky/number

# にいる場合##仮想ホストが Apache または Nginx で正しく設定されている場合は、

http:// と入力できます。 localhost:8000

の部分を独自のホスト名に置き換えます (例: http://symfony.dev/app_dev.php/lucky/number# #) #。

幸運な数字が出力された場合は、おめでとうございます!しかし、ロトをプレイする前に、まずロトがどのように機能するかを理解する必要があります。

numberAction#@ のルート上記の アノテーション と呼ばれ、URL マッチングを定義します。ルートを YAML (または他の形式) で記述することもできます。ルート の章を参照してください。実際、ドキュメント内のほとんどのルーティング ルーチンには、各形式の設定を示す「ラベル」が付いています。

#以下のメソッドをコメント アウトしてください - numberAction- コントローラーとして知られ、ここでページを制御します。唯一の原則は次のとおりです: コントローラーmustsymfony オブジェクトへの応答 (最終的にはこの原則の使い方を学ぶことになります)。

JSON レスポンスの作成

##コントローラーで返される Response オブジェクトには、HTML、JSON、さらには画像や PDF などのバイナリ ファイルを含めることができます。 HTTPヘッダー情報やHTTPステータスコードを簡単に設定できます。

JSON 戻り値を作成すると仮定すると、必要なのは LuckyController だけです次に、メソッドを追加します: #

  // src/AppBundle/Controller/LuckyController.php // ...class LuckyController{
    // ...     /**
     * @Route("/api/lucky/number")
     */
    public function apiNumberAction()
    {
        $data = array(
            'lucky_number' => rand(0, 100),
        );         return new Response(
            json_encode($data),
            200,
            array('Content-Type' => 'application/json')
        );
    }}


ブラウザでテストします

http://localhost:8000/api/lucky/number

コードを簡素化することもできます非常に使いやすい

JsonResponse

// src/AppBundle/Controller/LuckyController.php // ...// --> don't forget this new use statement 别忘了这行新的use声明use Symfony\Component\HttpFoundation\JsonResponse; class LuckyController{
    // ...     /**
     * @Route("/api/lucky/number")
     */
    public function apiNumberAction()
    {
        $data = array(
            'lucky_number' => rand(0, 100),
        );         // calls json_encode and sets the Content-Type header
        // 自动调用json_encode并设置Content-Type头
        return new JsonResponse($data);
    }}


動的 URL マッチング: / lucky / number / {count}

##¶ ネスト、うまくいきましたが、Symfony のルーティングにはさらに多くのことができます。ユーザーが

に移動できるようにしたいとします。 /lucky/number/5 を実行すると、ラッキーナンバー 5 がすぐに生成され、ルートが更新され、 が含まれるようになります。 { 最後のワイルドカード}ワイルドカード:

注释:// src/AppBundle/Controller/LuckyController.php // ...class LuckyController{
    /**
     * @Route("/lucky/number/{count}")
     */
    public function numberAction()
    {
        // ...
    }     // ...}
YAML:# app/config/routing.ymllucky_number:
    path:     /lucky/number/{count}
    defaults: { _controller: AppBundle:Lucky:number }
XML:<!-- app/config/routing.xml --><?xml version="1.0" encoding="UTF-8" ?><routes xmlns="http://symfony.com/schema/routing"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://symfony.com/schema/routing        http://symfony.com/schema/routing/routing-1.0.xsd">     <route id="lucky_number" path="/lucky/number/{count}">
        <default key="_controller">AppBundle:Lucky:number</default>
    </route></routes>
PHP:// app/config/routing.phpuse Symfony\Component\Routing\RouteCollection;use Symfony\Component\Routing\Route; $collection = new RouteCollection();$collection->add('lucky_number', new Route('/lucky/number/{count}', array(
    '_controller' => 'AppBundle:Lucky:number',))); return $collection;

{count} プレースホルダーのため、ページ URL は # になります。 #####違います###############。今後は、URL が /lucky/number/* と一致する必要があります (例: /lucky/number/5##)。 #。このようにして、コントローラーでこの値を受け取って使用できます:

// src/AppBundle/Controller/LuckyController.php// ... class LuckyController{     /**
     * @Route("/lucky/number/{count}")
     */
    public function numberAction($count)
    {
        $numbers = array();
        for ($i = 0; $i < $count; $i++) {
            $numbers[] = rand(0, 100);
        }
        $numbersList = implode(', ', $numbers);         return new Response(
            '<html><body>Lucky numbers: '.$numbersList.'</body></html>'
        );
    }     // ...}
go to/lucky/number/ xx

テストしてください。xx を 任意の 数値に置き換えます: http://localhost:8000/api/lucky/number/7

#ラッキーナンバー 7 が出力されるはずです。コントローラに

$placeholder

パラメータを追加すると、ルート内の任意の

{placeholder}## を取得できます #プレースホルダー値が同じ名前であることを確認してください。 #システムルーティングも実行できます詳細

、複数のプレースホルダー (/blog/{category}/{page} など) のサポートなど、プレースホルダーオプションおよび必須のプレースホルダーは正規表現 と一致します (例: {count}## である必要があります) # は数字です)。 詳細については、route の章をご覧ください。ルーティングのエキスパートになれる。

レンダリング テンプレート (コンテナを使用) ##コントローラーで HTML を返す場合は、テンプレートのレンダリングが必要になる場合があります。幸いなことに、Symfony には Twig があります。これは強力でありながら非常に楽しい、学びやすいテンプレート言語です。

現在、LuckyController

は基本クラスを継承しません。現時点で Twig (または他の Symfony ツール) を参照する最も簡単な方法は、Symfony の Controller

基本クラスを継承することです:

// src/AppBundle/Controller/LuckyController.php  
// ...
// --> add this new use statement
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
class LuckyController extends Controller
{    // ...}
テンプレート サービスを使用する

これらは何も変更しませんが、Symfony の containers/containers : これは、システム レベルの すべての 有用なオブジェクトを抽出できる配列のようなオブジェクトです。オブジェクトは Services (サービス) と呼ばれ、Symfony はテンプレートをレンダリングするための専用のサービス オブジェクトを送信します。 1 つはログ記録用で、その他にもたくさんあります。

Twig テンプレートをレンダリングすると、要求されたサービス名は template:## になります。 #

// src/AppBundle/Controller/LuckyController.php // ...class LuckyController extends Controller{
    /**
     * @Route("/lucky/number/{count}")
     */
    public function numberAction($count)
    {
        // ...
        $numbersList = implode(', ', $numbers);         $html = $this->container->get('templating')->render(
            'lucky/number.html.twig',
            array('luckyNumberList' => $numbersList)
        );         return new Response($html);
    }     // ...}


# 「サービス コンテナ」は非常に重要です。多くの関連知識を習得します。現時点では、多くのオブジェクトが保持されていることを理解するだけで、template のような「ニックネーム」でオブジェクトを渡すことができます。 logger ) これらのいずれかを取得するには、get() を使用します。 template サービスは TwigEngine のインスタンスであり、中に が付いています。 render() メソッドです。

#しかし、もっと簡単なこともあります。 #Controller 基本クラスを継承すると、render()# などの多くのショートカット メソッドを使用できます。 ##:

// src/AppBundle/Controller/LuckyController.php // .../**
 * @Route("/lucky/number/{count}")
 */public function numberAction($count){
    // ...     /*
    $html = $this->container->get('templating')->render(
        'lucky/number.html.twig',
        array('luckyNumberList' => $numbersList)
    );
 
    return new Response($html);
    */     // render: a shortcut that does the same as above 快捷方法
    return $this->render(
        'lucky/number.html.twig',
        array('luckyNumberList' => $numbersList)
        );
  }
コントローラーのショートカット メソッドがどのように機能するかについては、コントローラーの章を参照してください。

#上級ユーザーは、

#コントローラーをサービスとして定義する方法を参照してください

テンプレートを作成する

次の場合ここでページを更新すると、次のエラーが表示されます:

テンプレート "lucky/number.html.twig" が見つかりません

新しい app/Resources/views/lucky ディレクトリを作成して修正し、 number.html.twig次の場所に配置します:

##
枝条:{# app/Resources/views/lucky/number.html.twig #}
     {% extends 'base.html.twig' %} 
     {% block body %} <h1>Lucky Numbers: {{ luckyNumberList }}</h1>
    {% endblock %}
PHP:<!-- app/Resources/views/lucky/number.html.php -->
<?php $view->extend('base.html.php') ?> 
<?php $view['slots']->start('body') ?>   
 <h1>Lucky Numbers: 
<?php echo $view->escape($luckyNumberList) ?>
<?php $view['slots']->stop() ?>

Twig があなたを歓迎します!この単純なファイルは、基本的な機能をすでに示しています。{{ variableName }} のような構文は、何かを出力するために使用されます。そして luckyNumberListこの変数はあなたの render() メソッドに渡します。

% extends 'base.html.twig' % はレイアウト ファイルに対応し、 にあります。 app/Resources/views/base.html.twig、このファイルは Symfony プロジェクトの作成とともに存在します。 かなり単純 (スタイルのない HTML 構造) なので、カスタマイズすることができます。 {% ブロック本体 %} 部分は 継承システム/twig テンプレートを使用した継承システム 、将来のピリオドは、コンテンツの親テンプレート base.html.twig のレイアウト内の対応する位置に配置されます。

#今すぐページを更新してください

##http://localhost:8000/ lucky / number / 9

ページのソースを見ると、 のおかげで完全な HTML スケルトンが表示されます。 base.html.twig

#これは Twig のパワーのほんの一部にすぎません。 Twig の構文、配列ループ、他のテンプレートの出力、さらに優れた機能をマスターしたい場合は、#テンプレートの作成と使用# を参照してください。 ##。 プロジェクト全体を参照する

##柔軟な URL を作成し、継承を使用してテンプレートをレンダリングし、JSON 応答を出力しました。

#プロジェクト内のファイルを調べて、謎の雰囲気を取り除きましょう。これまでは、次の 2 つの非常に重要なフォルダーで作業していました:

app/

Contentプロファイルとテンプレート。一般に、

でない限り、PHP コード内のすべてのマテリアルがここに配置されます。 src/


PHP プログラムが置かれている場所 99% の時間は src/ (PHP ファイル) または app で作業します。 / (その他のもの) の下。技術スキルが向上するにつれて、各フォルダーで何が起こっているかがわかるようになります。

app/ ディレクトリには、app/AppKernel.php などの他のコンテンツもあります。 はい、新しいバンドルを開くためにこれを使用する必要があります (これは、app/ にある数少ない PHP ファイルの 1 つです)。

src/ 現在、このディレクトリの下には src/AppBundle## というディレクトリが 1 つだけあります。 #- ここにはすべてが入っています。パッケージは、「プラグイン」と同様に、オープン ソース バンドル を見つけてプロジェクトにインストールできますが、独自のものであっても、コードはバンドル (通常は AppBundle) に含まれています (ただし、このバンドルには特別なことは何もありません)。バンドルのより深い理解と、複数のバンドルを作成する必要がある理由 (ヒント: プロジェクト間でコードを共有する) については、バンドル システム を参照してください。章。

#では、プロジェクト内の他のフォルダーはどうなるのでしょうか?

web/

これは、プロジェクト全体のドキュメント ルート ディレクトリであり、 CSS、画像、アプリケーションの実行に使用されるファイルなどのアクセス ファイル (app_dev.php および app) .php) Symfony フロントエンド コントローラー (フロントエンド コントローラー)。


tests/

##プログラムの自動テスト (単体テストなど)単体テスト) はここに保存されます。

##bin/

## は、バイナリ ファイルの保存に使用されます。最も重要なのは、Symfony コマンドの実行を制御するために使用される

console ファイルです。 var/


これらは、自動的に生成され、保存されるファイルです。キャッシュ ファイル (

var/cache/) やログ ファイル (var/logs/ など) の場所)。 ####################ベンダー/######

依存関係マネージャーComposer を通じて、サードパーティのライブラリ、パッケージ、バンドルはここからダウンロードしました。このディレクトリ内の内容は編集しないでください。

#Symfony は柔軟性があります。必要に応じて、デフォルトのディレクトリ構造をオーバーライドできます。 Symfony のデフォルトのディレクトリ構造をオーバーライドする方法を参照してください。

プログラム レベルの構成

symfony にはいくつかの組み込みネイティブがありますバンドル (app/AppKernel.php ファイルを開いて表示します)、さらに .bundle をインストールできます。メインの構成ファイルは です。 app/config/config.yml

YAML:# app/config/config.yml # ...framework:
    secret: '%secret%'
    router:
    resource: '%kernel.root_dir%/config/routing.yml'
    # ...twig:
    debug:            '%kernel.debug%'
    strict_variables: '%kernel.debug%' # ...
XML:<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:framework="http://symfony.com/schema/dic/symfony"    xmlns:twig="http://symfony.com/schema/dic/twig"    xsi:schemaLocation="http://symfony.com/schema/dic/services        http://symfony.com/schema/dic/services/services-1.0.xsd        http://symfony.com/schema/dic/symfony        http://symfony.com/schema/dic/symfony/symfony-1.0.xsd        http://symfony.com/schema/dic/twig        http://symfony.com/schema/dic/twig/twig-1.0.xsd">     <!-- ... -->     <framework:config secret="%secret%">
        <framework:router resource="%kernel.root_dir%/config/routing.xml" />
        <!-- ... -->
    </framework:config>     <!-- Twig Configuration -->
    <twig:config debug="%kernel.debug%" strict-variables="%kernel.debug%" />     <!-- ... --></container>
PHP:// app/config/config.php// ... $container->loadFromExtension('framework', array(
    'secret' => '%secret%',
    'router' => array(
        'resource' => '%kernel.root_dir%/config/routing.php',
    ),
    // ...)); // Twig Configuration$container->loadFromExtension('twig', array(
    'debug'            => '%kernel.debug%',
    'strict_variables' => '%kernel.debug%',)); // ...

frameworkルートキーの設定は FrameworkBundle、twigルート キーは TwigBundle などで設定されます。 Symfony では 設定ファイル内のいくつかのオプションを変更することで動作を制御できます。その理由を知るには、構成リファレンス を参照してください。 または、非常に使いやすい

bin/console コマンドを使用します。ルートキーの下から取り出された完全な設定テンプレート:

$  php bin/console config:dump-reference framework
Symfony 設定システムは、環境、インポート、パラメータを含め、非常に強力です。これらすべてを理解するには、

構成## の章を参照してください。 ##################次のステップ? ############¶##################おめでとう!あなたは Symfony をマスターし始めており、美しく、機能的で、高速で保守可能なプログラムを構築するための新しい方法を学ぶことになります。 インフラストラクチャを完全に理解するには、次の章をよく理解しておく必要があります:

コントローラ

##ルート

##テンプレートを作成して使用する

  • #次に、

    中国語の本
  • 、また学習#サービスコンテナ

  • フォーム システム

#、Doctrine # を使用## (データベースにクエリを実行する必要がある場合) など!

中華料理本 もあります。これには、より高度な「ハウツー」記事が満載です。 その他の 質問を解決してください。

# 皆さんの楽しい勉強をお祈りしています。