20201216のPHPに関する記事は17件です。

DockerでMacに超絶シンプルなPHP&Apache環境を整える

はじめに

PHP案件を頂いたため、MAMPでやるかぁーと思ったのですが、ふと、「MAMPの必要あるか…?:thinking:」となりました。

というのも、今回はDB使わないし、MacにはPHPもApacheも入ってるよなと思ったのです。

Terminal
$ php -v
PHP 7.3.11 (cli) (built: Jun  5 2020 23:50:40) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies

$ httpd -v
Server version: Apache/2.4.41 (Unix)
Server built:   Jun  5 2020 23:42:06

うんうん入ってる。

ただし、ソースが動く本番環境のPHPバージョンは5系だったので、PHPのバージョンを切り替える必要がありました。

開発環境を整える方法として思いついたのは3つ。

  1. HomebrewでPHPバージョンを切り替えて開発する
  2. MAMPをちょっといじってPHPバージョンを切り替えて開発する
  3. Dockerを建てちゃう

そんなにPHP案件が多いわけではないですが、ローカル環境をガチャガチャするのが嫌だし、LinuxライクにコマンドポチポチーでApache起動できる方が慣れているので、今回は3つめのDockerを採用することにしました。

前提

環境 バージョン等
MacBook Pro 2019年モデル
OS macOS Catalina
Docker Engine v19.03.13
PHP 5.4

1. Docker Desktopをインストールする

公式サイトDownload for Macを選択し、Docker Desktopをダウンロードします。

スクリーンショット 2020-12-10 17.40.49.png

Docker.dmgを実行し、インストールします。

インストール完了したら実行します。
実行後、パスワードを求められることがありますが、適宜入力してください。

実行すると上のメニューバーの右側にクジラさんが現れます。(ちっちゃくてすみません)↓
スクリーンショット 2020-12-10 17.47.05.png

試しにターミナルでコマンドを打ってみて確認します。

$ docker version
Client: Docker Engine - Community
 Cloud integration: 1.0.2
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 16:58:31 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.13
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       4484c46d9d
  Built:            Wed Sep 16 17:07:04 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.3.7
  GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

2. Dockerfileを作成してビルドする

2.1. Dockerfileの作成

Dockerfileを書いてイメージを作成します。

適当なディレクトリを作成し、Dockerfileを作成します。

$ mkdir php5_apache

$ cd php5_apache

$ vim Dockerfile

公式のDockerイメージを拝借しちゃいましょう。
php:<version>-apacheと記述することで、Apacheも含んだコンテナを建てられます。
今回使用するバージョンは5.4ですのでその通り記述します。

Dockerfile
FROM php:5.4-apache

2.2. ビルド

docker build <Dockerfileのパス> -t <イメージ名>:<タグ名>
でビルドをかけます。

ここでは、イメージ名はphp5_apache、タグはバージョンとして1.0と指定しておきます。

-t: 名前とタグを指定するオプション

$ docker build ./ -t php5_apache:1.0

ビルドできたか確認しましょう。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
php5_apache         1.0                 7246b9f23253        5 years ago         470MB

ちなみに、Docker Desktopのダッシュボードからも確認することができます。
スクリーンショット 2020-12-10 18.31.52.png

3. コンテナを作成し、起動する

早速起動させていきましょう。

動かしたいソースは既に手元にあるので、マウントしちゃいます。

コマンドは以下の通り。
docker run -d -p <ホスト側ポート>:<コンテナ側ポート> -v <ホスト側パス>:<コンテナ側パス> php5_apache:1.0

今回使用したオプションの説明は以下。

  • -d: デタッチドモードで起動する(バックグラウンド実行)
  • -p: コンテナのポートをホスト側に公開する
  • -v: ホスト側のディレクトリをコンテナにマウントする
$ docker run -d -p 80:80 -v <作業ディレクトリ>:/var/www/html php5_apache:1.0

無事に起動できたか確認しましょう。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS                NAMES
469f65bd6a4f        php5_apache:1.0     "apache2-foreground"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   recursing_hodgkin

4. ブラウザで確認

80番ポートで開いたのでポート指定なしでlocalhostをブラウザのアドレスバーに入力し開きます。
無事にPHP等が出力されていればOKです。

5. コンテナの開始と停止

コンテナを一度作成してしまえば、docker start <コンテナIDまたはコンテナ名>で起動、docker stop <コンテナIDまたはコンテナ名>で停止できます。

今回はコンテナ名でやってみます。
recursing_hodgkinと名付けられていましたので、それで停止、開始してみます。

$ docker stop recursing_hodgkin
$ docker start recursing_hodgkin

6. コンテナにログインする

以下でrootでログインできます。
ちなみにOSはDebianです。

$ docker exec -it recursing_hodgkin /bin/bash

出るときはおなじみのexit

# exit

7. おまけ

