PHP関連のことを調べてみた2021年12月11日

PHP関連のことを調べてみた2021年12月11日

LaravelからElasticsearchを使うときに理解しておいたほうがいいこと

# 前提条件

## 背景

Laravel × Elasticsearchに必要なライブラリを読み解くのに無駄に時間がかかったので共有。

## 環境

PHP 7.4

Laravel 6.2

Elasticsearch 7.8

## この記事を読んだ方がいい人

・MySQLの経験がある程度あってSQLってこんな感じだよねー、な感覚がある人。
・RDBでは遅くなってしまう検索を解決してくれるイケイケな道具があることを知りつつ、それがなんなのかよくわからない人。

## この記事を読まない方がいい人

・Elasticsearchの実務経験がすでにあって全文検索エンジンとマブダチな人。
・日本人ならGroongaにしろよ、って人。

# 必要なライブラリたち

## 1. Scout

### Scoutってなに

Laravelの標準ライブラリ。

よその全文検索機能とEloquentモデルの仲介役をする人。

この記事を見てる人はElasticsearchをLaravelから使いたい的な人が多いともうが、ScoutだけではElasticsearchに対応でき

元記事を表示

DIについてまとめてみる

## DIとは?
DIとは、いわゆる「依存性の注入」と呼ばれているものです。
依存性の注入だとわかりづらいので、「オブジェクトの注入」と読み替えるとわかりやすいかもです。
## 前提
例えば、PayPayクラスと、TestPayクラスが存在するとします。
どちらのクラスも、「起動する」、「支払いをする」という動作は共通しています。
共通している動作「起動する」、「支払いをする」振る舞いは、インターフェースに切り出しています。

