20210119のPHPに関する記事は15件です。

プログラムを少しかじった私がバックエンドエンジニアとして働くためにECサイトを作り始めてみた その⑥

対象者

・バックエンドエンジニアを志す人
・web開発初学者
・ECサイトを作成しようと思っている人
・初学者の勉強仮定を見たい方

はじめに

こんにちは!
この投稿はその⑤の続きです。

今週は別プロダクトの発表が週末にあります!
前置きは短めに!目次です!

目次

1.今回の作業報告
2.反省点
3.次回のステップ

1.今回の作業報告

画像を使ってざっくり報告

◯商品の表示機能
商品一覧(全部)と男性向け商品と女性向け商品を一覧で表示させる仕様で実装しています。
スクリーンショット 2021-01-19 20.46.04.png

男性向け商品一覧
スクリーンショット 2021-01-19 20.46.20.png

女性向け商品一覧
スクリーンショット 2021-01-19 20.46.53.png

DBに男性向けと女性向けの識別するカラムをテーブルに入れて判定させました。

スクリーンショット 2021-01-19 22.41.10.png

◯注文確認機能
カートの商品を送る情報を入力
スクリーンショット 2021-01-19 20.48.13.png

ご注文確認画面へ。
カートの情報と送信先が表示されるようにしています。
スクリーンショット 2021-01-19 20.48.28.png

その他、ユーザー毎のログイン機能など他にも実装しましたが割愛します。

2.反省点
実装の仕様がちゃんと決まっていないために大幅に時間が取られてしまいました。
数量が増えたときどうするかなどの仕様はあらかじめ決める必要がありそうです。
テーブル結合などもうちょっと踏み込んで実装できれば色々表現できる幅が広がりそうです。

3.次のステップ
カート内の商品計算とかその他もろもろを引き続き実装していきます。

簡単ですが今回は以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel6】セッションの値が多重連想配列の時に特定のkeyに対応するvalueを更新する方法

はじめに

あまりググっても出てこなかった方法なので、残しておきます。
この選択肢があればセッションの扱える幅が広がると思います。

対象のセッション(仮)

例えば

//セッションからkeyが'cartData'の値を取得
$request->session()->get('cartData');

これで取得した値が以下の場合を想定する

[
    [0] => [
        'item_name' => 'ジャケット',
        'item_count' => 1,
    ],
    [1] => [
        'item_name' => '靴下',
        'item_count' => 3,
    ],
    [2] => [
        'item_name' => 'バッグ',
        'item_count' => 2,
    ],
]

実現したいこと

靴下の個数を3 → 5個にしたい!

セッションの特定のkeyに対応するvalueを更新する方法

以下のコードで更新できる

$request->session()->put('cartData.1.item_count', 5);

->put()の第1引数に連想配列の階層を文字列連結することで特定のkeyのvalueにアクセスすることができる。

config()と同じ感じですね

さいごに

ドキュメントにも明確には記載されていなかった...

Laravel 6.x HTTPセッション

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

wordpress を使ってエンジニアポートフォリオ作成

Wordpressを使ってエンジニアポートフォリオを作成

以下のサイトからテーマを取得
https://webdesign-trends.net/entry/11500
DEMOサイト
https://demos.pixelgrade.com/noah-lite/about/

Topページの作成

SmartSlider3

メニューバー

Slider

問い合わせフォームを作成

https://www.xserver.ne.jp/blog/contact-form/

多言語対応

https://ja.wordpress.org/plugins/weglot/?gclid=CjwKCAiAo5qABhBdEiwAOtGmbhv7AwSPbXWsVbRTu9C0Jth2fIqxddAQRHou0x1n1e8jg_Knzfye-BoCsBkQAvD_BwE

SEO対策

ポートフォリオでは特にSEO対策する予定はないが
今後ブログ作成など行うので書く予定

まとめ

作成完了したらまたいろいろ書く

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

谷藤賢一『いきなりはじめるPHPワクワク・ドキドキの入門教室』でPHPを勉強してみた(2)