7.1. Apacheのエラー

ふとログを見てみるとなんかエラーっぽいログが吐かれていました。

$ docker logs recursing_hodgkin
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Thu Dec 10 09:58:54.402679 2020] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.4.45 configured -- resuming normal operations
[Thu Dec 10 09:58:54.402792 2020] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'

「ドメイン名設定されてないよぉー困るよぉー:disappointed_relieved:」という内容です。
ご親切に「ServerNameディレクティブを設定しろ」と解決策まで書いてくれていますね。

多分設定しなくても問題ないんですが、エラーが残っているのが気持ち悪いので設定してあげます。

(私はCentOSばっかりいじってたので、DebianのApacheの設定ファイルとかどこ〜〜〜〜ってなりました。)

まずは、dockerにログイン。

$ docker exec -it recursing_hodgkin /bin/bash

vimが慣れているので一応インストール。
apt updateしないとvimがインストールできなかったのでやむなくしてます。
Dockerfileに最初から書いとけばよかったと思いつつ……

コンテナ内
# apt update
# apt -y upgrade
# apt install -y vim
# vim /etc/apache2/conf-enabled/httpd.conf

/etc/apache2/conf-enabled/*.confをconfigファイルとして読み込んでいるようなので、この中に記述していきます。

httpd.conf
ServerName localhost:80

Apacheサービス再起動。

# /etc/init.d/apache2 reload
[ ok ] Reloading web server: apache2.

CentOSいじってるとsystemctl restart httpdで再起動なので、service apache2 restartで再起動したくなるんですが、これを実行したらコンテナも一緒にお亡くなりになられたので、上記コマンドを叩きます。

7.2. マルチバイト文字使えないんだが

モジュール入れてないやろ。

どこからかそんな声が聞こえてきました。

モジュールを入れて、

# docker-php-ext-install mbstring

iniに追記し有効化します。

php.ini
extension=mbstring.so

恒例のapache再起。

# /etc/init.d/apache2 reload

終わりに

私もDockerに明るいわけではないので、備忘録的に残しました。

phpのエラーログとか出すようにしたり、おまけに書いた部分をDockerfileに記述したり等、実際に開発始める上で躓いたところがあったので、そこらへんもあとで記事にしておきたいと思います。

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

PHP 7 で劇的に改善された PHP

悪いイメージのある PHP (個人の感想です)

PHP はなんとなく悪いイメージがある、そう思っている人はいませんか?

僕も昔はそうでした。

僕は学生の時に、 Java, Scala, Ruby あたりを使っていました。PHP を触ったのは就職してからです。今学生だとしても、 PHP は勉強せず、 Python, Go あたりを勉強しますね。

しかし、 PHP を使って開発されている Web アプリケーションは非常に多いです。PHP には Web アプリケーション向けの便利な機能が大量にあります。

また、 PHP 7 から型周り改善が多く入り、以前の PHP から見違えるようになりました。

なぜ PHP には悪いイメージがあるのか

なぜ PHP が嫌いな人が多いのか、それは、「厳密でない比較演算子 ==」のせいだと思っています。

PHP 8 では、この比較演算子が変更になったことでも話題になりました。

【PHP8.0】非厳密な比較演算子==の挙動が今さら変更になる

↑のQiita記事の例にもありますが、

"true" == 0    // true => PHP 8 からはこれが false に
0 == "0"       // true
"true" == "0"  // false

これの不思議なところは、 "true" == 0 であり、 0 == "0" なのに、"true" == "0" は false になる点である。A = B かつ B = C なのに A = C にならない違和感である。

"true" == 0 がなぜ true になるのか、これは、文字列を int にキャストしようとした時に、文字列が数字から始まっていない場合は、 0 にキャストされるからである。

(int)"true"    // 0
(int)"100"     // 100
(int)"100abc"  // 100
(int)"abc100"  // 0

これは PHP のドキュメントにも書いてある。

https://www.php.net/manual/ja/language.operators.comparison.php

このキャストの挙動は PHP 8 でも変わっていない。== の挙動だけ修正されることになった。

PHP にはカオスな型の比較表があるのは有名だろう。一度見てみると面白いと思う。

https://www.php.net/manual/ja/types.comparisons.php

=== による厳密な比較の表はいるのか?と思ってしまう。

PHP 7 になって良くなったこと

関数の引数や戻り値、プロパティなどに型を書けるようになったのだ。

class Something
{
    private int $id;

    public function setId(int $id)
    {
        $this->id = $id;
    }

    public function getId(): int
    {
        return $this->int
    }

}

昔と比べると、こんなのほんとにPHPなのか?と思うのかもしれないが、これが今の PHP である。

== の挙動は相変わらずだが、型がだいぶきっちりし始めて、ちゃんと書けばかなり使いやすい言語だと感じ始めた。

PHP 8

更に PHP 8 で色々機能が追加された。

Nullsafe operator や

image.png

Union types など、

class Number {
    public function getSomething(): int|float
    {
        // int または float を返す
    }
}

便利な機能が多く追加されている。

PHP の良いところ

やはり Web に特化した言語であり、他の言語にはない機能がいっぱいある。

HTMLの特殊文字をエスケープする関数や、

htmlspecialchars('<html>')  // &lt;html&gt;

クエリ文字列を生成する関数

http_build_query(['a' => 1, 'b' => 2])  // a=1&b=2

JSON に変換する関数に、

json_encode(['a' => 1, 'b' => 2]);  // "{"a":1,"b":2}"

日の出の時間を取得する関数など(何に使うんだ)

$now = time();
date_sunrise($now);  // 04:30

Web に関する関数なら「こんなものもあるんだ」ってものまであります。 Web アプリを開発していると非常に便利です。

あとは、やっぱり利用者が多いので、 Web に知見が多く転がってるのは素晴らしいですね。ググれば大抵の問題は解決します。

PHP の良くない点

実際長年 PHP を触ってきましたが、やっぱり実行速度はコンパイル言語には勝てません。PHP 7 になってかなり高速化されました。PHP 8 は JIT コンパイルになってさらなる高速化が見込めますが、非同期処理が苦手なのもあり、やっぱり遅いです。

会社の新卒研修で Scala を使ったアプリケーションを作ったり、 https://lgtmoon.dev/ も Scala で作ったりしましたが、サーバーが超貧弱にもかかわらずかなりのパフォーマンスが出ます。

ただ Scala はあまりにも知見が少ないので、今なら Go を選択しますかね。当時 Go が有名だったら Go を選んでいたと思います。

まとめ

かなりダラダラと書いてしまいましたが、昔と比べて PHP はかなり良い言語になってきたと思うので、皆さん食わず嫌いせず触ってみるといいかと思います。

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

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

対象者

・バックエンドエンジニアを志す人
・プログラミング開発初学者

はじめに

こんにちは!

この投稿はその①の続きです。
その①

phpはコードを書いていて好きになりました。
好きになった理由を考えてみましたが下記があげられました。

・コードだけで機能を実装できるところ
・構造を考える楽しさ(データベース)
・機能(仕組み)を知る楽しさ

なるほど、好きになった理由はわかりました・・。
好きになったものをきっかけに働いていこうと思ったのが私です。

では、働くとしたらどんな働き方になるだろう
そんな時に出てきた言葉がバックエンジニアという言葉でした。
あー聞いたことがあるバックエンドエンジニアかPHPとかAWSとかね。

ってほとんど何も知らん。笑

なので調べていきます。

目次

1.バックエンドエンジニアとは?
2.抽象度が高いのでもっと具体的にする。
3.【結論】プロダクトを作ることがバックエンドエンジニアになる1番の近道
4.次のステップ:ECサイト作成

1.バックエンドエンジニアとは?

バックエンドエンジニアについて書かれたページを確認しました。

Aサイト:バックエンドエンジニアとは?

バックエンドは、サーバーサイド(Webサーバー側)やデータベースのシステムなど、ユーザーの目に見えない部分のことです。

ほう、ユーザに見えない部分ね・・
感想:抽象度が高すぎてわからん。見えない部分ってなにがあんねん。

2.抽象度が高いのでもっと具体的にする。

いや、確かに調べてみたらいっぱいあるんですよ・・
でも、細かな話するといっぱいありすぎるわけで。

軽く調べただけでも決済機能や認証機能、webサーバ、ドメインなど色んな言葉がありました。バックエンドエンジニア目指したいのにてんこ盛りの言葉の前にどうすればいいのかと思っちゃいました。

3.【結論】プロダクトを作ることがバックエンドエンジニアになる1番の近道

バックエンドエンジニアは結局な所、プロダクトを作るための技術を行う人(ま、エンジニアのほとんどがそうだと思ってる)だと思うからプロダクトを実際につくることがバックエンドエンジニアが使っている技術を身につけることに近づくという結論にいたりました。

ま、プロダクトと一言で言っても使われている技術はもちろんバックエンドだけとは限らないので作るプロダクトはバックエンドを最大限に活かしたプロダクトにしていきたいと考えています。

4.次のステップ:ECサイト作成

最初のプロダクトはECサイトにします。
どんな技術が使われているかわからないのでまずは調べたいと思います。
調べた内容はまた記事にします。

関連記事一覧
その①

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

WordPressでカテゴリーのアーカイブにカスタム投稿の記事も表示させる

ワードプレスのテーマtwentytwentyを基盤に、カテゴリーのアーカイブページにカスタム投稿の記事も一覧表示させる実装を行ったので、備忘録的にこの記事を残す。

環境情報

PHP:version 7.3.12
WordPress:version 5.5.3
WPテーマ:twentytwenty

作業

通常はポストタイプ名が post の投稿のみ表示される仕様のようだ。

functions.php
// カテゴリーのアーカイブにカスタム投稿の記事も表示させる
function add_customtype_archive( $wp_query ) {
    if ( is_admin() || ! $wp_query->is_main_query() )
        return;

    if ( $wp_query->is_category() || $wp_query->is_tag() ) {
        $wp_query->set( 'post_type', array( 'post', 'カスタム投稿タイプ' ));
        return;
    }
}
add_action( 'pre_get_posts', 'add_customtype_archive' );

「カスタム投稿タイプ」の部分を表示させたい投稿のポストタイプ名に変更してお使いください。

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

【初心者】PHPで文字を大文字/小文字に変換する

PHPで小文字を大文字に変換したい

そんな時は…

mb_strtoupper(文字列)

大文字を小文字にしたい時

mb_strtolower(文字列)

これを使用する。

少しずつPHPでできることが増えてきたと思う。

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

WindowsPCにComposer インストールしたメモ

Windowsに「MAMP4.2」と「Composer2」をインストールする

みなさんこんにちは
ジーズアカデミー 主席講師 山崎ですm(_ _)m
今回はLaravelをMAMPで動作させる際に受講生が困っていた内容の一つを記事にしました。
※今後同じ事をやる人のためにメモを残します。

(重要)Windwos/MAMP4.2で検証した内容です。

対象(インストールした環境)

・ Windows10
・ MAMP4.2(php7.4.1)
・ Composer(ver.2)

Windowsに「Composer」をインストール

1.「 Composer 」ダウンロード

https://getcomposer.org/Composer-Setup.exe

2.「 Composer 」インストール

何もチェックせずに「Next>」

3.「 Browse...」をクリックしてMAMPのPHPバージョンフォルダ内にある「php.exe」を選択

・チェックボックスルも入れておく。


「Next>」ボタンで次へ

4.「Create a php.ini file」にチェックを入れる!


「Next>」ボタンで次へ

5.何も入力しない


「Next>」ボタンで次へ

5.「Install」ボタンをクリック

6.「Next>」ボタンで次へ

7.「Finish」ボタンをクリック

<< 「composer install」「composer update」で赤い文字のエラーが出た場合 >>

1.php.iniの修正

image.png
上記「3」で選択したphp.exeと同フォルダ内に「php.ini」ファイルができてるので

php.ini
;extension=fileinfo
 ↓ ↓ ↓ 
extension=fileinfo

上記、";" コメント外し保存

2.MAMP再起動

php.iniの修正を反映させるため、MAMPを再起動します。

以下、追加メモ

*LaravelでリポジトリをGitcloneしてきた場合(以下コマンド)

  1. composer install
  2. cp .env.example .env (laravelフォルダ内で実行)
  3. php artisan key:generate (laravelフォルダ内で実行)
上記3つのコマンドを打つ理由は
  • .envが入っていない
  • KEYが発行されていない
  • vendorフォルダが入っていない

*Laravelの動作を確認する場合

1.「 MAMP 」→ 「 Preferences...」を選択

2.「 Web Server 」タブを選択 → 「 Select... 」ボタンを選択

3.フォルダ選択で「 Laravel 」フォルダ内の「 public 」を選択

http://localhost/ 」と「 public 」はイコールとなります。

4.「 http://localhost/ 」でブラウザから確認可能になります。

※MAMPが再起動してなければ、再起動してから確認しましょう!!

以上

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

【初心者】PHPで文字数を取得する

PHPで文字列の文字数を取得したい

PHPで文字数を出力したい時は…

echo strlen(文字列);

これで文字列の文字数を出力できる。

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

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

対象者

・バックエンドエンジニアを志す人
・プロダクト開発初学者

本題

こんにちは!

現在、あるコミュニティに所属していて、その中でhtml、css、javascript、phpを使いプロダクトを作っています。学んだ技術を使えば基本的に何を作ってもいいので好き放題に自分が思うプロダクトを作り続けています。

なかば半強制的な環境下で作ったプロダクトといえ自分で考えたプロダクトは多少なりとの愛着があるものです。自分が納得して作ったものもあればイケてないものもありました。

もの作りをしていて良くないとは思いますが、どう作っていいか分からず匙を投げたこともあります。(エンジニアとして適正ないかもなんて・・笑)

さて、そんな私ですが将来的にはバックエンド技術者として働きたいと思って日々を過ごしています。講義では技術について学習はしているもののバックエンド技術者になりたいという思いに対する行動は取れていないという漠然とした不安がありました。

そこでコミュニティの関係者の方に相談したところ、作りたいものをまず決めそこから必要な技術を調べて実装していくのが力がつく旨のアドバイスを頂きました。

アドバイスを聞いた私が思ったのは

・講義の課題に追われたりしてるのに+αで大変そうだな・・・
・年末年始ぐらい休みたいかも。笑
・ECサイトじゃなくてもいいんじゃない?
・強制的に作るのは漠然だが楽しくなさそう・・
・分からないこと多くて嫌になりそう・・

ということが頭に浮かんいました。(邪念が多めですね。良くないとは思っていますよ)
でも、バックエンドエンジニアになるって自分で決めているんです。
四の五の言わずに挑戦してみます。笑(やってるうちに楽しくなるかもしれないし!)

作ろうと思うのはECサイトの予定です(機能いっぱいありそう)

どんどん逆算して作ります。次の投稿は下記になるかなと思っています。

・そもそもECサイトってなに?
・ECサイトを作るための技術には何が必要か?
・どんな手順で実装していくか。

陰ながら見守っていただけると幸いです。(嫌になることもあるんだろうな・・笑)
※バックエンドエンジニアになるんだからバックエンジニアのことも調べていきます。
※そんなに困っていることを無いけどできれば何かを解決するプロダクトを作っていきたいなーだって何かをするための技術なんだし。

関連記事一覧
その②

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

JavaScriptとPHPを習い始めたばかりの人間がECサイトを構築するトライアル開始します

こんにちは。

プログラミング初学者ですが、
授業でJavaScriptとPHP、APIやFirebaseを学んだので
何かしら形にしてアウトプットをしてみたくなりました。

年末年始は授業もなく時間もできるので、一旦どこまでかかるかすら
把握しておりませんが、ECサイトを作ることに挑戦しようと思います。

思い立った敬意としては、学校のメンターでありCTOなど務めていらっしゃる
偉大な先輩から、

「作りたいものがあって、それをコード書きまくってダメなら何がダメか調べて
を繰り返し、自走していくことでようやく血肉となった結果自分の企画も
レベルが上がっていく」

なんとも筋トレのようなスポーツのような言葉をいただきとても共感させていただいたから。

過程やStuckしたポイントをどんどん更新しながらあげていって
同様にプログラム初学者の方々の背中を少しでも押せるような内容にしたいと思います。

日記のような形でこまめに更新していきます。

次の投稿は
・ECサイトにある機能のブレークダウン
・ECサイト作成に必要な技術

この辺り投稿予定。

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

LaravelのFacadeの仕組みを完全に理解した

Symfonyのほうから来ましたこんにちは。
長年「宗教上の理由でLaravelには入門しません」と言っていた私ですが、 副業 でLaravelで作られたアプリケーションに関わることになり、とうとうLaravelを触り始めました。

悪名高きFacade

私がLaravelに入門したことがなくても名前を知っていたのが Facade です。
カンファレンスや勉強会で知り合った範囲のLaravelユーザー達が口を揃えて「Facadeはよくない」と言っていたので、「なんかしらんけど良くないもの」として名前だけ認識していました。

Laravel製アプリケーションに関わることになって、ソースコードをgit cloneして最初に調べたのが app/ 配下のuse文です。

use Illuminate\Support\Facades を検索すると、あー…あるある…。

Facadeの何が良くないか?

これはLaravelの上級者達によって既にあちこちで語られているので、「Facade よくない」とかで検索してみてください。

私はドメインのコード内に記載することでLaravelへの暗黙的な依存が発生するのが一番良くないと思います。
Laravel側のアップデートや仕様変更によってドメインのコードが左右されると、アプリケーションのメンテナンスしやすさが下がります。はるか昔のバージョンからずっとフレームワークをバージョンアップできない事になりかねません。

また、Facadeが使われているクラスのユニットテストをしたいときに、LaravelのDIコンテナの初期化が必須になるのもマイナスです。
テストの実行にかかる所要時間が伸びると、テストが億劫になり、テストを避ける(ちょっとした仕様変更の際にテストを省略しようとする、手元でテストしない、「急いでるのでCI落ちてますがマージお願いします!」)悪い習慣がついてしまいます。
継続的にテストしていくために、テストは「速く」実行できることがとても重要です。

IDEで補完されない(これはプラグインとかで解決できるのかも?)というのも地味に面倒な点です。

Facadeは何をしているのか?(仕組み)

「良くないもの」と再認識したFacadeを取り除いていくためには、まずFacadeが何をしているのか理解した上で、Facadeを使わない書き方を考えていく必要があります。

オープンソースを使うメリットはソースコードが見れることですから、Facadeのソースコードを見てみましょう。
https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/Facades/Facade.php

ソースコードを見ると、Facadeを使って DB::hoge() のようなことをした場合、まず呼び出されるのはFacade::__callStatic() です。

abstract class Facade
{
    public static function __callStatic($method, $args)
    {
        $instance = static::getFacadeRoot();

        if (! $instance) {
            throw new RuntimeException('A facade root has not been set.');
        }

        return $instance->$method(...$args);
    }
}

getFacadeRoot() によりFacadeの対象のインスタンスを取り出し、そのインスタンスに対してstaticコールされたメソッドを実行していることがわかります。

ではFacadeの対象インスタンスをどのように取り出しているのかと言うと…

abstract class Facade
{
    public static function getFacadeRoot()
    {
        return static::resolveFacadeInstance(static::getFacadeAccessor());
    }

    protected static function resolveFacadeInstance($name)
    {
        if (is_object($name)) {
            return $name;
        }

        if (isset(static::$resolvedInstance[$name])) {
            return static::$resolvedInstance[$name];
        }

        if (static::$app) {
            return static::$resolvedInstance[$name] = static::$app[$name];
        }
    }
}

getFacadeAccessor() により対象のサービス名を特定した上で、 static::$app (DIコンテナ)からその名前のサービスを取得しています。
つまり、

class Hoge extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'hoge';
    }
}

のようなFacadeがあって

Hoge::foo($bar);

のように呼び出されているのであれば、DIコンテナ上で hoge という名前で定義されているサービスのクラス名を調べて、autowireしてやれば同等のことができるというわけです。

- Hoge::foo($bar)
+ $this->hoge->foo($bar);

IDEの補完もきくし、テスト時にピュアなPHPUnitのTestCaseクラスでテストが書けます。クリーン :relaxed:

まとめ

アプリケーション内のソースコード内を概観して、Facadeが使われているのは AOP がマッチしそうなケースだなーと思いました。
DBとかRedisとか使っちゃってるのはだめだぞ☆って感じですけども。

ごく一般的なLaravel製アプリケーションを、メンテ性高く長期運用できるシステムへ改善する過程を一緒に体験してみたい(一緒に苦労してみたいとも言う…)方がいたら https://www.wantedly.com/projects/475929 からご連絡くださいね :relaxed:

もしこれを読んで、最初からFacadeがなくてすべてがDIされている世界(Symfony)に興味を持った方は Symfony Advent Calendar 2020 も覗いてみてください :thumbsup:

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

はじめまして

自己紹介

はじめまして。情報系大学3年のTaYです。普段はPHPやJSを触っています。
最近ではゼミでPythonも触っています。(ほんとに触っているだけ)

自分のやってきたことの備忘録として始めてみました。

今はLaravelを独学中で簡単な掲示板を作っています。

完成したら載せようかな〜と考えています!

特に書くこともないので今回はこの辺で:wave:

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

HomebrewでインストールしたPHPのバージョンを切り替える方法

目的

  • HomebrewでインストールしたPHPのバージョンを切り替える方法をまとめる

実施環境

  • ハードウエア情報

    項目 情報
    OS macOS Catalina(10.15.3)
    ハードウェア MacBook Air (11-inch ,2012)
    プロセッサ 1.7 GHz デュアルコアIntel Core i5
    メモリ 8 GB 1600 MHz DDR3
    グラフィックス Intel HD Graphics 4000 1536 MB

ことの発端

  • PHP7.4を入れたかったけどPHP8.0を入れてしまった。
  • $ php -vを実行すると下記のように表示されてしまい7.4になってない。

    PHP 8.0.0 (cli) (built: Nov 30 2020 13:47:29) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
        with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies
    

詳細

  1. 下記コマンドを実行してPHP7.4をHomebrewでインストールする。

    $ brew install php@7.4
    
  2. 下記コマンドを実行してPHP8.0からPHP7.4に切り替える。

    $ brew unlink php@8.0
    $ brew link php@7.4
    
  3. 下記コマンドを実行してPHPのバージョンが切り替わったことを確認する。

    $ php -v
    
  4. 筆者の環境だと正常に切り替わってた。

    PHP 7.4.13 (cli) (built: Nov 30 2020 14:46:04) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v3.4.0, Copyright (c) Zend Technologies
        with Zend OPcache v7.4.13, Copyright (c), by Zend Technologies
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WordPressでカスタムフィールドの値で一覧表示を絞り込む

ワードプレスのテーマtwentytwentyを基盤に、カスタムフィールドの真偽値を使って一覧表示したい投稿を絞り込む実装をしたので、備忘録的にこの記事を残す。

環境情報

PHP:version 7.3.12
WordPress:version 5.5.3
WPテーマ:twentytwenty

作業

<div class="section_inner">
  <h2>カスタム投稿 真/偽での振り分け</h2>
  <div class="contents">
    <?php $args = array(
      'post_type' => array('sample_01', 'sample_02'),/*カスタム投稿タイプの名前*/
      'showposts' => 4,
      'meta_key' => 'new',/*カスタムフィールドのフィールド名*/
      'meta_value' => true,/*カスタムフィールドの値*/
    );
    $customPosts = get_posts($args);
    if ($customPosts) : foreach ($customPosts as $post) : setup_postdata($post); ?>
        <a href="<?php the_permalink(); ?>">
          <?php the_title(); ?>
          <div class="title"><?php the_field('title'); ?></div>
          <div class="thumbnail"><?php echo wp_get_attachment_image(get_post_meta($post->ID, 'thumbnail', true), 'thumbnailSmall'); ?></div>
        </a>
      <?php endforeach; ?>
    <?php else : ?>
      <p>記事はありません。</p>
    <?php endif;
    wp_reset_postdata(); ?>
  </div>
