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

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

switch文[PHP]

#switch文をPHPで書く
if, elseifによる分岐が多く複雑な場合、switch文で書き換えるとシンプルで読みやすいコードにできる。switch(式)の(式)がcaseの値と一致したとき、そのブロックが実行される。caseのどれにも一致しなかった時、defaultのブロックが実行される
![1470803893312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/5389320a-d636-b5c6-e282-d7765e74b862.png)
##break
break命令は現在のブロックから脱出するための命令。break命令がないと、後ろに続くcaseブロックが続けて実行されてしまう

“`

switch($remainder) {
case 0:
echo “大吉です。”;
break;

case 1:
echo “中吉です。”;
break;

元記事を表示

Xdebug3.0.0がリリースされたので、ver2からの雑なコンバート

### Xdebug 3.0.0 is out!
11/25に[Xdebug 3.0.0 is out!](https://xdebug.org/announcements/2020-11-25)されたわけですが、`pecl install xdebug`と記載していて、まんまと勝手にver3がインストールされてしまい、まんまと以前の設定で動かず焦っている今日この頃ですが皆さんいかがお過ごしでしょうか?

そんなわけで、私が使用している設定をコンバートし、ひとまず変更を加えて動くところまで雑にやって、雑にまとめました。

### mode設定
ver2.x系でとりあえずステップデバッグを使うためには、下記の設定を行っていたと思います。いや、むしろこれがほぼすべてと言ってもよいくらい。

“`ini
xdebug.remote_enable=1
xdebug.default_enable=0
xdebug.profiler_enable=0
xdebug.auto_trace=0
xdebug.coverage_enable=0
“`

ver3.x系では

“`ini
xdebu

元記事を表示

【ajax】本番環境で謎の403エラー

## 環境
– Laravel 8系
– PHP 7.4
– appache

## 実装したいこと
ajaxを使用して非同期でPATCH処理を行いたい。

## 本題
“`javascript

$.ajax({
type: ‘PATCH’,
url: ‘/hoge_update’,
headers: {
‘X-CSRF-TOKEN’: $(‘meta[name=”csrf-token”]’).attr(‘content’)
},
data: {
id: id,
item: item,
},
dataType: ‘json’,
}).done(function (data) {
“`
こんな感じで非同期でPATCH処理を実装しようと思ったら、本番環境で `403 Forbidden`エラーが。

