Edited at

Symfony2 初心者向け開発Tips9選

More than 1 year has passed since last update.

開発現場で利用していたSymfony2の開発Tipsをまとめてみました。

公式ページにもSymfony2の利用方法は綺麗にまとめられていますが、クイックページを見ずともそこそこ使えるように主要機能の使い方を紹介。

早速Symfony2を以下URLからダウンロード。

 Symfony2ダウンロードサイト


Symfony2導入とローカル環境構築

Windows&netBeansでの環境構築を紹介するが、まずは以下コマンドでプロジェクト作成。

/**

* Symfony2のファイル取得
*/

php -r "readfile('http://symfony.com/installer');" > symfony

/**
* プロジェクト作成
* 以下の場合、my_projectという名称のプロジェクトが作成されます
*/

php symfony new my_project

netBeansで既存プロジェクトから作成したプロジェクトを選択。

以下のコマンド実行でビルドを行い、bootstrap.phpが作成された事を確認。

php composer run-script post-update-cmd

XML構成の使用にチェックを入れ、phpunit.xml.distを指定し、PHPUnitを使用して全ての*Testファイルを実行にチェックする。最後にアーカイブをドキュメントルートに展開して下記URLにアクセス。

//Symfony2アクセスURL

http://localhost/Symfony/web/app_dev.php


まずはHello Worldを表示

Symfony2の基本であるバンドルを以下コマンドで作成。

Directory欄には作成場所を、Bundle欄に作成したいBundle名を指定。

//バンドル生成

php app/console generate:bundle --namespace=Directory/Bundle --format=yml

//例)Symfony2ディレクトリ配下のsrcフォルダにHelloWorldBundle作成
php app/console generate:bundle --namespace= src/HelloWorldBundle --format=yml

バンドルを作成するとControllerが作成され、最初からindexActionメソッドが定義されている。

namespace Test\HelloBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
public function indexAction($val)
{
return $this->render('TestHelloBundle:Default:index.html.twig', array('val' => $val));
}
}

バンドル配下のResources/configにrouting.ymlが格納されている。


routing.yml

//サンプル例

test_hello_homepage:
path: /hello/{val}
defaults: { _controller: TestHelloBundle:Default:index }

ざっくりと上の意味は[/hello/{val}]のURLでアクセスすれば、TestHelloBundle内のDefaultController.phpのindexActionが呼ばれる仕組みになっている。

上記indexActionの引数になっている$valと、routing.ymlのpathに記載されている{val}は名前を合わせる必要がある。

またフレームワークには色々な決まりごとがあるが、まずControllerは以下2つが基本。

・Controllerクラスを継承し、XXXXControllerというクラス名にする

・メソッドも必ずYYYYActionという名称にする

以下URLでDefaultController.phpのindexActionが呼び出され、index.html.twigがレンダリングされる。

//コントローラ呼び出し

http://localhost/Symfony/web/app_dev.php/hello/World

デフォルトで以下のtwigが作成されている。

//index.html.twig

Hello { { val } }


リクエストの受け取り方

Hello Woldの項ではindexActionの引数でリクエストを受け取っているが、Controllerクラスを継承することで色々受け取れる。

一部紹介するがその他は公式ページを要確認。

//リクエスト取得

$request = $this->getRequest();

//URI
$uri = $request->getPathInfo();

//GETパラメータ
$getparam = $request->query->get('test');

//HTTPメソッド
$method = $request->getMethod();


twigでのレンダリング処理

長くなるので詳細は以下で説明↓↓↓

【Symfony2】twigレンダリング基礎知識


Symfony2でのバリデーション処理

標準バリデーションを使った簡易チェック画面開発手順↓

【Symfony2】バリデーションチェック画面開発


データベース接続まわり

長くなるので詳細は以下で説明↓↓↓

【Symfony2】DB接続のサンプルプログラム


イベントリスナー

長くなるので詳細は以下で説明↓↓↓

【Symfony2】イベントリスナーでログ出力


コマンドクラス作成

コマンドラインツールでバッチ処理を作れるので、ContainerAwareCommandクラスを継承。

See You Next Again!!を出力するプログラムを紹介。


batch.php

namespace Test\HelloBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class HelloCommand extends ContainerAwareCommand
{
protected function configure()
{
$this->setName('Hello:Test')->setDescription('テスト');
}

protected function execute(InputInterface $input, OutputInterface $output)
{
echo "See You Next Again!!";
}
}


コマンドプロンプトで以下コマンド実行。

//コマンド実行

php app/console Hello:Test

・コマンド実行時はconfigureメソッドで設定された名前を指定

・実行させたいロジックはexecuteメソッドに記載

以前私は業務でバッチを作り、cronでスケジューリングさせていた。


IPアドレス制限

特定リソースに対してアクセス制御するためのaccess_controlコントロール。

権限でも縛れるが私はIPでのリソース制限に標準機能を利用していた。


security.yml

# app/config/security.yml

security:
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous:

access_control:
- { path: "^/hello/[^/]+$", roles: IS_AUTHENTICATED_ANONYMOUSLY, ips: xx.xx.xxx.xx }
- { path: "^/hello/[^/]+$", roles: ROLE_NO_ACCESS }
providers:
in_memory:
memory:

encoders:
Symfony\Component\Security\Core\User\User: plaintext


/hello/任意のルーティングにマッチングするリクエストがあった場合、アクセス許可されているアクセスかどうかをチェックするが、アクセス制御について今回は2つ定義。

1つ目のルールは定義されているIPアドレス(xx.xx.xxx.xx)に合致する場合は制御ルールを無視し、2つ目のルール(ROLE_NO_ACCESS)では、全てのリクエストを拒否することでアクセス制御を実現。


その他

他にやっていた事↓↓↓

【Symfony2】yml定義の情報を取得してみる

【Symfony2】本番環境公開手順