### ケース1:コンストラクタの引数にオブジェクトを渡した場合
“`php

元記事を表示

PHPでのサーバー間通信について

# はじめに
CYBIRDエンジニア Advent Calendar 11日目担当の@naotwuです。
10日目は@shiso_cの[イケメンに絆されて入社したらScrollViewに囚われた話](https://qiita.com/shiso_c/items/1ba6a0162928b3b4fceb)でした。

#概要
この記事では、PHPのcURL関数を使って外部のAPIを叩く方法について書いています。
業務で外部サイトからデータを取得したり、自分が担当している複数のサービス間でデータのやりとりを行うことがあり、いつも忘れてしまうので備忘録として書きます。

#環境
CentOS 7.7
PHP 7.4.3
cURL 7.29.0

#cURL関数の流れ
curlとは、HTTPリクエストを飛ばして外部サイトとデータを送受信することができる関数です。

####1. curlセッション初期化

“`
$url = ‘https://example.com/api/hoge.php’
$ch = curl_init($url);
“`

####2. オプションの設定(POSTで

元記事を表示

ShopifyアプリのSession Token認証を追う

[OPNELOGI Advent Calendar2021](https://qiita.com/advent-calendar/2021/openlogi)の11日目です。
昨年に続いてShopifyアプリの認証周りの内容です。

## Shopifyアプリとは
ShopifyアプリとはOauth認証によってShopifyリソースを操作できるwebアプリのことで、
パブリックなものはShopify App Storeに公開されており、ストアにインストール(Oauth認証)することで利用可能になります。
https://apps.shopify.com/?locale=ja

Shopifyアプリには大きく分類すると下記の2つががあります。

– 外部サイトで動作するもの(OPENLOGIはこちらです)
– Shopifyの管理画面内に表示されるもの(埋め込みアプリと呼ばれます)

埋め込みアプリのイメージ:
![Shopify.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180075/9ba2ae9

元記事を表示

PHP で null安全

# 前提
PHP >= 8.0
PHPStan: 1.2.0

# null安全とは
– 簡単にいうと、null が原因で実行時エラーにならない仕組みのこと。
– コンパイラや静的解析ツールによって nullable 型とnon-nullable型を区別し、必要な null チェックが機械的に強制されることで、null を安全に扱うことができる。

– PHP では null に対してメソッド呼び出しを行うとエラーになるので null 安全ではない。
– null に対するプロパティアクセスはエラーにならないものの、想定外の挙動であることが大半だと思うのでバグを引き起こす可能性がある。

“`php
getAddress()->getCountry(); // Error: Call to a member function address() on null
var_dump($user->address->country); // null
“`

# PHPStan で null安全にする
– PHPの静的解

元記事を表示

今更聞けない、Elasticsearchを超簡単に説明

# 前提条件
## 背景
Laravel × Elasticsearchの事例がそこまで多くなかったので
自分が調べたことが今からやろうと思ってる人の助けに少しでもあればと思いまして。

## 環境
PHP 7.4

Laravel 6.2

Elasticsearch 7.8

## この記事を読んだ方がいい人

・MySQLの経験がある程度あってSQLってこんな感じだよねー、な感覚がある人。
・RDBでは遅くなってしまう検索を解決してくれるイケイケな道具があることを知りつつ、それがなんなのかよくわからない人。

## この記事を読まない方がいい人

・Elasticsearchの実務経験がすでにあって全文検索エンジンとマブダチな人。
・日本人ならGroongaにしろよ、って人。

# Elasticsearchとは
全文検索エンジンの一種。

そもそもそれってなに?

ざっっっっくり言うと、MySQLのLIKE検索をちょーはやくするためのやつ。

# なんではやいの?
文字列の検索には2種類あるらしい。

逐次検索 と 索引検索

前者はGrepコマンドでお馴染み、ぜーんぶのデータ

元記事を表示

The stream or file “/var/www/storage/logs/laravel.log” could not be opened in append mode: failed to open stream: Permission deniedではまった件

laradockにlaravelプロジェクトを立ち上げ、ワクワクしながらアクセスすると
![スクリーンショット (1627).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281946/d10832e5-f41b-392f-d110-8448d5faad1f.png)

( д) ゚ ゚

どうやらstorrage/logs/laravel.logにアクセスする権限がないことらしい
ググっても英語の記事ばかりでよくわからない

解決法

“`
chmod -R 777 storage bootstrap/cache
“`

を打ち込んで解決しました

![スクリーンショット (1629).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2281946/f7c49e79-d228-fff0-c88b-ad1fe4c5e8a2.png)

##感想##
1時間も調べたのに解決があっさり

元記事を表示

CVE-2021-32682 elFinder RCE 简单分析

#漏洞描述
该漏洞源于,在创建新的zip存档时,没有对`name`参数进行严格的过滤,导致参数被带入`prox_open`中执行,造成命令注入

#影响版本
“`
elFinder <= 2.1.58 ``` #环境搭建 下载地址: https://github.com/Studio-42/elFinder 下载完成后,重命名`/php/connector.minimal.php-dist`为`/php/connector.minimal.php` 然后在浏览器中加载运行`/elfinder.src.html`即可 ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2370511/189d5b86-edde-eb82-4f39-61470a0d9174.png) #漏洞分析 源码地址: https://github.com/Studio-42/elFinder/releases/tag/2.1.58 得知是通过存档功能,传递`name`参数造成命令注入,然后

元記事を表示

Socialiteで各プロバイダーごとに取得できるユーザー詳細情報のまとめ

# はじめに
今回の記事は、Socialteでの認証方法が本題ではなく、認証成功後の取得情報を中心に触れていきます。
具体的には、認証成功後に取得できるユーザー情報が各プロバイダーによって異なるため、ユーザー情報の何が取得できるか纏めております。
取得項目を具体的にまとめた記事は今の所見かけていないので利用ケースはないかもしれないですが、認証後に会員登録の入力項目補完やテーブル追加などで役に立つのかなと思います。
※今回紹介するプロバイダーは、Google、Facebook、Twitter、Yahoo Japanです。

Socialiteとは何?、認証方法については下記記事に説明がありますので、ご興味のある方は見てみてください。

+ [Laravel 8.x Laravel Socialite](https://readouble.com/laravel/8.x/ja/socialite.html)
+ [LaravelでTwitter認証を実装する](https://qiita.com/tamakiiii/items/cd027580e1d86e2652d7)

# Google

元記事を表示

M1 macOS|MontereyにアップグレードしたらPHP使えなくなったから再度インストールした

ことの発端は、これまでローカル環境にてLaravelの開発をしていた。
いつも通り「php artisan serve」サーバー起動コマンドを打つと…

“`
$php artisan serve
command not found
“`
とコマンドないよと怒られた。

調べてみると下記記事発見。

https://applech2.com/archives/20211018-apple-removed-php-from-macos-12-monterey.html

>M1のMacOS、MontereyへのOSバージョンアップではPHPはバンドルされない。。。

とのことなので新たにPHPをインストールした。その時の備忘録。

## 1.Homebrewバージョン確認
“`ターミナル
$brew -v
Homebrew 3.3.3
“`
brew -vを実行
Homebreは入っている

### 必要ならHomebrewバージョンアップ
“`
brew upgrade
“`

## 2.phpバージョン確認
“`
$php -v
command not found