</div>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Visual Studio Code 1.52 で、ブレークポイントが使えなくなる問題の解決方法

2020年12月16日(水)記載

すぐに解決すると思いますが、Visual Studio Code が自動更新されて、PHP debug ができなくなった場合の解決方法。既に、解決のために拡張機能を開発している人が動いています。

今この瞬間に困っていたらどうぞ。

環境

  • Visual Studio Code 1.52
  • PHP Debug 1.13.0

解決方法

一次情報はこちら
https://github.com/felixfbecker/vscode-php-debug/issues/427

ギアアイコン > 設定メニュー > デバッグセクション > Allow Breakpoints Everywhere にチェックを入れる

スクリーンショット 2020-12-16 9.52.22.png

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

[PHP]Composer超概要(初めの一歩)

皆さんこんにちは。

PHP Advent Calendar 2020(Qiita)16日目の記事を書かせていただきます。

今年から仕事でPHPを書くようになり(それまではずっとJavaエンジニア)PHPを書いているのですが、ずっとレガシーなPHPのシステムを触っていました。が、最近ふとLaravelで開発するようになり、Laravelを使う中で出てくるのが今回扱う「Composer」でした。正直、PHPで開発するならComposerないとしんどいなぁ・・というのを実感したので、改めてComposerはどういうものなのか、何が便利なのかを嚙み砕いて書いていければと思います。