以下の内容を学習。
chapter3-9 アンケート項目を増やそう!
chapter3-10 前ページに戻る機能をつけよう!
chapter3-11 入力データを消さないでページを戻る方法!

【やらかしたミス】
入力フォームに文字を記載して送信しても、ブラウザにプログラムが表示された。

【原因】
ファイル「index.html」をダブルクリックしたせい。アドレスバーに「http://localhost/phpkiso/~」を入力すればいい。
あと、MANPを起動するのを忘れていた。

HTML/CSSで作ったホームページはローカル環境でも確認できるのに、PHPはわざわざサーバーを起動させないと動かないのはなんでなんだ?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

連想配列の最初のキーを取得するためにarray_key_first()を使おうと思ったらphp7から追加された要素で使えなかったから、php5でも使える方法にしてみた

どうも、7noteです。array_key_first()と同じことをphp5でもする。

連想配列の1番目かどうかを判断させるのに、array_key_first()が使えます。
しかし、これはphp7から追加されたものになるのでそれ以前のphpの環境では使えません。

なので、php5以前でも同じような処理ができる方法を解説。

php7.xならarray_key_first()が使えるが・・・

**php5.xで同じことをするならこんな方法がある

$city = array('東京'=>'tokyo', '愛知'=>'aichi', '大阪'=>'osaka');

reset($city);
$first_key = key($city);

foreach($city as $key => $value) {
    if($key === $first_key){
        // 最初の処理
    } else {
        // それ以外の時の処理
    }
}

おまけ

array_key_first()の使い方

php7以降ならarray_key_first()で連想配列の最初のkeyを取得可能。

// php7.x
$city = array('東京'=>'tokyo', '愛知'=>'aichi', '大阪'=>'osaka');

foreach($city as $key => $value) {
    if($key === array_key_first($city)){
        // 最初の処理
    } else {
        // それ以外の時の処理
    }
}

まとめ

phpはバージョンによって使える関数が違うことがあるので、よく使うものは代替策の書き方を知っておくと便利!

おそまつ!

~ Qiitaで毎日投稿中!! ~
【初心者向け】WEB制作のちょいテク詰め合わせ

参考:https://gotohayato.com/content/59/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPの基礎アウトプット

PHPの勉強を始めたのでこの場を借りてアウトプットしていきたいと思います。

①PHPはHTMLに埋め込んで使用することができる

<?php echo '<h2>テスト</h2>'; ?>

とHTMLに記載するとHTMLには下記に変換されます

<h2>テスト</h2>

このようにPHPは?phpを使用することによってHTMLに埋め込むことができます。
RubyでいところのERBのようなイメージで認識しています。

また、上記にもありますがechoで出力をすることができます。
echoの後に半角スペースが必要であることに注意が必要です。

②変数と四則演算の省略形

PHPの変数には先頭に $ が必要です。
また、
$A = $A + 1
は $A += 1
と記載します。

以上、アウトプットでした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】artisanコマンドでやりたいこと、ここで見つかる

はじめに

「この記事を見ればお目当てのartisanコマンドが(だいたい)全て見つかる!」っていう記事です。

以前書いたGitでやりたいこと、ここで見つかるのartisanコマンドバージョンです。

僕自身が「あのartisanコマンドどう書くんだっけ?」ってなった時に見返す用でもありますのでストックしておくと便利かなと思いますw

※この記事では全てのartisanコマンドを網羅したわけではありません。

.envのAPP_ENVを表示

$ php artisan env

Laravelの内蔵サーバーを起動(PHPのビルドインサーバー)

$ php artisan serve

DBとの接続状況を確認

$ php artisan migrate:status

コントローラー作成

$ php artisan make:controller {任意の名前}Controller

コントローラー作成(主要7アクションを自動的に生成)

$ php artisan make:controller {任意の名前}Controller --resource

シングルアクションコントローラー作成

$ php artisan make:controller {任意の名前}Controller --invokable

