PHP 初心者が WordPress の プラグイン 作成 ! part47 ( コードを整理 04 )

この記事では PHP 初心者 が WordPress プラグイン を 作成 します。 part47 では引き続き今までのコードを少し整理してみます。

前回はココナラヘルパークラスにサイトアクセスとログインの機能を実装しました。

PHP 初心者が WordPress の プラグイン 作成 ! part46 ( コードを整理 03 )

デストラクタ

オブジェクトがどこからも参照されなくなった時の動作を実装しておこうと思います。
PHPにもdispose的なものがあるのかなと思ったのですが見つけれず、デストラクタというものを使うことになりました。
このデストラクタはオブジェクトの参照がなくなる以外にも呼び出されるそうです。
お掃除処理にはぴったりですね!

PHP: コンストラクタとデストラクタ – Manual

 

ヘッドレスブラウザは一番最後にclose処理が必要なのでこのデストラクタに定義しておきます。

    function __destruct() {
        // 親クラスのデストラクト呼び出し
        super._destruct();

        // ヘッドレスブラウザを閉じる
        $browser->close();
    }

デストラクタは親のデストラクタを自動で呼び出したりはしないようなので
明示的に記載する必要があるようです。ココナラヘルパークラスの親はObjectクラスかな?
なんにしても呼び出しておいて損はなさそうです😆

カプセル化と情報隠ぺいを意識

クラス外に見せる必要のないメソッドをprivate修飾しておこうと思います。
必要になったときにpublicにしていきます。

private function reachable(): bool
private function getFirstPage(): Page
private function login() : bool

組み込んでみる

reachable()で確認している到達可否についてはクラスの生成段階で判断しておくことにしました。
なのでコンストラクタに仕込みます。

    function __construct() {
        // whereis chromiumでパスを探した
        $browserFactory = new BrowserFactory('/usr/bin/chromium');

        // for Docker option
        $options = [
            'headless' => true,
            'noSandbox' => true ,
            'sendSyncDefaultTimeout' => 100000,
            'windowSize'      => [1920, 1000],
            'userAgent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
            'enableImages'    => false,
        ];

        // ヘッドレスブラウザスタート
        $this->browser = $browserFactory->createBrowser($options);

        // ★到達できない場合エラー
        if(!reachable()) {
            throw new Exception('サイトに到達できませんでした。');
        }
    }

これでインスタンス生成時にココナラサイトに到達できない場合は例外を発生するようになるはずです。

過ちに気付く

ログイン機能なのですが、よく実装を確認してみると「ログイン画面に遷移」しただけで実際にはログインできていませんでした(笑
ログイン機能の実装を修正します。

    // ココナラアカウント
    private const USER_NAME = 'hoge';
    private const USER_PASSWORD = 'fuga';
    ・・・
    ・・・
    // ログインを行う
    private function login() : bool
    {
        // トップページを取得する
        $this->page = getFirstPage();

        // ココナラのログイン画面に遷移する(30秒待つ)
        $this->page->evaluate('document.querySelector("li.c-mainNavBeforeLogin_item-pc a:first-child").click()')->waitForPageReload(Page::LOAD, 30000);

        // アカウント入力
        $page->evaluate(
        '(() => {
            document.querySelector("#UserLoginEmail").value = "'.self::USER_NAME.'";
            document.querySelector("#UserLoginPassword").value = "'.self::USER_PASSWPRD.'";
            document.querySelector("form#UserLoginForm button[type=\"submit\"]").removeAttribute("disabled");
        })()');

        // ログインを実施(エラーは全て無視)
        try{
            $evaluation = $page->evaluate('document.querySelector("form#UserLoginForm button[type=\"submit\"]").click()')->waitForPageReload(Page::LOAD, 30000);
        } catch(OperationTimedOut $e) {
        } catch(NavigationExpired $e) {
        }

        // ダッシュボードのリンク確認を行ってログイン状態か確認する
        $isLogin = $this->page->evaluate('document.querySelector(".c-mainNavProviderLeft_item") != null ? true : false;')->getReturnValue();
        return isLogin;

    }

アカウントについてはプライベートな定数で定義します。
PHP7.1から使用できるようになったとのことです。

PHP7.1からprivate constが書ける – Qiita

まとめ

ココナラヘルパーのデストラクタとログイン機能の修正等を行いました。
次回は動作確認を行っておこうと思います。

今日はここまで!