What's Composer?

  • 「依存関係管理ツール」/ プロジェクト単位で管理できる

Composerとは「依存関係管理ツール」と呼ばれるソフトウェアで、PHPのプログラムで使用するパッケージの依存関係を管理する為に使用される。プロジェクト単位にパッケージを>管理できる。【引用】Composerの教科書 - 増井 敏克著

プロジェクト単位で管理できるので、複数プロジェクトで異なるバージョンのライブラリを導入したい場合でも他プロジェクトに影響を与えない かつ デフォルトでは「vendor」というディレクトリにインストールしたライブラリが一括で格納されるので、管理もしやすくわかりやすいです。

  • パッケージの依存関係を管理してくれる
    複雑なパッケージ管理もComposerが担ってくれます。導入したいパッケージに必要なライブラリ等もまとめてインストールしてくれるので、パッケージごとの依存関係を意識せずとも必要なパッケージを導入できます。

  • composer.jsonで同じバージョンのライブラリをすぐに共有できる
    複数の開発者で開発をする際には、composer.json = 「Composerを管理しているファイル」を共有→ composer.jsonがあるディレクトリ上でcomposer installとするだけで、依存しているライブラリを持ってきてくれます。このファイルを共有するだけでバージョンを同じに揃えられる・・・とても便利ですね。

  • オートローディング機能
    Composerでは、オートローディング(スクリプト冒頭にrequireやincludeを個別に書かなくても、使用したいファイルを自動的に読み込める機能)が使用できます。※オートローディングについてはまだ勉強中なので、また別の記事で詳しく書きます。

