20201118のPHPに関する記事は13件です。

PHP8 RC、Composer2、Xdebug3 RCでLaravel8.xを動かす

概要

  • PHP8.0がRCになっていたから諸々新し目のものを使って環境構築してみるよ
  • 環境自体はDockerで構築していくよ
  • 全ての環境に対応出来るわけじゃないと思うけど参考になれば嬉しいよ
  • PHP8.0もXdebug3もRCなので現状は実運用しないように、とはいえ開発していくのには見ていくことも必要だよね

最終的な環境

$ docker-compose exec app php --version
PHP 8.0.0RC4 (cli) (built: Nov 12 2020 20:17:20) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.0RC4, Copyright (c), by Zend Technologies
    with Xdebug v3.0.0RC1, Copyright (c) 2002-2020, by Derick Rethans

$ docker-compose exec app composer --version
Composer version 2.0.7 2020-11-13 17:31:06

成果物

GitHubにあげてあるので参考にどうぞ
Dockerfileの最終状態もリポジトリにあげてあります

https://github.com/hrs-o/PHP8.0RC-Laravel

PHP7.4 時代のDockerfile

  • この7.4時代のDockerfileを8.0RC用に書き直していくのが主目的
FROM php:7.4-fpm-alpine

RUN apk upgrade --update && \
    apk --no-cache add autoconf build-base git libxml2-dev libzip-dev oniguruma-dev openssh rsync

RUN docker-php-ext-install -j$(nproc) zip pdo_mysql mysqli
RUN docker-php-ext-install -j$(nproc) bcmath fileinfo ctype json mbstring tokenizer xml
RUN docker-php-ext-install -j$(nproc) opcache

RUN pecl install apcu \
    && docker-php-ext-enable apcu

RUN pecl install xdebug \
    && docker-php-ext-enable xdebug

RUN pecl install redis  \
    && docker-php-ext-enable redis

RUN curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer \
    && composer self-update

RUN composer global require hirak/prestissimo
RUN composer global require squizlabs/php_codesniffer
RUN composer global require friendsofphp/php-cs-fixer
RUN composer global require phpmd/phpmd
RUN chmod 777 /var/log/

ENV PATH "/root/.composer/vendor/bin:$PATH"

試したこと

Imageを8.0-rc-fpm-alpineに変更

当然というか流石にbuild通らず

FriendsOfPHP/pickleの利用

  • releaseから取得したpickleだとXdebug-betaのVERSIONがうまく取得出来ずエラーになってしまう
  • masteをビルドしてね、とのことだがxdebugのbetaのVERSIONがパースエラーになるため利用出来ない
  • そのためForkして自リポジトリで修正した状態で利用することに(PR自体は送信済み、受け入れられると嬉しい)
    • 現状pickleはcomposer1でないと利用出来ないのでComposer1のイメージでビルドしてからPHP8.0の方にCOPY
  • peclでインストールしていた部分をpickleに変更することでapcu、xdebug-beta、redisのインストールができた
FROM composer:1 as pickle

RUN cd /tmp \
    && git clone https://github.com/hrs-o/pickle.git \
    && cd pickle \
    && git checkout update/dumper-stability \
    && composer install --no-dev --optimize-autoloader \
    && php -d phar.readonly=0 box.phar build

FROM php:8.0-rc-fpm-alpine

COPY --from=pickle /tmp/pickle/pickle.phar /usr/local/bin/pickle

hirak/prestissimoがインストールできない

  • hirak/prestissimoは現状Composer2に未対応のようなので一旦諦め。
    • というかComposer2は高速だからprestissimo使わなくていいよね!ってリポジトリに記載有り。

ということでここまでで一応Dockerfileの修正は終わったのでLaravelのインストールと動作確認をしていく。

Laravelのインストール

$ mkdir src
$ docker-compose exec app composer create-project --prefer-dist laravel/laravel . "8.*"

.envの設定

DB接続とRedisへの接続を試すので設定しておく

.env
~~
DB_CONNECTION=mysql
DB_HOST=php8-mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root

~~

REDIS_HOST=php8-redis
REDIS_PASSWORD=null
REDIS_PORT=6379

~~

migrate実行

$ docker-compose exec app php artisan migrate

View・Contoroller・Roterを定義し実行

内容はコミットを参照してください
https://github.com/hrs-o/PHP8.0RC-Laravel/commit/69e1aae936ff77b6c165c68f5f39576301c697f8

ひとまずDB接続、Redisへの接続も上手く行っていそう

IDEからリモートデバッグ出来るか確認

今回はIntelliJ Idea(PHPStorm)を対象とする

Xdebugの設定が変わっているので修正

https://3.xdebug.org/docs/upgrade_guide

