2019/05/31
Symfonyの勉強を始めたので概要をまとめてみる
Symfonyを習得しなきゃいけなくなったので、勉強始めました。
APIサーバとして使う予定なので、viewテンプレートについては一旦置いておいて、基本的な内部構造について学びました。
今回学び始めるにあたり、公式のリファレンスが出ていたのでそちらを参考にしました。
下記にリンクを置いておきます。
バージョンはSymfony3.4です。
Symfonyって何?
PHPのフレームワークです。
今流行りのlaravelはSymfonyのコンポーネントが多数使われているらしいです。
ざっと見た限り、Laravelと文法が似ているところが多く、過去にLaravelやられていた方は理解しやすいのではないでしょうか。
個人的な意見ですが、Laravelは構成が単純で分かりやすく、Symfonyは構成が重厚な印象を受けました。
規約がしっかりしているのでSymfonyは大規模開発に向くかな?と思いました。
用語説明
Controller
まずは基本のControllerから
Controllerはエントリポイントに使われるPHPファイルです。
ここでユーザーからのリクエストを受け取り、加工してデータを返します。
ControllerというSuffixがクラス名につきます。
こんな感じです。
class DefaultController extends Controller
Action
Controller内に定義されるメソッドはActionと呼ばれます。
MVCの定義通り、Actionは入力を受け取って結果を返すだけなので原則とても短いコードになります。
class DefaultController extends Controller | |
{ | |
\** | |
* @Route("/", name="homepage") | |
*\ | |
public function indexAction() { | |
return $this->render("index.html.twig",[]); | |
} | |
} |
Routing
Actionの上に @Route というアノテーションがあり、これがルーティング定義です。
この場合、ルート(”/“)にアクセスした場合に実行されるActionという意味ですね!
通常のコメントとは異なり、\**
から始まっていることが特徴です。
nameはoptionalですが、ページのリンクなどで使われます。
ハイライトしてる部分がそれに該当します。
class DefaultController extends Controller | |
{ | |
\** | |
* @Route("/", name="homepage") | |
*\ | |
public function indexAction() { | |
return $this->render("index.html.twig",[]); | |
} | |
} |
URLリクエストから値を受け取る場合は以下のように設定します。
class DefaultController extends Controller | |
{ | |
\** | |
* @Route("/hello/{name}", name="hello") | |
*\ | |
public function helloAction($name) { | |
return $this->render("index.html.twig",[ | |
'name' => $name | |
]); | |
} | |
} |
例えばlocalhost:8000/hello/nakano
というリクエストがされた場合、nakano
が$nameに詰められviewへ送られます。
viewファイルでは以下のように展開します。
{# hello.html.twig} | |
{% block body %} | |
<h1>Hi {{name}}!</h1> | |
{% endblock%} |
下記のようにすればリダイレクトすることができます。
class DefaultController extends Controller | |
{ | |
\** | |
* @Route("/", name="homepage") | |
*\ | |
public function indexAction() { | |
return $this->redirectToRoute("hello", ["name" => "test"]) | |
} | |
} |
第一引数に”hello”を指定していますが、これがRouteのname部分です。
第二引数に定義した値がリダイレクト先のページに渡されます。
error
404エラーの場合
throw $this->createNotFoundException();
500エラーの場合
throw new \Exception("something going on!!!);
request
リクエストから値を取得するには以下のようにします。
class DefaultController extends Controller | |
{ | |
\** | |
* @Route("/", name="homepage") | |
*\ | |
public function helloAction(Request $request) { | |
// Ajaxリクエストからの判定 | |
$request->isXmlHttpRequest; | |
// Getパラメータからの取得 | |
$request->query->get("hoge"); | |
// Postパラメータからの取得 | |
$request->request->get("hoge"); | |
} | |
} |
セッションに値を詰めるには
$session->set("foo", "bar");
セッションから値を取り出すには
$session->get("foo");
第二引数を指定すると、値が存在しなかった場合の挙動が定義出来ます。
$session->get("foo", "default");
フラッシュメッセージ(次のリクエストの間まで一時的に保存する値)の追加方法は以下です。
$this->addFlash("notice", "this will be erased soon");
これを取り出すには以下のようにします。
{% for message in app.flashes("notice")%} | |
<div class="flash-notice"> | |
{{ message }} | |
<div> | |
{% endfor %} |
env
開発環境や本番環境など、アプリケーションを動かす際に異なる環境で動かすことは多いと思います。
Symfonyは開発用(dev
)と本番用(prod
)で環境ごとに異なる設定を定義することが出来ます。
開発用の設定はconfig_dev.yml
に、本番用はconfig_prod.yml
を使います。
開発用と本番用で環境情報を共通にしたいものがある場合はconfig.yml
を使うと共通の設定を定義することが出来ます。
上書きしたい設定がある場合は、下記のように各ファイルでoverrideします。
# config_dev.yml
imports:
- {resource: config.yml}
hogehoge:
hoge: true
上記の場合、config.yml
のhogehoge
の定義を上書きしています。
まとめ
だいぶ長くなりましたが、ざっくり概要について纏めました。
ファイル構成などは長くなったのでスキップしました。
別記事に纏めたいと思います!
DBとの連携なども纏めていきたいですね。
また、今回はバージョン3.4用のリファレンスで学んだのですが、最新は4系らしいのでそちらとの差異も確かめていきたいところです。
今回はここまで。