質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

composerが使えない環境でのjson schemaの使い方について

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 234

目的

Jason-schemaをcomposerなしで利用したいです。

WordPressでcomposerを使うことができない(そのスキルがない)という前提で宜しくお願い致します。

状況

justinrainbow/Jason-schemaを利用するため、以下のページからzipをDLしました。
https://github.com/justinrainbow/json-schema.git

そして使い方として以下のページを見ると「Validator.php」を読めばいいことがわかりました。
https://blog.masu-mi.me/post/2014/10/03/test_json_schema/

しかしこれはcomposerが使える状況においてだと思っています。
今回は使えないので、ファイルをすべて自分でrequireしないといけません。

そこで「Validator.php」でuseしているものをさかのぼり、次のファイルたちが必要なのではないかと考えました。

イメージ説明

これらのファイルたちを以下のようにrequireしました。
使い方のページにあった「Validator.php」を読むために、useされているファイルを逆から読むべきだと考えたためです。

define( "DIR_TEMPLATE", get_template_directory() );

// use がないものを最初に読む
require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Exception/InvalidArgumentException.php';
require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Exception/ValidationException.php';

// 水色を読む
require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Entity/JsonPointer.php';

// 緑を読む
require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/ConstraintError.php';

// ピンクを読む
require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Constraints/Constraint.php';

// 黄緑を読む
require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Constraints/BaseConstraint.php';

// Validator.phpを読む
require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Validator.php';


こう考えて実行したのですが、以下のエラーになってしまいました。

[12-Jul-2020 01:42:17 UTC] PHP Fatal error:  Interface 'JsonSchema\Exception\ExceptionInterface' not found in /export/user/b/zjp_56u01y/live_62u457/var/wordpress/wp-content/themes/test/plugins/json-schema-master/src/JsonSchema/Exception/InvalidArgumentException.php on line 15


さっそくInvalidArgumentException.phpの15行目を見ると以下のようにありますが、この意味まではわかりません。

class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface


さきほどのrequireの順番を変えたりもしたのですができず、そもそも考え方が間違っているのではないかと不安になりました。

ここまで以下①~⑤の考えに基づいてきたのですが、どこかが間違っているためにできないのだと思います。正しくはどうすべきかなどアドバイスを頂きたいです。

➀最終的に「Validator.php」が読めればOK
➁composerが使えないときは、「Validator.php」を読むために必要なファイルがある
➂それは「Validator.php」のuseをさかのぼった上図の7個だけである
④上記コードのrequireのやり方はあっている
⑤他に必要な処理はない

どうぞよろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Citrusxparadi

    2020/07/12 16:19

    すみません少し表現が悪かったです。ご親切からの助言はうれしいのですが、どうかお願いですから、私なりの前提の上での質問をご容赦ください。

    キャンセル

  • maisumakun

    2020/07/12 16:22

    > どうかお願いですから、私なりの前提の上での質問をご容赦ください。

    その「前提」そのものに手を入れるのがいちばん適切、と考えて回答したまでです。

    キャンセル

  • Citrusxparadi

    2020/07/12 16:45

    そうですよね。すみませんでした。

    キャンセル

回答 3

+4

わたしはこれまでComposerに挑戦したのですがどうしてもできなくて、だからいま自分ができるrequire_onceの方向で取り組もうとしているのが今回の質問です。

確実にそちらのほうが茨の道です。バージョンが変われば依存ライブラリも変化しうるので、そのたびに調べる作業が必要になって、維持コストも半端ありません。

  1. 空のディレクトリにcomposer.jsonを書いてcomposer installを行う
  2. ディレクトリ内に生成したファイルを全部コピー
  3. WordPressからはautoload.phpを呼び出す

このようにするのが手っ取り早いですし確実です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/12 16:04 編集

    >「Composerに挑戦したのですがどうしてもできな」い技術レベルで、手動読み込みをやろうとしても、なおのことうまくいかないだけです。
    いいえ、他のプラグインはComposerなしでできました。Jason-schemaがそれらと比べて複雑なのか、同じ方法ではできず困っているところです。

    キャンセル

  • 2020/07/12 16:07

    > いま自分ができることで戦うしかないんです。

    「Composerを身につける」ほうが速いし、あとあと役に立つと判断しての回答です。

    キャンセル

  • 2020/07/12 16:08

    ご判断ありがとうございます。

    キャンセル

+1

ローカル環境であれば、問題ないのだと考えていたので、おすすめしているつもりでした。
すみませんでした。

なのでrequire_onceの正しい書き方を知りたいのですが、やはりその部分を教えてはもらえませんでしょうか?

先ほど述べた通りです。

以下先ほどの内容

もし手動でするなら上記URLのディレクトリ以下のファイルに関して、全て確認する必要があります。
useしているものは、すべてrequire_onceがいると考えた方がよいです。なので、おそらくほぼ全てのファイルの修正が必要ではないかと思います。加えて、useしていなくても、require_onceが必要なものがある場合もあります。(今回だと、BaseConstraint.phpで呼び出されるFactory.phpなどです。)

①〜⑤についても回答しておきます。
➀最終的に「Validator.php」が読めればOK
間違いではないと思いますが、Validator.phpを呼び出した時にエラーが発生しなければOKという方がまだ正しいです。

➁composerが使えないときは、「Validator.php」を読むために必要なファイルがある
正しいです。Validator.phpは外部のファイルがなければ使えません。

➂それは「Validator.php」のuseをさかのぼった上図の7個だけである
違います。それぞれのファイルの全部のuseをさかのぼる必要あります。
他にも

// Validator.php 56行目
$schemaURI = SchemaStorage::INTERNAL_PROVIDED_SCHEMA_URI;


