- 1. データの受け渡し練習のためECサイト作ってみた
- 2. Laravelでオニオンアーキテクチャを使ってみた
- 3. robots.txtを取得しクロール拒否されていないかチェック②
- 4. Laravel側でのIPアドレスによるアクセス制御
- 5. PHPでテストコードを書いてみる!単体・結合テスト、AAAについても解説!
- 6. セキュリティ対策について(レスポンスヘッダー等)
- 7. CakePHP4.xのアプリをCakePHP5にアップグレードする とりあえずアップグレード編
- 8. Laravel初心者が掲示板作る【Laravel 8.x】
- 9. PHPのjson_decode()はデコードに失敗した場合nullを返す
- 10. Laravel 11で外部API呼び出しメソッドをMock化する方法
- 11. Authより前に処理を差し込みたい
- 12. もしPHPが使われなくなったら、どのバックエンド言語を選ぶか?
- 13. 【Laravel11】最低限のログ設計について
- 14. Laravel11で管理画面を作るのにFilamentをインストールしてみる
- 15. Laravel11の開発環境をDockerで構築する方法
- 16. OpenID Connectの実装について
- 17. 【Stripe決済】laravel + JavaScriptでStripeクレジットカード決済をやってみた
- 18. Perlプログラミング入門:初心者のための15ステップガイド
- 19. Laravel/PHPの日付で起こり得るバグ4択!何個解けますか?
- 20. CSVのパースで空文字とnullを区別する
データの受け渡し練習のためECサイト作ってみた
## 記事の概要
エンジニア未経験からの挑戦ということで企業様へアピールするためのポートフォリオを作成してみました。
作成手順と機能、工夫したところ、課題点を書き出してみようと思います。### プロフィール
20代後半 男性
ITは全くの未経験(前職は営業)
就労移行支援にて0からプログラミングを学ぶ。
**作成期間は1ヶ月くらい**## 目的
* JavascriptとPHPを使いつつDBとの連携も行えるよう経験を積む
* 今の自分のレベル感を企業に見ていただく
* 素のJs、PHPでどこまで書けるかチャレンジ# スペック
**言語**
Javascript (Vanilla Js)
PHP 8.0.19**DBMS**
MySQL Ver 8.0.29**開発環境**
Windows 11 Pro
IIS (Version 10.0.22621.2860)## 完成画面
(圧縮上手くできませんでした。。。)
![ECサイト.gif](https://qiita-image-store.s3.ap-north
Laravelでオニオンアーキテクチャを使ってみた
## はじめに
少しだけクリーンアーキテクチャやオニオンアーキテクチャについて感覚が掴めた気がするので記事にしておきます。
ご指摘点あれば遠慮なくお願いいたします。
構成ですがPHPとLaravelを使用、ディレクトリ構成はonion architectureで構築していきます。### 実際の構成
以下ディレクトリ構成になります。
また色んなディレクトリ構成が存在するのでこれが正解ではないです。
呼び出し方とかおさえておけば色々対応できると思います。“`
├── app
│ ├── Http
│ │ ├──Controllers
│ │ │ ├── Api
├── onion
│ ├── Controller
│ ├── Driver
│ ├── Entity
│ └── UseCase
“`流れとしては
– routes/api.php
– Http/Controllers
– onion/Controllers
– onion/UseCase
– onion/Driver(Repository)
– onion/Entity
robots.txtを取得しクロール拒否されていないかチェック②
# 概要
前回は、[robots.txtを取得する処理](https://qiita.com/ishi720/items/d985bb711744ce9864fb)を作成しました。
今回は、`robots.txt`からクロール拒否されていないかチェックする処理を作成したいと思います。# robots.txtの構成
まずは、サンプルとしてQiitaのrobots.txtを拝借しました。
Qiitaのrobots.txtは以下のような構成になっています。“`text:robots.txt
# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
User-agent: *
Disallow: /*/edit$
Disallow: /api/*
Disallow: /graphql$
Disallow: /policies/td-optout$
Disallow: /search
Disallow: *.md
Disallow: */i
Laravel側でのIPアドレスによるアクセス制御
# IPアドレスによるアクセス制限とは
業務系Webアプリケーション構築時には、「特定のIPアドレスからのアクセスのみ許容したい」といった要件はありがちかと思います。
通常、インフラ側で制御すれば良い話ではあり、AWSであれば下記の方法で設定可能です。
– ALBのリスナールール
– ネットワークACL
– セキュリティグループ# Webアプリケーション側で実装する必要性
前項の通り、AWSで設定することにより、簡単に実施できます。
しかし、下記のケースではどうでしょうか。
– ユーザーが二種類ある(user, admin)
– adminの中でも権限が分かれている
– adminの特定の権限のみIPアドレスによるアクセス制限を実施したい「adminのみIPアドレスを制限したい」ということであれば、ALBのリスナールールでパス指定することにより、なんとかなりそうです。
厄介なのが、「adminの特定の権限のみ」という部分です。ログイン認証後しか判定できないため、Webアプリケーション側で実施する必要があります。# 実装方法
MiddleWareを使って実装していきます。
PHPでテストコードを書いてみる!単体・結合テスト、AAAについても解説!
# テストコードとは?
プログラムの動作を検証するために書かれるコードのことです!
# テストコードのメリット
– バグ検知
– コードに潜むバグの検知を早期に発見できます
– 関数の動作を表現できる
– テストコード自体が関数の使用方法を示すドキュメントになります
– リファクタリングの安全性確保
– 他メンバーがコードを修正する際にもテストが通ることで品質が保証されます
– テストコードが無いとどこまで影響範囲があるのか確認しなければなりません# テストの種類
– 単体(ユニット)テスト
– 関数単位で正しく動作するか確認します
– 例: MVCフレームワークのモデルの関数のテスト
– 結合(インテグレーション)テスト
– 単体テストで確認した関数を組み合わせて連携してテストを行います
– 例: MVCフレームワークのコントローラーのアクションのテスト
– システムテスト
– システム全体が要件通りに動作するかを確認します
– アプリケーションがほぼ完成した段階で実施されます# A
セキュリティ対策について(レスポンスヘッダー等)
# ウェブセキュリティの強化:ヘッダーとCookieの設定方法
## はじめに
Webアプリケーションのセキュリティは、常に進化する脅威に対抗するためには不可欠です。
本記事では、サーバー応答のセキュリティを向上させるためのヘッダーの設定方法と、
Cookieの安全な扱い方について解説します。
サンプルコードはPHPになります。
またこれから扱う内容は検証ツールを開いてネットワークタブのレスポンスヘッダーの話しになります。
![スクリーンショット 2024-08-26 14.38.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2586109/d692eeea-1cbd-7c85-edab-a57d1501ab18.png)## セキュリティヘッダーの設定
### X-Content-Type-Options
このヘッダーを`nosniff`に設定することで、ブラウザはMIMEタイプのスニッフィングを無効にし、指定された`Content-Type`のみを扱うようになります。これは、悪意
CakePHP4.xのアプリをCakePHP5にアップグレードする とりあえずアップグレード編
## はじめに
PHPのバージョンやらMySQLのバージョンやらをあげるためにCakePHPも5に上げようと思い、手順を記録しておこうと思いました### PHPとMySQLのバージョンを上げる
CakePHP5ではPHP8.1以上が必要です
今回はhttps://qiita.com/scarym/items/6b5e813f0972896780fc
の通り、MAMP7で
* PHP8.3.9
* MySQL8.0.35という環境で動かします
### アップグレード・ツールを使う
https://book.cakephp.org/5/ja/appendices/5-0-upgrade-guide.html
を参考にアップグレードツールをインストールします。
今回は現在動いているアプリを仮に「my_app_name」とします
まずは「my_app_name」に移動して
“`
git clone https://github.com/cakephp/upgrade
“`
my_app_nameの下に「upgrade」が出来るのでそちらに移動
“`
cd upgra
Laravel初心者が掲示板作る【Laravel 8.x】
https://manablog.org/laravel_bulletin_board/
こちらの記事を参考にしてLaravel初心者がつまづいた所をまとめてみる。
# バージョン
Laravel version
8.83.27PHP version
7.4.33MuSQL version
5.7.39MAMP version
6.9# 進捗
現在、
投稿記事を表示するためのコントローラーをつくっていく
の章の
投稿一覧の表示ページを作成する
でつまづいている。## 2024.8.1
### Seederが動かない
“`terminal:ターミナル
$XXX bbc % php artisan db:seed
Database seeding completed successfully.
“`
とりあえず、`php artisan db:seed`も
`php artisan migrate`みたいに
マイグレーションファイルやシーダーファイルも
一括で読んでくれるものだと勘違い。
実際はデフォルトだと`DatabaseSeeder`クラスを実行
PHPのjson_decode()はデコードに失敗した場合nullを返す
調べればすぐだったのに、勘違いにより1時間くらい無駄にしたので備忘のために残します。
悔しい。## サクッと理解したい人
参考記事:https://www.php.net/manual/ja/function.json-decode.php
:::note info
json のデコードに失敗したり エンコードされたデータがネストの最大値を超えているなどの場合、null を返します。
:::てっきりエラーが表示されるのかと思ってました。
デコードに失敗した時はエラーではなくnullが返ります。## デコードってなに
(デコードとエンコードいつもわからなくなっちゃう)
デコードとは、JSONをオブジェクトに変換することです。
逆にエンコードは値をJSON形式に変換することです。## 今回失敗したパターン
今回、デコードするために渡したJSONが**ダブルクォーテーションで囲われていない**値があり、デコードに失敗しnullとなっていました。
“`PHP:失敗例
Laravel 11で外部API呼び出しメソッドをMock化する方法
# はじめに
Laravelで外部APIと連携するアプリケーションを開発する際、外部APIの準備が整っていなかったり、APIの利用制限があるためなるべく通信したくない、などの理由で、ローカル環境での開発やテスト実行時に実際に外部APIを呼び出したくない場合があると思います。そこで今回は、Laravelで外部API呼び出し処理をMock化する方法を紹介します。
この方法を使うことで、外部APIのレスポンスを擬似的に再現し、開発やテストをスムーズに進めることができます。# 前提条件
– PHP 8.3.7
– Laravel Framework 11.14.0# 実装手順
## APIサービスの作成
まずは、実際に外部APIにリクエストを送信するサービスクラスを作成します。
今回は呼び出し元でステータスコードを利用できるように、JsonResponse型で返していますが、配列など任意の型で実装できます。
その場合は、Mockクラスのメソッドの戻り値も合わせて変更してください。“` php
// app/Services/ApiService.php
Authより前に処理を差し込みたい
# Authより前に処理を差し込みたい
Laravel10の開発でAuthよりも前に処理を差し込みたい場合、どうすればいいのか書いていきます。
先に結論を言っておくと公式ドキュメントの「ミドルウェアの順序」の部分に従ってKernel.phpに$middlewarePriorityを定義します。
https://readouble.com/laravel/10.x/ja/middleware.html“`
protected $middlewarePriority = [
\Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
\Illuminate\Cookie\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\
もしPHPが使われなくなったら、どのバックエンド言語を選ぶか?
私はベテランのバックエンド開発者として、PHPは私のキャリアにおいて重要な役割を果たしてきました。しかし、技術の世界は日々変化しており、常に新しい挑戦に備える必要があります。では、もしPHPが今日突然消滅したら、どのバックエンド言語を選ぶでしょうか?以下が私の鋭い見解です。
## 1. Golang
まず、私は間違いなくGolang(Go言語)を選びます。なぜなら、Golangは性能が優れているだけでなく、開発体験も非常に良いからです。PHPと比べて、Golangの並行処理能力はまさに雲泥の差です。Golangのコードを書くことは、面倒な設定や終わりのないデバッグがない、楽しい旅のようです。
Golangの標準ライブラリは非常に強力で、ほぼすべての開発ニーズを満たすことができます。また、Golangの”Bring your own”アプローチは、フレームワークに縛られるのが嫌な開発者にとってまさに理想的です。各構造体のために個別のファイルを作成する必要はなく、エラーハンドリングもより直接的で透明です。要するに、Golangはコードそのものに集中できるようにしてくれます。
##
【Laravel11】最低限のログ設計について
## はじめに
システムのログってめちゃくちゃ大事。
システムのバグの早期発見からの修正だったり、システムで何が起きているか可視化できる。そんなある日、あるプロジェクトのフレームワーク設計を行うことがあった。
ただ単に環境を用意して渡すと、書き方がそれぞれ異なる可能性もあるため、先に準備した方がいいなと思った時の出来事である。**ログ周りはできるだけ処理を共通にしてメンバーにおろそう**
特にLaravelは書き方に自由性があるため、それぞれ異なる書き方ができやすいフレームワーク(だと個人的には思っている)。
荒削りな部分もあるが、全体のログ設計として最低限を網羅できるように設計したことを忘れないように備忘録としてメモしておく。
## ログ実装
+ **前提**
前提としてデフォルトのLaravelのフローを崩さず、ログの出力、書き出しの部分のみをオーバライドしたい。
また、標準出力も開発効率向上のため、対応する。
+ **ログ関数**
まずログを出力するServiceクラスを作成。**基本ログ項目**
・IPアドレス
・URL
Laravel11で管理画面を作るのにFilamentをインストールしてみる
管理画面の作成に、以前は`Laravel-Admin`を使ったことがあるのですが、更新が止まっているようなので新たに`Filament`を使ってみようと思います!
まずはFlamentの導入するための備忘録になります# 環境
– PHP8.2
– Laravel11
– Laravel Sailで環境構築、Dockerで起動中環境構築に関しては、こちらを参考にしてください!
https://qiita.com/curacao/items/892109e579c377b9b4b8
# Filamentとは?
簡単にまとめると
– 無料のLaravelの管理パネルツール
– ドキュメントが充実していて、コミュニティも活発
– シンプルなので手軽に導入をできる
– Tailwind cssベース
– 頻繁にアップデートが行われているという優れもの!
公式のDemoもあるので、是非見てみてください!
[Filament公式DEMO](https://demo.filamentphp.com/)
[Filament公式](https://filamentphp.com/)#
Laravel11の開発環境をDockerで構築する方法
久々にLaravelを使う(前回使ったのは6系だったな?)ので、備忘録を残します!
今回はDockerを使って環境を構築してみたいと思います!# 環境
– WSL2
– Laravelは11系を使用
– PHPは8.2系にアップデート済み
– DockerはDocker Desktop for Windowsを利用PHPが7系で8系にアップデートしたい方はこちらを参考にしてください
https://qiita.com/curacao/items/b4d4e645489294fb1f57
# Laravelプロジェクトの作成
まずはcomposerを使ってLaravelプロジェクトの作成を行います。
開発を行うディレクトリに移動して次のコマンドを実行します。
“`
composer create-project laravel/laravel hoge-app
“`
※WSL環境で開発を行う場合、プロジェクト作成の場所は結構大事になってきます! **推奨は`~/`以下です!**
理由に関してはこちらの記事を参照https://qiita.com/curacao/ite
OpenID Connectの実装について
## はじめに
この記事ではOpenID Connect認証の流れと、PHPを用いたアクセストークンおよびIDトークンの取得、公開鍵の検証方法について説明します。
OpenID Connectは、OAuth 2.0をベースにした認証プロトコルであり、
ユーザーが認証情報を直接提供することなく、第三者アプリケーションに安全にアクセス権を委任できる仕組みです。—
## OpenID Connect基本的な処理の流れ
※Service Aは開発中のサイト
※Identity Providerは認証を行うサービス(例:Google、Facebookなど)“`mermaid
sequenceDiagram
participant User
participant Service A
participant Identity ProviderUser->>Service A: ログインボタンをクリック
Service A->>Identity Provider: 認証リクエストを送信
Identity Provider->
【Stripe決済】laravel + JavaScriptでStripeクレジットカード決済をやってみた
## はじめに
決済機能を実装するにあたり、StripeAPIを使用して実装することになった。今回の記事はstripeAPIに関しての決済備忘録になる。
忘れないようにメモしとく。## ざっくりな環境
+ Docker
+ Laravel11
+ php8.3
+ MySQL8.0
+ JQuery
+ HTML
+ CSS
+ Bootstrap## 流れ
まず流れから把握しておく。+ **フロント側でPaymentMethodIDを作成する**
Stripe(多分他の決済機能も一緒)はクレジットカード情報を送信したり、取得したりするのはセキュリティ的に良くないため、カード情報を直接保存せず、トークン化された情報を使って、セキュリティを確保するらしい。これにより、PCI DSS(Payment Card Industry Data Security Standard)に準拠した安全な方法でカード情報を管理ができるようになるみたいやな。
ここでまあまあハマった。
+ **フロント側で作成したPaymentMethodIDを使用してサーバー側が決済**
上記記
Perlプログラミング入門:初心者のための15ステップガイド
# はじめに
こんにちは!今日はPerlプログラミング言語について学んでいきましょう。Perlは強力でフレキシブルな言語で、特にテキスト処理が得意です。この記事では、15の章に分けてPerlの基礎を丁寧に解説していきます。各章にはサンプルコードも用意しましたので、ぜひ実際に試してみてくださいね。
## 第1章:Perlの基本
Perlは「実用的抽出・報告言語」(Practical Extraction and Report Language)の略称です。1987年にラリー・ウォールによって開発されました。
“`perl
#!/usr/bin/perl
use strict;
use warnings;print “こんにちは、Perlの世界へようこそ!\n”;
“`## 第2章:変数とデータ型
Perlには3つの主要な変数型があります:スカラー($)、配列(@)、ハッシュ(%)。
“`perl
my $name = “太郎”;
my @fruits = (“りんご”, “バナナ”, “オレンジ”);
my %ages = (“太郎” => 25, “花子” =
Laravel/PHPの日付で起こり得るバグ4択!何個解けますか?
## あるある!日付計算がうまく行かないバグ
さっそくですが、このコードの中のバグが分かりますか?
“`
public function searchBookingsInWeek(CarbonInterface $start)
{
return BookingModel::query()
->whereBetween(‘date’, [$start->startOfWeek(), $start->endOfWeek()]);
}
“`
### 答え**※1問目だけはネタバレ対策させていただきます。**
次からはスクロールの調整でご協力お願いします。バグ解決を検索している方になるべく不便なく届くため次から答えを隠しません。クリックで正解を表示
正解は、Carbonのオブジェクトはミュータブルなせいで探してる期間が実質
$start->endOfWeek()
から$start->endOfWeek()
になっちゃいます。修正としては簡単
CSVのパースで空文字とnullを区別する
## 背景
業務でCSV取込機能を作っていて、なめてかかっていたら詰まったので備忘録として残します## 課題
以下のようなCSVを取り込む必要があり、
“`csvs
“dummy”,””,,dummy
“`
結果として、
“`json
[
“dummy”,
“”,
null,
“dummy”,
]
“`
を得たいとのこと
え…CSVはそもそも文字列しか扱えないものだと思ってた…`null`も考慮せなあかんの…## PHPで頑張る
PHPには`fgetcsv`と`str_getcsv`があるけど、https://www.php.net/manual/ja/function.fgetcsv.php
https://www.php.net/manual/ja/function.str-getcsv.php
どっちも以下のような結果になる
“`php
str_getcsv(‘”dummy”,””,,dummy’);
/*
[
“dummy”,
“”,
“”,
“dummy”,
]
*/
“`
公式のオプション見て色々試したものの、全然上手くいかな