20201022のPHPに関する記事は12件です。

WordPress 5 のテーマエディターで .php 編集がエラーになる

WordPress はテーマエディターで CSS や HTML テンプレートを編集できるが、
WordPress 4.9 以降は .php ファイルの編集がエラーになるらしい。

致命的なエラーをチェックするためにサイトと通信できないため、PHP の変更は取り消されました。SFTP を使うなど、他の手段で PHP ファイルの変更をアップロードする必要があります。

error.png

「file.php の○〜○行目をコメントアウトする」という対策があるらしい。
広い範囲をコメントアウトするのは面倒なので、if 文の条件を変えて対応してみた。

php.png

変更前

    if ( $is_active && 'php' === $extension ) {

変更後

    if ( $is_active && 'php__IGNORE__' === $extension ) {

コメントアウトしなくても、条件が偽になれば実行されないので、何でも良さそう。
無事にファイル編集も成功しました。

success.png

とても正しい対策手順とは思えないけど、管理画面のセキュリティの懸念がない環境なら、これでも良いだろう。

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

ラッコはフィルタリング(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のフィルターは?クライアントからきた情報を通すか通さないか判断する処理ってことなのだろうか...

とりあえず今日はここまで

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

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が割り当てられます。)

便利なのでぜひ。

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

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が割り当てられます。)

便利なのでぜひ。

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

stripe決裁機能の実装

stripeの決済機能(checkout)を実装したやり方を紹介します。
調べた結果のメモです。

ファイル構成
- index.php
- charge.php
- composer.json
- composer.lock
- .env

composer.jsonとcomposer.lockはライブラリをインストールすると自動で作成されます。

index.php
 require '../../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.php
require '../../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 | php

stripeをサーバー上でインストールします。いろいろ試しましたが、下記が正解でした。

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ダッシュボードに決裁者のメールアドレスと購入商品が記載されます。

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

Laravel:バリデーションをスマートかつ、任意メッセージを作成

【概要】

1.結論

2.どのようにコーディングするか

3.開発環境

1.結論

FormRequestを作成し、rulesに検証ルールを用いて、messagesメソッドで任意のメッセージを記載する!


2.どのようにコーディングするか

まずFormRequestを作成します。

php artisan make:request HogeRequest

なぜFormRequestを作成するのかというと、その方が機能としてスマートだからです。Controllerにも記載することは可能ですが、コントローラーはViewやModelに指示を送る橋渡し役がメインになります。バリデーションをする役目ではなく、クライアントからリクエストされた際にリクエスト内部でバリデーションの機能を実行した方がスマートだからです。

上記で作成した後にControllerに下記の記載を忘れないでください。

app/HttpControllers/HogeController.php
use 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

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

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!

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

テーブル定義変更にて、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@)///

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

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関数は設定変数の値を取得します。設定値はファイル名とアクセスしたいオプションを「ドット」記法で指定します。デフォルト値が指定でき、設定オプションが存在しない時に返されます。

https://readouble.com/laravel/6.x/ja/helpers.html

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

PHPでStripe Checkout (new version)を使ったクレジットカード決済サンプル

はじめに

サイトにクレジットカード決済を導入できる「Stripe Checkout」のバージョンが新しくなったので、1回限りのクレジットカード決済のサンプルを書いてみます。

サンプルコードの環境

CentOS 8
php 7.2
stripe-php 7.6

stripe-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の支払いページに移動します。
card.PNG
クレジットカード情報を入力して支払うと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のドキュメントでご確認ください。

以上で終わります。

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

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 laradock

workspaceディレクトリに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_PASSWORDlaravelに変更してください。
      • ここは自由に指定していただいて大丈夫です。
  • postgresqlを使う場合
    • POSTGRERS_DATABASE, POSTGRES_USER, POSTGRES_PASSWORDlaravelに変更してください。
      • ここも自由に指定していただいて大丈夫です。

コンテナの起動

  • ここまでお疲れさまでした。やっとコンテナを起動です。
  • ここではnginx, mysqlを起動します。必ず現在のディレクトリがlaradock内であることを確認してください。
docker-compose up -d nginx mysql

laravelのインストール

  • 今回は8系を入れます。
  • 他バージョンがいい人はバージョン指定方法を調べてください。
docker-compose exec workspace composer create-project laravel/laravel ./

プロジェクトディレクトリの確認

  • APP_CODE_PATH_HOSTAPP_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.js

DBの設定

プロジェクトディレクトリに移動しましょう。

cd ../プロジェクト名

.envを編集

vim .env
  • mysqlを使う場合
    DB_CONNECTION=mysql

  • pgsqlを使う場合
    DB_CONNECTION=pgsql

  • DB_HOST127.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と入力します。

  • これでfishシェルでワークスペースコンテナで作業できます。
    この画像

最後に

  • わからないことや改善点など気軽にコメントください。
  • 気が向けばお返事します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Azure] WebAppでAzure AD認証を有効にした際に、実際に認証したユーザ情報をアプリ側で取得する(PHP編)

Azure WebAppにはappservice認証機能があり、AzureAD、Google、Facebook、Twitterでの認証を簡単に設定することが可能です。

image.png

非常に簡単に認証設定することができるのですが、現在は認証機能だけのため、これだけでは対象のプロバイダーで認証されたユーザ全員が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で実行すると出力結果は次のようになりました。
image.png

X-MS-CLIENT-PRINCIPAL-IDP でAzureAD(aad)が、X-MS-CLIENT-PRINCIPAL-NAMEでユーザ名が取得できました。この環境ではgmailのMSアカウントをAzureADにゲスト登録しているため @gmail.comのユーザ名となっています。

その他のプロバイダの場合

その他のプロバイダで認証した場合も、同様にヘッダ情報からユーザ情報が取得できるかと思います。ドキュメントにあるヘッダ情報を並べただけですが、同様に情報取得するサンプルを こちら に作成してみました。

参考資料

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