マイグレーションファイル作成(テーブル作成用)

$ php artisan make:migration create_{テーブル名}_table —-create={テーブル名}

マイグレーションファイル作成(カラム追加用)

$ php artisan make:migration add_column_{テーブル名}_table —-table={テーブル名}

※ファイル名の付け方には個人差あり
※これがデファクトスタンダードではない

マイグレーション実行

$ php artisan migrate 

現在のテーブルを全削除してマイグレーションやり直し

 $ php artisan migrate:fresh

データベース全体を作り直す

$ php artisan migrate:refresh

マイグレーション実行&シーディング実行

$ php artisan migrate --seed

マイグレーションロールバック(最後に実行したマイグレーションを元に戻す)

$ php artisan migrate:rollback

全てのマイグレーションをロールバックする

$ php artisan migrate:reset

シーダーファイル作成

$ php artisan make:seeder {任意の名前}Seeder

{任意の名前}TableSeederにする場合もアリ

シーディング実行

$ php artisan db:seed

特定のシーダーファイルを実行

$ php artisan db:seed --class={実行するシーダーファイル}

モデル作成

$ php artisan make:model {任意の名前}

(例)テーブル名がusersなら{任意の名前}はUserにする

モデルとファクトリーを同時に作る

$ php artisan make:model {任意の名前} —-factory

(例)テーブル名がusersなら{任意の名前}はUserにする

ルーティング一覧を表示

$ php artisan route:list

フォームリクエスト作成(バリデーションに使用)

$ php artisan make:request {任意の名前}Request 

ポリシー作成

$ php artisan make:policy {任意の名前}Policy --model=Article

通知クラス作成

$ php artisan make:notification {任意の名前}Notification

ファクトリー作成(モデルと対応させる)

$ php artisan make:factory {モデル名}Factory —-model={モデル名}

テスト作成

$ php artisan make:test {任意の名前}ControllerTest

tinker起動

$ php artisan tinker

さいごに

順次追記予定です

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP Portfolio 

はじめに

らむです。
今回は、初めてQiitaで投稿します。
理由としては、ある程度、学習をしたのでポートフォリオを制作することにしました。

目的

私は、現在転職するために独学で、プログラミングを勉強しています。
また、転職活動において他人と差別化できるように作成中のポートフォリオの説明や工夫点などをアウトプットしていきます。

開発環境

■言語(製作中の現時点)
PHP 7.4.2
mysql Ver 8.0.22
JavaScript (jQuery)
HTML
CSS

■ローカル開発
MAMP

ポートフォリオ概要

・機能
  ログイン機能、カレンダー、ToDoList
・細かな機能
  ユーザー登録、ログイン、ログアウト
  カレンダーの一般的な機能
  日にち選択時にモーダルウィンドウ(予定入力欄)表示

■今後実装予定
入力した予定の保存、更新、削除機能
予定一覧に「成功」、「失敗」欄を追加し、選択により画面が変わる
その日の予定の進捗を0時前に表示させ○%以上成功したら、○%以下しか成功できなかったらとそれぞれ表示

詳細

■ターゲット
13歳以上をメインターゲット

■ターゲット選定理由
13歳になると中学生になります。中学生になれば、自分で予定を組んだりしていく事が多いと思います。
12歳未満は主に保護者が予定を管理していると考えています。

■開発した理由
現職で工程管理、マネジメント業務を行っており、毎日予定を立て、業務をしています。
その中で、その日に計画した全ての予定を終わらせ、毎日こなしていくことは大変だと感じています。
なので、少しでもモチベーションを上げれるように考え方を変え、ミッション風にアレンジしようと思い具現化する為に実装しました。

■工夫点

一般的なスケジュール管理をゲーム感覚でできるように付加価値を与えた点。
13歳以上をメインターゲットにしているので、全てにおいてシンプルに制作しています。
 
引き続きポートフォリオ制作がんばります!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】動的に生成した文字列を直接ファイル形式でレスポンスする方法。

自分用のメモとして残します。

