Symfony2を使用してVPSでCRUD操作を実行する方法(パート1)

提供:Dev Guides
移動先:案内検索

Symfonyについて

Symfony は、オープンソースのPHPWeb開発フレームワークです。優れたアプリケーションの構築に役立つツールと方法論のセットです。 このフレームワークの特徴のいくつかは、その速度、柔軟性、スケーラビリティ、および安定性です。 本格的なWebアプリケーションだけでなく、プロジェクトに必要な小さな機能にも使用できます。

前のチュートリアルでは、Symfony2 Standard Distribution をインストールし、VPSで動作するように構成する方法を見てきました。 このチュートリアルと次のチュートリアルでは、データモデルに対していくつかの基本的なCRUD(作成、読み取り、更新、削除)操作を実行する小さなSymfonyアプリケーションを作成します。 このチュートリアルは、前の記事の手順を実行し、中断したところから続行できることを前提としています。

使用するデータはニュースページです。 エンティティ(ニュースページのデータモデルとして機能)を作成し、それを読み取って表示する方法を学習します。 次の記事では、ニュースページの追加、更新、削除など、他の操作を実行する方法を学習します。 ただし、最初にバンドルを作成する必要があります。

バンドル

Symfonyのバンドルは、アプリケーションの特定の機能に必要なすべてのファイルを保持するディレクトリです。 これには、PHPファイル、スタイルシート、javascriptファイルなどが含まれます。 このアプリケーションでは、ニュースページに関係するすべてのことを担当するバンドルを1つだけ作成します。 ブログも必要な場合は、それを担当する特定のバンドルを作成できます。

バンドルのすごいところは、プラグインのようにも機能することです(Symfonyのコア機能でさえバンドルに配置されています)。 つまり、特定の機能のすべてのコードを保持する新しいバンドルを自分で作成することも、他の誰かが作成した外部バンドルを登録することもできます。 したがって、データの操作を開始する前に、Symfony Standard Distributionがこの優れた機能を提供するため、コマンドラインで空のバンドルを生成しましょう。 これは、すべてのフォルダーを作成してバンドルをSymfonyに手動で登録する必要がないことを意味します-これはすべて自動的に行われます。

したがって、バンドルを自動的に生成するには、アプリケーションのメインフォルダー(この場合はSymfony)に移動します。

cd /var/www/Symfony

次のコマンドを実行して、NewsBundleという名前の新しいバンドルを生成します。

php app/console generate:bundle --namespace=Foo/NewsBundle --format=yml

画面の指示に従い、デフォルトのオプションを受け入れます。 このコマンドは、ベンダーFooに属するNewsBundleという名前のバンドルを生成します。 必要なベンダー名を選択できますが(これは基本的にあなたを表します)、バンドル名がBundleという単語で終わっていることを確認する必要があります。 さらに、このコマンドは、バンドルの構成形式をYAMLファイルに指定します。

バックグラウンドで、バンドルのフォルダー構造が作成され( src / Foo / NewsBundle )、バンドルがアプリケーションの残りの部分に登録されます。

エンティティ

前のチュートリアルのすべての手順を実行した場合は、データベース接続がすでに構成されているはずです。 そうでない場合は、parameters.ymlファイルを編集できます。

nano /var/www/Symfony/app/config/parameters.yml

そこで、データベース情報を指定できます。 すでにデータベースを作成している場合は、次の手順をスキップできます。 ただし、次のコマンドを使用して、Symfonyにこのファイルの情報と一致するデータベースを自動的に作成させることができます。

php app/console doctrine:database:create

ここで、データモデル(ニュースページ)を操作するには、エンティティと呼ばれるものを作成する必要があります。 これは基本的に、ニュースページに関するすべての情報を定義するPHPクラスです。 Symfonyには、これを使用するための優れたコマンドラインツールと、このデータモデルに一致する実際のデータベーステーブルを作成するためのもう1つの優れたコマンドラインツールがあります。

したがって、Newsというエンティティを生成するには、コマンドラインから次のコマンドを実行します。

php app/console doctrine:generate:entity