php.ini
[xdebug]
- xdebug.remote_enable = 1
+ xdebug.mode = debug
- xdebug.remote_autostart = 1
+ xdebug.start_with_request = yes
- xdebug.remote_host = host.docker.internal
+ xdebug.client_host = host.docker.internal
- xdebug.remote_port = 9000
+ xdebug.client_port = 9003
xdebug.remote_log = /tmp/xdebug.log
xdebug.idekey = PHP8

XDEBUGのPort設定

  • Languages & Frameworks > PHP > Debug 内のXdebug portを 9003 に変更

PHP Remote Debugの設定

  • Edit Configurations を開く
  • 左上の+ を押して PHP Remote Debug を選択
  • Filter debug connection by IDE keyにチェックを入れる
  • IDE keyに PHP8を入力

image.png

  • Server の横にある .. を押す
  • Serversダイアログ左上にある + を押してサーバーを追加
  • Hostに localhostを設定
  • Portに 58080 を設定
  • Use path mappings にチェック
  • Project filesのsrcに対応するAbsolute path on the serverに /src を記述してOK

image.png

リモートデバッグ実行

  • コードの適当なところにブレークポイントを設定
  • 作成したPHP Remote Debugをデバッグ実行
  • ブレークポイントを設定したコードを通る処理の実行

今回、自分の環境ではステップ実行出来るのは確認済み

まとめ

  • 書いてみると単純なことばかりだけどpickle周りはとてもてこずった
  • というかほとんどpickleのソースリーディングと修正に時間かった
  • 実際利用する際にはライブラリがcomposer2に対応しておらず使えないこともまだ多そうなので何ともだがPHP8に向けて触っていく位の構築はできたんじゃないかなと

参考

【PHP8.0】PHP8.0の新機能
【PHP8】Docker で PECL の YAML 関数(YAML パーサー)をインストールして使う

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

PHPで管理画面を作る①

作成開始から3日目

作成手順

①作りたいテーマ大まかに決める
②HTML、CSSで画面骨組みつくりながら、画面遷移図書く
③DB設計
④実装
⑤テスト
⑥デプロイ

進捗

①作りたいテーマ大まかに決める   完了
②HTML、CSSで画面骨組みつくりながら、画面遷移図書く   完了
③DB設計  ←Now!
④実装
⑤テスト
⑥デプロイ

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

ECCUBE4系の、受注一覧で商品コードで検索する。

自分用のメモ程度です。
ECCUBE4系を利用しているのですが、商品コードで検索したいとの要望があったので実施。

フォームを増やしたりするのは面倒なので、現状の詳細検索→購入商品名を商品コードにも対応させる方法で進めました。

変更箇所は1箇所のみで、
/src/Eccube/Repository/OrderRepository.php
に  OR oi.product_code LIKE :buy_product_nameを追加すれば完了です。

// buy_product_name
if (isset($searchData['buy_product_name']) && StringUtil::isNotBlank($searchData['buy_product_name'])) {
    $qb
        ->andWhere('oi.product_name LIKE :buy_product_name OR oi.product_code LIKE :buy_product_name')//ここに追加
        ->setParameter('buy_product_name', '%'.$searchData['buy_product_name'].'%');
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel基礎】複数のテーブルの結びつけ【リレーション】

概要

Laravel学習で自分がつまずいた部分を備忘録としてまとめています。
今回は複数のテーブルの結びつけに関する記事です。

この記事でわかる事

テーブルの結合方法(リレーション)
①テーブルの主従関係
②テーブルの設定
③モデルの設定

以下、記事内容です!

テーブルの主従関係

今回はPostテーブルとCommentsテーブルを用意して、結合します。

こうした複数テーブルの結合をリレーションと呼びます。
そして、リレーションにおいて重要なのが主従関係です。
一方のテーブルが主テーブル・もう一方が従テーブルとなり、
この主従関係によって書くコードが変わってきます。

今回の場合だと、Post(記事)に対してComments(コメント)がつくので、
Postテーブルが主、Commentsテーブルが従という関係になります。
ブログのイメージですね。記事がまず先にあって、それに対してコメントがつく。
Twitterだと、まずユーザーがいて、そこから投稿が生まれる。
それが無いと成り立たない側のテーブルが主テーブルになります。

従テーブルは主テーブルのIDを保管するフィールドを用意する必要があります。
このフィールドを外部キーと呼びます。

これを踏まえて、テーブルを設定していきます。

テーブルの設定

今回はPostテーブルとCommentsテーブルを用意しました。
■Postテーブル

posts_table.php
   public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

まずは主テーブルになるPostsテーブル。
こちらは通常通りですね。ID,title,body,投稿日時を設定しました。

■Commentsテーブル

comments_table.php
     public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->increments('id')          
         ①$table->integer('post_id'); 
            $table->string('body');
            $table->timestamps();
          ②$table->foreign('post_id')
                  ->references('id')
                  ->on('posts')
                  ->onDelete('cascade');
        });
    }

