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

[PHP]クラスのプロパティーのDocコメントのannotaionの取得

前提

c#のattribute的な書き方をしたい

作ったもの

PropertyのDocCommentにhiddenがあったら、

<input type="hidden" name="{property-name}" value="{property-value}"/>

を返します。

実装

まずは値を格納するだけのクラス。
ViewModelを想定しました。

class ExampleViewModel extends ViewModel{
    /**
     * 返す
     * @hidden true
     */
    public $hidden_prop;
    /**
     * 返さない
     * @oden
     */
    public $not_hidden_prop;
    /**
     * 返さない
     * @hidden false
     */
    public $false_hidden_prop;
    /**
     * 返す
     * @hidden true
     */
    public $hidden_prop2;
    // 返さない
    public $no_annotation;

    function __construct(){
        $this->hidden_prop = '1';
        $this->not_hidden_prop = '2';
        $this->not_hidden_prop = '3';
        //$hidden_prop2 valueがない時も返します
        $this->no_annotation = '5';
    }
}

お次はhtmlを作成するクラスです。

class HtmlHelper{

    /**
     * '@hidden true'が付いたプロパティーを
     * input tag のHTMLタグとして返す。
     *
     * @param ViewModel $class
     * @return string
     */
    public function getInputHiddenTags(ViewModel $class){
        // クラスからプロパティーを取得
        $reflection = new \ReflectionClass($class);
        $properties = $reflection->getProperties();

        $input_hidden_tags = '';

        // ぐるぐる
        foreach($properties as $property){

            // プロパティーのコメントを取得します

            // 下記コメントいただいた通り修正しました、ありがとうございます
            // $reflection_property = new \ReflectionProperty($class, $property->name);
            // $doc = $reflection_property->getDocComment();
            $name = htmlspecialchars($property->name, ENT_QUOTES, 'UTF-8');
            $value = htmlspecialchars($class->$name, ENT_QUOTES, 'UTF-8');

            // 正規表現の極み
            if(preg_match('/\@hidden true\s*\n/', $doc)){
                $name = $property->name;
                $value = $class->$name;
                $input_hidden_tags .= <<<HTML
                    <input type="hidden" name="${name}" value="${value}" />
                HTML;
            }
        }

        return $input_hidden_tags;
    }
}

まとめ

必要あらばアノテーション判定部分を切り出します。

参考

https://www.php.net/manual/ja/class.reflectionclass.php
https://www.php.net/manual/ja/class.reflectionproperty.php

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

Laravel で MySQLのTime型の最大値を超えて集計する

やりたいこと

MySQLのTime型は

'-838:59:59' から '838:59:59'
にまでしか対応していません。

なので仮にDBに○○した時間をtime型で保存し、合計を取り出そうとすると上限に当たる可能性がありませす

集計方法

MySQLのTime_TO_SEC関数を使います。
その名の通りこれは、Timeを秒数に直してくれます。
秒数に直したものを合計し、それを取得します。

取得した秒数をPHPでHH:MMに整形してあげれば、上限を超えた状態になります。

TestController.php
public function summary()
{
    $user = User::selectRaw('SUM(TIME_TO_SEC('sleep_time')) as total_sleep_time')
      ->where('name','太郎')
      ->first();

    $time = $user->total_sleep_time;
    // HH:MM
    sprintf('%02d:%02d', ($time / 3600),($time / 60 % 60))
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EC-CUBE セキュリティチェックリスト

内容は随時アップデートしています。ぜひストックしてください。


この資料は、公式に発表されたセキュリティチェックリストの補足です。

【初心者向け】EC-CUBEを安全運用・セキュリティ対策講座 | EC-CUBE名古屋 vol.74 にて詳細をお話しする予定です。


※マークは最優先でチェックすること


2系


※ data 以下のファイル、フォルダが公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/data など)に data フォルダが公開されていないかご確認ください。

data/Smarty/templates/default/site_frame.tpl などにアクセスし、ファイルの中身が表示されないことをご確認ください。


data 以下のファイルの中身が表示されてしまった場合

data フォルダに .htaccess というファイル名で、以下の内容を保存してください。

order allow,deny
deny from all

保存した後、ファイルの中身が表示されないことをご確認ください。
それでも表示されてしまう場合は、 こちらのプロフィール にある SNS や、メールアドレス宛までお気軽にご連絡ください。


