Symfony2の共通処理を書きたいけどサービスとかよくわからない…
もっと簡単にControllerから、さらにはテンプレートからアクセスできる方法はないの!!!という事を調べたら意外と簡単にできたので紹介します。
共通処理で求めるもの
調べていると共通処理の方法ってなんかよくわからないです。
EventListenerだとかなんとか…さらには、Doctrineを使うのも一苦労だったりもっと簡単にControllerと同じように書きたい!っていう面倒な私が調べた結果を紹介します。
マニュアル読めばちゃんと書いてあるんですけどね…英語読むの苦手な人はここみればたぶん大丈夫!というくらいの勢いで書きます。
共通処理用のControllerを作成する
まずは、共通処理用のControllerを作成します。
わかりやすく「CommonController.php」とした名前のControllerを作成して進めていきます。
Controllerは普通に作って大丈夫です。
ただし、今回は共通処理のみに特化したControllerなのでRouteは不要です。
処理メソッドを追加する
メソッドの追加は、いつも通りで問題ありません。
引数も設定できます。Requestの引数を取りたい場合は、呼び出す時に渡さないといけないので「$this->getRequest()」で取ったほうがいいと思います。
class CommonController extends Controller
{
/**
* 数字のみかどうかの判定
*
* @param type $string
*/
public function isNumeric($string)
{
// 全角から半角に変換
$string = mb_convert_kana($string, 'a');
// 全て数字だった場合はtrueを返す
if (preg_match('/^[0-9]+$/', $string)) {
return true;
}
return false;
}
}
テンプレートを使う場合
上記でもわかるように、returnはそのまま返るようになります。
でも、テンプレート使いたい場合もありますよね!
難しく考えず「renderView」を使って文字列として返すだけです!
class CommonController extends Controller
{
/**
* アラートを出すテンプレート
*
* @param type $string
*/
public function isNumericTemplate($string)
{
// 上記で作成したメソッドで処理した結果を判定
if ($this->isNumeric($string)) {
return null;
}
// テンプレートファイルを指定
$template = $this->renderView('AcmeIndexBundle:Common:alert.html.twig', [
'message' => '数字で入力してください。'
]);
return $template;
}
}
app/config/config.ymlに共通処理の設定を追加する
ここが一番ややこしい部分で、挫折してしまうのですが下記の書き方を真似れば大丈夫です!
# serviceにまずは登録します。
service:
# acme_commonは、他の名前に変更しても問題ありません。
# 既に他で設定されている場合は違う名前に変更してください。
acme_common:
# [Acme\IndexBundle]は、自分で作成したBundleに変更してください。
class: Acme\IndexBundle\Controller\CommonController
calls:
- [setContainer, [@service_container]]
# Twig内でも使用できるようにします。
twig:
debug: "%kernel.debug%"
strict_variables: "%kernel.debug%"
globals:
# @acme_commonは、serviceで設定した名前にしてください。
# 左側のacme_commonは、serviceと同様に違う名前を設定できますが合わせておくといいでしょう。
acme_common: "@acme_common"
Controllerから共通処理を呼び出す
Controllerから呼び出す時は、getを使うだけで取得できるようになります。
class DefaultController extends Controller
{
/**
* 何かを処理するAction
*
* @param type $string
*/
public function indexAction($string = null)
{
$isNumeric = $this->get('acme_common')->isNumeric($string);
// 上記で作成したメソッドで処理した結果を判定
if ($this->isNumeric($string)) {
// 全て数字だった場合の処理
} else {
// 数字以外が入っていた場合の処理
}
// これ以降の処理は通常通り
}
}
Twigから共通処理を呼び出す
Twigからの呼び出しは下記の呼び出し方になります。
config.ymlで設定した値で呼び出す事が可能になっております。
{{ acme_common.isNumeric('abc') }}
{# ifを使う場合 #}
{% if acme_common.isNumeric('abc') %}
ここにtrueの場合の処理
{% else %}
ここにfalseの場合の処理
{% endif %}
{#
テンプレート機能を返してもらう場合
rawを使わないとHTMLエンコーディングされる
#}
{{ acme_common.isNumericTemplate('123')|raw }}
さいごに
マニュアルを読めばできる内容ですが、日本語での解説が少なく自分自身ちょっと戸惑ってしまった部分でもあるので書きました。
Symfony2は、設定さえしっかり覚えてしまえばやりたいことができるフレームワークなんだと改めて感じることができます。
共通処理をうまく使えば効率もあがりますね!
