# ありがとうSymfony
## Symfony Meetup Kansai #1
by smdhogehoge
----
## Who?
- @smdhogehoge
- カルテットコミュニケーションズ
- バックエンドエンジニア
- 和歌山在住リモートワーカー
----
## インタビュー記事が出ました
https://www.remotework-labo.jp/2019/05/quartet-communications-1/
![](https://i.imgur.com/IqQLGE6.jpg)
----
## 今日話したいこと
- これまで手がけたサービス達を例に上げつつ
- 婚活アプリ,ブログメディア
- Symfonyの良いところを上げていきつつ
- 僕にとってのSymfonyとは
---
# 婚活アプリ
----
# :cold_sweat:
----
## 会員の種別がめっちゃ多い :cold_sweat:
- 男性/女性 :couple:
- 有料/無料会員 :moneybag:
- クーポンの有無 :ticket:
- 〇〇サイト経由の登録会員 :office:
- etc...
----
## かつ、できることが違う :cold_sweat:
| 種別 | 機能A | B| C | D|E|F|
| --- | --- | --- | --- | --- | --- | --- |
| 男性 | :o: | :x: | :x: | :x: | :x: | :x: |
| 女性 | :o: | :o: | :o: | :o: | :x: | :x: |
| 有料 | :o: | :o: | :o: | :x: | :o: | :x: |
| クーポン有 | :o: | :o: | :x: | :x: | :o: | :x: |
| 〇〇経由 | :o: | :o: | :o: | :x: | :x: | :o: |
----
# :innocent:
----
<!-- .slide: data-background="https://i.imgur.com/U9A2GNf.png"-->
----
```php
<?php
class MessageController extends Controller
{
public function showAction(Request $request)
{
$user = $this->getUser();
if ($user->isMale()) {
if ($user->getStatus() === 'premium') {
if ($user->getCoupons()->getType === 'message') {
// ...
} else {
// ...
}
} else {
if ($user->getCoupons()->getType === 'message') {
// ...
} else {
// ...
}
}
} else {
if ($user->getStatus() === 'premium') {
if ($user->getCoupons()->getType === 'message') {
// ...
} else {
// ...
}
} else {
// ...
}
}
}
}
```
----
# :skull:if分岐地獄:skull:
----
# :skull:Fat Controller:skull:
---
# どうしたか
----
## Authorization
----
| 種別 | 機能A | B| C | D|E|F|
| --- | --- | --- | --- | --- | --- | --- |
| 男性 | :o: | :x: | :x: | :x: | :x: | :x: |
| 女性 | :o: | :o: | :o: | :o: | :x: | :x: |
| 有料 | :o: | :o: | :o: | :x: | :o: | :x: |
| クーポン有 | :o: | :o: | :x: | :x: | :o: | :x: |
| 〇〇経由 | :o: | :o: | :o: | :x: | :x: | :o: |
----
結局『〇〇ができるorできない』
----
```php
<?php
class MessageController extends Controller
{
/**
* @Security("has_role('ROLE_SHOW_MESSAGE')")
*/
public function showAction(Request $request)
{
//
}
}
```
※注:当時の書き方です
----
``` php
<?php
class User extends BaseUser
{
public function getRoles()
{
$roles = [];
if ($this->isFemale()) {
$roles[] = 'ROLE_SHOW_MESSAGE';
}
}
}
```
----
symfonyの良いところ①
## if分岐地獄だったコード
## →「権限」で管理する、という考え方
----
symfonyの良いところ①
# より良い考え方を授けてくれる
---
# ブログメディア
----
# :cold_sweat:
----
## :cold_sweat: 記事の種類が多い
- 通常記事
- 連載記事
- 寄稿記事
- ユーザー記事
----
## :cold_sweat: 紐づくEntityが違う
- 通常記事:記者が書く
- 連載記事:「連載」毎にグルーピング
- 寄稿記事:(記者とは違う)特別な執筆者が書く
- ユーザー記事:ユーザーが書く
----
# :innocent:
---
# どうしたか
----
# Table Inheritance
----
![](https://i.imgur.com/xPMP0t0.png)
----
# Doctrine頼もしい :muscle:
----
他にも
- いろんな「いいね」機能をPolymorphicで
- https://gitpitch.com/shimokei53/slide_symfony17#/
- Doctrine Criteria
- https://tech.quartetcom.co.jp/2018/12/23/criteria-sample/
----
symfonyの良いところ②
# Doctrineが賢すぎる
----
symfonyの良いところ②
# DBまで含めた設計が柔軟
---
# 僕にとってのSymfony
----
- より良い設計、考え方が身につく!
- データ設計なども幅広くカバー!
----
たとえPHPを離れても
基礎となる考え方や、応用の効くコアな概念を
知るきっかけをくれる
----
![](https://i.imgur.com/4GC66MZ.png)
----
## しかも仕事にも出会える
![](https://i.imgur.com/ZkW0uO6.jpg)
---
# ありがとうSymfony!
{"metaMigratedAt":"2023-06-14T21:43:07.223Z","metaMigratedFrom":"YAML","title":"ありがとうSymfony","breaks":"true","description":"View the slide with \"Slide Mode\".","contributors":"[{\"id\":\"2f761ee7-727c-4e76-82d1-8270f4040e75\",\"add\":7322,\"del\":3491}]"}