20211123のPHPに関する記事は8件です。

いろいろな言語でAPIコールするよ!

導入 webAPIの叩き方を各言語でまとめました。 後で見返す用です。 2021年11月23日時点:Postリクエスト送信 json リクエストのサンプルパラメータ sample_endpoint = "http://localhost:8888/sample" sample_parameter = { "title": "トマトスープ", "making_time": "15分", "serves": "5人", "ingredients": "玉ねぎ, トマト, スパイス, 水", "cost": "450" } Curl curl --location --request POST 'http://localhost:8888/recipes' \ --header 'Content-Type: application/json' \ --data-raw '{ "title": "トマトスープ", "making_time": "15分", "serves": "5人", "ingredients": "玉ねぎ, トマト, スパイス, 水", "cost": "450" }' Go package main import ( "fmt" "strings" "net/http" "io/ioutil" ) func main() { url := "http://localhost:8888/recipes" method := "POST" payload := strings.NewReader(`{ "title": "トマトスープ", "making_time": "15分", "serves": "5人", "ingredients": "玉ねぎ, トマト, スパイス, 水", "cost": "450" }`) client := &http.Client { } req, err := http.NewRequest(method, url, payload) if err != nil { fmt.Println(err) return } req.Header.Add("Content-Type", "application/json") res, err := client.Do(req) if err != nil { fmt.Println(err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) return } fmt.Println(string(body)) } php <?php require_once 'HTTP/Request2.php'; $request = new HTTP_Request2(); $request->setUrl('http://localhost:8888/recipes'); $request->setMethod(HTTP_Request2::METHOD_POST); $request->setConfig(array( 'follow_redirects' => TRUE )); $request->setHeader(array( 'Content-Type' => 'application/json' )); $request->setBody('{\n "title": "トマトスープ",\n "making_time": "15分",\n "serves": "5人",\n "ingredients": "玉ねぎ, トマト, スパイス, 水",\n "cost": "450"\n}'); try { $response = $request->send(); if ($response->getStatus() == 200) { echo $response->getBody(); } else { echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' . $response->getReasonPhrase(); } } catch(HTTP_Request2_Exception $e) { echo 'Error: ' . $e->getMessage(); } python import requests import json url = "http://localhost:8888/recipes" payload = json.dumps({ "title": "トマトスープ", "making_time": "15分", "serves": "5人", "ingredients": "玉ねぎ, トマト, スパイス, 水", "cost": "450" }) headers = { 'Content-Type': 'application/json' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) これから getパラメータの記述方法なども追記していく
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Wordpressのphpファイルでfunctions.phpのショートコードを呼び出す方法【自分用メモ】

最近コーディングしているとphpファイル(category.phpやfunctions.php内など)でfunctions.phpにある関数を使いたくなるのでメモ。頻繁に使わないので書き方を忘れる上に検索すると違う記事ばかりでるので・・・ コード <?php echo do_shortcode('[ショートコードの文字列]'); ?> 引数に固定ページと同じショートコードを入力すれば大丈夫です。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPにおけるクラスの使い方

ここでは一般的なクラスやabstract、trait、interfaceなどの使い方をまとめたいと思います。 classの使い方 クラスは変数・定数やメソッドを一つにまとめたもの。 役割ごとにクラスを作り、そのインスタンスを使ってプログラムを動かすことをオブジェクト指向という。 class_example.php class Product{ //公開条件にはpublic、protected、privateがある。 // publicは外から使える→インスタンス後にアクセスできるということ // protectedは自分と継承先のクラスが使うことができる // privateはクラス内でしかプロパティやメソッドにアクセスできない→変数などはprivateが安全(外から書き換えられないから) // 変数 private $product = []; // 関数 // コンストラクトメソッドはクラスがインスタンス化される際に呼び出される // $thisはnewによりインスタンス化したオブジェクトを指す function __construct($product=null){ $this->product[] = $product; } public function getProduct(){ $products = $this->product; foreach($products as $product){ echo $product; } } public function addProduct($item){ $this->product[] = $item; } // staticはクラスメソッドを定義できる // Class::メソッド名()で使うことができる public static function getStaticProduct($str){ echo $str; } } $instance = new Product('インプット'); $instance->getProduct(); => 'インプット' $instance->addProduct('追加'); $instance->getProduct(); => 'インプット' => '追加' Product::getStaticProduct('静的'); => '静的' 継承 クラスは単一継承の機能を持ち、一つのクラスを継承できる。 親クラスの変数やメソッドなどを子クラスが使えるようになる。 class Parente{ protected $parentVariable = '親の変数です'; public function parentfunc(){ echo "親の関数です"; } } class Child extends Parente{ public function test(){ echo $this->parentVariable; } } $instance = new Child(); $instance->test(); => '親の変数です' // 変数のアクセス修飾子はprotectedなので継承先のクラス内でも使える $instance->parentfunc(); => '親の関数です' インターフェイス 継承先のクラスにメソッドの強要を行う。 インターフェイス内に書かれているメソッドは継承先のクラスで用いなければならない。 インターフェイスは中身のないpublicメソッドしか書けない、インスタンス化はできない。 継承方法はimplementsを使い、何個でも継承できる。 interface ExampleInterface{ // helloメソッドを継承先のクラスに置いて定義しなければエラーが出る public function hello(); } interface ExampleInterface2{ // goodMorningメソッドを継承先のクラスに強制 public function goodMorning(); } class Example implements ExampleInterface, ExampleInterface2{ public function hello(){ echo 'こんにちは'; } public function goodMorning(){ echo 'おはよう'; } } どんな時に使うのか謎ですが、何かソースコードをみながら理解を深めたいと思います。 抽象クラス 抽象クラスはクラスにインターフェイスの機能を持たせたようなクラス。(インスタンス化はできない) abstract class クラス名Abstractと定義する。 わかりやすいようにクラス名にAbstractとつける場合が多い。 メソッドの強制とメソッドを提供する。 メソッド定義の前にabstract public(protected) 〜とつけるとそのメソッドを継承先のクラスで強制する。 <?php abstract class ExampleAbstract{ protected $abstractVariable = '抽象クラスの変数です'; public function goodEvening(){ echo 'こんばんは'; } abstract protected function hello(); } class Example extends ExampleAbstract{ public function hello(){ echo 'こんにちは'; echo $this->abstractVariable; } public function goodMorning(){ echo 'おはよう'; } } $instance = new Example(); $instance->hello(); => 'こんにちは抽象クラスの変数です'; $instance->goodEvening(); => 'こんばんは'; トレイト クラスは単一継承のため、一つのクラスしか継承できませんが、トレイト何個でも継承することができるクラスのようなもの(インスタンス化はできない) trait トレイト名で使用する。 使うときは使いたいクラス内でuseする。 trait ExampleTrait{ protected $traitVariable = '抽象クラスの変数です'; private $traitPrivateVariable = 'トレイトのプライベート変数です'; public function hello(){ echo 'こんにちは'; } } trait ExampleTrait2{ public function goodEvening(){ echo 'こんばんは'; } } class Example{ use ExampleTrait; use ExampleTrait2; public function goodMorning(){ echo 'おはよう'; echo $this->traitVariable; echo $this->traitPrivateVariable; } } $instance = new Example(); $instance->goodMorning(); =>'おはよう抽象クラスの変数ですトレイトのプライベート変数です' trait内で定義したprivate変数もuse先のクラスで普通に使えました。。。 traitはとても使いやすそうな感じがしました。クラスを拡張してくれる感じで。 おわりに メソッドの強制などはどうやって使うのか謎が深まりましたが、とりあえずphpにおけるクラスの使い方をアウトプットしました。またクラス関係で学習したものはここに追記していく予定です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ScratchAPIが便利すぎる件について

はじめに 皆さ~ん!ScratchAPIって知ってますか?(唐突) ScratchAPIとは 普通のAPIって、APIキーとか認証とかが必要になってくるんですよ。 ですが、このScratchAPIは認証いらずで手軽に誰でも使えます! ただし、GET系のAPIしか使えません。 使ってみよう ScratchAPIはいくつかURLがあります。 素材(画像とかサウンドとか) http://assets.scratch.mit.edu/任意 ベーシックなAPI http://api.scratch.mit.edu/任意 プロジェクトの詳細(内容ブロックなど) http://projects.scratch.mit.edu/任意 使ってみよう! 実際にPHPで使ってみましょ~ね~ main.php <?php $json = file_get_contents("http://api.scratch.mit.edu/users/".$_GET["q"]."messages/count"); $json = json_decode($json, true); echo $_GET["q"]."の現在のメッセージ数は~...[".$json["count"]."]個だよ!"; ?> はい。URLパラメータの[q]で入力されたユザネを取得し、ソイツのめっさげ数を見るっていうやつですね。 結構Easyですよね(そもそもする事がEasyなのは気にしない☆彡) 他にもいろいろやることはあります。 詳しくはこの記事を見てみてください! 終わりに 結構簡単だったでしょ? ではでは~☆彡
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

$ npm run devでコンパイルしようとしたらSintax error

<エラー概要> ◉LaravelMix学習 表題の通り、上記コマンドでエラー発生 SyntaxError: Identifier 'mix' has already been declared <仮説> ◉コードを書き換える際に余分なコードを記載してしまった。 ◉エラー文よりすでに定義された変数や定数が再定義されている <解決方法> webpack.mix.js const mix = require('laravel-mix'); こちらのコードがなぜか二行書いてしまっており一行削除し解決に至りました。 エラー文の通り、 すでに定義mixという変数が再定義されているということでした。 <感想> 今回のエラーはエラー分をじっくり読めば解決できるものでした。 引き続き頑張ります! 補足アドバイスがあれば是非お願いいたします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

localhost:8000に接続できないエラー(404 Not found)

<エラー概要> ◉Laravel学習 http://localhost:8000/admin/profile/create に接続を試みるも、 404 Not found と出力されうまく実行できない。 <仮説/試したこと> ◉ルーティングの記述確認 php artisan route:list <原因/結果> admin/news/create admin/news/delete admin/news/edit →このようにprofileのルーティングが全くできていませんでした、、 route/web.php Route::group(['prefix' => 'admin'], function() { //ProfileController Route::get('profile/create', 'Admin\ProfileController@add'); Route::get('profile/edit', 'Admin\ProfileController@edit'); Route::post('profile/create', 'Admin\ProfileController@create'); Route::get('profile/index', 'Admin\ProfileController@index'); }); 上記のように追記し解決に至りました。 <感想>  「ルーティングはしっかり出来ているはず!」という謎の思い込みから解決に時間を要してしまいました。 自分を疑い続けることは大切だと再認識できました。 今週は学習が中だるみしてしまったので11月最後まで走りきります!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

IntelliJ IDEA / PhpStormとdockerのPHPでブレークポイントを使ってデバッグする方法

xdebug php.iniの設定例。 ; 以下の設定だと、IntelliJのRUNではxdebug.modeの設定が無しで実行されるのでmode=developとして実行され、 ; DEBUGではIntelliJ側でxdebug.mode=debugが設定されて実行されるのでブレークポイントが働くようになります xdebug.mode=develop xdebug.start_with_request=yes xdebug.client_host=host.docker.internal xdebug.client_port=9003 xdebug.log=/var/log/php/xdebug.log 上記はPHP8 xdebug3の設定です。 ※PHP7xdebug2だと設定キーと値が異なります Dockerの設定追加 Virtual machine pathとLocal Pathの対応が一致するように、Path mappingsも設定しましょう。例えばDockerの/var/www/abc.phpが、ホストの/Users/xxx/src/abc.phpと一致させるような設定です。 PHP CLI Interpreterの設定追加 PHP Remote Interpreterのプラグインが必要です。「...」をクリック。 Serverは先ほど追加したDockerを指定。今回はDocker Composeを使っているので、Configuration filesでdocker-compose.ymlを指定。ServiceにはPHPが動作するサービスを指定します。 Runを実行してみる 試しにLaravelのartisanを実行。 artisanの標準出力を確認できればRemote Interpreterの設定は問題ないです。DockerのPHPで実行できてます。 ブレークポイントを設定して、Debugを実行しても止まらない Start Listening for PHP Debug ConnectionsでListening状態にします。緑色になっていればOK。 artisanの最初の行でブレークポイントを設定して、Debugを実行してみます。 しかし、ブレークポイントで停止せず、以下のエラーが表示されました。 Connection was not established. Probably 'xdebug.remote_host=host.docker.internal' is incorrect. Change 'xdebug.remote_host' IntelliJ IDEA側の実行ログを見ても-dxdebug.client_host=host.docker.internalがあるのですが、incorrectと表示されます。 エラーを回避するため、設定を加えます。 デバッグ実行できるよう設定を追加 php実行側の接続先の名称と、IntelliJ IDEA / PhpStormの名称を揃えて、一致させるような設定です。 名称を「laravelproject-php-xdebug-server」とします。 環境変数PHP_IDE_CONFIGの設定 docker composerの設定例です。 version: "3" services: laravelproject-php-xdebug: environment: PHP_IDE_CONFIG: "serverName=laravelproject-php-xdebug-server" IntelliJ IDEA / PhpStormのPHP Serversの設定 Serversに「laravelproject-php-xdebug-server」を追加。path mappingsも設定します。 PHP CLI InterpreterにConfiguration Optionsを追加 以下設定を加えておかないと接続が不安定なので追加します。 -dxdebug.client_port=9003 -dxdebug.client_host=host.docker.internal DEBUG実行時に、xdebug.client_portは9000で勝手にセットされるみたいで9003を別途設定しています。xdebug.client_hostもhost.docker.internalで自動セットされるので不要っぽく見えるのですが、なぜか無いと接続できない時があってその原因がわかってないので、とりあえず追加しています。 改めて、ブレークポイントを設定して、Debugを実行 無事、停止されました。 dockerのbashからデバッグ実行する dockerのシェルからデバッグを開始したい場合。 # -dxdebug.mode=debugを追加してphpを実行 $ PHP_IDE_CONFIG=serverName=laravelproject-php-xdebug-server php -dxdebug.mode=debug artisan php.iniでxdebug.mode=developにしているため、debugを指定しました。 IntelliJ IDEA / PhpStormからPHPUnitをデバッグ実行する Test Frameworksを追加します。Test RunnerのDefault configuration fileは、virtual側のパスでphpunit.xmlを指定します。 PHPUnitのTestファイル開いて、「>>」の「Debug〜」からDEBUGを実行します。 ブレークポイントも動作しています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Composer基礎的な知識

Composer 忘備録です。 ほぼ、公式からの拝借です。 composer.json プロジェクトの依存関係が記述されており、他のメタデータも含まれている場合があります。通常、プロジェクト/ VCSリポジトリの最上位ディレクトリに配置する必要があります。(Packagistに上げなければ、最上位じゃなくても問題はない) require * 探して依存関係を解決してダウンロード、インストールする * Composerはこの情報を使用して、 repositories キーを使用して登録したパッケージ「リポジトリ」、またはデフォルトのパッケージリポジトリである Packagist.org で 適切 なファイルのセットを検索します。上記の例では、composer.jsonファイルに他のリポジトリが登録されていないため 、monolog/monologパッケージがPackagist.orgに登録されていると想定しています。 { "require": { //パッケージ名: バージョン "monolog/monolog": "2.0.*" } } パッケージ名 基本的にベンダー名/パッケージ名である。 パッケージ名が被っても、ベンダー名で差別化できる composer.lock composer.lockには、インストールしたパッケージ情報が記載されてます。 composer update Composer.jsonにパッケージを追加した際には、composer updateを実行させます。追加したパッケージがインストールされcomposer.lockも更新されます。 バージョン指定が〜以上と曖昧な指定の場合はupdateするとメジャーアップデートも含まれる可能性がある為、安易にupdateしてはいけない。 Composerは次の2つのことを実行します。 composer.jsonファイルにリストされているすべての依存関係を解決し、すべてのパッケージとその正確なバージョンをファイルに書き込みcomposer.lock、プロジェクトをそれらの特定のバージョンにロックします。composer.lockプロジェクトで作業しているすべての人が同じバージョンの依存関係にロックされるように、ファイルをプロジェクトリポジトリにコミットする必要があります 暗黙的に install コマンドを実行します。これにより、依存関係のファイルがvendorプロジェクトのディレクトリにダウンロードされます。(vendor ディレクトリは、プロジェクト内のすべてのサードパーティコードの従来の場所です) composer install composer installを実行するとcomposer.lockに基づいてパッケージをインストールします。初回はcomposer.lockがないので、composer.jsonに基づいてcomposer.lockが作成されたうえでパッケージがインストールされます。 composer.lock vendor(ダウンロードしたライブラリ群)が作成される。 vendorフォルダ vendorフォルダにはインストールしたパッケージが格納されます。 vendorフォルダ配下にあるautoload.phpをプログラムで読み込むだけでライブラリを利用することができます。 オートロード Composerは、オートロード機能(自動でクラスファイルを読み込む機能)を提供しています。オートロード機能には、psr-4 classmap filesといった方法があります。 PSR-4(名前空間) psr-4では、「名前空間」と「composer.jsonの存在するディレクトリからの相対パス」の対応付けを行います。下記例では、Appから始まる名前空間のクラスへアクセスした際に、appディレクトリ配下から対応するクラスファイルを探してロードします。 "autoload": { "psr-4": { "App\\": "app/" } }, autoloadセクションを編集した場合、下記コマンドを実行して変更を反映させる必要があります。 composer dump-autoload
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む