元記事を表示

Ray.Di

この記事は [BEAR.Sunday Advent Calendar 2021](https://qiita.com/advent-calendar/2021/bear-sunday)の記事です。

[弁護士ドットコム](https://qiita.com/advent-calendar/2021/bengo4com)では筆者がJoinする前からRay.Diを2つのプロダクトで利用していました。(現在はもっと増えています)。社内用のWikiにアップした記事を、許可を得てここに転載します。READMEの内容と合わせて、背景技術や比較を加えています。使い方だけでなく、より技術的な理解が深まるものをと考え記載しました。

# Ray.Diとは

* Ray.Diは[Google Guice](https://github.com/google/guice)のPHP版として開発したPHPのDIフレームワークです。

* DIではオブジェクトを作るのに必要なオブジェクトや値を依存としてコンストラクタで受け取ります。その依存を作るためにも、他の依存が必要です。そうやってオブジェクトを

元記事を表示

継続について知りたい

## はじめに
ずっと理解したいと思って放置していることをこの機会に1つ進めてみよう、ということで、「継続」について今回は書いてみました。schemeの解説を辿るだけだとまた分からないままになりそうなので、普段使ってるphpでの実装を交えつつ。

## 継続とは
ある時点での処理を続けるための情報(残りの処理)のこと。通常これを表立って取り扱うことはしませんが、意図的にこれを値として明示的に渡す形のプログラミングを継続渡しスタイル(continuation passing style)と呼びます。

これを少しでも理解しよう、というのがこの記事の主旨になります。

## まずは具体例
素朴に引数の値をそのまま返す関数を定義します。
※動作環境としてLaravelのtinker上で実施しています。

“`php
function id($x)
{
return $x;
}
“`

これを呼び出して処理結果を出力する関数を定義、実行してみます。`dump`はLaravelのヘルパ関数になります。

“`php
function runId()
{
dump(id(‘h

元記事を表示

PHPでブラックジャックを作る

# 概要
普段はフレームワークを使用してるので、オブジェクト指向の復習をかねて素のPHPでブラックジャックを作る
最終的なゴールのイメージは↓こんな感じでcliの操作で簡単な対戦ができるようにする

※わかりづらいコードがあるかもしれません。その際は指摘していただけると嬉しいです。

# 今回作るブラックジャック
ブラックジャックにはいくつかのルールがあるので、今回は下記のルールを基に実装する
・ディーラーとプレイヤー(自分)の1対1の勝負とする
・Aの得点は1点もしくは11点のどちらかとする(合計が21に近くなるようにする)
・J,Q,Kは全て10点扱い
・ディーラーは17以上になるまでカードを引き続ける
・21点を超えたらバーストとする
・お互いバーストしていなかったら21に近い方が勝ち

# 何のオブジェクトを用意するか考え

元記事を表示

WordPressテーマ「Snow Monkey」の投稿情報の表示内容を細かく変更する

本記事は「[Snow Monkey Advent Calendar 2021](https://adventar.org/calendars/7036)」に寄稿予定の記事に関連するカスタマイズTIPSのまとめです。

寄稿した解説記事も見ていただければ幸いです。

Snow Monkeyの「メタ」のカスタマイズについて、いろいろ調べました | ウェビンブログ
https://webbingstudio.com/weblog/entry-929.html

## 投稿情報とは

投稿一覧や詳細のタイトル周辺には、公開日やカテゴリー等が出力されます。本記事ではこれを**メタ**=投稿情報としています。
この内容は、WordPressテーマ「Snow Monkey」では、テーマのカスタマイズ画面で選択したレイアウトテンプレートによって自動的に決められます。

![snowmonkey_meta_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21117/c075f781-4223-a861-e9d8-38

元記事を表示

wordpressでのアーカイブページ(投稿一覧ページ)でカテゴリーの取得がうまくいってない時の対処法

WordPressの投稿一覧ページでカテゴリーのタイトルとスラッグの情報がうまく取得できなかったので、調べつつ解決したので備忘録。
今回出てくる関数は`get_thecategory()`と`get_queried_object()`
#起きたこと

前提として、カスタム投稿タイプは使用していない、デフォルトの投稿タイプの話になる。
先述の通りで、参照しているテンプレートファイルはarchive.phpになる。
まずはパンクズリストの該当コードを抜粋。

“`

  • cat_name; } ?>
  • “`
    今回最初につまずいたのが、カテゴリーが複数ある中でいくつかは正常に表示がされていて、少数の表記が意図していないものになっているということ。
    カテゴリーをよく見てみると、親子階層になっていて、調べたら上記のget_the_category()関数は親子関係のカテゴリー情報取得には向いていないということ、
    厳密には子カテゴリー

    元記事を表示

    Laravelで開発速度を爆速にしてくれるパッケージ3つ ?

    ## 初めに

    Laravelの基本機能が充実していることはLaravelarの皆さんであれば既にご存知かと思いますが、
    Laravelに導入できるパッケージも非常に充実しています。

    今回は、自分がよく開発で導入するパッケージの中でも開発速度を**爆速**:rocket:にしてくれるものを紹介します!

    ## Laravel-admin
    管理画面を爆速で構築できるパッケージです。
    Laravelで管理画面を構築するパッケージはVoyagerなどもよく挙げられますが、ソースコードで完結している点が扱いやすいです。
    個人的なお気に入りはモデルからのスキャフォルドがとっても便利な点ですね!

    ### 使い方
    下記のコマンドでインストールが完了します。

    “`
    $ composer require encore/laravel-admin
    $ php artisan vendor:publish –provider=”Encore\Admin\AdminServiceProvider”
    $ php artisan admin:install
    “`

    これだけで、 `http://$

    元記事を表示

    LaravelのModelでコンストラクタを使う

    # はじめに
    動的な値を初期値にしたいとき、いろいろな書き方はあると思いますが、コンストラクタで処理をしてしまうのが一番楽かと思います。
    私もModelのコンストラクタで初期値などの処理を書いていたのですが、Fakerが使えなくなったり、APIだけ不具合を起こすようになったりと正しい書き方でないとエラーを起こすことが分かったので、正しい書き方を共有したいと思います。

    ## 誤った書き方①
    “`php:App/Models/User.php
    function __construct()
    {
    $this->uid = Str::uuid();
    }
    “`

    ## 誤った書き方②
    “`php:App/Models/User.php
    function __construct()
    {
    $this->uid = Str::uuid();
    parent::__construct();
    }
    “`

    ## 正しい書き方
    “`php:App/Models/User.php
    function __construct($attributes = [])
    {
    $this

    元記事を表示

    CVE-2021-32305 Websvn RCE 简单分析

    #漏洞描述
    该漏洞源于没有对`search.php?search=`参数进行严格的过滤,导致参数被带入`prox_open`中执行,造成命令注入

    #影响版本
    “`
    WebSVN <= 2.6.1 ``` #环境搭建 本次测试是在vulfocus靶场上测试 可通过以下命令进行拉取docker ``` docker pull 1933pika/cve-2021-32305 docker run -d -p 80:80 1933pika/cve-2021-32305 ``` #漏洞分析 WebSVN源码:https://github.com/websvnphp/websvn/releases/tag/2.6.0 我们在`search.php`中搜索`search`参数,如下: ![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2370511/22536f2c-44e8-4b80-4cba-ca4fe9ba4e34.png) 会先判断`search`是否为空值,否的话参数会传入`

    元記事を表示

    PHPUnitでGeneratorをMockしたい場合ってどうすればよいの?

    こんにちは! @takoba といいます。インターネットと音楽とカレーライスを主にたべるぺちぱーです?
    現在は [コネヒト株式会社](https://connehito.com/) でサーバーサイドを主戦場にしたエンジニアとして働いています。 CakePHP を主に触っています〜〜?‍♀️

    このエントリは、 [PHP Advent Calendar 2021](https://qiita.com/advent-calendar/2021/php) の9日目のエントリです。
    8日目は @kubotak さんによる [PHPコードを消すライブラリを作った](https://tech.macloud.jp/entry/2021/12/08/000000) でした。

    ## 前提

    ### `Generator` is 何?
    cf. [PHP: ジェネレータとは \- Manual](https://www.php.net/manual/ja/language.generators.overview.php)
    > ジェネレータを使うと、foreach でデータ群を順に処理するコードを書くと

    元記事を表示

    鬼車(oniguruma)に困ってる人たちへ:Redhat8系 PHP install

    最近PHPをインストールすると鬼車にハマります。

    rpmからonigurumaをインストールする方法がありますが、
    remiリポジトリを入れれば簡単に解決出来ます。

    “`
    $ sudo yum install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

    remi-release-8.rpm 26 kB/s | 26 kB 00:01
    Dependencies resolved.
    =============================================================================================================================
    Package Architecture Version

    元記事を表示

    OTHERカテゴリの最新記事