- 投稿日:2020-10-22T23:27:30+09:00
WordPress 5 のテーマエディターで .php 編集がエラーになる
WordPress はテーマエディターで CSS や HTML テンプレートを編集できるが、
WordPress 4.9 以降は .php ファイルの編集がエラーになるらしい。致命的なエラーをチェックするためにサイトと通信できないため、PHP の変更は取り消されました。SFTP を使うなど、他の手段で PHP ファイルの変更をアップロードする必要があります。
「file.php の○〜○行目をコメントアウトする」という対策があるらしい。
広い範囲をコメントアウトするのは面倒なので、if
文の条件を変えて対応してみた。変更前
if ( $is_active && 'php' === $extension ) {変更後
if ( $is_active && 'php__IGNORE__' === $extension ) {コメントアウトしなくても、条件が偽になれば実行されないので、何でも良さそう。
無事にファイル編集も成功しました。とても正しい対策手順とは思えないけど、管理画面のセキュリティの懸念がない環境なら、これでも良いだろう。
- 投稿日:2020-10-22T23:24:33+09:00
ラッコはフィルタリング(CakePHP)がわからない#1
IT業界に漂流し、なんとか半年間エンジニアとして生きてます。オッターです。
業務の中でわからなかったことを、ドキュメントなどを読んで自分なりに噛み砕いていくつもりです。
今回は業務でこんな関数を見かけてわからんかったのでググってみたよ。
public function beforeFilter(Event $event){・・・ }CakePHPのbeforeFilter()is何???
まずはドキュメント
コントローラーの各アクションの前に発動する Controller.initialize イベント中に呼ばれます。アクティブなセッションのチェックや、 ユーザーの権限の調査に適した場所です。
ふむ?APIの方で関数の説明を見てみた
コントローラアクションの前に呼び出されます。この方法を使用して、コンポーネントを構成およびカスタマイズしたり、各コントローラーアクションの前に実行する必要のあるロジックを実行したりできます。
要はbeforeFilterって名前をつけてやるとコントローラーのアクション(そのコントローラーで定めた関数とか?)の前に実行してくれるってわけだ。
TableRegistryとかで使うテーブルをそのコントローラーの変数として定義したりするinitializa中に呼ばれる、と
ふむふむHTTPリクエストのライフサイクル(流れとかフェーズとかそんな感じ)要所要所で呼び出せるようにCakePHPが用意したリクエストライフサイクルコールバックの一種なんだってさ。へ〜
https://book.cakephp.org/3/ja/controllers.htmlじゃあフィルタリングって何よ???
せっかくなので通信の勉強もしましょうってことでググりました
フィルタリングって用語自体は、「通すべきものかどうか判断すること」だと
ふむ?ではbeforeFilterのフィルターは?クライアントからきた情報を通すか通さないか判断する処理ってことなのだろうか...
とりあえず今日はここまで
- 投稿日:2020-10-22T22:49:53+09:00
phpで連想配列からキーを指定して特定のカラムの値のみを返す
連想配列で特定のカラムの値をkeyにして単一のカラムの値をvalueにしたい場合、別の配列を用意しそこにループ処理で値を詰め直すということをやっていました。
ループ処理を用いたやり方
<?php $foods = array( array( 'id' => 1, 'name' => 'Sushi', 'country' => 'Japan', ), array( 'id' => 2, 'name' => 'hamburger', 'country' => 'America', ), array( 'id' => 3, 'name' => 'Pasta', 'country' => 'Italia', ) ); ?>この配列のidをkeyにnameをvalueにします。
<?php $foods_menu = array(); foreach($foods as $key => $food){ $id = $food['id']; $name = $food['name']; $food_menu[$id] = $name; } ?>こんな感じで毎度ループを回してました。
けれどarray_column関数を使えば毎度ループを回すことなく同じことが実現できます。
array_columnを用いたやり方
<?php $foods_menu = array_column($foods,'name','id'); ?>第一引数に対象の配列、第二引数にvalueにしたいカラム、第三引数にkeyにしたいカラムを指定することで実現できます。
(第三引数を指定しなければ0からkeyが割り当てられます。)便利なのでぜひ。
- 投稿日:2020-10-22T22:49:53+09:00
phpで連想配列から特定のカラムの値をkeyとvalueに指定して返す
連想配列で特定のカラムの値をkeyにして単一のカラムの値をvalueにしたい場合、別の配列を用意しそこにループ処理で値を詰め直すということをやっていました。
<?php $foods = array( array( 'id' => 1, 'name' => 'Sushi', 'country' => 'Japan', ), array( 'id' => 2, 'name' => 'hamburger', 'country' => 'America', ), array( 'id' => 3, 'name' => 'Pasta', 'country' => 'Italia', ) ); ?>この配列のidをkeyにnameをvalueにします。
ループ処理を用いたやり方
<?php $foods_menu = array(); foreach($foods as $key => $food){ $id = $food['id']; $name = $food['name']; $food_menu[$id] = $name; } ?>こんな感じで毎度ループを回してました。
けれどarray_column関数を使えば毎度ループを回すことなく同じことが実現できます。
array_columnを用いたやり方
<?php $foods_menu = array_column($foods,'name','id'); ?>第一引数に対象の配列、第二引数にvalueにしたいカラム、第三引数にkeyにしたいカラムを指定することで実現できます。
(第三引数を指定しなければ0からkeyが割り当てられます。)便利なのでぜひ。
- 投稿日:2020-10-22T22:28:49+09:00
stripe決裁機能の実装
stripeの決済機能(checkout)を実装したやり方を紹介します。
調べた結果のメモです。ファイル構成
- index.php
- charge.php
- composer.json
- composer.lock
- .envcomposer.jsonとcomposer.lockはライブラリをインストールすると自動で作成されます。
index.phprequire '../../vendor/autoload.php'; //サーバー用 // require_once 'vendor/autoload.php'; //ローカル用 $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); $data_key = getenv('data_key'); ?> <!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <title>PHP Stripe Sample</title> <body> <form action="./charge.php" method="post"> <script src="https://checkout.stripe.com/checkout.js" class="stripe-button" data-key="<?php echo $_ENV['data_key'] ?>" data-amount="100" data-locale="ja" data-currency="jpy" > </script> </form> </body> </html>]charge.phprequire '../../vendor/autoload.php'; //サーバー動作用 //require 'vendor/autoload.php'; //ローカル動作用 //API keyの読み込み $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); $API_KEY = getenv('API_KEY'); \Stripe\Stripe::setApiKey($_ENV['API_KEY'] ); $token = filter_input(INPUT_POST, 'stripeToken'); $email = $_POST['stripeEmail']; try { if(!is_string($token)){ throw new Exception('文字列以外のトークンが指定されました'); } // 顧客情報をstripeダッシュボードへ保存 $customer = \Stripe\Customer::create(array( 'email' => $email, 'description' => "サンプルの課金処理" )); $charge = \Stripe\Charge::create(array( "amount" => 100, "currency" => "jpy", "source" => $token, "description" => "サンプルの課金処理" )); } catch(\Stripe\Error\Card $e) { echo "ERORR:" . $e->getMessage(); exit; } header("Content-type: text/html; charset=utf-8"); echo "決済が完了しました<br>"; echo "ID:" . $charge->id . "<br>";
.envファイル
#index.phpで使用 data_key = "pk_xxxxxxxxxxxxxxxxxxxxxx" //stripeのアカウントで取得して下さい #charge.phpで使用 API_KEY = "sk_xxxxxxxxxxxxxxx" //stripeのアカウントで取得して下さい1.サーバー環境でのcomposerのインストール
ターミナル(コマンドプロンプト)を起動してssh接続でサーバーにします。
※私はさくらレンタルサーバーを使用していましたssh アカウント名@ドメイン名を入力してログインします。
2.composerをインストールcurl -sS https://getcomposer.org/installer | phpstripeをサーバー上でインストールします。いろいろ試しましたが、下記が正解でした。
php composer.phar require stripe/stripe-phpつづいて.envファイルを読み込むためのライブラリを追加します。
php composer.phar require vlucas/phpdotenvこれで準備は完了です。
ここから解説します。charge.phpのファイルの以下の部分でstripeライブラリを読み出します。
require '../../vendor/autoload.php';
ローカル環境と違って、サーバー上ではcomposerがインストールされた階層が分かりにくいのでいろいろ試した結果、このようになりました。
.envファイルはAPI keyを保護するためのファイルです。API keyを直接コードに記載するのではなく、外部ファイルに保存して読み込むというやり方を利用します。以下の部分が.envファイルの読み込み動作です。$dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); $API_KEY = getenv('API_KEY');
ところが、最初はうまく.envファイルのkeyが読み込めませんでした。$_ENV[ ]を利用すれば、読めるようになって次のように記載しています。\Stripe\Stripe::setApiKey($_ENV['API_KEY'] );
最初に作ったコードで決裁自体は可能でしたが、誰が決済したのかわからないという問題があったので、コードを少し見直しました。それが以下の部分です。$email = $_POST['stripeEmail']; $customer = \Stripe\Customer::create(array( 'email' => $email, 'description' => "サンプルの課金処理" ));これでstripeダッシュボードに決裁者のメールアドレスと購入商品が記載されます。
- 投稿日:2020-10-22T22:14:50+09:00
Laravel:バリデーションをスマートかつ、任意メッセージを作成
【概要】
1.結論
2.どのようにコーディングするか
3.開発環境
1.結論
FormRequestを作成し、rulesに検証ルールを用いて、messagesメソッドで任意のメッセージを記載する!
2.どのようにコーディングするか
まずFormRequestを作成します。
php artisan make:request HogeRequest
なぜFormRequestを作成するのかというと、その方が機能としてスマートだからです。Controllerにも記載することは可能ですが、コントローラーはViewやModelに指示を送る橋渡し役がメインになります。バリデーションをする役目ではなく、クライアントからリクエストされた際にリクエスト内部でバリデーションの機能を実行した方がスマートだからです。
上記で作成した後にControllerに下記の記載を忘れないでください。
app/HttpControllers/HogeController.phpuse App\Http\Requests\HogeRequest;このように記載しないと下記に記載するHogeRequest.phpが機能しません。
app/Http/Requests/HogeRequest.php<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class HogeRequest extends FormRequest { public function authorize() #---❶ { if ($this->path() == 'hoge') #---❷ { return true; }else{ return false; } } public function rules() #---❸ { return [ 'name' => 'required', 'mail' => 'email', 'age' => 'numeric|between:0,150', ]; #---❹ } public function messages() #---❺ { return [ 'name.required' => '名前は必須です', 'mail.email' => '適切なemailを入力してください', 'age.numeric' => '年齢は整数で入力してください', 'age.between' => '適切な値を入力してください' ]; #---❻ } }❶:authorizeで、FormRequestが許可されているかどうかチェックします。
❷:アクセスしたパスをチェックしています。hoge以外は通さないようにしています。
❸:rulesで、バリデーションの機能を果たしています。
❹:blade.php(view)におけるname要素(name,mail,age)を指定し、検証ルール(required,email,numeric|between)に則ってコーディングしています。
❺:FormRequestのmessagesメソッドをオーバーライドしています。つまり親クラス(FormRequest)のメソッドを子クラス(HogeRequest)で再定義しています。記述していないルールがあった場合は親クラスがそのままレンダリング(英語表記)されます。
❻:❹と同じようにコーディングします。その際に'name要素.検証ルール(❹で設定したルール)' => '任意のメッセージ'を記載すると、アプリ制作者が意図したメッセージを表示できます。
3.開発環境
PHP 7.4.10
Laravel 8.9
- 投稿日:2020-10-22T21:19:04+09:00
Laravelで日本語化
はじめに
Laravelバージョン5,6,7で対応。
ログイン画面、エラーメッセージなどを英語表記から日本語表記へ変更する。app.phpの記述を変更
config/app.php'locale' => 'en', // 変更 'locale' => 'ja',GitHubで日本語化ファイルをダウンロード
こちらからダウンロード。
Code(緑色のアイコン)
→Download ZIP
でダウンロードできる日本語化ファイルを配置
1.ダウンロードしたファイルを解答し、開く。(ファイル名:lang-master)
2.
src
フォルダ内のja
フォルダをプロジェクト内のresoueces/lang
フォルダ直下に配置。3.
json
フォルダ内のja.json
ファイルをプロジェクト内のresoueces/lang
フォルダ直下に配置。上記のように配置されていればOK!
- 投稿日:2020-10-22T15:15:32+09:00
テーブル定義変更にて、composer require doctrine/dbal 失敗!
Laravelを使って作業中tableに仕様変更が入った!
とあるカラムをnullable()にするとのこと...
テーブルの再定義すりゃええんやねぇ〜(余裕余裕)...
?あれ。で、できない...
作業フロー
①テーブル再定義のmigrationファイル作る
php artisan make:migration ModifyProjects②migrationファイルを書いてゆくーー
//①で作ったmigrationファイル public function up() { Schema::table('変えたいカラムがあるテーブル名', function (Blueprint $table) { $table->integer('変えたいカラム名前')->nullable()->change(); }); }③ターミナルにて以下のコマンド実施
※これを入れることで『->change()』が使える様になる!composer require doctrine/dbalあ、あれ?エラー出るんだが... (o_o)/ンゴォ
※これがスムーズに入れば超簡単な作業ゾエラー①
mmap() failed: [12] Cannot allocate memory mmap() failed: [12] Cannot allocate memory PHP Fatal error: Out of memory (allocated 400556032) (tried to allocate 1359872 bytes) in phar:///usr/local/bin/composer/src/Composer/Util/RemoteFilesystem.php on line 462 Fatal error: Out of memory (allocated 400556032) (tried to allocate 1359872 bytes) in phar:///usr/local/bin/composer/src/Composer/Util/RemoteFilesystem.php on line 462ふむふむ。。。
メモリがどーのこーの言われてんなぁ。
(エラー文コピペでググる!)swapファイル2GB作れば行けそうやなぁ...
※主は1GBずつチマチマ作ります...//一気に2GB作る sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile //正常にできてるか確認 free -h total used free shared buff/cache available Mem: 983M 109M 72M 32K 801M 732M Swap: 2.0G 0M 2.0G //できてる!!!!!!はーいもうできるンゴ!(慢心)
※結果から言うとまだできないよ!//慢心で打ちました。 composer require doctrine/dbalエラー②
PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223 Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223 Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.[ec2-user@ip-172-31-35-16 paylove]$ php -r "echo ini_get('memory_limit').PHP_EOL;"さっきとちょっと違うエラーだね!
このエラーは親切なことに一番下に『Check』とリンク貼ってくれてる!///リンク踏むと解決方法出てくる! php -r "echo ini_get('memory_limit').PHP_EOL;" sudo vi /etc/php.ini ↑このファイルの中身書き換える//php.iniの中 ; Maximum amount of memory a script may consume (128MB) ; http://php.net/memory-limit ;memory_limit = 128M memory_limit = -1これでできるはず!
composer require doctrine/dbalおし!入った!
④migrateしていくヨーーン
php artisan migrate
てな感じでテーブルの定義変更できましたぁ〜(@0@)///
- 投稿日:2020-10-22T12:09:29+09:00
config内で連想配列を参照,変更する場合
config/○○.php'hoge' => [ 'id' => env('KEY'), 'secret' => env('SECRET'), 'redirect' => env('CALLBACK'), ],があった場合
$id = config('○○.php.hoge.id');//configの値や文字列を$idに代入 config(['○○.php.hoge.id','△△']);//configに代入したい値や文字列を'△△'に記述これでできます
配列のネストした要素をドット記法で取得できるらしいです
以下laravel非公式日本語ドキュメント引用
config関数は設定変数の値を取得します。設定値はファイル名とアクセスしたいオプションを「ドット」記法で指定します。デフォルト値が指定でき、設定オプションが存在しない時に返されます。
- 投稿日:2020-10-22T08:26:40+09:00
PHPでStripe Checkout (new version)を使ったクレジットカード決済サンプル
はじめに
サイトにクレジットカード決済を導入できる「Stripe Checkout」のバージョンが新しくなったので、1回限りのクレジットカード決済のサンプルを書いてみます。
サンプルコードの環境
CentOS 8
php 7.2
stripe-php 7.6stripe-phpはcomposerでインストールします。
composer require stripe/stripe-php支払いページサンプル
Stripeの支払いフォームに渡す情報として、金額、商品名、リダイレクト先URLなどを定義してセッションを作成します。
リダイレクト先URLのパラメーターに {CHECKOUT_SESSION_ID} をつけておくと、リダイレクト時に自動でsession_idに変換されます。payment.php<?php require './vendor/autoload.php'; // ご自身のAPIキーを入力 $secretKey = 'sk_test_xxxxxxxx'; $publicKey = 'pk_test_xxxxxxxx'; $stripe = new \Stripe\StripeClient($secretKey); $session = $stripe->checkout->sessions->create([ 'payment_method_types' => ['card'], 'line_items' => [[ 'price_data' => [ 'currency' => 'JPY', 'product_data' => [ 'name' => '商品名', ], 'unit_amount' => 100, ], 'quantity' => 1, ]], 'mode' => 'payment', // ご自身のサイトURLを入力 'success_url' => 'https://192.168.56.101/success.php?session_id={CHECKOUT_SESSION_ID}', 'cancel_url' => 'https://192.168.56.101/success.php?session_id={CHECKOUT_SESSION_ID}', ]); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>支払いページ</title> <script src="https://js.stripe.com/v3/"></script> </head> <body> <button id="checkout-button">支払う</button> <script type="text/javascript"> var stripe = Stripe('<?php echo $publicKey;?>'); var checkoutButton = document.getElementById('checkout-button'); checkoutButton.addEventListener('click', function() { stripe.redirectToCheckout({sessionId: "<?php echo $session->id;?>"}) .then(function (result) { if (result.error) { // var displayError = document.getElementById('error-message'); // displayError.textContent = result.error.message; } }); }); </script> </body> </html>支払いページを開いて支払うボタンを押すと、Stripeの支払いページに移動します。
クレジットカード情報を入力して支払うとsuccess_urlにリダイレクトされます。完了ページサンプル
success_urlのsuccess.phpファイルです。GETで渡されたsession_idを使って、支払いが完了したか確認します。
success.php<?php require './vendor/autoload.php'; // ご自身のAPIキーを入力 $secretKey = 'sk_test_xxxxxxxx'; $stripe = new \Stripe\StripeClient($secretKey); $session = $stripe->checkout->sessions->retrieve($_GET['session_id'], []); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>完了ページ</title> <script src="https://js.stripe.com/v3/"></script> </head> <body> <?php if ($session->payment_status === 'paid') { echo '<p>支払いが完了しました</p>'; } if ($session->payment_status === 'unpaid') { echo '<p>支払いが完了していません</p>'; } ?> </body> </html>支払いが完了していると「支払いが完了しました」と表示されます。支払いをキャンセルした場合は「支払いが完了していません」と表示されます。
Stripeのダッシュボードで、支払いが完了していることをご確認ください。
Legacyバージョンと比べて変わったところ
顧客(Customer)が必ず作られるようになった
支払いが完了すると、顧客(Customer)が必ず作られるようになりました。カード情報を保持するのでダッシュボードから追加請求などができるようになります。顧客の削除はダッシュボードからできます。
Apple Pay、Google Payに対応
ダッシュボードの設定でApple Pay、Google Payのオンオフができます。
3Dセキュアに対応
本人認証の3Dセキュアに対応しているようです。
ポップアップがページ遷移になった
Legacyの時は支払いボタンを押すとポップアップウィンドウが開いていたのですが、ページ遷移で支払いができるようになりました。
支払いフォームの色を変更できるようになった
自身のサイトに溶け込んだデザインにすることができます。
など。
詳しくはStripe Checkoutのドキュメントでご確認ください。以上で終わります。
- 投稿日:2020-10-22T04:35:58+09:00
Laradockでもfish shellを使いたい!!
やること
- laradockで特にファイルをいじらずにlaravelの環境構築をするとデフォルトでzshが選択されているのでfishに変更します。
- ついでに、config.fishと.vimrcもローカルのものを持ってきます。
対象読者
- laravelの環境構築をサクッと終わらせてコーディングの学習に集中したい駆け出しエンジニア
- laradockでfishを使いたいけどdockerに疎い人(fishに行き着く人はだいたいdockerfileイジれる気もしますが...)
- 他の記事の通りにやるとworkspaceコンテナ内で/var/www/sample-projectのように余計に階層が増えて困っている人
作業
laradockを展開するディレクトリへ移動
cd laradockをインストールしたいディレクトリlaradockをインストール
git clone https://github.com/Laradock/laradock.git
- laradockというディレクトリができるはずです。
laradockディレクトリに移動
cd laradockworkspaceディレクトリにconfig.fishと.vimrcをコピー
cp ~/config/fish/config.fish ./workspace cp ~/.vimrc ./workspace./workspace/Dockerfileを編集
vim ./workspace/Dockerfile
- 以下を追記してくだい。
- 特に追記の場所は決まっていませんが、1388行目の後ろくらいにいれるといい感じになると思います。
- Dockerfileの他の部分ではif文を書いていますが、この辺が少しわからなかったのでif文は端折っています。詳しい方教えていただけると助かります。
########################################################################### # Fish: ########################################################################### RUN apt-get install -y fish RUN git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf RUN ~/.fzf/install RUN curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish RUN ["/usr/bin/fish", "-c", "fisher add jethrokuan/fzf"] RUN cp /root/.fzf/bin/fzf /usr/bin/ COPY config.fish /root/.config/fish/ ########################################################################### # .vimrc: ########################################################################### COPY ./.vimrc /root/.envファイルを作成・編集
cp env-example .env vim .env
- APP_CODE_PATH_HOST の箇所を
APP_CODE_PATH_HOST=../プロジェクト名
と編集してください。- phpのバージョンを指定したい場合はPHP_VERSION の箇所を編集してください。
- 直前の行に
# Accepted values: 7.4 - 7.3 - 7.2 - 7.1 - 7.0 - 5.6
とバージョンが列挙されているのでこの中から指定するようにしましょう。- mysqlを使う場合
- PMA_PORT の箇所を
PMA_PORT=8081
と編集してください
- 他のポートと衝突しなければでなければ何でもいいです。
- ポートとかよくわかんねって方はとりあえず8081にしておけばOKです
- MYSQL_VERSION の箇所を
MYSQL_VERSION=5.7
と編集してください。
- mysqlは8系だとやたらエラーに遭遇したのでこだわりがなければ5.7が無難です。
- MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORDをlaravelに変更してください。
- ここは自由に指定していただいて大丈夫です。
- postgresqlを使う場合
- POSTGRERS_DATABASE, POSTGRES_USER, POSTGRES_PASSWORDをlaravelに変更してください。
- ここも自由に指定していただいて大丈夫です。
コンテナの起動
- ここまでお疲れさまでした。やっとコンテナを起動です。
- ここではnginx, mysqlを起動します。必ず現在のディレクトリがlaradock内であることを確認してください。
docker-compose up -d nginx mysqllaravelのインストール
- 今回は8系を入れます。
- 他バージョンがいい人はバージョン指定方法を調べてください。
docker-compose exec workspace composer create-project laravel/laravel ./プロジェクトディレクトリの確認
- APP_CODE_PATH_HOSTで
APP_CODE_PATH_HOST=../プロジェクト名
と指定したので、プロジェクトディレクトリが作成されたか確認しましょう。ls ..
- また、作成されたディレクトリの中も確認しましょう。
ls ../プロジェクト名 ○以下のように表示されればOK README.md bootstrap/ config/ phpunit.xml routes/ tests/ app/ composer.json database/ public/ server.php vendor/ artisan* composer.lock package.json resources/ storage/ webpack.mix.jsDBの設定
プロジェクトディレクトリに移動しましょう。
cd ../プロジェクト名.envを編集
vim .env
mysqlを使う場合
DB_CONNECTION=mysql
pgsqlを使う場合
DB_CONNECTION=pgsql
DB_HOSTを
127.0.0.1
からlaradock_mysql_1
に変更してください。
- ホスト名はコンテナ名にしないといけません。
- DBクライアント(mysql workbench, table plus, dbeaverなど)から接続するときは
127.0.0.1
と指定してください。DB_DATABASE, DB_USER, DB_PASSWORDを先程指定した値に変更してください。
- 記事の通りにしているならすべてlaravelです。
- うまく行かない場合はユーザー、パスワードをrootに変えて試してください。
DBの接続確認
laradockディレクトリに戻ります。
cd ../laradockそれではマイグレーションをしてみましょう。
docker-compose exec workspace php artisan migrate ○以下のように表示されればOK Nothing to migrate.phpstormからコンテナへの接続
こちらの記事からdockerの設定を済ませてください。
以下の画像の左側のContainersからworkspaceを右クリックし、execを選択してください。
新しいコマンドを作成されるように促されるのでfishと入力します。
最後に
- わからないことや改善点など気軽にコメントください。
- 気が向けばお返事します。
- 投稿日:2020-10-22T01:26:15+09:00
[Azure] WebAppでAzure AD認証を有効にした際に、実際に認証したユーザ情報をアプリ側で取得する(PHP編)
Azure WebAppにはappservice認証機能があり、AzureAD、Google、Facebook、Twitterでの認証を簡単に設定することが可能です。
非常に簡単に認証設定することができるのですが、現在は認証機能だけのため、これだけでは対象のプロバイダーで認証されたユーザ全員がWebAppにアクセスできるようになります(AzureADの場合はADの権限設定で多少制限することも可能)。
認可の機能は何かしらアプリケーション側で実装する必要があるため、今回はAzureADで認証したユーザ情報をPHPで取得する方法を調査しました。
取得すべき情報
Azure App Service および Azure Functions での認証と承認 を見ると
PHP アプリの場合、App Service は _SERVER['REMOTE_USER'] 変数を設定します
という記載があったのですが、試したところこの変数では情報を取得することができませんでした。Azure App Service 上での認証と承認の高度な使用方法 を見ると、ユーザー要求へのアクセス
App Service では、特殊なヘッダーを使用して、アプリケーションにユーザー要求を渡します
という記載があり、こちらの情報で取得することができました。サンプルコード
次のコードでヘッダ情報を取得することができました。トークンは長いのでマスク風の処理をして出力しているのと、取得できなかった情報も参考として残しています。
get_aad_info.php<?php $headers = getallheaders(); echo "\$headers['X-MS-CLIENT-PRINCIPAL-NAME'] : ", $headers['X-MS-CLIENT-PRINCIPAL-NAME'], '<br>'; echo "\$headers['X-MS-CLIENT-PRINCIPAL-ID'] : ", $headers['X-MS-CLIENT-PRINCIPAL-ID'], '<br>'; echo "\$headers['X-MS-CLIENT-PRINCIPAL-IDP'] : ", $headers['X-MS-CLIENT-PRINCIPAL-IDP'], '<br>'; echo "\$headers['X-MS-TOKEN-AAD-ID-TOKEN'] : ", substr($headers['X-MS-TOKEN-AAD-ID-TOKEN'], 0, 10), '******************** <br>'; echo "\$headers['X-MS-TOKEN-AAD-ACCESS-TOKEN'] : ", substr($headers['X-MS-TOKEN-AAD-ACCESS-TOKEN'], 0, 10), '******************** <br>'; echo "\$headers['X-MS-TOKEN-AAD-REFRESH-TOKEN'] : ", substr($headers['X-MS-TOKEN-AAD-REFRESH-TOKEN'], 0, 10), '******************** <br>'; echo "\$headers['X-MS-TOKEN-AAD-EXPIRES-ON'] : ", $headers['X-MS-TOKEN-AAD-EXPIRES-ON'], '<br>'; echo "\$_SERVER['REMOTE_USER'] : ", $_SERVER['REMOTE_USER'], '<br>'; // 取得できない echo "\$_SERVER['PHP_AUTH_USER'] : ", $_SERVER['PHP_AUTH_USER'], '<br>'; // 取得できない $current_user = get_current_user(); echo "\$current_user : ", $current_user, '<br>'; // nobody になる ?>これをWebAppで実行すると出力結果は次のようになりました。
X-MS-CLIENT-PRINCIPAL-IDP
でAzureAD(aad)が、X-MS-CLIENT-PRINCIPAL-NAME
でユーザ名が取得できました。この環境ではgmailのMSアカウントをAzureADにゲスト登録しているため @gmail.comのユーザ名となっています。その他のプロバイダの場合
その他のプロバイダで認証した場合も、同様にヘッダ情報からユーザ情報が取得できるかと思います。ドキュメントにあるヘッダ情報を並べただけですが、同様に情報取得するサンプルを こちら に作成してみました。
参考資料