初期構築からSymfony4を動かすまでのメモ

# はじめに
個人的にメモしてたやつだけど、もし使う人が居たらってことで構築メモを落としておく。
だけどいまはLaravelが凄いから、こんなの出してもってのもある(汗)


# 導入と初期設定
導入環境はWin10のWSL。WSLじゃなくてままのUbuntuでも。
Apache2とphpはXAMPPじゃなくて、個別にモジュール追加でインストール。


## Apache2 and PHP install and Composer Setup
サーバー環境はUbuntuだとaptで追加していく。また導入後に`php.ini`も忘れずに設定しておく。

```
sudo apt install curl zip git vim apache2 php8.1 mysql-server php8.1-cli php8.1-curl php8.1-intl php8.1-mbstring php8.1-xml php8.1-mysql libapache2-mod-php8.1
```

### composerの導入
phpのパッケージ管理ツールです。入れておきましょう。
> https://getcomposer.org/download/

* * * *

### composer高速化
**2021/11/04追記**
Composerがv2になってからデフォルトで高速化されるようになりました！
なので下記の対応は不要になりました。

<details><summary>composer v1</summary>Composerのパッケージダウンロードを並列化するプラグインPrestissimoを導入する。依存関係のパッケージが並列にダウンロードされるので、SymfonyやLaravelなどパッケージ数の多いフレームワークをComposerで利用する時には相当な時間短縮になる。
`composer global require hirak/prestissimo`</details>


## Apache2 Setup
Apacheの設定と導入したPHPのモジュール有効化からRootディレクトリの設定。そして有効化の再起動をしていく。

```
apache2ctl -M
sudo /usr/sbin/a2enmod rewrite
sudo vim /etc/apache2/apache2.conf
sudo vim /etc/apache2/sites-available/000-default.conf
sudo vim /etc/apache2/sites-enabled/000-default.conf
sudo service apache2 restart
```

## Git Setup
一応でコンソールにて済ませておく。上から
1. Githubの登録ID
2. 同じく今度はメールアドレス
3. カラーパターンの設定
4. git checkoutの短縮
5. git commitの短縮
6. git statusの短縮
7. git branchの短縮
8. 勝手に改行コードを変えない為の設定

```
git config --global user.name "GithubID"
git config --global user.email "GithubMail"
git config --global color.ui auto
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
git config --global alias.hist 'log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short'
```

* * * *

## インストール(v4)
昔は`symfony new`とかで入れてた気がしたけど、今はcomposerでらくちん導入。

`composer create-project symfony/skeleton project-name`


## Symphonyで使える便利なサーバの追加
昔はデフォで入ってたはずだけどv4から消えて、軽くなった感じ。確かに中身を見るとだいぶすっきりした印象がある。そしてインストールはいつもの`composer require server`でらくちん。

※サーバー起動(`bin/console server:run`)したが、この時点ではデフォルトルートがないよと怒られた。何もないから当然。


## 作成を便利に作成するやつ
CakePHPで言うならbakeがsymfonyにもあるらしい。あるのとないのじゃかなり変わってくるから、かなり助かる(触ってたのはv2だから...)。

`composer require maker`


## コントローラー作成の助け
正式名称はannotationの省略形。
> SensioFrameworkExtraBundleをインストールします。SymfonyMakerBundleは、コントローラーを作成するとき、ルーティング定義にアノテーションを使います。アノテーションによるルーティングの制御は、SensioFrameworkExtraBundleが提供する機能です。

うん、よくわからないけど便利にしてくれるみたい。

`composer require annot`


## デバッグツール
お馴染みの大好きデバッグツールで、これがないと開発がつらい。そしてテストもできるイケメン。

`composer require debug-pack`


## いつも使ってるテンプレートエンジン追加(v2)
色々使って、結局落ち着くTwig。Laravel bladeもかなり良いと聞くけど(Laravelの使用率と検索率を見ながら)、なんとなく自分には合わなかった。地味にSmartyも好きだったりする。

`composer require twig`

* * * *

# 作って動かす
コントローラーの作成とビューの作成。


## コントローラー作成
コマンドでらくちん。

`./bin/console make:controller DefaultController`


## 動かしてみる
前はココで色々と変更が必要だったけどmakeする前にtwigが入ってると自動で認識して、設定してくれるようになったみたい。便利。

`./bin/console server:run`

* * * *

# メモツールつくる
動きはなんとなく分かったから、メモツールを作ってみる。

## とりあえずDemoを拡張して、更に感覚を
自分が入れたのは`symfony/skeleton`で、名前の通り最低限のもの(そりゃ軽い)。なので`symfony/symfony-demo`でFull-Verを使って弄る。

`composer create-project symfony/skeleton-demo symfony-demo`


## 一応起動確認
`php bin/console server:run`でlocalhost:8000へ。すると日本語化されたDemoが。コレはありがたい...。


## 早速弄る
日本語になっているのは、どうやら言語ファイルがあるらしく、そこからロードして出してる様子。それにしてもSymfonyProfilerが有能過ぎて惚れる...。


## Controller
Controllerはココに入ってた。

`./src/controller`


## Lang
翻訳するには下記ファイルに書き足すことで翻訳追加が出来る。これによりグローバル化がかなり簡単であり、更にはSymfonyProfilerで抜けている翻訳があれば警告でお知らせをしてくれる親切機能。

`./translations/messages.ja.xlf`


## DataBase
どうやらDemoはSQLiteを使ってデータを保存している。だけどそのやり取りをしているであろうModelが何処なのか、この時点では見当たらない。

とりあえず設定箇所はsymfonyのROOTに.envがあるのでこれで指定する。
``` .env.dist
DATABASE_URL=sqlite:///%kernel.project_dir%/var/data/blog.sqlite
```
設定後に`php bin/console doctrine:database:create`で.env.distの内容を読み取って作成してくれる。この辺はLaravelとほぼ同じ。


## Databaseを作る
`php bin/console make:entity (DBNAME)`にて`src/Entity/(DBNAME).php`が出来るので、これを弄る。


## でModelはどこよ
どうやらControllerでもDBの操作が可能みたいだけどskeleton-demoは`src/Repository/`にてDBの操作をしていた。

ん、と思ってControllerに戻ると`use App\Repository\PostRepository;`の記述が、コレで呼んでたのか...。それを踏まえて読むと`public function index(int $page, string $_format, PostRepository $posts): Response`と確かにPostRepositoryを呼んでる記述。なにこれ初見でこんなん気付けないって...。


## じゃあViewは？
Controllerにて普通に呼び出されてた。ちなみに下記の$_formatはURLをそのままファイル名で呼んでいるので、そのための記述。

`return $this->render('blog/index.'.$_format.'.twig', ['posts' => $latestPosts]);`

* * * *

# まとめ
Slim3やCodeigniter3をメインとして使っていたが、慣れれば結構Symfonyも扱いやすいのではと、調べてみるとそう思った。あと割と色々と勉強で様々のフレームワークを触れてたので、意外とどうにかなった(CakePHP3 FuelPHP Laravel Lumen(Laravelのマイクロ版))。暇があればゴリッと何か作ってもいいかもと思いました(・ω・)
ただ、やはりSymfonyはYahooが採用しただけあって結構お硬いフレームワークなので学習コストが高そうとも思いました...。