従テーブルになるCommentsテーブルですが、
従テーブルでは下記2つの設定をする必要があります。

①外部キーの作成
主テーブルのIDを保管するためのフィールドを作成しておきます。
今回はPostテーブルのidを保管するので、'post_id'フィールドとします。

②外部キーの参照先を設定
記事が消された際、紐づくコメントも消されるように設定しないといけません。
ここでは外部キーの参照先を指定し、参照先のデータが消えたら、このテーブルのデータも一緒に消えるよう指示しています。
各コードの内容は下記のような感じですね。
// foreign(フィールド) = このフィールドは下記を参照します
// references(フィールド) = 参照先のフィールド
// on(テーブル名)      = 参照先のテーブル
// onDelete('cascade'); = 上記が削除されたら該当データも一緒に削除

以上がテーブルの設定です。

モデル

次に、モデルの更新です。
まずは主テーブルとなるPostモデルを更新します。
■Postモデル(主)

Post.php
    class Post extends Model
{
    protected $fillable = ['title', 'body'];

    // ①Commentモデルとの紐付け
    public function comments() {
        return $this->hasMany('App\Comment');
    }
}

①commentテーブルとリンクさせるためのcomments関数を作成します。
主テーブルでは、
$this -> hasMany(参照先モデル)とする事で
従テーブルのデータを引っ張ることが可能になります。

■Commentモデル(従)
次にCommentモデルを更新します。

Comment.php
    class Comment extends Model
{
    //
    protected $fillable = ['body'];

    // ②Postモデルへの紐付け
    public function post() {
    return $this->belongsTo('App\Post');
    }

}

②Postテーブルとリンクさせるためのpost関数を作成します。
従テーブルでは、
$this -> belingsTo(参照先モデル)とする事で
従テーブルのデータを引っ張ることが可能になります。

belongToは所属すると言う意味なので、主テーブルに従ずると言う感じですね。

リレーションの確認

ここまでで、テーブルが結合できたかターミナルで確認します。
まずはPostテーブル→Commentsテーブルの確認。
ここでは(①) App\Post::find(2)->comments;によって、
PostテーブルのID:2のデータを呼び出し、
紐づくCommentsテーブルのデータを呼び出しています。

ターミナル
>>>
(①) App\Post::find(2)->comments;

       App\Comment {#3962
         id: "3",
         post_id: "2",
         body: "test",
         created_at: "2020-11-18 17:48:51",
         updated_at: "2020-11-18 17:48:51",
       },
     ],
   }
>>> 

こうですね。紐づくコメントの中身が出てきたのでOKです。

次にCommentsテーブル→Postテーブルへのリレーションを確認します。

ターミナル
>>> App\Comment::find(3)->post;
=> App\Post {#3963
     id: "2",
     title: "title 2",
     body: "body 2",
     created_at: "2020-11-18 17:55:50",
     updated_at: "2020-11-18 17:55:50",
   }
>>> 

こちらも出てきたのでOKです。

まとめ

以上、Laravelにおけるテーブルのリレーションでした。
初めは、hasMany( )とbelongTo( )の違いがよくわからなかったのですが、
主従関係と言う概念を理解すると、違いが腹落ちしました。

最後まで読んで頂きありがとうございました!

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

WindowsのPHPからSQL Serverに接続する方法

目的

普段LAMPP環境でDBはMySQLばかり使っていたのですが、とある案件でDBにSQL Serverを選択することに。
Windows(XAMPP)上のPHP(Laravel)からSQL Severに接続するにあたり、必要なドライバー等を調べたので手順をまとめます。

手順

手順は以下の通りです。

環境調査

まずは自分のPHP環境をphpinfo()で下調べします。

確認するのは以下の3つ。

  • PHP Version
  • Architecture
  • Thred Safety

phpinfo.png

ドライバーダウンロード

Microsftの公式サイトからMicrosoft SQL Server 用 Drivers for PHPをダウンロードします。

SQL server 2019用

https://docs.microsoft.com/ja-jp/sql/connect/php/download-drivers-php-sql-server?view=sql-server-ver15

SQL server 2017用

https://docs.microsoft.com/ja-jp/sql/connect/php/download-drivers-php-sql-server?view=sql-server-2017

SQL server 2016用

https://docs.microsoft.com/ja-jp/sql/connect/php/download-drivers-php-sql-server?view=sql-server-2016

ドライバーの配置

ダウンロードしたexeファイルを実行します。
実行するとファイルが展開されるので、そのファイルの中から環境にあったdllファイルをPHPインストール先のphp\ext\にコピーします。
【例】XAMMPの場合は、c:\xampp\php\ext