Composerの導入

Composerのインストールについては、公式のWebサイトに詳しく載っているので割愛します。インストールしたいOSにPHPがインストールされていれば、あとは手順に沿ってインストールするのみです。

公式リンク: https://getcomposer.org/

LaravelもComposer経由でインストールされる!?

Laravelで開発する際には、ComposerでLaravelをインストールする必要があります。

まとめ

今回の記事では、Composerについての概要をざっくりとまとめました。まだまだ学習中で、理解できていないことも多いので、しっかりと知識を身に着けたうえで再度ComposerについてもQiitaにまとめていこうと思います。

明日は @thgm3116 さんです!

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

実は簡単!?HerokuにアップロードしたCleraDB(MySQL)をCLIで接続する方法

heroku上にアップロードしたCleraDB(MySQL)を接続する方法に凄く手間がかかったので、同じ境遇にいる人の助けになればなと思い、自分の備忘録も兼ねて書いていきます。

開発環境

  • windows10
mysql --version
mysql  Ver 8.0.22 for Win64 on x86_64 (MySQL Community Server - GPL)

以下のコマンドを打ち、データベースのユーザー名、パスワード、ホスト名、データベース名を取得します。

heroku config:get CLEARDB_DATABASE_URL

すると、このようにデータベースの情報が返ってくると思います。