文字列をダウンロードファイルとしてレスポンスを返す方法をメモ。
→つまりレスポンス用にわざわざファイルを保存しない。

■やり方

\Responseクラスでレスポンス用のオブジェクトを明示的に作成する。

$content = 'hoge,hoge,hoge';
$headers = [
    'Content-type'        => 'text/plain; charset=utf-8',
    'Content-Disposition' => 'attachment; filename="download.txt"',
];
$response = \Response::make($content, 200, $headers);

return $response;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPで書くWordPressループ処理の基本と、件数やカテゴリーなどを指定する方法

WordPressの更新システムを組み込んだwebサイトの作成、「記事一覧」「実績一覧」「メニュー・料金一覧」「よくある質問一覧」などなど、ループ処理で一覧表示をさせることが多いかと思います。
ループ処理の基本的な書き方と、カテゴリーや件数での条件を指定した書き方をまとめました

ループ処理の基本的な書き方

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

 <!-- 記事のループ処理 -->

<?php endwhile; ?>
<?php else : ?>

 <!-- 記事が無い場合 -->

<?php endif; ?>

ループ処理の中身の一例

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
        <span><?php the_time('Y/m/d'); ?></span>
    <?php endwhile; ?>
<?php else : ?>
    <p>記事がありません</p>
<?php endif; ?>

この書き方では以下のようになります

記事がある場合

  • タイトルをaタグで囲んで表示、リンクは投稿先へ
  • spanタグで日付を年/月/日で表示
  • この処理を記事がある分だけ繰り返す
  • ループ終わり

記事が無い場合

  • 「記事がありません」という文字列をpタグで囲んで表示
  • ループ終わり

更に最初に少し書き加えると、条件を指定した表示ができます。

カテゴリーを指定

'cat=○○'この部分に表示させたいカテゴリのIDを入れる

<?php query_posts('cat=1'); ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
 <!-- 記事のループ処理 -->
<?php endwhile; ?>
<?php else : ?>
 <!-- 記事が無い場合 -->
<?php endif; ?>

複数のカテゴリを指定する場合はカンマで区切る

<?php query_posts('cat=1,3,5'); ?>

指定のカテゴリを表示しない場合

<?php query_posts('cat=-1'); ?>

表示数を指定

'posts_per_page=〇〇'この部分に表示数を入れる

<?php query_posts('posts_per_page=10'); ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
 <!-- 記事のループ処理 -->
<?php endwhile; ?>
<?php else : ?>
 <!-- 記事が無い場合 -->
<?php endif; ?>

指定のカテゴリの表示数を指定

<?php query_posts('cat=1&posts_per_page=10'); ?>

まとめ

規模の小さいコーポレートサイトやブログの更新システムは、この書き方で十分まかなえるかと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】.envファイルの値を確認する方法。env関数の使い方と注意点。

Laravelで.envファイルに記述した値が反映されているのか確認する方法について。

envヘルパ関数

Laravelにデフォルトで用意されている関数。.envファイルの指定した値を呼び出せる。

env('環境変数名', 'デフォルト値')

  • 環境変数がnullの場合にデフォルト値が表示される。
  • デフォルト値はなくてもいい。

値がきちんと読み込まれているか確認するにはデフォルト値を設定しておく方がわかりやすい。

▼記述例

env('DB_CONNECTION')

env('DB_CONNECTION', 'default')


確認手順

実際にブラウザに表示してみる。

1. ビューの作成

rousources > views > env.blade.php

テストとして、DBに関する3つの環境変数を表示してみる。

env.blade.php
<p>{{ env('DB_CONNECTION', 'default')}}</p>
<p>{{ env('DB_HOST', 'default')}}</p>
<p>{{ env('DB_PORT', 'default') }}</p>



▼(補足)対象のデータ

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306

2. ルーティング

routes > web.php

web.php
//env
Route::get('env', function () {
    return view('env');
});

3. ブラウザに表示

ターミナル
#サーバー起動
php artisan serve