dllファイルは以下のようなファイル名になっているため、最初に調べた環境に合わせたものを選んでください。
php_pdo_sqlsrv_[PHP Version]_[Architecture]_[Thred Safety].dll
PHP Version : PHP7.3なら73
Architecture : enabledならts、disabledならnts
Thred Safety : x32もしくはx64

php.iniの修正

php.iniファイルにextensionの記述を追記します。
指定するファイルは先ほど配置したdllファイルです。
以下はスクリーンショットで示した環境の場合の記述例です。

php.ini
extension=php_pdo_sqlsrv_73_ts_x64.dll

確認

Apacheを再起動後、再度phpinfo()を表示して反映されているか確認します。
pdo_sqlsrvが追加されていれば設定完了。
pdo_sqlsrv.png

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

CakePHP 複数レコードを一括保存するsaveAllの使い方

ビュー

form.ctp
echo $this->Form->create ( 'User', array (
    'type' => 'post',//POSTとGETの設定
    'controller' => 'users',//コントローラーの設定
    'action' => 'edit',//アクションの設定
) );

echo $this->Form->input ( 'User.0.name.');
echo $this->Form->input ( 'User.0.age');

echo $this->Form->input ( 'User.1.name');
echo $this->Form->input ( 'User.1.age');


echo $this->Form->input ( 'User.2.name');
echo $this->Form->input ( 'User.2.age');

echo $this->Form->end('送信');

$this->request->data;の中身

$data = array(
    'User' => array(
        0 => array(
            'name' => '太郎',
            'age' => 10
        ),
        1 => array(
            'name' => '花子',
            'age' => 8
        ),
        2 => array(
            'name' => '二郎',
            'age' => 5
        ),
    )
);

$data["User"]というように$dataの後ろにモデル名を指定するところがポイントです。

$this->User->saveAll($data["User"]);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

404エラーを返すWordPress投稿を修正する方法

WordPressは強力なCMSですが、わずかな調整によりWebサイトにアクセスできなくなる場合があります。ただし、WordPressの問題の解決策を見つけるのは非常に簡単です。WordPressユーザーが直面する最も一般的な問題のいくつかあります。例えば内部サーバーエラーまたはデータベース接続の確立エラーなどです。そして、ほとんどのWordPressユーザーがいつか直面するもう1つの一般的な問題は、WordPressの投稿が404エラーを返すことです。この記事では、404エラーを返すWordPressの投稿を修正する方法を紹介します。


通常、ユーザーはブログのメインページであるWordPress管理エリアにアクセスできますが、単一の投稿にアクセスすると、404 Notfoundエラーが発生する場合があります。そういった場合でもほとんどの場合、慌てる必要はありません。そういった時の原因は主に2つです。

①htaccessファイルが削除された
②書き換えルールに問題が発生した

そこで行うべきアクションはパーマリンク設定を修正することです

「設定」⇨「パーマリンク」に移動し、「設定を保存」をする。ただこれだけ。

これにより、パーマリンク設定が更新され、書き換えルールがフラッシュされます。ほとんどの場合、このソリューションはWordPressの投稿404エラーを修正します。ただし、それが機能しない場合は、.htaccessファイルを手動で更新する必要があります。

FTPを使用してサーバーにログインし、/ wp-content /や/ wp-includes /などのフォルダーと同じ場所にある.htaccessファイルを変更します。最も簡単な方法は、アクセス許可を666に変更して、ファイルを一時的に書き込み可能にすることです。次に、元の解決策を繰り返します。権限を660に戻すことを忘れないでください。次のコードを.htaccessファイルに手動で追加することもできます。

BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

ローカルサーバーの修正

多くの場合、デザイナーや開発者は、テスト目的でローカルサーバーを使用してコンピューターにWordPressをインストールします。綺麗なパーマリンクを使用したい場合は、MAMP、WAMP、またはXXAMPのApache構成でrewrite_moduleを有効にする必要があります。

以上が404エラーに対しての処理になります。もしよろしかったらコメント待っています。

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

PHP PSRについて(2020年版)

アクシス Advent Calendar 2020 9日目担当のtuuuuuukenです!

普段の業務ではPHPを書くことが多いのですが、PSR-4やPSR-2など個別の規約については知っているものの
PSRそのものや他の規約についてはあまり知らなかったので調べてみました。

PSRとは

PSR(PHP Standards Recommendations, PHP標準勧告)とは、PHP-FIG(The PHP Framework Interop Group, PHPフレームワーク相互運用グループ)が策定しているPHPの規約です。
PSRを定めることによってフレームワークやライブラリ間での相互連携を可能とし、PHP(とそのエコスシステム)を発展させるために存在しています。

その一覧はhttps://www.php-fig.org/psr/ 及びhttps://github.com/php-fig/fig-standards で見ることができます。

また、PHP標準勧告なんて名前がついているので必ず守るべき規約のようにも見えますが
PHP-FIG(つまり公式団体ではない)が策定した規約ですので必ず守る必要はありません。