画面の指示に従ってください。 最初に指定する必要があるのは、ショートカット名ですが、名前です。 私たちの場合はFooNewsBundle:News になります(エンティティ名はコロンの後に続くものですが、それが属するバンドルも指定する必要があります)。 次に、構成管理のために先に進み、ymlを選択します。

これに続いて、データモデルのクラスプロパティ(テーブルの列に一致する)を追加します。 タイトル(文字列、255)、本文(テキスト)、created_date(日時)を追加しましょう。 次に、リポジトリは必要ないので、「いいえ」を選択して生成を確認します。 これでエンティティが作成されました。

それがどのように見えるかを知りたい場合は、新しく作成されたエンティティクラスファイルを調べることができます。

nano /var/www/Symfony/src/Foo/NewsBundle/Entity/News.php

次に、この新しく作成されたエンティティに基づいてニュースページを保存するデータベーステーブルをSymfonyに生成させましょう。 次のコマンドを実行します。

php app/console doctrine:schema:update --force

このコマンドは、エンティティから情報を取得し、これに基づいてテーブルを生成します。 簡単な確認が必要です: " データベーススキーマが正常に更新されました! 「1」クエリが実行されました。 「データベースを見ると、次のようなテーブルが表示されます。 ニュース 4つの列(id、title、body、created_date)があり、すべてがニュースエンティティクラス。

データの読み取り

データベースが空なので、phpmyadminまたはコマンドラインを使用して、新しいSymfonyアプリケーションを使用して読み取ることができる2つのテスト行を挿入しましょう。 後で、アプリケーションを使用して新しいコンテンツを追加する方法を説明しますが、今のところ、mysqlターミナルで次のコマンドを実行して2行を追加できます。

use symfony;
INSERT INTO News (title,body,created_date)
    VALUES ('News title 1', 'Some body text', NOW());
INSERT INTO News (title,body,created_date)
    VALUES ('News title 2', 'Another body text', NOW());

ダミーコンテンツができたので、特定のニュースページに対するユーザーリクエストをSymfonyコントローラーにマッピングするルートを作成しましょう。

アプリケーションのメインルートファイルはapp/ config フォルダーにありますが、バンドルフォルダー構造にあるrouting.ymlファイルでバンドルの特定のルーティングルールを定義することもできます。 :

nano /var/www/Symfony/src/Foo/NewsBundle/Resources/config/routing.yml

すでに存在するルールを削除し、代わりに別のルールを追加しましょう。

foo_news_show:
    pattern:  /news/{id}
    defaults: { _controller: FooNewsBundle:Default:show }

このルールの名前はfoo_news_showで、ブラウザーが www.example.com/Symfony/web/app_dev.php/news/ {id} 、[X159X ] {id} は、要求されたニュースページの動的に渡されるIDのワイルドカードです。 defaults で、呼び出すコントローラーとメソッドを指定します。 この場合、DefaultController.phpファイルにあるDefaultControllerと、その中の showAction メソッドになります(これを作成する必要があります)。

ここでDefaultControllerを指定したのは、そのファイルがすでに存在し、バンドルの作成時にSymfonyによって自動的に生成されたためです。 だから私たちはそれを使うほうがよいでしょう。 ここで行う必要があるのは、 News エンティティクラスとDoctrineデータベースライブラリを使用してニュースページを要求し、それを変数でTwigテンプレートファイルに渡すメソッドを作成することです。 したがって、'にDefaultController.phpファイルを編集させます。

nano /var/www/Symfony/src/Foo/NewsBundle/Controller/DefaultController.php

このファイルには、 indexAction()メソッドがすでに定義されていることがわかります。 その下で、 showAction()メソッドを宣言しましょう。

public function showAction($id) {
      $news = $this->getDoctrine()
            ->getRepository('FooNewsBundle:News')
            ->find($id);
      if (!$news) {
        throw $this->createNotFoundException('No news found by id ' . $id);
      }
    
      $build['news_item'] = $news;
      return $this->render('FooNewsBundle:Default:news_show.html.twig', $build);
    }