install 以下のファイル、フォルダが存在するか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/install など)に install フォルダが存在するかご確認ください。


install フォルダが存在する場合

通常の運用では使用しないプログラムが含まれています。
install フォルダを削除してください。


test 以下のファイル、フォルダが存在するか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/test など)に test フォルダが存在するかご確認ください。


test フォルダが存在する場合

通常の運用では使用しないプログラムが含まれています。
test フォルダを削除してください。


tests 以下のファイル、フォルダが公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/tests など)に tests フォルダが存在するかご確認ください。


tests フォルダが存在する場合

通常の運用では使用しないプログラムが含まれています。
tests フォルダを削除してください。


管理画面の URL を変更した際に、標準の admin フォルダが残存していないか

管理画面の URL を標準の admin から変更した場合、 admin フォルダが残っていないことをご確認ください。


admin フォルダが残っている場合

使用しなくなったプログラムが含まれています。 admin を削除してください。


3系


※ app が公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/app など)に app フォルダが公開されていないかご確認ください。

app/console などにアクセスし、ファイルの中身が表示されないことをご確認ください。


※ app 以下のファイルが公開されている場合

app フォルダに .htaccess というファイル名で、以下の内容を保存してください。

order allow,deny
deny from all

保存した後、ファイルの中身が表示されないことをご確認ください
それでも表示されてしまう場合は、 こちらのプロフィール にある SNS や、メールアドレス宛までお気軽にご連絡ください。


※ vendor が公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/vendor など)に vendor フォルダが公開されていないかご確認ください。

vendor/symfony/config/README.md などにアクセスし、ファイルの中身が表示されないことをご確認ください。

※ vendor 以下のファイルが公開されている場合

vendor フォルダに .htaccess というファイル名で、以下の内容を保存してください。

order allow,deny
deny from all

保存した後、ファイルの中身が表示されないことをご確認ください
それでも表示されてしまう場合は、 こちらのプロフィール にある SNS や、メールアドレス宛までお気軽にご連絡ください。


install.php が存在するか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/install.php など)に install.php が存在するかご確認ください。


install.php が存在する場合

通常の運用では使用しないプログラムが含まれています。
install.php を削除してください。


tests 以下のファイル、フォルダが公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/tests など)に tests フォルダが存在するかご確認ください。


tests フォルダが存在する場合

通常の運用では使用しないプログラムが含まれています。
tests フォルダを削除してください。


index_dev.php が存在するか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/index_dev.php など)に index_dev.php が存在するかご確認ください。


index_dev.php が存在する場合

開発用途で使用するプログラムが含まれています。
本番環境では、 index_dev.php を削除してください。


4系


※ var が公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/var など)に var フォルダが公開されていないかご確認ください。

var/cache/prod/annotations.map などにアクセスし、ファイルの中身が表示されないことをご確認ください。


※ var 以下のファイルが公開されている場合

var フォルダに .htaccess というファイル名で、以下の内容を保存してください。

order allow,deny
deny from all

保存した後、ファイルの中身が表示されないことをご確認ください。
それでも表示されてしまう場合は、 こちらのプロフィール にある SNS や、メールアドレス宛までお気軽にご連絡ください。


※ .env が公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/.env など)に .env ファイルが公開されていないか、ファイルの中身が表示されないことをご確認ください。


.env ファイルの中身が表示されてしまう場合

EC-CUBE をインストールしたフォルダの .htaccess ファイルに以下の内容を追加し、保存してください。

<FilesMatch "^composer|^COPYING|^\.env|^\.maintenance|^Procfile|^app\.json|^gulpfile\.js|^package\.json|^package-lock\.json|web\.config|^Dockerfile|\.(ini|lock|dist|git|sh|bak|swp|env|twig|yml|yaml|dockerignore)$">
    order allow,deny
    deny from all
</FilesMatch>

保存した後、 .env ファイルの中身が表示されないことをご確認ください。
それでも表示されてしまう場合は、 こちらのプロフィール にある SNS や、メールアドレス宛までお気軽にご連絡ください。


codeception が公開されていないか

EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/codeception など)に codeception フォルダが存在するかご確認ください。


codeception フォルダが存在する場合

通常の運用では使用しないプログラムが含まれています。
codeception フォルダを削除してください。


開発(dev)モードになっていないか

.env ファイルや、 .htaccess ファイルに設定されている APP_ENV の値が dev になっていないかご確認ください。