PSRの構成

2020年12月現在、承認されたPSRは13個あり、4つの分類で構成されています。

  1. オートローディング
  2. インターフェース
  3. HTTP
  4. コーディングスタイル

オートローディング

ファイルパスからクラスを自動ロードするための仕様について定められています。
現状はPSR-4の1つのみで、PSR-0については非推奨となっています。

PSR-4: Autoloading Standard

自動ロードのためのPHPの名前空間(namespace)及びクラス名の規約について定義されています。
このようなフォーマットになっています。\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>

インターフェース

フレームワークで提供されることが多い機能(HTTPを除く)についてのインターフェース仕様について定められています。

PSR-3: Logger Interface

ロガーに関するInterfaceについて定められたPSR。
debug, info, noticeなど8つのログ出力メソッドや、それらのログレベルを受け取るlogメソッドなどについて定義されています。
有名なライブラリだとMonologなどが実装していますね。

PSR-6: Caching Interface

itemの有効期限やキーのフォーマット、サポートすべきデータ型などについて定義されています。

PSR-11: Container Interface

DIコンテナーの標準化について定義されています。
インターフェースはとてもシンプルでget及びhasの2つが定義されています。
また、面白いのが推奨される使用方法についても言及している点です。

オブジェクトが独自の依存関係を取得できるように、ユーザーはコンテナをオブジェクトに渡すべきではありません。これは、コンテナがサービスロケーターとして使用されることを意味 します。これは一般的に推奨されないパターンです。

気になる方は以下を見てみてください。
https://www.php-fig.org/psr/psr-11/#13-recommended-usage
https://www.php-fig.org/psr/psr-11/meta/#4-recommended-usage-container-psr-and-the-service-locator

PSR-13: Hypermedia Links

ハイパーメディアリンクについて定義されているらしいです。が、いまいち使い道がわかりませんでした。
phalconがPSR-13を実装しているようでしたのでそちらのドキュメントも読んでみましたがよくわからず...(これを気にphalcon初めてみるのも良さそうです)
https://docs.phalcon.io/4.0/ja-jp/html-link#html-link-psr-13

PSR-14: Event Dispatcher

Observerパターンの仕組みを提供するためのインターフェースなどについて定義されています。

PSR-16: Simple Cache

キャッシュライブラリ向けのインターフェースなどについて定義されています。
PSR-6もキャッシュについて定義されていますが、PSR-16の方がよりシンプルみたいです。

PSR-6はすでにこの問題を解決していますが、最も単純なユースケースで必要とされるものに対してはかなり形式的で冗長な方法で解決しています。このより単純なアプローチは、一般的なケースのための標準化された合理化されたインターフェースを構築することを目的としています。PSR-6から独立していますが、PSR-6との互換性をできるだけ簡単にするように設計されています。

HTTP

PHPでHTTPを扱う上でよく利用する、HTTPクライアントやリクエストハンドラ、ミドルウェアなどについて定められています。

PSR-7: HTTP message interfaces

HTTPのメッセージオブジェクト(HTTPリクエスト及びHTTPレスポンス)について定義されています。

PSR-15: HTTP Server Request Handlers

リクエストハンドラー(MVCで言う所のC)について定義されています。
PSR-7で定義されたHTTPリクエストを引数に受け取り、HTTPレスポンスを返すインターフェースについて定義されています。

PSR-17: HTTP Factories

PSR-7で定義されたリクエスト及びレスポンスを生成するためのファクトリに必要なインターフェースについて定義されています。

PSR-18: HTTP Client

HTTPクライアントについての定義です。
簡単に言うとPSR-15の逆(つまりリクエストを送る側について)ですね。

コーディングスタイル

コーディング規約について定義されています。PSR-2については上位互換のPSR-12が承認されたため非推奨となっています。

PSR-1: Basic Coding Standard

最低限守るべきコーディング規約について定義されています。
PHPタグ(<?phpor<?=)についてやファイルエンコード(BOM無しUTF-8)などなど。

PSR-12: Extended Coding Style

細かいコーディング規約及びコーディングスタイルについて定義されています。
use文の順番(クラス、関数、定数の順)やextendsとimplementsは同じ行に1行で書きましょう、などなど。
PSR-2と比べるとPHP7で追加された引数と戻り値の型宣言の規約などが追加されています。

まとめ

使わないPSRについはあまり知る機会がないのでこの機会に知ることができて楽しかったです。
PHP8がリリースされたので新たなPSRも投稿されそうですね。

明日はmichidaさんの「スキャフォールドツール作った話」です!
それではみなさん良いPHPライフを!


おまけ

PSR一覧

ACCEPTED(承認済み)