「CLEARDB_DATABASE_URL: mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true」

この情報を元に、CLIで接続を行っていきます。

注意:MySQLのコマンドプロンプトではなく、windowsに搭載されているコマンドプロンプトを使ってください(Macならターミナル)

mysql -u[ユーザー名] -p[パスワード] -h[ホスト名]
//末尾にダブルセミコロン(;)は付けないでください。付けるとエラーが出ます。

すると、以下のような実行結果が返ってきます

~
Your MySQL connection id is id名
Server version: 5.5.62-log MySQL Community Server (GPL)
~

最後にデータベースを選択してください。(これめっちゃ忘れる)

use [データベース名];
//ここ、ダブルセミコロン(;)付ける

Database changed

後は好きにMySQLの構文を打ってください

select * from users;

んね?実は簡単♪

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

macでいきなりはじめるPHPにチャレンジする!(1) MAMP導入編

初めまして!
僕は某プログラミングスクールの夜間・休日コースで半年間勉強をしていました。
某プログラミングスクールでは、rubyおよび、rubyonrailsを中心に学習してきたので、次の一歩として、web開発に用いることができるPHPを学ぼうと思い、それにあたって学んだことをまずは記事にしたいと思います!特に同じような学習の進め方をする人に少しでも参考になれば幸いです。
なお、初学者であり知識の偏りもあるので、理解が不足している部分があるかと思います。もし何かありましたら教えていただけると幸いです。