APP_ENV=dev になっている場合

開発用途で使用する設定になっています。
本番環境では、 APP_ENVprod に設定してください。


全バージョン共通


SSLが導入されているか

EC-CUBE に https:// からの URL でアクセスできるかご確認ください


https:// からの URL でアクセスできない場合

常時SSLの導入をご検討ください。
導入方法がわからない場合は、 こちらのプロフィール にある SNS や、メールアドレス宛までお気軽にご連絡ください。


公表された脆弱性が修正されているか

EC-CUBE脆弱性リスト にアクセスし、対象バージョン のフォームにご利用の EC-CUBE のバージョンを入力し、脆弱性対応が済んでいるかご確認ください。

ご利用の EC-CUBE のバージョンは、管理画面のトップページでご確認可能です。

修正方法がよくわからない場合は、こちらのプロフィール にある SNS や、メールアドレス宛までお気軽にご連絡ください。


管理画面のユーザーID/パスワードが推測されやすいものになっていないか

以下のような例に該当する場合は、推測されにくいユーザーID/パスワードに変更しましょう

  • ユーザーIDとパスワードが同じ
  • ユーザーIDが admin など推測されやすいもの
  • パスワードが8文字以下
  • パスワードが数字のみ、英字のみ

古いバージョンの EC-CUBE では、ユーザーIDに記号が使用できない場合があります。
修正方法がわからない場合は、こちらのプロフィール にある SNS や、メールアドレス宛までお気軽にご連絡ください。


管理画面が推測しやすい URL になっていないか

管理画面の URL が admin など推測しやすい URL になっていないことをご確認ください。
2.11 以降のバージョンでは、 管理画面から admin 以外に変更可能です。
また、 IP アドレスの制限などもセキュリティの強化には有効ですので、併わせてご検討ください。


パーミッション777のファイル、フォルダが存在しないか

パーミッションが 777 となっているファイル、フォルダが存在しないことをご確認ください


パーミッション777のファイル、フォルダが存在する場合

ファイルは 604、 フォルダは 705 など、ご利用のサーバーでの適切なパーミッションに変更してください。

テンプレートや、画像フォルダなど、Webサーバーから書き込みが必要な場合は、ファイル: 606、フォルダ: 707など、書き込み許可が必要な場合があります。
この場合は、セキュリティのリスクが向上しますのでご注意ください。


パーミッション666のファイルが存在しないか

パーミッションが 666 となっているファイルが存在しないことをご確認ください


パーミッション666のファイルが存在する場合

ファイルは 604 など、ご利用のサーバーでの適切なパーミッションに変更してください。

テンプレートなど、Webサーバーから書き込みが必要な場合は、606 など、書き込み許可が必要な場合があります。
この場合は、セキュリティのリスクが向上しますのでご注意ください。


API が有効になっていないか

2系の場合は、EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/api など)にアクセスし、ページが見つかりません もしくは、 API機能が無効です。 と表示されることをご確認ください。
「API機能が無効です。」と表示する場合でも、完全に削除してしまった方が安全です。
html/api フォルダを完全に削除してください。