番号 タイトル リンク
1 Basic Coding Standard https://www.php-fig.org/psr/psr-1/
3 Logger Interface https://www.php-fig.org/psr/psr-3/
4 Autoloading Standard https://www.php-fig.org/psr/psr-4/
6 Caching Interface https://www.php-fig.org/psr/psr-6/
7 HTTP Message Interface https://www.php-fig.org/psr/psr-7/
11 Container Interface https://www.php-fig.org/psr/psr-11/
12 Extended Coding Style Guide https://www.php-fig.org/psr/psr-12/
13 Hypermedia Links https://www.php-fig.org/psr/psr-13/
14 Event Dispatcher https://www.php-fig.org/psr/psr-14/
15 HTTP Handlers https://www.php-fig.org/psr/psr-15
16 Simple Cache https://www.php-fig.org/psr/psr-16
17 HTTP Factories https://www.php-fig.org/psr/psr-17
18 HTTP Client https://www.php-fig.org/psr/psr-18

DRAFT(草案)

番号 タイトル リンク
5 PHPDoc Standard https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc.md
19 PHPDoc tags https://github.com/php-fig/fig-standards/blob/master/proposed/phpdoc-tags.md

ABANDONED(放棄)

番号 タイトル リンク
8 Huggable Interface https://github.com/php-fig/fig-standards/blob/master/proposed/psr-8-hug/
9 Security Advisories https://github.com/php-fig/fig-standards/blob/master/proposed/security-disclosure-publication.md
10 Security Reporting Process https://github.com/php-fig/fig-standards/blob/master/proposed/security-reporting-process.md

DEPRECATED(非推奨)

番号 タイトル リンク
0 Autoloading Standard https://www.php-fig.org/psr/psr-0
2 Coding Style Guide https://www.php-fig.org/psr/psr-2
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

炎上している件とは関係ないけどforとforeachの違いをまとめてみた

前回の記事 → 転生できないからVimで2つのファイルの差分を確認してみた

ほんと炎上とは何も関係ないです←

forとforeachって何が違ってどう使うのかややこしくなった時期が
過去あったなぁと思ったのでまとめました
因みに個人的な好みとしてforeachの方が使うことが多いです^ - ^

for

公式 → https://www.php.net/manual/ja/control-structures.for.php

for ($i = 1; $i <= 10; $i++) {
    echo $i;
}

基本的な使い方は上記の通りで
$iが1からカウント?スタートして10になるまで{}の中の処理を繰り返します。
自分で繰り返す回数を指定出来る様なイメージで解釈しています。

foreach

公式 → https://www.php.net/manual/ja/control-structures.foreach.php

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr は array(2, 4, 6, 8) となります

foreachは配列の中の要素やオブジェクトなど
要するに配列の中に入るものであればその配列の数だけ{}の中の処理を
繰り返していきます。
個人的にはこれが工夫して使えると
俺ってプログラマーじゃね?って勘違いできるので是非とも使いこなしてみてください。

forとforeachの違い

比べてみて大きな違いは数字の値分ループするのか
配列の数だけループするのかといった違いが大きいでしょうか

どういうときに使うの?と問われると
内容次第ですが多分どちらも使おうと思えば使えるのかなと思います。
これまでの経験の中で言わせてもらうと
forやforeachの中で変にifでネストしまくったコードは
読みづらいなぁと思うので僕はそんなコードを書かない様に意識をしています。
全く使わないことは無理なので適度な加減が必要ですね!

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

YouTube Data API v3 クォータ制限について

プログラミング初心者が自身で作りたいwebページの作成中に
疑問に思ったこと、問題解決したことを書いていきます。
間違っている点も多々あると思います。

突然、YouTube Data API v3 で取得していた動画情報が取得できなくなってしまった

YouTubeの動画URLを入力すればカテゴリ別に仕分けしてDBに登録し、リスト形式で表示するというwebアプリを作った。
動画情報をYouTube Data API v3を用いてリスト形式で表示させるというものだったが
突然動画情報が取得できなくなってしまった。

1.原因の調査

原因を調査したところ、GoogleのAPIでは1日に使用できる「クォータ(Queries)(?)」の制限があるとのこと。

コンソール

こちらにアクセスしたところ確かにいっぱいだった・・・
(連日上限まで気づかずに使っていたみたい・・・)

スクリーンショット 2020-11-18 5.27.18.png

1日のクォータ数の上限は10,000しかないみたい・・・
上限の引き上げもGoogle側に申請できるみたいだったが、英語での申請とのことで敷居が高い・・・
ならば自身のコードの見直しをしてみた。

2.コードの見直し

自身のwebアプリは
1.youtube動画のURLをデータベースに保存

2.データベースに保存されたURLをもとに動画情報取得(サムネイル、投稿者、タイトルなど)

