###実現したいこと
通常はComposerを使って以下で実行できるプラグインがあります。(JSONの構造を検証するJson Schemaというプラグインです。)
これを独自オートローダーで実行したいと思っています。
【header.php】
php
1<?php 2// Composerがあればこれでできる 3require 'vendor/autoload.php'; 4a 5// "schema.json"にある JSON の構造を検証する 6$json = '{"a":1, "b":2}'; 7$schema = file_get_contents('./schema.json'); 8$v = new JsonSchema\Validator; 9$v->check(json_decode($json), json_decode($schema));
###試したこと
そのためにこちらのサイトから独自オートローダー【ClassLoader.php】をDLしました。「自動で必要なものを読んでくれる機能」があるようです。
そしてこれを次のように// Composerが使えないのでこうした
としたのですが、// ここでエラー
となってしまいます。
【header.php】
<?php // Composerが使えないのでこうした require_once DIR_TEMPLATE . '/plugins/Autoloader-master/ClassLoader.php'; // "schema.json"にある JSON の構造を検証する $json = '{"a":1, "b":2}'; $schema = file_get_contents('./schema.json'); $v = new JsonSchema\Validator; // ここでエラー $v->check(json_decode($json), json_decode($schema));
###独自オートローダーのコード
先のDLした【ClassLoader.php】は次の通りで、// コメントに従って$DefaultPathを次のように変更した
のように変更しましたが、何か間違っているでしょうか?
【ClassLoader.php】
PHP
1<?php 2 3/** 4 * 自作オートローダ 5 * require_once地獄に囚われないために、 6 * 指定されたクラス名から、$DefaultPathで指定されたディレクトリの 7 * サブディレクトリまでいって再帰的に検索して探してrequire_onceする。 8 * 使い方は使用するrequire_once 'ClassLoader.php'; 9 */ 10class ClassLoader 11{ 12 // コメントに従って$DefaultPathを次のように変更した 13 //private static $DefaultPath = "./src"; 14 private static $DefaultPath = DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema'; 15 private static $ClassName; 16 17 /** 18 * クラス検索 19 * self::$DefaultPathで指定されたディレクトリ以下を検索する 20 * @param string $FilePath 最初だけ呼び出されたClass名が入り、以降はディレクトリ名が入る 21 * @return boolean 成功ならTrue 22 */ 23 public static function SearchClassFile($FilePath) 24 { 25 if (!is_dir($FilePath)) { 26 self::$ClassName = $FilePath; 27 $FilePath = self::$DefaultPath; 28 } 29 30 if ($handle = opendir("$FilePath")) { 31 while (false !== ($Item = readdir($handle))) { 32 if ($Item != "." && $Item != "..") { 33 if (is_dir("$FilePath/$Item")) { 34 self::SearchClassFile("$FilePath/$Item"); 35 } else { 36 if (self::$ClassName == basename($Item, ".php")) { 37 $FileName = "{$FilePath}/{$Item}"; 38 39 if (is_file($FileName)) { 40 require_once $FileName; 41 42 return true; 43 } 44 } 45 } 46 } 47 } 48 closedir($handle); 49 } 50 } 51 52} 53 54spl_autoload_register(array('ClassLoader', 'SearchClassFile')); 55
###エラー
上記を試したエラーは次のものでした。
php
1[12-Jul-2020 06:03:57 UTC] PHP Fatal error: 2Uncaught Error: Class 'JsonSchema\Validator' not found in 3/export/user/b/zjp_56u01y/live_62u457/var/wordpress/wp-content/themes/test/header.php:63
このエラーによればClass
が読めていないということらしいので、今度は【header.php】に以下// さらにClassを読むべくこうした
を追加しました。
<?php // Composerが使えないのでこうした require_once DIR_TEMPLATE . '/plugins/Autoloader-master/ClassLoader.php'; // さらにClassを読むべくこうした require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Validator.php';
ですが今度は以下のエラーとなってしまいます。
php
1[12-Jul-2020 05:01:20 UTC] PHP Fatal error: 2Class 'JsonSchema\Constraints\BaseConstraint' not found in 3/export/user/b/zjp_56u01y/live_62u457/var/wordpress/wp-content/themes/test/plugins/ 4json-schema-master/src/JsonSchema/Validator.php on line 23
このエラーによれば【Validator.php】側の問題のようですが、しかしその問題の行(23行目)は以下の最後の部分でして、これは独自オートローダーによる「自動で必要なものを読んでくれる機能」によって解消されるつもりでしたので、これ以上原因を追えなくなってしまいました。
【Validator.php】
php
1<?php 2 3/* 4 * This file is part of the JsonSchema package. 5 * 6 * For the full copyright and license information, please view the LICENSE 7 * file that was distributed with this source code. 8 */ 9 10namespace JsonSchema; 11 12use JsonSchema\Constraints\BaseConstraint; 13use JsonSchema\Constraints\Constraint; 14 15/** 16 * A JsonSchema Constraint 17 * 18 * @author Robert Schönthal <seroscho@googlemail.com> 19 * @author Bruno Prieto Reis <bruno.p.reis@gmail.com> 20 * 21 * @see README.md 22 */ 23class Validator extends BaseConstraint
独自オートローダーの使い方が間違っているのではないかと思うのですが、どうすればいいのかアドバイスいただけませんでしょうか。
よろしくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/16 06:02
2020/07/16 08:19
2020/07/16 08:20
2020/07/16 08:37
2020/07/16 08:49 編集
2020/07/18 08:09
2020/07/20 03:12