3系の場合は、 EC-CUBEのURL直下(例: https://example.com/path/to/ec-cube/api/v0/product など)にアクセスし、 ページが見つかりません と表示されることをご確認ください。


API が有効になっている場合

適切にアクセス制限がかかっているかご確認ください。
よくわからない場合は、こちらのプロフィール にある SNS や、メールアドレス宛までお気軽にご連絡ください。


html を別のフォルダ名(www, public_html など)に変更されていないか

サーバーによっては、 EC-CUBE 標準の公開フォルダである html が使用できない場合があります。
html 以外のフォルダ名に変更されている場合は、前出の2系、3系、4系のチェックリストを今一度ご確認ください。


user_data 以下に CSV ファイルが存在しないか

user_data フォルダ以下に CSV ファイルが存在しないかご確認ください。
存在する場合は削除してください。


upload 以下に CSV ファイルが存在しないか

upload フォルダ以下に CSV ファイルが存在しないかご確認ください。
存在する場合は削除してください。


他の CMS と同居している場合, バージョン(本体, プラグイン)は最新か

WordPress など、他の CMS を同時にインストールしている場合、最新バージョンが導入されているかご確認ください。
最新バージョンでは無い場合は、最新バージョンにバージョンアップしてください。


他のフリーCGIを使用していないか

フリーで配布されている CGI を使用していないかご確認ください。
EC-CUBEは機密情報を扱いますので、フリーで配布されている CGI との同時利用はおすすめしません。


独自テンプレートでエスケープ漏れなど無いか

テンプレートを独自にカスタマイズされている場合、フォームの input タグなどにエスケープ漏れが無いかご確認ください。

特に2系の場合は、 value 属性に h が付与されていることをご確認ください。

<!-- value に h が付与されているのを確認 -->
<input type="text" name="<!--{$key1}-->" value="<!--{$arrForm[$key1].value|h}-->"  />

独自カスタマイズ, プラグインで eval を使用している箇所は無いか

独自カスタマイズ、プラグインのソースを検索し、 eval 関数を使用している箇所は無いかご確認ください。

eval 関数の使用は推奨しません。
よくわからない場合は、こちらのプロフィール にある SNS や、メールアドレス宛までお気軽にご連絡ください。


独自カスタマイズ, プラグインで serialize/unserialize を使用している箇所は無いか

独自カスタマイズ、プラグインのソースを検索し、 serialize/unserialize 関数を使用している箇所は無いかご確認ください。

serialize/unserialize 関数の使用は推奨しません。
よくわからない場合は、こちらのプロフィール にある SNS や、メールアドレス宛までお気軽にご連絡ください。


独自カスタマイズ, プラグインで SQL を実行する際, プレースホルダを使用しているか

独自カスタマイズ、プラグインのソースを検索し、適切にプレースホルダを使用しているかご確認ください。

以下のように変数を直接 SQL に渡している場合は要注意です

$sql = "SELECT * FROM dtb_products WHERE product_id = '".$product_id."';";

ここに書いてあることがよくわからない場合は

こちらのプロフィール にある SNS や、メールアドレス宛までお気軽にご連絡ください。

こちらもあわせてご覧ください


TODO

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

【PHP】コマンドでPHPファイルを任意のPHPバージョンを指定して実行する。

開発環境でxamppを複数バージョン使っているため、PATHを通したPHP以外で実行したいことが多々あるため、メモとして残します。

■やり方

C:/xampp5.6.32/php/php.exe -f "C:projects/testproject/test.php"

はじめにPHP実行ファイルのフルパス。
-fオプションでファイル実行になります。
最後に実行するPHPファイルのフルパスを指定。

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

【WordPress会員機能】WP-Membersプラグインで登録時にメール認証(ダブルオプトイン方式)を実装する方法

WordPressで会員サイトを構築するとなると、プラグインの候補がある程度絞られてきます。
中でも導入数が多く、日本語ドキュメントも充実しているのが、『WP-Members Membership Plugin』。
登録時のフィードのカスタマイズができることや、ユーザーによるプロイフィール編集ができるなど、基本的な会員機能が一通り備わっており、使い勝手が良いのですが、どうしても仕様上欲しかったのが、新規登録時のメール認証。

  1. フォームに入力して新規登録
  2. 確認メールが届く
  3. メールにある本登録URLをクリック
  4. 本登録完了

と言った、動きを実装するべく調べていたところ、公式サイトにドキュメントを発見。
Send new user an activation link in the new registration email

しかし、この方法をそのまま実装してもいろいろ間違っているようで、うまく動きませんでした。
(メールに値を不要する際、フィールドにない値は取れないこと、['toggle']がnewmodとなっているが新規登録時はnewregでないとダメなど。あと、本登録してなくてもログイン出来るなど、あくまでサンプルレベルのソースでした。)

いろいろとカスタマイズを加えることで実装が実現しましたので、以下その内容をまとめます。

管理画面より、アクティベーションキー用のhiddenフォームを追加

管理画面、設定>WP-Membersを開き、フィールドタブ、フィールドの追加をクリックし、新しくフィールドを追加します。
wp-members.png
今回は「activation_key」と言う名前にしています。値はなんでも構いません。

function.phpにフィルター・アクションフックを記入

function.php
/**
 * 各種設定が変更できるヘルパー関数
 * (設定やテキストの変更は全てこの関数でできます)
 */
function my_activation_key_settings() {
    $settings = array(
        'email_text'      => '本登録はこちら: ',// メールに含めるテキスト
        'return_url'      => home_url('/user/'),// 登録完了時のリダイレクト先
        'send_welcome'    => false,// 本登録時ウェルカムメールを送信するか
        'show_success'    => true,// 完了メッセージを表示するか
        'success_message' => '本登録が完了しました。<br>サイトをお楽しみください',// 完了メッセージ
        'send_notify'     => false,// ユーザー登録時に管理者へ通知メッセージを送信
    );  
    return $settings;
}

/**
 * 登録時にアクティベーションキーを作成
 */
add_filter( 'wpmem_register_form_before', 'my_generate_key' );
function my_generate_key() {
    // ランダムなキーを発行
    $key = md5( wp_generate_password());
    // jQueryに渡す(jQueryでhiddenタグに入力している)
    return '<script>
    jQuery(function($){
        var php = {key:"'.$key.'"};
        functionTest(php.key);
    });
    </script>';
}

/**
 * 登録時メールにアクティベーションキーを追加
 */
add_filter( 'wpmem_email_filter', 'my_add_key_to_email', 10, 3 );
function my_add_key_to_email( $arr, $wpmem_fields, $field_data ) {
    $settings = my_activation_key_settings();
    $url = trailingslashit( $settings['return_url'] );
    // 新規登録に対してのみ実行
    if ( $arr['toggle'] == 'newreg' ) {
        // 保存されたキーを取得
        $key = get_user_meta( $arr['user_id'], 'activation_key', true );
        // メール本文にテキストを追加
        $arr['body'] = $arr['body'] . "\r\n"
            . $settings['email_text']
            . add_query_arg( 'activate', $key, $url );
    }
    return $arr;
}

/**
 * アクティベーションキーを確認・存在する場合は、ユーザーを検証してログインします。
 */
add_action( 'template_redirect', 'my_validate_key' );
function my_validate_key() {
    $settings = my_activation_key_settings();
    // アクティベーションキーをチェック
    if ( isset( $_GET['activate'] ) ) {
        // キーの対象となるユーザーアカウントを取得
        $users = get_users( array(
            'meta_key'    => 'activation_key',
            'meta_value'  => $_GET['activate'],
            'number'      => 1,
            'count_total' => false
        ) );
        if ( $users ) {
            foreach( $users as $user ) {
                // 指定されたアクティベーションキーが有効、ログイン実行
                wp_set_auth_cookie( $user->ID, true );
                wp_set_current_user( $user->ID );
                // activation_keyメタを削除し、アクティブに設定
                delete_user_meta( $user->ID, 'activation_key' );
                update_user_meta( $user->ID, 'active', '1' );
                if ( $settings['send_welcome'] ) {
                    // ヘルパー関数の値がtrueならウェルカムメールを送信
                    wpmem_inc_regemail( $user->ID, '', 2 );
                }
                if ( $settings['send_notify'] ) {
                    // ヘルパー関数の値がtrueなら通知メールを送信
                    global $wpmem;
                    wpmem_notify_admin( $user->ID, $wpmem->fields );
                }
                break;
            }
        }
    }
}

/**
 * 本登録完了メッセージ表示
 */
add_filter( 'the_content', 'my_show_thankyou_on_activation', 100 );
function my_show_thankyou_on_activation( $content ) {
    $settings = my_activation_key_settings();
    if ( $settings['show_success'] && isset( $_GET['activate'] ) ) {
        // 依存関係をロード
        $content = wpmem_inc_regmessage( '', $settings['success_message'] ) . $content;
    }
    return $content;
}

/**
 * ログイン実行時、アクティベーションしていないユーザーの場合強制ログアウト
 */
add_filter( 'wpmem_login_redirect', 'my_login_redirect', 10, 2 );
function my_login_redirect( $redirect_to, $user_id ) {
    $type = get_user_meta( $user_id, 'active', true );
    if($type != '1') {
        wp_logout();
    }
    // ログインページへリダイレクト
    return home_url( '/login/' );
}

jQueryで関数を用意

登録フォームのページにjavascriptを設置します。
jQueryを使い、hiddenタグにアクティベーションキーを挿入しています。

sample-script.js
function functionTest($arg) {
    jQuery('input[name="activation_key"]').val($arg);
}

以上で、メールにアクティベーションURLが届くようになりました。

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

Visual Studio Codeを使用してPHPのデバッグを行う方法(備忘録)

visual studio codeを使用して、phpのデバッグを行う事にしたが、数日間試行の上、やっと解決したので備忘録として記載します。

phpを使用する目的として、webサーバー用に組み込む事を前提に記載します。
Xampは、用いず、Apache24をインストールし、binにて、httpdで立ち上げる方法を取ります。
Visual Studio Code, php74はインストール済との前提で記載します。

<?php
$a = "abcd";
$b = "efgh";

$c = $a.$b;

echo $c;

?>

上記の様な簡単なプログラムに、ブレークポイントを付け、Step Inが出来る事を目的とします。
このコードは、Apachee24のhtdocsに、hello.phpとして保存して置きます。

下記の図で、PHP Debug等をインストールします。
php1.png

この様なステップイン出来る状態にするためは、このサイトにある様に、下記の作業が必要です。

php2.png
scriptを修正するためには、歯車を押します。「launch.json」が表示あれます。

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "extensionHost",
            "request": "launch",
            "name": "Launch Extension",
            "runtimeExecutable": "${execPath}",
            "args": [
                "--extensionDevelopmentPath=${workspaceFolder}"
            ],
            "outFiles": [
                "${workspaceFolder}/out/**/*.js"
            ],
            "preLaunchTask": "npm"
        },
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        },
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "stopOnEntry": true,
            "pathMappings": {
                "C:\\Apache24\\htdocs": "${workspaceRoot}"
            }
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000,
        }
    ]
}