この関数はDoctrineを使用して、渡されたIDを持つニュースエンティティを取得し(ニュースが見つからない場合は例外をスローします)、次に作成する必要があるnews_show.html.twigテンプレートファイルにニュースオブジェクトを渡します。 。 コードは非常に単純です。 それでは、それを実行しましょう。

ビューは、バンドル内の Resources / views フォルダー内にあり、それらを使用するコントローラーにちなんで名付けられた別のフォルダー(この場合は Default )内にあります。 そこで、news_show.html.twigという新しいファイルを作成します。

nano /var/www/Symfony/src/Foo/NewsBundle/Resources/views/Default/news_show.html.twig

そして、次のテンプレートコードを貼り付けます。

{{ news_item.Title }}
{{ news_item.Body }}

<h1>{{ news_item.Title }}</h1>
{{ news_item.Body }}

これは、Twigテンプレート言語を含むhtmlファイルです。 ここではSymfonyのTwigについて詳しく説明しませんので、ここで詳細をお読みください。 ブラウザでwww.example.com/Symfony/web/app_dev.php/news/1を指定すると、ID1のニュースが表示されます。

次に、別のルーティングルールとコントローラーメソッドを作成して、すべてのニュースページのリストを作成しましょう。 以前に編集したのと同じrouting.ymlファイルを開きます。

nano /var/www/Symfony/src/Foo/NewsBundle/Resources/config/routing.yml

そして、以下を追加します。

foo_news_home:
    pattern:  /news/
    defaults: { _controller: FooNewsBundle:Default:index }

このルートは、 DefaultControllerindexAction()メソッドをトリガーするので、編集してみましょう(既にコントローラーファイルにあることを覚えている場合は、変更する必要があります)。

nano /var/www/Symfony/src/Foo/NewsBundle/Controller/DefaultController.php

デフォルトで指定されている引数( $ name )と、メソッド自体のコードを削除します。 代わりに、以下を貼り付けてください。

$news = $this->getDoctrine()
            ->getRepository('FooNewsBundle:News')
            ->findAll();
      if (!$news) {
        throw $this->createNotFoundException('No news found');
      }
    
      $build['news'] = $news;
      return $this->render('FooNewsBundle:Default:news_show_all.html.twig', $build);

以前に作成した方法と同様に、これはテーブル内のすべてのニュースを検索し、それらをnews_show_all.html.twigテンプレートファイルに渡します。 それでは、前に作成したものと同じフォルダにこのファイルを作成しましょう。

nano /var/www/Symfony/src/Foo/NewsBundle/Resources/views/Default/news_show_all.html.twig

そして、 $ news オブジェクト配列を反復処理して、すべてのニュースタイトルを表示します。

{% for new in news %}

<h3>{{ new.Title }}</h3>

{% endfor %}

www.example.com/Symfony/web/app_dev.php/news/ にアクセスすると、テーブルに手動で追加した2つのニュースタイトルが表示されます。 また、Symfonyルーティングシステムを使用して、前に作成したそれぞれのページにつながるこれらのタイトルの周りにリンクを追加しましょう。 したがって、以下を置き換えます。

<h3>{{ new.Title }}</h3>

これとともに:

<h3><a href="{{ path('foo_news_show', {'id':  new.Id  }) }}">{{ new.Title }}</a></h3>

これは、Twigテンプレート内にリンクを生成するための便利な方法です。 基本的に、使用するルートと、ルートが期待するワイルドカードの値(この場合はニュースオブジェクトにあるID)を指定します。 ここで、ページを更新すると、タイトルがそれぞれのページへのリンクに変わります。

結論

このチュートリアルでは、Symfonyバンドルとは何か、そしてそれらを作成する方法を見てきました。 また、データベース内のニュースページとやり取りする必要のある小さなアプリケーションも開始しました。 このために、テーブル構造に一致するEntityクラスを定義し、Doctrineを使用して情報にアクセスし、エンティティオブジェクトにデータを入力しました。 さらに、Symfonyルーティングシステムを使用して、ブラウザー要求をPHPコントローラーメソッドに接続し、PHPコントローラーメソッドがデータを要求して、Twigテンプレートでブラウザーに返します。

次の最後のチュートリアルでは、ニュースページの作成、更新、削除について説明します。

投稿者: Danny