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

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

前回はnamespaceを定義し、呼び出し側(index.php)にてインスタンス生成の実装を行いました。

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

ヘルパーにココナラへのアクセス機能を実装する。

それではヘルパーにココナラへのアクセス機能を実装したいと思います。
最初に作成するのは「ココナラのサイトにアクセスできるか(到達確認)」です。
到達できないことにはその後の作業も進められません。

このメソッドを作成するにあたり、まずは単純に値を返さないメソッドを作ります。
PHPでも「値を返さない」という表現はできるようです。返り値に「void」を指定するとのこと。

PHPにおけるvoidとは何か – Qiita

厳密には「返り値に意味はない」を表しているようで、仮に戻り値を確認したとしてもそこには「NULL」が入っているそうです。
こういったところに厳格なJavaではコンパイルエラーですよね。

PHP7.0までは返り値に「void」を記載できなかった?
PHP7.1から進化し、返り値の型にvoidを指定できるようになったそうです。
さらに返り値の型にvoidを宣言している場合、メソッド内で「return」の実装を行うだけでエラーとして補足される安心設計になったようです。

ほんとだ!これは安心です😏

以下のように作成しました。

class.coconara-helper.php

    // 到達確認
    function reachable(): void
    {
        // 新しいタブを作成しサイトにアクセス
        $page = $browser->createPage();
        $page->navigate('https://coconala.com/')->waitForNavigation();

        // ページタイトル取得
        $pageTitle = $page->evaluate('document.title')->getReturnValue();
        echo $pageTitle;
    }

しかしこれでは本当に遷移できたのかわかりません。
なので以下の実装を修正し、遷移できたことを戻り値として返却します。
※そもそもメソッド名がreachableなのでなにかしら結果を返さないと変ですよね😐

    // 到達確認
    function reachable(): bool
    {
        // 新しいタブを作成しサイトにアクセス
        $page = $browser->createPage();
        $page->navigate('https://coconala.com/')->waitForNavigation();

        // ページタイトル取得
        $pageTitle = $page->evaluate('document.title')->getReturnValue();

        //echo $pageTitle;
        // ブラウザからページを破棄
        $tmpPage.close();
        // トップページのタイトル確認
        return $pageTitle === 'ココナラ - みんなの得意を売り買い スキルマーケット';
    }

これで遷移が成功したのか失敗したのかわかります。

ログインする

ログインする際も「到達確認」で使用した実装を一部(ページオブジェクト生成部分)使用します。
同じコードを2回記述するのはよくないですよね。
なのでreachableの実装を分割しました。

    // 到達確認
    function reachable(): bool
    {
        // トップページを取得する
        $tmpPage = getFirstPage();

        // ページタイトル取得
        $pageTitle = $tmpPage->evaluate('document.title')->getReturnValue();
        
        //echo $pageTitle;

        // ブラウザからページを破棄
        $tmpPage.close();

        // トップページのタイトル確認
        return $pageTitle === 'ココナラ - みんなの得意を売り買い スキルマーケット';
    }

    // トップページを取得
    function getFirstPage(): Page
    {
        // 新しいタブを作成しサイトにアクセス
        $page = $browser->createPage();
        $page->navigate('https://coconala.com/')->waitForNavigation();

        return $page;
    }

これで使うことができるようになりました。

    function login() : bool
    {
        // トップページを取得する
        $page = getFirstPage();

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

        // ページタイトル取得
        $pageTitle = $tmpPage->evaluate('document.title')->getReturnValue();

        // タイトル確認
        return $pageTitle === 'ログイン | ココナラ';

    }

このログインで使用した$pageはこの後の処理でも大活躍する変数です。
このままではメソッド終了とともに消滅してしまうのでフィールド(クラス変数)として使用するように修正します。

class Coconara_Helper {
    // ヘッドレスブラウザ
    
    private $browser;
    private $page; // ★
・・・
    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);

        // ページタイトル取得
        $pageTitle = $this->page->evaluate('document.title')->getReturnValue();

        // タイトル確認
        return $pageTitle === 'ログイン | ココナラ';

    }

ここでミスに気付く

フィールド変数にアクセスする場合は$this->xxxxを使用することを失念していた箇所がありました。
該当するのは$browserです。早速修正をしておきます。

$browser =.... // ×
$this->browswer =.... // 〇

まとめ

ココナラヘルパーにココナラへのアクセスおよびログイン機能を実装しました。
考えながら実装すると時間があっという間に過ぎますね。

今日はここまで!