中野's workspace

  • Profile
  • Privacy
  • Contact

2019/05/31

Symfonyの勉強を始めたので概要をまとめてみる

  • #PHP
  • #Symfony

目次

Symfonyを習得しなきゃいけなくなったので、勉強始めました。

APIサーバとして使う予定なので、viewテンプレートについては一旦置いておいて、基本的な内部構造について学びました。

今回学び始めるにあたり、公式のリファレンスが出ていたのでそちらを参考にしました。
下記にリンクを置いておきます。

quick_tour

バージョンは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
]);
}
}
view raw routing.php hosted with ❤ by GitHub

例えばlocalhost:8000/hello/nakanoというリクエストがされた場合、nakanoが$nameに詰められviewへ送られます。

viewファイルでは以下のように展開します。

{# hello.html.twig}
{% block body %}
<h1>Hi {{name}}!</h1>
{% endblock%}
view raw hello.html.twig hosted with ❤ by GitHub

下記のようにすればリダイレクトすることができます。

class DefaultController extends Controller
{
\**
* @Route("/", name="homepage")
*\
public function indexAction() {
return $this->redirectToRoute("hello", ["name" => "test"])
}
}
view raw Redirect.php hosted with ❤ by GitHub

第一引数に”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");
}
}
view raw getFromRequest.php hosted with ❤ by GitHub

セッションに値を詰めるには

$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 %}
view raw flash-message.php hosted with ❤ by GitHub

env

開発環境や本番環境など、アプリケーションを動かす際に異なる環境で動かすことは多いと思います。

Symfonyは開発用(dev)と本番用(prod)で環境ごとに異なる設定を定義することが出来ます。

開発用の設定はconfig_dev.ymlに、本番用はconfig_prod.ymlを使います。

開発用と本番用で環境情報を共通にしたいものがある場合はconfig.ymlを使うと共通の設定を定義することが出来ます。

上書きしたい設定がある場合は、下記のように各ファイルでoverrideします。

# config_dev.yml
imports:
    - {resource: config.yml} 
hogehoge:
    hoge: true

上記の場合、config.ymlhogehogeの定義を上書きしています。

まとめ

だいぶ長くなりましたが、ざっくり概要について纏めました。

ファイル構成などは長くなったのでスキップしました。
別記事に纏めたいと思います!
DBとの連携なども纏めていきたいですね。

また、今回はバージョン3.4用のリファレンスで学んだのですが、最新は4系らしいのでそちらとの差異も確かめていきたいところです。

今回はここまで。

このエントリーをはてなブックマークに追加