僕はPHPを学ぶにあたって、タイトルにある「いきなりはじめるPHP: ワクワク・ドキドキの入門教室」を購入しました。少し古い本ではありますが、とても理解しやすく、また実際に動かしながら作ることができるのと、説明が簡潔ながらまとまっていて、とても読みやすい本でした。初学者でまだまだ理解できていないことが多い僕でもスラスラと読みながら1つのアプリを開発できました。

・・・しかし、この本は古いのはともかく、あくまでもwindowsでの開発方法が中心で、macのことはほとんど触れられていません、そこでmacで進めるにあたって苦労したこと、別で調べたことなどをまとめていきたいと思います。

今回はMAMPの導入についてです。MAMPとは「Mac Apache MySQL PHP」の略で、Mac向けに作られたmysqlとPHPの開発環境ツールです。
本ではXAMPPを導入すると書いていますが、XAMPPはMacとの相性が悪く、エラーが出やすいとのことであり、mac用は存在しますが避けた方がいいとのことです。僕はXAMPPを導入してからその事実を知り、やり直すことになりました・・・

このMAMPを導入することで、PHPを導入できるということはもちろん、仮想のサーバーを立てて、ローカル環境での開発、動作確認ができます。railsの場合は「rails s」コマンドで出来たのは・・・と思ったんですが、これはrailsにセットで入っているPumaというやつが頑張ってくれているようです。知らないうちに便利なものを享受しているものだと改めて思いました。今回もMAMPという便利なものに頼らせてもらいましょう。

