20210901のPHPに関する記事は4件です。

【Laravel】ページネーションの実装方法

はじめに 今回は簡単にできるページネーションの実装方法について説明します。 ページネーションとは たとえば、1ページに投稿を100件も表示すると、ユーザーも見づらいし、表示速度も落ちるし、システムの負荷も増えてしまいますね。 そこで、そのような長いコンテンツを複数のページに分けて表示させることをページネーションといいます。 ページネーションの実装 1) コントローラーに以下のように記述します。 MenuController.php public function index() { $menus = Menu::paginate(5); return view('menus.index', ['menus' => $menus]); } paginateの引数に渡されている数字が1ページに表示する件数です。 2) テンプレートファイルに以下のように記述します。 index.blade.php {{ $menus->links() }} おわりに これだけでページネーションを実装できるなんてびっくりですね。 ページネーションをカスタマイズすることもできるので、カスタマイズしたい人はググってみてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】入力フォームの値の複合バリデーション

やりたいこと Laravel で 生年月日が 年、月、日でバラバラにPOSTされるケース。 以下のように、単純にバリデーションすると 日付として成立しているかの検証ができない。 年、月、日 を 合わせて、日付として成立しているか評価したい! example // リクエスト例 request()->birthday_year; request()->birthday_month; request()->birthday_day; // それぞれバリデーションする場合 'birthday_year' => 'required|integer|date_format:Y', 'birthday_month' => 'required|between:1,12', 'birthday_day' => 'required|between:1,31', 方法 withValidator() を使うと、通常のバリデーションルールを通過したあとに、柔軟にルール追加ができた。 $this->input('birthday_xxx') のように項目ごとに入力内容が取得できるので、checkdate() で 日付として成立しているか評価する。 $validator->errors()->add($key, $message) で、 特定のキーに対して、エラーメッセージを追加することが可能 BirthdayRequest.php <?php namespace App\Http\Requests; use App\Http\Requests\Request; class BirthdayRequest extends Request { protected $rules = [ 'birthday_year' => 'required|integer|date_format:Y', 'birthday_month' => 'required|between:1,12', 'birthday_day' => 'required|between:1,31', ]; protected function withValidator($validator): void { $validator->after(function ($validator) { if (!checkdate($this->input('birthday_month'), $this->input('birthday_day'), $this->input('birthday_year'))) { $validator->errors()->add('birthday_day', '正しい日付を入力してください'); } }); } } あとがき 詳しくは... https://readouble.com/laravel/8.x/ja/validation.html フォームリクエストへのAfterフックを追加 withValidator() 使わなくても、デフォルトのバリデーションルールだけで、できると嬉しいな。(パット見なさそう?) Laravel5.5 あたりから、 withValidator() ありそうです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

試験するときにで便利なこと