http://127.0.0.1:8000/env にアクセス

image.png

環境変数の値が読み込まれていることが確認できた。


表示されない場合の対処法

キャッシュが読み込まれてしまい、.envファイルが読み込まれない場合がある。

以下コマンドでキャッシュをクリアする。

$ php artisan config:clear

image.png

  ↓

ターミナル
$ php artisan config:clear
Configuration cache cleared!

  ↓

image.png


ローカル環境で実行してはいけないコマンド

php artisan config:cacheを実行すると、.envファイルを読み込みに行かなくなる。

すべての値が.envがきちんと記述されているのに、ブラウザの表示がnull(上記設定ではdefault)になる場合は、このコマンドが実行された可能性がある。

php artisan config:cacheとは?

本番環境用のコマンドで、すべての設定ファイルを一つにまとめることで高速化するためのコマンド。

設定が頻繁に変わる開発環境では推奨されていない。

また、実行すると、キャッシュが作成され、.envファイルを読み込みに行かなくなる点も注意が必要。

$ php artisan config:cache
Configuration cache cleared!

Laravel公式 設定キャッシュ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 配列が空かどうかを判定する

目的

  • PHPで配列が空かどうか判定する方法をメモ的にまとめる

情報

方法

  • empty()関数を用いて配列が空かどうかを判定する。empty()関数は空の場合trueを返す。
  • 「当該変数に配列が格納されており、かつ、その配列が空」であることをチェックしたいためempty()関数だけではなくis_array()関数も一緒に使用する。
  • 下記を実行すると変数$arrayには空の配列が格納されているため「Empty data」の文字列が出力される。

    <?php
    
    $array = [];
    
    if (is_array($array) && empty($array)) {
        echo 'Empty data';
    }
    

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

lcobucci/jwt 4系でZoom API用トークン作成 (Claimの日付系フォーマットを変える)

[PHP] Zoom APIを利用してミーティングを作成するで、Zoom APIを利用してミーティングを作成する方法が詳しく記載されていますが、lcobucci/jwtの4系ではZoom API用のJWTトークンの作成方法が変わっています。
4系でのトークン作成について簡単に説明します。

TL;DR

lcobucci/jwt4系は、デフォルトのClaimFormatterが日付系をマイクロ秒ありUnixタイムスタンプにフォーマットするので、Zoom APIが401を返してくる。日付をマイクロ秒なしUNIXタイムスタンプにフォーマットしてトークン作成することで正常にZoom APIにアクセスできる。

lobucci/jwtインストール

composer require lobucci/jwt

トークン作成

Configurationインスタンスを作る

3系ではBuilderを使ってトークン作成していましたが、4系ではまずConfigurationインスタンスを作成します。

use Lcobucci\JWT\Configuration;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key\InMemory;

$apiSecret = '[ZOOM API SECRET]';
$configuration = Configuration::forSymmetricSigner(
            new Sha256(), // 暗号化ハッシュ関数
            InMemory::plainText($apiSecret) // キー
        );

Zoomは、HMAC SHA256を利用しているので、ハッシュ関数には Lcobucci\JWT\Signer\Hmac\Sha256を、キーはZoom API管理画面から平文で取得できるのでLcobucci\JWT\Signer\Key\InMemory::plainText()でセットします。

Builderからトークン作成、そして失敗

トークン作成用のBuilderは$configuration->builder()で取得できるので、これを利用します。

※このコードでは動作しません!!!

$apiKey = '[ZOOM API KEY]';
$now = new \DateTimeImmutable();
$token = $configuration->builder()
    ->issuedBy($apiKey)
    ->issuedAt($now)
    ->expiresAt($now->modify('+1 hour'))
    ->getToken($configuration->signer(), $configuration->signingKey());

作成日時や有効期限といった日付系はUNIXタイムからDateTimeImmutable型に変更になっています。
Builderのそれぞれのメソッドに渡す値につぃては以下の通りです。