それではMAMPの導入です。まずはMAMPのダウンロードページにアクセスしましょう。
https://www.mamp.info/en/downloads/
PHP8.png
このような画像の画面になるので、macユーザーの方は迷うことなくmacOS用を選びましょう。ちなみにOSのアップデートがされていないと動作保証はされないようなので注意です。

ダウンロードし、開くとおなじみインストーラーが表示されます。
PHP9.png
日本語化されているので、迷わず進められそうです、続けるを押して、どんどん進めるとインストールされます。

PHP10.png
無事インストールし起動するとこんな画面になります、ちなみに起動するとpro版をかなり勧められますが、僕はあくまでも初学者なのでとりあえずスルーしました、pro版との違いはこちらのサイトに比較が書かれていました。バージョンが少し古いので変更あるかもしれませんが、参考になりそうです。
https://webrandum.net/mamp-mamp-pro/

PHP13.png
startボタンを押すとローカルサーバーが起動します。画像のような案内画面が表示されますね。XAMPPだとMySQLの起動は別なのですが、MAMPの場合は同時に起動されるようです。この辺りがまた学習、開発を進めていく上で大きな違いを産んでいきそうな予感がしますね。

PHP11.png
左上の「preferences」をクリックすると設定画面に移ります。案内ページをoffにする設定などもありますが、注目したのはPortsの設定です、デフォルトだと画像のようになっています。
このままだとlocalhostへのアクセスがhttp://localhost:8888となります。そこで80&3306ボタンをクリックするとhttp://localhostになります。mysqlのポートも3306になります。ただしskypeなどを利用している場合、80のポート争いが起きてサーバーが起動できないこともあるそうです。僕は現状80&3306でうまく動作していますが、うまく行かない場合は他のアプリの見直しや、ポートの変更も必要になりそうです。

MAMPの導入は以上です。次回はPHPを実際に動かすまでを書いてみたいと思います。何か意見などありましたらコメントお願いします。

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