【Symfony】コントローラのソース構造説明
実行環境
macbook
composerインストール済み
VSCodeインストール済み
Symfonyバージョン5
コントローラの基本形
コントローラは以下のような形式となっている
<?php
namespace App\Controller;
class コントローラクラス;
{
public function メソッド名()
{
return ○ ○ ;
}
}
【コード解説】namespace App\Controller;とは?
まず「namespace」は名前空間を定義する記述のこと。
今回で言うと「このファイルの名前空間はApp\Controllerにするね」と決めている。
※App\Controllerの部分の記述は、自分で好きな名前をつけられる。
そもそも名前空間ってなに?
名札や名字みたいなイメージ。例えば同じクラス名があっても、namespaceが違えば競合することを回避することができる。
→例えば太郎さんが2人いて、「太郎さん!」って呼ぶと、どっちの太郎さんだよ!ってなる(エラーになる)けど、「田中太郎さん!」って呼べば、その人(コントローラ)が来てくれるってゆーイメージ。
namespace App\Controller;
class HelloController {}
namespace App\Model;
class HelloController {} // これは別のクラスとして扱われる
※実際に使用する(呼び出す)時は「use ○○」のように定義して使用する。
【コード解説】class コントローラクラス名;とは?
classはオブジェクト(もの)をつくるための設計図のこと。
この設計図の名前は「〇〇(コントローラクラス名)」だよと定義するための記述。
【コード解説】publicとは?
- public
アクセス修飾子を記述する箇所。
そもそもアクセス修飾子ってなに?
「どこからアクセスできるか?」を決めるルールのこと。
public (パブリック)・・・どこからでも アクセスできる
private (プライベート)・・・クラスの中からだけ アクセスできる
protected (プロテクテッド)・・・クラスの中 + 継承先のクラス からアクセスできる
【コード解説】function メソッド名()とは?
- function メソッド名()
メソッドを定義するための記述。ルーティングとの関連は特に無いので、命名はなんでもよい。
そもそもメソッドってなに?
クラスの中で使う 「動作(処理)」をまとめたもの。処理と読み替えると最初のうちは理解しやすい。
【コード解説】return ○ ○ ;とは?
return文と呼ばれるものでこのメソッドを呼ばれた時に最終的に返す値。
ルート設定
ルートとは、どのアドレスにアクセスしたらどのメソッドを呼び出すかを関連づけること。
Symfonyでは2パターンの実装がある。
手動(yamlファイル)での記述方法
configフォルダ内のroutes.yamlに記述する。
yaml(ヤムル)とは?
YAML Ain't Markup Languageの意味。インデントによってデータの構造を示す書き方。特殊なタグや命令などを必要とせずただ記述したいデータを書いていくだけなので、わかりやすいのが特徴。
## ルートの記述の基本形
名前 :
Path: パスの指定
controller: コントローラとアクション(メソッド名)の指定
以下は、App\Controller\HelloControllerのindexメソッドと紐づけるためのルーティングの記述例。
## ルートの記述の例
hello :
Path: /hello
controller: App\Controller\HelloController::index
自動(アノテーション)での記述方法
アノテーションをクラスやメソッドの前に記述する。
アノテーションとは?
@で始めるコメント文。
<?php
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
class HelloController {
/**
* @Route("/hello", name="hello")
*/
public function メソッド名()
{
return ○ ○ ;
}
}
PHPファイル(コントローラ)にHTMLを書く方法
ヒアドキュメント構文(<<<)を使って記述する。
ヒアドキュメント構文とは?
PHPで複数行に渡る長いテキストを作成するのに用いる構文。
<?php
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
class HelloController {
/**
* @Route("/hello", name="hello")
*/
public function index()
{
$result = <<< EOM
<html>
<head><title>Hello</title></head>
<body>
<h1>Hello Symfony!</h1>
<p>this is Symfony sample page.</p>
</body>
</html>
EOM;
return new Response($result);
}
}
AbstractControllerを継承する
記述方法
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class HelloController extends AbstractController
{
/**
* @Route("/hello", name="hello")
*/
public function index()
{
return new Response("Hello Symfony");
}
}
AbstractControllerとは?
コントローラで利用する様々な機能が揃っている。これにより、より高度な画面関係の表現を比較的簡単に作成することができる。Symfonyでは「twig」というテンプレートエンジンを利用して画面をレンダリングし、表示することができるが、このためのメソッドもAbstractControllerクラスを継承することで組み込まれる。
サービス内容の確認方法
getSubscribedServicesというメソッドで組み込まれているサービスの一覧を確認できる。
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class HelloController extends AbstractController
{
/**
* @Route("/hello", name="hello")
*/
public function index()
{
$result = '<html><body>';
$result .= '<h1>Subscribed Service</h1>';
$result .= '<ol>';
$arr = $this->getSubscribedServices();
foreach ( $arr as $key => $value ) {
$result .= '<li>'.$key.'</li>';
}
$result .= '</ol>';
$result .= '</body><html>';
return new Response($result);
}
}
Discussion