メソッド名 引数
issuedBy APIキー
issuedAt トークン作成日
expiredAt 有効期限

値をセットして、getToken($configuration->signer(), $configuration->signingKey())でトークンを作成しますが、このトークンではZoom APIにアクセスしても401 Unauthorizedが返ってきます。

作成したトークンでAPIにアクセスできない原因は日付系フォーマット

4系のBuilderで生成されたトークンのClaim部分とZoom APIの管理画面から生成した値を比べてみました。

Zoom管理画面から生成したClaim部分
{
  "aud": null,
  "iss": "APIキー",
  "exp": 1610972172,
  "iat": 1610966772
}
4系lcobucci/jwtで生成したClaim部分
{
  "iss": "APIキー",
  "iat": "1611019091.181495",
  "exp": "1611022691.181495"
}

4系では、日付系のフォーマットにマイクロ秒が付随しているのに対し、Zoom管理画面から生成したものにはマイクロ秒が付随していません。(audはなくても問題なし)

lcobucci/jwtのコードを追ってみると...

ChainedFormatter.php
public static function default(): self
    {
        return new self(new UnifyAudience(), new MicrosecondBasedDateConversion()); // <- ここ
    }
MicrosecondBasedDateConversion
    private function convertDate(DateTimeImmutable $date)
    {
        $seconds      = $date->format('U');
        $microseconds = $date->format('u');

        if ((int) $microseconds === 0) {
            return (int) $seconds;
        }

        return $seconds . '.' . $microseconds; // <- ここ
    }

というようになっています。lcobucci/jwtではLcobucci\JWT\ClaimsFormatteインターフェイスを実装したフォーマッタークラスがあり、これを利用してClaimをフォーマットしていますが、デフォルトでは日付はマイクロ秒つきのUnixタイムスタンプになるフォーマッターが使われてしまいます。これが原因でした。

日付をマイクロ秒なしUNIXタイムスタンプにフォーマットしてトークン作成する

マイクロ秒なしUNIXタイムスタンプ用のフォーマッターを作る

まず、マイクロ秒なしにするためには独自のフォーマッターを作ります。

UnixTimestampFormatter.php
<?php

use Lcobucci\JWT\ClaimsFormatter;
use Lcobucci\JWT\Token\RegisteredClaims;

class UnixTimestampFormatter implements ClaimsFormatter
{
    /** @inheritdoc  */
    public function formatClaims(array $claims): array
    {
        foreach (RegisteredClaims::DATE_CLAIMS as $claim) {
            if (! array_key_exists($claim, $claims)) {
                continue;
            }

            assert($claims[$claim] instanceof \DateTimeImmutable);
            $claims[$claim] = $claims[$claim]->getTimestamp();
        }

        return $claims;
    }
}

独自フォーマッターを使ってトークンを作成する

作成したフォーマッターは$configuration->builder()に引数で渡せます。独自フォーマッターを渡せば、あとは前述の通りでZoom APIにアクセスすることができるトークンを作成できます。Configurationインスタンス作成を含めた、一連のコードは以下の通りです。

use Lcobucci\JWT\Configuration;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key\InMemory;
use UnixTimestampFormatter;

$apiKey = '[ZOOM API KEY]';
$apiSecret = '[ZOOM API SECRET]';
$now = new \DateTimeImmutable();

// Configurationインスタンス作成
$configuration = Configuration::forSymmetricSigner(
            new Sha256(), // 暗号化ハッシュ関数
            InMemory::plainText($apiSecret) // キー
        );

// トークン作成
$token = $configuration->builder(new UnixTimestampFormatter())
    ->issuedBy($apiKey)
    ->issuedAt($now)
    ->expiresAt($now->modify('+1 hour'))
    ->getToken($configuration->signer(), $configuration->signingKey());

トークン作成後は、[PHP] Zoom APIを利用してミーティングを作成すると同様です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Xdebugをextensionで設定してPHPブレイクポイントが動作しなかった件