試験するときに便利だったことまとめます。 Google Chromeのシークレットウィンドウ こちらは使用している方も多いのでは。 chromeを履歴や Cookie がまっさらの状態で使用できるので、 2ユーザでログインしたい場合などに便利です。 社内システムのようなシステムでは役職や部署などによって実行権限が異なることが多いかと思います。 そのような場合に動作を確認するのに、ログイン→実行→ログアウト→別ユーザでログインといった手順で 確認するのはかなりの手間になります。 違うブラウザでログインすれば同様のことができますが、 やはり同じブラウザで確認したいことも多いのでそういった場合に活用できます。 権限者ごとのユーザ情報をまとめる 実際上記でもあるように、試験では様々な役職・部署の方で試験をしたい場合があるのですが、 多くなってくると頭では覚えてられないので、あると非常に助かりました。 日付基準のバッチは引数で実行する 日付基準の処理は試験が難しいです。 DBの値を使用して処理している場合は、その値を変えるだけなので良いですが システム日付を取得して処理するといったバッチも多いはず。 そういったプログラム内部で日付取得し、後続処理とすると いざ試験するときに非常にやりにくくなります。 なので基本的にはバッチに引数として日付を渡してあげることで試験しやすくなります。 引数なしの場合は現在日を取得し、ありの場合そちらの日付が優先されるイメージです。 この辺りはテスト容易設計にもつながる? LaravelのCommandクラスの場合、こんな感じになる php artisan command:test 20210721 正常系にもログ出力を埋め込む よくあるパターンとして、プログラムで例外などの異常系が発生した場合にログを出力をする という実装があると思います。 担当システムでもこの形で基本的には実装をしています。 ところがいざ実運用に入ってバグに悩まされた場合などには、調査用のログがあると調査が捗ります。 一旦リリースしてから調査用のログの埋め込むのは、コード変更・デプロイに結構工数がかかるので心理的な負担が重い。。。 今後は重要なユースケースやパフォーマンス面などで不安がある箇所などではログを入れてもよいかなと感じています。 具体的にはメソッドの開始、終了、DB処理、条件分岐周辺の部分にログ出力用のコードを埋め込んで おくと便利そうです。 ただ、毎回処理ごとにログを吐くのは量が膨大になるため、ログレベルなどを活用し、 後から設定しだいで出す出さないで切り分けるのが良いかと思います。 public function execute() { Log::debug('処理開始'); if ( $obj->isTest() ) { // 今は固定文字列ですが、周辺のObject情報を詰めても良さそう Log::info( '条件に入りました。' ); return; } Log::debug('処理終了'); }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WordPressのテンプレート中でよく使う処理<随時更新>

戸惑い、傷つき、誰にも打ち明けずに、悩んでた、それももう~~~~~やめ~よ~お~~♪ POSTループ(クエリを指定) <?php $args = array( 'post_type' => 'post', 'posts_per_page' => 3, 'tax_query' => array( array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => array( 'exam' ), ), ), ); $query = new WP_Query( $args ); ?> <?php if( $query->have_posts() ) : ?> <?php while ( $query->have_posts() ) : $query->the_post(); ?> <!-- データを取得 --> <?php endwhile; ?> <?php else : ?> <li><p>まだ記事がありません。</p></li> <?php endif; ?> <?php wp_reset_postdata(); //必須 ?> 備考 色々方法はあるらしいがWP_Query()が推奨されているらしいので。 参考:関数リファレンス/WP Query POSTデータ タイトル <?php the_title(); ?> 備考 echo 書かなくて良い。 テンプレートタグ/the title 投稿日 <?php echo get_the_date('y.m.d'); ?> 備考 the_date()はecho 書かなくて良いが、同ー投稿日の記事が複数あると出力してくれない。 テンプレートタグ/the date テンプレートタグ/get the date PHP:date Manual パーマリンク <?php the_permalink(); ?> 備考 echo 書かなくて良い テンプレートタグ/the permalink アイキャッチ画像 URLとalt <?php if ( has_post_thumbnail() ) : $thumbid = get_post_thumbnail_id( $post->ID ); $alt = get_post_meta($thumbid, '_wp_attachment_image_alt', true); ?> <img src="<?php the_post_thumbnail_url( 'full' ); ?>" alt="<?php echo $alt ? $alt : get_the_title(); ?>"> <?php endif; ?> URLのみ <?php if ( has_post_thumbnail() ) : ?> <img src="<?php the_post_thumbnail_url( 'full' ); ?>"> <?php endif; ?> 備考 画像は面倒。余計な属性がつくデフォルトではなく自力で。altが無い時の保険処理付き。 カスタムフィールド(テキスト) slug が hogehoge なフィールドの値を表示。 <?php the_field('hogehoge'); ?> フィールド名が hogehoge なフィールドの値を取得。 <?php $text = get_field('hogehoge'); ?> 備考 サニタイズとかした方がベターかも。不特定多数が投稿するようなサイトは作ったこと無いけど。 カスタムフィールド(ファイル) ※ フィールド名が hogehoge で、返り値が「ファイル URL」の場合 <?php $file = get_field('hogehoge'); if( $file ) : ?> <a href="<?php echo $file['url'] ?>" target="_blank"">ファイルを開く</a> <?php endif; ?> 備考 PDFファイル添付したいケースでよく使う 個別記事ページ 前の記事へ/次の記事へリンク ※ 投稿 <ul> <li><?php previous_post_link('%link', '前の記事へ'); ?></li> <li><a href="/news/">一覧に戻る</a></li> <li><?php next_post_link('%link', '次の記事へ'); ?></li> </ul> ※ カスタム投稿 <ul> <li><?php previous_post_link('%link', '前の記事へ'); ?></li> <li><a href="<?php echo get_post_type_archive_link( get_post_type() ); ?>">一覧に戻る</a></li> <li><?php next_post_link('%link', '次の記事へ'); ?></li> </ul> 備考 /news/の部分、投稿のアーカイブページをTOPページ以外にしていると、関数でアーカイブページURLが取得出来ない問題有。 そのため、直指定。 うまいやり方ないかな。。 共通 TOPページのURL <?php echo esc_url( home_url('/') ); ?> 備考 長い。 子テーマのURL <img src="<?php echo get_stylesheet_directory_uri() ?>/images/aternus.png" alt="" title="" width="" height="" /> 備考 画像のパス取得等に使用。 カスタム投稿タイプデータ:記事に紐付くカスタムタクソノミーのターム一覧 コード <?php $terms = get_the_terms( $post->ID, 'taxonomy_name' ); if ( $terms ) : foreach ( $terms as $term ) : ?> <p class="cat-<?php echo $term->slug; ?>"><?php echo $term->name; ?></p> <?php endforeach; endif; ?> 備考 タームが無い時の保険付。 あああ 備考 終わりに WordPressがブログソフトウェアだってこと、忘れ去られている気がする。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む