LoginSignup
19
18

More than 5 years have passed since last update.

Symfony2 初心者向け開発Tips9選

Last updated at Posted at 2016-08-12

開発現場で利用していた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】本番環境公開手順

19
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
18