Validator.phpでは、SchemaStorageのように、useしなくても呼び出せるもの(なぜ呼び出せるかは、namespaceについて知る必要があります)もあるのでこれもrequire_onceで読み込んでおく必要があります。

※ ちなみに、Validator.phpで全てのファイルをrequire_onceするでも、それぞれのファイルで必要なものをrequire_onceするでも、正しくかけていればどちらでも動くはずです。

④上記コードのrequireのやり方はあっている
はい。require_onceを利用していれば問題ありません。

⑤他に必要な処理はない
③で述べた通り、ほぼ全てのファイルで修正が必要かと思われます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/12 16:08

    ①〜⑤についてありがとうございます。require_onceの正しい書き方を知りたいので、もう少し調べてみます。

    キャンセル

  • 2020/07/12 16:21

    require_onceだらけになるのを解消するのが、composerの役割でもあるので、本当はcomposer使っていただくのが一番いいんです。

    windows環境なら、composerをインストールして、パスを通して、

    composer require justinrainbow/json-schema
    を実行すればできるのですが。

    キャンセル

0

他の答えの通り、 composer を使う方がずっと楽です。が、あえて使わないとどんだけ面倒くさくなりますか?

問題文中のサイトから下記のスクリプトを引用して、ファイル名ちょっと調整します:

// basic.php
<?php
require 'load_jsonschema.php'; /* 調整 */

$json = '{"a":1, "b":2}';
// JSON Schems を"schema.json"に記述しておく
$schema = file_get_contents('./schema.json');
$v = new JsonSchema\Validator;
$v->check(json_decode($json), json_decode($schema));

問題文中のような必要なファイルを分析するのもいいですが、実はその分析をPHPに任せればいいです。

空の load_jsonschema.php と schema.json を作ってそのまま 

php basic.php 

で実行したら、下記のようなエラーメッセージが出てきます。

Fatal error: Uncaught Error: Class 'JsonSchema\Validator' not found in /private/tmp/php-no-composer/basic.php:7
Stack trace:
#0 {main}
  thrown in /private/tmp/php-no-composer/basic.php on line 7

その Class 'JsonSchema\Validator' の部分は必要なクラスであり、src/JsonSchema/Validator.php の中にあります。そのファイルを load_jsonschema.php に加えましょう。

// load_jsonschema.php
<?php

$JSON_SCHEMA_PATH = 'json-schema/src/JsonSchema/';

require_once $JSON_SCHEMA_PATH . 'Validator.php';

また php basic.php で実行したら、下記のようなエラーメッセージが出てきます。

Fatal error: Uncaught Error: Class 'JsonSchema\Constraints\BaseConstraint' not found in /private/tmp/php-no-composer/json-schema/src/JsonSchema/Validator.php:23
Stack trace:
#0 /private/tmp/php-no-composer/load_jsonschema.php(26): require_once()
#1 /private/tmp/php-no-composer/basic.php(2): require('/private/tmp/ph...')
#2 {main}
  thrown in /private/tmp/php-no-composer/json-schema/src/JsonSchema/Validator.php on line 23

似たように、Class 'JsonSchema\Constraints\BaseConstraint' が src/JsonSchema/Constraints/BaseConstraint.php にあります。そのファイルを Validator.php の上に加えます。

// load_jsonschema.php
<?php

$JSON_SCHEMA_PATH = 'json-schema/src/JsonSchema/';

require_once $JSON_SCHEMA_PATH . 'Constraints/BaseConstraint.php';
require_once $JSON_SCHEMA_PATH . 'Validator.php';

上記の流れを繰り返します。もう加えたファイルはもう一度エラーメッセージに現れたら、ファイルの順序を調整してみます。

最後の結果は下記のようです。

// load_jsonschema.php
<?php

$JSON_SCHEMA_PATH = 'json-schema/src/JsonSchema/';

require_once $JSON_SCHEMA_PATH . 'UriResolverInterface.php';
require_once $JSON_SCHEMA_PATH . 'Uri/UriResolver.php';
require_once $JSON_SCHEMA_PATH . 'SchemaStorageInterface.php';
require_once $JSON_SCHEMA_PATH . 'SchemaStorage.php';
require_once $JSON_SCHEMA_PATH . 'UriRetrieverInterface.php';
require_once $JSON_SCHEMA_PATH . 'Uri/UriRetriever.php';
require_once $JSON_SCHEMA_PATH . 'Constraints/ConstraintInterface.php';
require_once $JSON_SCHEMA_PATH . 'Constraints/BaseConstraint.php';
require_once $JSON_SCHEMA_PATH . 'Constraints/Constraint.php';
require_once $JSON_SCHEMA_PATH . 'Constraints/ObjectConstraint.php';
require_once $JSON_SCHEMA_PATH . 'Constraints/TypeCheck/TypeCheckInterface.php';
require_once $JSON_SCHEMA_PATH . 'Constraints/TypeCheck/LooseTypeCheck.php';
require_once $JSON_SCHEMA_PATH . 'Constraints/TypeConstraint.php';
require_once $JSON_SCHEMA_PATH . 'Constraints/TypeCheck/TypeCheckInterface.php';
require_once $JSON_SCHEMA_PATH . 'Constraints/TypeCheck/StrictTypeCheck.php';
require_once $JSON_SCHEMA_PATH . 'Entity/JsonPointer.php';
require_once $JSON_SCHEMA_PATH . 'Constraints/UndefinedConstraint.php';
require_once $JSON_SCHEMA_PATH . 'Constraints/SchemaConstraint.php';
require_once $JSON_SCHEMA_PATH . 'Constraints/Factory.php';
require_once $JSON_SCHEMA_PATH . 'Validator.php';

composer の autoload.php がしていることはこの流れに似たようなことです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る