3.カテゴリ別に取得した情報を表示させる
といったものだ。
この「2」の箇所でAPIでの取得を行っていることが原因でクォータの上限に簡単に達してしまう模様。
これでは公開したらまともに動作しなくなってしまう・・・

3.コードの改善

コードというより最早設計の問題だった。
APIでの動画情報取得をできるだけ少なくするためにデータベースの保存時のみ動画情報取得するように設計し直した。
1.youtube動画のURLから動画情報(サムネイル、投稿者、タイトルなど)を取得し、データベースに保存

2.データベースに登録された動画情報を動画URLごとに表示させる
これで、動画リストを開くたびにAPIが使用されることがなく、クォータの使用量もかなり余裕ができた。

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

YouTube Data API v3 クォータ制限について その1

プログラミング初心者が自身で作りたいwebページの作成中に
疑問に思ったこと、問題解決したことを書いていきます。
間違っている点も多々あると思います。

突然、YouTube Data API v3 で取得していた動画情報が取得できなくなってしまった

YouTubeの動画URLを入力すればカテゴリ別に仕分けしてDBに登録し、リスト形式で表示するというwebアプリを作った。
動画情報をYouTube Data API v3を用いてリスト形式で表示させるというものだったが
突然動画情報が取得できなくなってしまった。

1.原因の調査

原因を調査したところ、GoogleのAPIでは1日に使用できる「クォータ(Queries)(?)」の制限があるとのこと。

コンソール

こちらにアクセスしたところ確かにいっぱいだった・・・
(連日上限まで気づかずに使っていたみたい・・・)

スクリーンショット 2020-11-18 5.27.18.png

1日のクォータ数の上限は10,000しかないみたい・・・
上限の引き上げもGoogle側に申請できるみたいだったが、英語での申請とのことで敷居が高い・・・
ならば自身のコードの見直しをしてみた。

2.コードの見直し

自身のwebアプリは
1.youtube動画のURLをデータベースに保存

2.データベースに保存されたURLをもとに動画情報取得(サムネイル、投稿者、タイトルなど)

3.カテゴリ別に取得した情報を表示させる
といったものだ。
この「2」の箇所でAPIでの取得を行っていることが原因でクォータの上限に簡単に達してしまう模様。
これでは公開したらまともに動作しなくなってしまう・・・

3.コードの改善

コードというより最早設計の問題だった。
APIでの動画情報取得をできるだけ少なくするためにデータベースの保存時のみ動画情報取得するように設計し直した。
1.youtube動画のURLから動画情報(サムネイル、投稿者、タイトルなど)を取得し、データベースに保存

2.データベースに登録された動画情報を動画URLごとに表示させる
これで、動画リストを開くたびにAPIが使用されることがなく、クォータの使用量もかなり余裕ができた。

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

Laravel で「Server error: GET http://cabinet.laravel.com/latest.zip resulted in a 522 Origin Connection Time-out response:」エラー

Laravel で久しぶりに laravel new blog のコマンドを打ってプロジェクトを作ろうとしたらタイトルのエラーが発生した。

laravel% laravel new blog
Crafting application...

In RequestException.php line 113:

  Server error: `GET http://cabinet.laravel.com/latest.zip` resulted in a `52  
  2 Origin Connection Time-out` response:                                      
  <html>                                                                       
  <head><title>522 Origin Connection Time-out</title></head>                   
  <body bgcolor="white">                                                       
  <center><h1>522 Origin Conne (truncated...)                                  


new [--dev] [--auth] [-f|--force] [--] [<name>]

困ったらstackoverflow

Laravel News に載っている通りインストーラーアップデートしなさいって書いてありました。
https://stackoverflow.com/questions/64686037/why-do-i-get-a-laravel-error-while-creating-a-new-project

解決方法
composer global require "laravel/installer:^4.0"

上ので私は解決しました。それでダメならアンインストールとインストールとか試しなさいだそうです。

【詳細は下記参照】
https://laravel-news.com/updating-the-laravel-installer

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

JavaScript PHP 正規表現を使用した文字列置換でが何を指しているかわからなかったので調べて簡単にまとめる

目的

  • JavaScriptとPHPの文字列置換でどうして$1にヒットした文字列が入っているのかわからなかったので調べてみた

前提情報

