Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

20180425 phpstudy-my-first-laravel

165 views

Published on

2018.04.25 PHP勉強会の資料

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

20180425 phpstudy-my-first-laravel

  1. 1. My First Laravel PHP勉強会 2018.4.25(Wed) @m_norii
  2. 2. About me 林 正紀 (HAYASHI Masanori) 1974年09月12日生 (43歳) ・・ 埼玉生まれ埼玉育ち埼玉川越市在住 埼玉大学/大学院・数学専攻 埼玉土着エンジニア 勤務 • @m_norii • http://norii.hatenablog.com/ • https://www.facebook.com/m.norii • https://www.slideshare.net/m_norii
  3. 3. エキテン -- 国内最大級オールジャンル口コミサイト
  4. 4. 私のWeb Application Framework歴 Zend Framework 1 symfony1 Symfony2 FuelPHP CakePHPとCodeIgniterはかじった程度
  5. 5. 案件:コーポレートサイト https://www.designone.jp/
  6. 6. 要件 • フロント側 • 動的機能はニュースと問い合わせのみ • デザイナー要望:テンプレートエンジンいれたい • バックヤード側 • ニュースを更新する機能 • ログイン認証
  7. 7. 選択したスタック:フロント • Linux/Nginx/MySQL/PHP • https://github.com/duncan3dc/blade • 動的機能がほとんどない要件なので Laravelフルセットは必要なかった • ただテンプレートエンジンは必要だった • Twigも検討したが、社内別プロジェクトで Laravelを使っていたので デザイナーもBladeの知見があった • Blade単体※で動くようにしたものをみつけた 検証して問題無さそうなので採用した ※単体と言っても依存ライブラリはまあまあある • https://github.com/vlucas/phpdotenv • 環境依存情報の切り出し
  8. 8. 選択したスタック:バックヤード • Laravel • ニュース記事のCRUDだけにしてはリッチすぎると も思ったが、認証やページネーションなど地味なと ころの実装に時間かけたくなかった • TinyMCE • JavaScriptのWYSIWYGエディタ • WordPressでも使われているやつ • ニュース記事本文の編集に利用 • Jbimages • TinyMCEのプラグイン • 画像をアップロードできるようにする
  9. 9. バックヤード画面
  10. 10. Laravel採用してよかったところ • ドメインが複雑でなければさくさく作れる • 今回はうってつけだった • php artisan make:auth が簡単・便利 • ページネーションが簡単・便利 • フラッシュデータが簡単・便利 • 次のリクエスト間だけセッションにアイテムを保存 • 「データを登録しました」みたいなやつ • ファイルアップロードも実装が楽 • Blade、機能が洗練されてて使いやすい
  11. 11. Laravel はまったところ URL生成系のメソッド <script src="{{ asset('/js/app.js') }}" defer></script> こう出力される ↓ <script src="http://example.com/js/app.js" defer></script> <form action="{{ url('/articles') }}" method="post" name="article"> こう出力される ↓ <form action="http://example.com/articles" method="post" name="article"> <form id="logout-form" action="{{ route('/logout') }}" method="POST"> こう出力される ↓ <form id="logout-form" action="http://example.com/logout" method="POST">
  12. 12. なぜはまったか? • 最初ローカル環境では、http (非SSL) で開発 を進めていた • 自己署名証明書いれてもよかったが、結局ブラウザ の警告画面がうざいので入れなかった • ある程度開発が目処立って 検証用サーバ(https環境)にアップしたらい ろいろリンクが機能しなかった • 調べていったら、先のメソッドたちがURLをフルで 出力しているのが原因だった
  13. 13. どう直したか? 結局同一ドメインだし、メソッド通すのやめた <script src="{{ asset('/js/app.js') }}" defer></script> ↓ <script src="/js/app.js" defer></script> <form action="{{ url('/articles') }}" method="post" name="article"> ↓ <form action="/articles" method="post" name="article"> <form id="logout-form" action="{{ route('/logout') }}" method="POST"> ↓ <form id="logout-form" action="/logout" method="POST">
  14. 14. フルURL生成もう1つ • ページネーションが生成するURL <a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">&lsaquo;</a> <a class="page-link" href="{{ $url }}">{{ $page }}</a> <a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">&rsaquo;</a> ↓ <a class="page-link" href="http://example.com/articles?page=3" rel="prev">&lsaquo;</a> <a class="page-link" href="http://example.com/articles?page=4">{{ $page }}</a> <a class="page-link" href="http://example.com/articles?page=5" rel="next">&rsaquo;</a>
  15. 15. そもそもページネーションって ページネーション用パラメータ以外、同一の URLですよね? この時、リンクURLはここまで省略できる <a href="http://example.com/articles?page=3"> ↓ ドメインいらない <a href="/articles?page=3"> ↓ パスも同じだからいらない <a href="?page=3">
  16. 16. こう直した • strstr() を使って ? の前を除去 • もっとスマートな直し方があればいいのだが <a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev">&lsaquo;</a> <a class="page-link" href="{{ $url }}">{{ $page }}</a> <a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next">&rsaquo;</a> ↓ <a class="page-link" href="{{ strstr($paginator->previousPageUrl(), '?') }}" rel="prev">&lsaquo;</a> <a class="page-link" href="{{ strstr($url,'?') }}">{{ $page }}</a> <a class="page-link" href="{{ strstr($paginator->nextPageUrl(), '?') }}" rel="next">&rsaquo;</a> ※出力 <a class="page-link" href="?page=3" rel="prev">&lsaquo;</a> <a class="page-link" href="?page=4">{{ $page }}</a> <a class="page-link" href="?page=5" rel="next">&rsaquo;</a>
  17. 17. はまったところ(2) 「HTMLエスケープはしたいが、改行は<br>に 変換したい」場合 {{ nl2br($form['content']) }} だと、<br>がエスケープされて出力されてしまう {!! nl2br($form['content']) !!} だと、<br>は出力されるが、他のHTMLタグも出力してしまう ↓ {!! nl2br(e($form['content'])) !!} で、<br>だけをエスケープせずに出力できる ・・・けど、なんかスマートじゃない感
  18. 18. 他、細かいところ • カスタムエラーページの作り方がわからん • .env 何に使うかわからない項目がある • DBとかMailとかRedisはいいとして • 「 PUSHER_APP」って何? • 結局使わなそうなので設定ごと消したけど • URLの話、そもそも開発環境のSSL証明書問題 みんなどうしてるんだろう?
  19. 19. ちょっとハマりどころもあったけど Laravel開発は楽しい! エンジニアが本来注力すべきところに集中でき る感じが良い!
  20. 20. ご清聴ありがとうございました

×