調べてみるとどうやらapache側で許可されているのが `GET` `POST`のみみたい(詳細は[こちら](https://qiita.com/koyablue/items/

元記事を表示

Requestは、ただのバリデーションファイルじゃない【2020/11/26】

今まで僕は、LaravelのRequestファイル(ex userRequest.phpとか)は、バリデーションをするためにあるファイルだと思っていました。しかし、バリデーション機能はどちらかとういうとおまけ。

– △ バリデーション機能
– ◯ データを保持するオブジェクト + おまけでバリデーション

だった。

strutsでいう、ActionFormに一番近い(懐かしいな)。
ここからフォームやクエリパラメータに突っ込んだデータを取り出してくる。

だから、Controllerファイルの中で、

“`php:xxxController.php
$this->all()
“`
でデータとれるのはもちろん、

“`php:xxxRequest.php
$this->all()
“`

と、Requestファイルの中でも普通に`$this`でデータが取れる。

バリデーションしているだけなのになんで`Request`ファイルなのか疑問だったけど、get/postの`リクエスト`を受け取っている紛れもないファイルだった。

フレームワーク作る人って、すごいな。

元記事を表示

PHP: Google Cloud Translation API の使い方 (Basic)

“`php:basic01.php
#! /usr/bin/php
translate($text, [
‘target’ => $targetLanguage,
]);
print(“Source

元記事を表示

[PHPUNIT]setupメソッド使用時のよくあるエラー

laravelのphpunitでsetUp()メソッドを定義したところ、エラーが出て詰まったので共有します。

#現状
“`php:.php
class …Test extends \TestCase
{
public function setUp()
{

}
}
“`

#エラー文
“`
PHP Fatal error: Declaration of W3\Controllers\…Test::setUp() must be compatible with Illuminate\Foundation\Testing\TestCase::setUp(): void in
“`
作成したテストのsetUp()の返り値と自動で作成されるIlluminate\Foundation\Testing\TestCase
のsetUp()の返り値が違うことでした。

#解決策
“`php:.php
class …Test extends \TestCase
{
public function setUp():void

元記事を表示

LaravelのKernel.phpのscheduleメソッド内でcommandを使ってハマった件

## PHPとLaravelのバージョン

– Laravel Framework 5.7.28
– PHP 7.3.11

## 出ていたエラー
“`
ERROR: Aborted. {“exception”:”[object] (Symfony\\Component\\Console\\Exception\\RuntimeException(code: 0): Aborted. at /home/hoge/hoge/hoge_api/vendor/symfony/console/Helper/QuestionHelper.php:135)
“`

“`
{“exception”:”[object] (Symfony\\Component\\Console\\Exception\\CommandNotFoundException(code: 0): Command \”hoge\” is not defined.
“`

## 書いていたコード

app/Console/Kernal.php

“`
protected function schedule(Sche

元記事を表示

PHPを深くまでしろう part1~言語構造編~

# はじめに

最近、同年代の最強エンジニア方からいろいろなアドバイスを頂いているのですがその中で言語の言語仕様そのものについて深く知ることが重要と言われてから自分がよくPHPを使用しているので今一度PHPについて深く勉強しようとした記録です。

# 言語構造

PHPでよく使うechoやprintなどは関数ではなく言語構造と言われているのですが、そのことについて全然違いを理解していなかったので調べてみました。

“`php

if (式) {
}
“`
上記のif文は()の中に式をいれることにより条件に一致する場合は{}の中が実行されます。

“`php

if (1 === 1) {
echo ‘ok’;
}
// とか
if ($result = ‘hello’) {
echo ‘ok’;
}
“`
など、他にも沢山の方法があります。
()の中には式を入れるのですが、式とはどういったことを指すの言葉なのでしょうか?
簡潔にいうと、
> PHPにおける式とは、値を持つものすべてのこと

このことを踏まえて、最初の話に戻るのですが、echoは言語構造なので()

元記事を表示

レンタルサーバーのPHPのセッション時間を伸ばす【結果確認中】

#目的
レンタルサーバーmixhost上でのセッション時間を伸ばす
php.iniのsession.gc_maxlifetimeを伸ばしたが変化なし

#参考
[セッションの有効期間とか設定とか挙動とかを調べました](http://pentan.info/php/session_gc.html)
[]()

#仮説
セッションファイルはレンタルサーバーの共有フォルダにありそうなので他のユーザのアクセスで消される可能性がある
※下記の記事より仮説は正しそう
[https://webmaster.chielog.com/php/161.html](https://webmaster.chielog.com/php/161.html)

#やったこと
セッション時間設定の延長(php.iniのsession.gc_maxlifetime)とともに、セッションファイルの保存場所を変更した
MultiPHP INI Editorに設定(session.save_path)があるので変更

#結果
セッション時間が延長された

元記事を表示

PHPで作る二段階認証

# はじめに
 PHPに限らず、Webアプリケーションを作る際に、何らかの”本人確認”的なことをしたい場面があると思います。事前に登録されたユーザ情報と照らし合わせるとかでいいと思うんですが、もうちょい手軽にできる一例を紹介したいと思います。それが、メールと組み合わせた2段階認証です。
 この手法は、[PHPで敷居の高い掲示板を作ってみた](https://qiita.com/mimuro_syunya/items/9d7135e99bab105cbcc0)に使ったもので、Tokenというランダムな文字列を合言葉にして、メール宛てにその合言葉を送ることで、2段階認証をするものです。つまり、「メールアドレス=身分証明」的な扱いをしているという事です。

※この手法の欠点としては、そもそも”メール=本人”ではないこと。メールで認証したから必ず本人とは限らない。

# 概要
 この仕組みの概要としては、

1. サーバーでtokenを作り、token.txtに保存する
2. メールにurl(token付き)を送信
3. 確認画面でtoken.txtの内容と、urlについたtokenを確認する

元記事を表示

【CakePHP】フォーム内のhiddenに配列を設定し、コントローラーで受け取る方法

##実現したかったこと

hiddenに配列をもたせて、コントローラー側で取得する。

##改善前

“`php:cakeのビュー側
Form->hidden(‘hoge’,array(‘value’ => 1)); ?>
Form->hidden(‘hoge’,array(‘value’ => 2)); ?>
Form->hidden(‘hoge’,array(‘value’ => 3)); ?>
“`
クロムの検証ツールで覗いてみる

“`html



“`

よし、いい感じ。

コントローラー側で受け取れているか見てみる。

“`php:コントローラー側のアクションの中で実行

print_r($t

元記事を表示

シングルアクションコントローラーをLaravelで採用した際にInvalid route actionが出た件

##はじめに
最近、アプリケーションアーキテクチャに興味を持ち、実際にLaravelでADR(Action Domain Responder)を試しています。Laravelは自由度が高いのでアーキテクチャ次第で全く違ったものになるという印象を受けています。
ADRには、1つのアクションとルートを対応させる事で複雑化を防ぐという思想があり、シングルアクションコントローラー(実際は、Action)を採用しました。(他にもメリットがあるかは勉強中です…)

##ルートが認識されない
公式を見つつシングルアクションクラスとルートを作成しました。

“`php:BookRegisterAction.php

元記事を表示

Composerがインストールできない環境でComposerを使用したい時

PHPでシステムを組むときにComposerを使うかと思いますが、
レンタルサーバーだったり、権限がなかったりと、Composerをインストールできないときがあると思います。

その場合、以下手順でComposerのコマンドを叩けます。
※既にローカル環境などで開発していて、composer.jsonがある前提です。
– – –
まずはcomposer.jsonがあるフォルダに移動します。

次にcomposer.pharというComposerを叩くためのファイルを落としてきます。

“`
curl -sS https://getcomposer.org/installer | php
“`
あとは以下で叩けます。

“`
php composer.phar install
“`

update

“`
php composer.phar update
“`

composer

php composer.phar
に置き換わった感じですね。

元記事を表示

Laravel で Target class [Controller] does not exist.が出た時の対応

# 事象
最近のLaravel (多分v8以降とかそのあたり)では、初期状態で以下のようなコードをroutes/web.phpに記述すると、あるはずのController Classを見つけられずエラーが発生する。

“`php
Route::get(‘/hoge’, ‘Controller@index’);
“`

“`
Illuminate\Contracts\Container\BindingResolutionException
Target class [Controller] does not exist.

http://laravel.internal/hoge

Illuminate\Container\Container::build
htdocs\laravel\vendor\laravel\framework\src\Illuminate\Container\Container.php:811
“`

どうやらContollerの初期位置を見失うようになったらしい。

# 対応

App/Providers/RouteServiceProvider.

元記事を表示

MAMPが起動できない時のエラー解除方法

Apache couldn’t be started because port 8888 is in use by some other software.

というエラーが出て、MAMPがスタート出来なかったので調べていたところ、

https://qiita.com/xiaoxiao/items/9e5686a4b02b34929c8b

こちらの方の記事を見たら解決出来ました。

実際に実行したことは、

1、ターミナルのホームディレクトリで、以下コマンドを入力。
“`$ sudo lsof -i -P | grep “LISTEN”
“`

2、ポートの状態が一覧で表示
  ※8888が使われているものを見つける。

3、以下のコマンドで8888を削除
“`$ kill -9 XXXX“`(XXXXは該当する番号を入力)

4、もう一度 1、と同じコマンドで状態を確認すると、
  8888を使っていたものが削除されていました。

5、その後、MAMPを起動してみると無事に起動出来ました。

元記事を表示

Centos7にてcomposer installを行うと「Your requirements could not be resolved to an installable set of packages.」と怒られた

## なにが起こったか
Centos7に運用中のLaravelプロジェクトをクローンしてcomposer installしたらコケた。

“`
$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Your requirements could not be resolved to an installable set of packages.

Problem 1
– Installation request for php-di/invoker 2.1.0 -> satisfiable by php-di/invoker[2.1.0].
– php-di/invoker 2.1.0 requires php >=7.3 -> your PHP version (7.2.28) does not satisfy that requirement

元記事を表示

Symfonyの認可について

# 初めに

`User`に紐づいた`Post`エンティティがあったとき「自分の所有する`Post`以外は見れない」という用件を達成するにはどのような実装方法があるか、という話です。

# 最も単純な方法

最も単純な方法は、コントローラーでログインしている`User`の`Post`かどうか判断する方法です。特に難しいこともありません。
が、しかし、 アクセス権を確認する際に同じようなコードが至る所に出てきてしまうことが容易に想像できます。

“`php
/**
* @Route(“/{id}/detail”, name=”post_detail”)
*/
public function edit(Post $post)
{
$user = $this->getUser();
if ($post->getUser() !== $user) {
throw $this->createAccessDeniedException();
}

}

元記事を表示

PHP8をWindows10にインストールする

PHP8をWindows10にインストールします。64bit版

## Visual C++ 2015-2019 再頒布可能パッケージのインストール

PHP8を動かすには、**Visual C++ 2015-2019 再頒布可能パッケージ** のインストールが必要です。
事前にインストールしてください。

直リンク:https://aka.ms/vs/16/release/vc_redist.x64.exe
公式ヘルプ:https://support.microsoft.com/ja-jp/help/2977003/

## PHP8 のダウンロード

PHP公式サイトから、PHP8 をダウンロードする。

https://windows.php.net/download/

いろいろありますが「**VS16 x64 Thread Safe**」のzipファイルを選択します。
解凍したら、今回は“C:/php“に配置するとします。

## php.ini の設定
PHPの設定ファイルを編集します。

PHPフォルダにある“php.ini-development“を複製し、“

元記事を表示

Ubuntu Nginxでwordpressの環境構築

wordpress環境構築の為に、AzureでVM作成してサーバーを立てました。

サーバのOSはUbuntu 18.04.5 LTSです。

レンタルサーバーなどを使用すれば簡単にできるwordpress環境構築ですが、1からwordpressの環境を構築したら結構難しかったので、やり方をまとめました。
#UbuntuにwebサーバーNginxをインストール
ApacheかNginxかで迷いましたが今回はNginxを使用しました。

まずは、インストール可能なパッケージの「一覧」を更新し、nginxをインストールする下記コマンドを実施。

ちなみに、apt-getコマンドは、Debian系のディストリビューション(DebianやUbuntu)のパッケージ管理システムであるAPT(Advanced Package Tool)ライブラリを利用してパッケージを操作・管理するコマンドです。

centOSの場合は、apt-getの代わりにyumコマンドが使えます。

“`
# apt-get update
# apt-get install nginx
“`

Nginxがインストー

元記事を表示

PHPでの基本的なこと (2)

備忘録代わりにまとめる
毎回文末の;を忘れそうになる

#if文
###if
if文は if(条件式){真だった場合}と表記する

“`php
$code = “Qiita”;

if ($code == “Qiita”){
echo “$code は \”Qiita\””;
}
// Qiita は ”Qiita”
“`

###else
elseを含んだif文は if(条件式){真だった場合}else{偽だった場合}と表記する

“`php
$code = “Ooita”;

if ($code == “Qiita”){
echo “$code は \”Qiita\””;
}else{
echo “$code は \”Qiita\” ではない”;
}
// Ooita は “Qiita” ではない
“`

###else if
else ifを含んだif文はif(条件式1){条件1が真だった場合}else if(条件式2){条件式2が真だった場合}else{すべて偽だった場合}と表記する

“`php
$code = “Ooita”;

if ($

元記事を表示

OTHERカテゴリの最新記事