開発現場で利用していた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が格納されている。
//サンプル例
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!!を出力するプログラムを紹介。
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でのリソース制限に標準機能を利用していた。
# 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】本番環境公開手順