IIS・PHP環境を作り、その環境でローカルでデバッグしようとしたらブレイクポイントが動作せず、コードのエラーがあった場合はデバッガーが動作するという状態になり、散々あれこれ悩んで調べたりした結果、php.iniのDLL読み込みの記述に誤りがあっただけでした。

間違い。

extension=php_xdebug-2.9.8-7.3-vc15-nts-x86_64.dll

zend_extensionで指定する。

zend_extension=php_xdebug-2.9.8-7.3-vc15-nts-x86_64.dll

phpinfoでXdebug表示されてたし、エラー時に止まったのでphp.iniは問題ないだろうと思って、pathMappings?とか色々いぢってました。(/・ω・)/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel/UIでの簡単ログイン機能の実装

準備

Laravel/uiをインストールしてとりあえず基本のログイン機能が使えることを確認しておく。
※php8では使えません。

前提

セキリュティへの考慮はしていません。
ポートフォリオを作る際にできたらいいなと思ったので書いています。
コードを書くのには慣れていないので、あくまで参考程度でお願いします。

実装

Laravel/UIの処理が全部はわかりませんが、インストールの際にviews/authlogin.blade.phpが作成されています。
この中を見てみると

login.blade.php
<form action="{{ route('login') }}" method="POST">
...
</form>

と書かれており、このrouteに渡してあげればいいみたいです。

login.blade.php
<form method="POST" action="{{ route('login') }}">
    @csrf //この記述がないとセッションエラーが起きる
    <button type="submit" >{{ __('Guest Login') }}</button>
    <input type="hidden" name="email" value="...">
    <input type="hidden" name="password" value="...">
</form>
//valueには自分が作成したいユーザの値をいれる。

次にlogin.blade.phpの表示を命令している部分が、少しややこしいですが、vendor/laravel/ui/auth-backend/AuthenicatesUsers.php内にありました。

AuthenicatesUsers.php
public function showLoginForm()
    {   
        return view('auth.login', compact('test'));
    }
//ここが該当部分です。

そこでDBにゲストで使いたいユーザが登録されている場合にtrueを返し簡単ログインできるようにしたいと思います。

AuthenicatesUsers.php
public function showLoginForm()
    {
        if(User::where('email','LIKE', '...')->get() != '[]'){
            $test = true;
        }else{
            $test = false;
        }
//if文で ... != '[]'としているのはsqlを発行した際、見つからない場合の返り値が'[]'のため

        return view('auth.login', compact('test'));
    }

そしてlogin.blade.phpで$testを読み取ればできる。

login.blade.php
@if($test == true)
  <form method="POST" action="{{ route('login') }}">
    @csrf
    <button type="submit" class="btn btn-primary">{{ __('Guest Login') }}</button>
    <input type="hidden" name="email" value="test@test.com">
    <input type="hidden" name="password" value="password">
  </form>
@endif

とりあえずこれで簡単ログインができる。
しかし、最初からゲストユーザはDBに無くエラーが出るので、DBに無い場合はregisterに渡して登録させればいい。

login.blade.php
@if($test == true)
  <form method="POST" action="{{ route('login') }}">
    @csrf
    <button type="submit" class="btn btn-primary">{{ __('Guest Login') }}</button>
    <input type="hidden" name="email" value="test@test.com">
    <input type="hidden" name="password" value="password">
  </form>
@else
  <form method="POST" action="{{ route('register') }}">
    @csrf
    <button type="submit" class="btn btn-primary">{{ __('Guest Login') }}</button>
    <input type="hidden" name="name" value="test">
    <input type="hidden" name="email" value="test@test.com">
    <input type="hidden" name="password" value="password">
    <input type="hidden" name="password_confirmation" value="password">
  </form>

@endif 

これで簡単ログインが実装できた。

注意

本番では100%使いません。
ポートフォリオで見てもらう人の負担を減らすみたいな用途くらいかな?
再度、コードを書くのには慣れていないためよくない書き方をしているかもしれません。もしこうした方がいいよ!などありましたら是非教えていただきたいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む