確認

  1. Chromeの検証モードのコンソールでで下記を実行してみる。

    /(https?:\/\/[^\s]*)/g.exec('https://qiita.com/miriwo は筆者のQiitaのホームです');
    
  2. 下記の出力が得られた。

    画像

  3. キー0とキー1にヒットした文字列「https://qiita.com/miriwo」が格納されている。

  4. 正規表現部分を下記のように修正して実行してみる。

    /https?:\/\/[^\s]*/g.exec('https://qiita.com/miriwo は筆者のQiitaのホームです');
    
  5. 下記の出力が得られた。

    v-html_-_Google_検索.png

  6. キー0にのみヒットした文字列https://qiita.com/miriwoが格納されている。

  7. どうやら$1などは正規表現部分のいくつめの括弧でマッチしたものかを表しているようである。

  8. 下記のリンクの「引数としての文字列指定」の「$n」の記載にそれっぽいことが書かれている。

  9. $2を作り出すために意図的に下記を実行してみる。ドキュメントの記載どおりなら$2はキーとしては存在するが、検索条件を指定していないので何も値が格納されないはずである。

    /(https?:\/\/[^\s]*)()/g.exec('https://qiita.com/miriwo は筆者のQiitaのホームです');
    
  10. 予想通り下記のように出力された$2はキーとして存在しているが値は格納されていない。

    v-html_-_Google_検索-2.png

  11. では$0は何を指しているのかを確認するために下記を実行してみた

    /(https?)(:\/\/[^\s]*)/g.exec('https://qiita.com/miriwo は筆者のQiitaのホームです');
    
  12. 下記のような出力が得られた。下記の結果から$0は括弧に関係なく正規表現部分全体でヒットした文字列が格納されているものであると言える。

    v-html_-_Google_検索-3.png

  13. 個人のブログではあるがまとめてくださっている方がいた。「$0 は正規表現にマッチした文字列全体を表し、$1, $2, $3 は、それぞれ1番目、2番目、3番目の左括弧で囲まれた部分のパターンに一致した部分文字列を表します。」と書かれているのでおそらく自分の見解は間違えていないように思える。

付録

  1. 自分がよく使うPHPでは正規表現を使った置換はどのように行われるのかが気になったので公式ドキュメントを呼んでみた。
  2. PHPで正規表現を用いた文字列置換を行うときはpreg_replace()メソッドを使用するようである。
  3. 下記のように当該メソッドを使用する。

    preg_replace(検索条件文字列, 置換後の文字列, 置換対象文字列);
    
  4. 「検索条件文字列」は正規表現を用いて記載するものでありJavaScriptと同じようにデリミタでくくって記載する。

  5. そして検索にヒットしたものが入ってくるキーも$0や$1などJavaScriptと一緒のようだった。公式ドキュメントのリンクを下記に記載し抜粋したもの載せる。(PHPのドキュメントのほうがわかりやすく書いてくれている気がした。先にこっちを読めばよかった。)

    • https://www.php.net/manual/ja/function.preg-replace.php

      replacement では、 \n 形式または $n 形式で参照を指定することができます。 後者の形式の方が好ましい形式です。各参照は、n 番目のキャプチャ用サブパターンにマッチしたテキストにより置換されます。 n は 0 から 99 までとすることができ、 \0 または $0 は パターン全体にマッチするテキストを参照します。キャプチャ用サブパターンの番号 については、その左括弧が左から右に(1から)カウントされます。 string に含まれるバックスラッシュリテラルは、エスケープが必須であることに注意して下さい。

  6. 試しに下記を実行してURL部分が検索にヒットするか確認してみた。

    echo preg_replace('/(https?:\/\/[^\s]*)/', '<a href="$1">$1</a>', 'https://qiita.com/miriwo は筆者のQiitaのホームです');
    
  7. 下記のように出力されたので問題無く置換できているようである。

    <a href="https://qiita.com/miriwo">https://qiita.com/miriwo</a> は筆者のQiitaのホームです
    
  8. ヒットした文字列が格納されているキーがJavaScriptのものと同じであるのか確認してみる。下記を正規表現部分と置換後の文字列をいじって下記を実行してみる。

    echo preg_replace('/(https?)(:\/\/[^\s]*)()/', '$0 - $1 - $2 - $3  ', 'https://qiita.com/miriwo は筆者のQiitaのホームです');
    
  9. 下記のように出力された。1つ目のハイフンまでが$0であり、すべての正規表現にヒットしたのでURLがフルで表示されている。1つ目から2つ目のハイフンまでが$1であり1つ目の括弧のヒット部分が表示されている。2つ目から3つ目のハイフンまでが$2であり2つ目の括弧のヒット部分が表示されている。最後のハイフンのあとは$3であり3つ目の括弧のヒット部分が表示されるが括弧の中に何も記載されておらず何もヒットしていないので何も出力されていない。

    https://qiita.com/miriwo - https - ://qiita.com/miriwo -    は筆者のQiitaのホームです
    

まとめ

  • JavaScriptでもPHPでも正規表現を使った文字列置換の$1とか$2とかは左から数えた正規表現の括弧の数にリンクしており、それぞれ$1には1つ目の括弧の正規表現にヒットした文字列が、$2には2つ目の括弧の正規表現にヒットした文字列が格納れている。$0だけは少し特殊で括弧に関係なくデリミタで区切られた正規表現すべてを通してヒットした文字列が格納される。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む