私は、pythonもデバッグするので、上記、コードには、pythonのjsonコードも含まれています。
このサイトでは、xampでを指定していますが、下記の通り修正しています。
注意事項として、 "C:\Apache24\htdocs": とする必要があります。¥と¥を2回続けて記載する取り決めになっています。

            "stopOnEntry": true,
            "pathMappings": {
                "C:\\Apache24\\htdocs": "${workspaceRoot}"

さらに、php.iniの追記も必要です。

[xdebug]
zend_extension = C:\php74\ext\php_xdebug-2.9.0-7.4-vc15-x86_64.dll
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9000

ここで、虫の絵を押し「Launch currently open script」を選択し、ブレイクポイントを設定し、緑色の三角矢印を押すとデバッグが始まります。

以上です。
修正のご要望があれば、ご連絡下さい。

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

Declaration of <クラス名>::<メソッド名> should be compatible with <クラス名>::<メソッド名>

状況

phpunitのsetUp()メソッドを設定した時に、タイトルのエラーが発生

エラー内容と対象方法

setUp()メソッドは親クラスのメソッドをオーバーライドしているのですが、
オーバーライド元とオーバーライド先でメソッドの引数または戻り値が異なる場合にエラーが発生します。

この場合、親クラスの戻り値が以下の通りvoidとなっているため、
オーバーライド先でも同様の指定が必要となります。

TestCase.php
/**
* Setup the test environment.
*
* @return void
*/
protected function setUp(): void
{
    if (! $this->app) {
        $this->refreshApplication();
    }

    $this->setUpTraits();

    foreach ($this->afterApplicationCreatedCallbacks as $callback) {
        $callback();
    }

    Facade::clearResolvedInstances();

    Model::setEventDispatcher($this->app['events']);

    $this->setUpHasRun = true;
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Wordpressと静的コンテンツを共存させる方法

WordPressのトップにあるindex.phpを確認。
初期設定通りであれば、
wp-blog-header.php
を参照するように設定されているはず。

index.php
ドキュメントルート/wp/index.php
/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );

wordpressが読み込む順番は、
index.php→wp-blog-header.php

なので、index.phpと同じ階層に表示させたいコンテンツを配置することで、
1. 静的コンテンツを配置したディレクトリ
2. wp-blog-header.php
の順番に参照します。

ここで1つ問題なになるのが、
Wordpressと静的コンテンツのディレクトリが重複してしまう場合です。

例)
WordpressのURL
https://sample.com/test/
静的コンテンツとして表示させたいURL
https://sample.com/test/landing

この場合、ディレクトリ配下にindex.phpと同様に、
wp-blog-header.phpにリダイレクトさせることで解決できます。
※基本はindex.phpをコピーしてパスの設定を修正するだけで大丈夫です。

cp index.php test/index.php
相対パスの設定を修正

【注意事項】
直接参照させているだけなので、ファビコンは表示されません。
僕の場合は、結局WordPressのテーマに静的ファイルを入れ込む形で実装しました。

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