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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

3回答

1035閲覧

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

Citrusxparadi

総合スコア0

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/07/12 02:37

編集2020/07/12 02:41

目的

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されているファイルを逆から読むべきだと考えたためです。

php

1define( "DIR_TEMPLATE", get_template_directory() ); 2 3// use がないものを最初に読む 4require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Exception/InvalidArgumentException.php'; 5require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Exception/ValidationException.php'; 6 7// 水色を読む 8require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Entity/JsonPointer.php'; 9 10// 緑を読む 11require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/ConstraintError.php'; 12 13// ピンクを読む 14require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Constraints/Constraint.php'; 15 16// 黄緑を読む 17require_once DIR_TEMPLATE . '/plugins/json-schema-master/src/JsonSchema/Constraints/BaseConstraint.php'; 18 19// Validator.phpを読む 20require_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行目を見ると以下のようにありますが、この意味まではわかりません。

php

1class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayato7

2020/07/12 03:28 編集

ローカル環境などでもcomposerは使いたくないのでしょうか。 使えるのならcomposerを利用してインストールしたものを、FTPなどでアップロードするという方法があるとは思います。 https://www.serversus.work/topics/8twzqq9ryyiyujpahggy/
Citrusxparadi

2020/07/12 03:43

はい、お恥ずかしながら前提の通りでして、「composerを利用してインストールしたもの」が何になるかわからない状況なので、このように頑張っているところなのです。
hayato7

2020/07/12 04:23

require_onceを全ファイルに書いていくのは、大変です。加えてアップデートなどがあった場合、 反映作業の手間もかかります。 https://github.com/justinrainbow/json-schema/tree/master/src/JsonSchema もし手動でするなら上記URLのディレクトリ以下のファイルに関して、全て確認する必要があります。 useしているものは、すべてrequire_onceがいると考えた方がよいです。なので、おそらくほぼ全てのファイルの修正が必要ではないかと思います。加えて、useしていなくても、require_onceが必要なものがある場合もあります。(今回だと、BaseConstraint.phpで呼び出されるFactory.phpなどです。) 現実的なのは以下2つかなと。 - Composerの使い方を覚える 頑張るなら、こっちで頑張る方が今後のことを考えてもよいと思います。 >「composerを利用してインストールしたもの」が何になるかわからない状況 とありますが、インストールしたもの全てアップロードしてしまって問題ありません。 以下のようなサイトを参考にすればできないことはないと思います。 https://blitzgate.co.jp/blog/1820/ - オートローダーを自作 composerが行っていることを、コードで書いてしまうという作戦です。 ただ、こちらは初めてだとハマることも多いと思うので、あまりおすすめできません。
Citrusxparadi

2020/07/12 04:56 編集

「現実的なの」はありがたいのですが、ある程度スキルのある方にとってのものかと思います。わたしはこれまでComposerに挑戦したのですがどうしてもできなくて、だからいま自分ができるrequire_onceの方向で取り組もうとしているのが今回の質問です。 なのでrequire_onceの正しい書き方を知りたいのですが、やはりその部分は教えてはもらえませんでしょうか? 自作オートローダーという発想はなかったので一回挑戦してみます。
maisumakun

2020/07/12 07:10

> わたしはこれまでComposerに挑戦したのですがどうしてもできなくて PHPプロジェクトに今後取り組む上では、ほぼ確実に必要となります。いつ覚えるかだけの問題です。 > 自作オートローダーという発想はなかったので一回挑戦してみます。 そこまで手を出す余裕があるのであれば、先にComposerを使えるようになってください。
Citrusxparadi

2020/07/12 07:16

あの、ほんとに勘弁していただけませんか?Composerは私にはできなかった。この前提に立った質問はいけませんか?どのような正当性や責任や親切心があって、それほどまで前提の見直しを強要するか理解しかねます…
Citrusxparadi

2020/07/12 07:19

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

2020/07/12 07:22

> どうかお願いですから、私なりの前提の上での質問をご容赦ください。 その「前提」そのものに手を入れるのがいちばん適切、と考えて回答したまでです。
Citrusxparadi

2020/07/12 07:45

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

回答3

0

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

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

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

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

投稿2020/07/12 07:01

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/07/12 07:03

「Composerに挑戦したのですがどうしてもできな」い技術レベルで、手動読み込みをやろうとしても、なおのことうまくいかないだけです。
Citrusxparadi

2020/07/12 07:04

とりあえず試作品を作り、人に見せて、あとはプロに任せたいと思っています。維持コストうんぬんは今は関係ないですし、気にしないでください。いま自分ができることで戦うしかないんです。
Citrusxparadi

2020/07/12 07:07 編集

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

2020/07/12 07:07

> いま自分ができることで戦うしかないんです。 「Composerを身につける」ほうが速いし、あとあと役に立つと判断しての回答です。
Citrusxparadi

2020/07/12 07:08

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

0

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

なので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をさかのぼる必要あります。
他にも

php

1// Validator.php 56行目 2$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 05:04

編集2020/07/12 05:08
hayato7

総合スコア1135

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Citrusxparadi

2020/07/12 07:08

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

2020/07/12 07:21

require_onceだらけになるのを解消するのが、composerの役割でもあるので、本当はcomposer使っていただくのが一番いいんです。 windows環境なら、composerをインストールして、パスを通して、 composer require justinrainbow/json-schema を実行すればできるのですが。
guest

0

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

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

php

1// basic.php 2<?php 3require 'load_jsonschema.php'; /* 調整 */ 4 5$json = '{"a":1, "b":2}'; 6// JSON Schems を"schema.json"に記述しておく 7$schema = file_get_contents('./schema.json'); 8$v = new JsonSchema\Validator; 9$v->check(json_decode($json), json_decode($schema));

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

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

shell

1php 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 に加えましょう。

php

1// load_jsonschema.php 2<?php 3 4$JSON_SCHEMA_PATH = 'json-schema/src/JsonSchema/'; 5 6require_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 の上に加えます。

php

1// load_jsonschema.php 2<?php 3 4$JSON_SCHEMA_PATH = 'json-schema/src/JsonSchema/'; 5 6require_once $JSON_SCHEMA_PATH . 'Constraints/BaseConstraint.php'; 7require_once $JSON_SCHEMA_PATH . 'Validator.php'; 8

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

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

php

1// load_jsonschema.php 2<?php 3 4$JSON_SCHEMA_PATH = 'json-schema/src/JsonSchema/'; 5 6require_once $JSON_SCHEMA_PATH . 'UriResolverInterface.php'; 7require_once $JSON_SCHEMA_PATH . 'Uri/UriResolver.php'; 8require_once $JSON_SCHEMA_PATH . 'SchemaStorageInterface.php'; 9require_once $JSON_SCHEMA_PATH . 'SchemaStorage.php'; 10require_once $JSON_SCHEMA_PATH . 'UriRetrieverInterface.php'; 11require_once $JSON_SCHEMA_PATH . 'Uri/UriRetriever.php'; 12require_once $JSON_SCHEMA_PATH . 'Constraints/ConstraintInterface.php'; 13require_once $JSON_SCHEMA_PATH . 'Constraints/BaseConstraint.php'; 14require_once $JSON_SCHEMA_PATH . 'Constraints/Constraint.php'; 15require_once $JSON_SCHEMA_PATH . 'Constraints/ObjectConstraint.php'; 16require_once $JSON_SCHEMA_PATH . 'Constraints/TypeCheck/TypeCheckInterface.php'; 17require_once $JSON_SCHEMA_PATH . 'Constraints/TypeCheck/LooseTypeCheck.php'; 18require_once $JSON_SCHEMA_PATH . 'Constraints/TypeConstraint.php'; 19require_once $JSON_SCHEMA_PATH . 'Constraints/TypeCheck/TypeCheckInterface.php'; 20require_once $JSON_SCHEMA_PATH . 'Constraints/TypeCheck/StrictTypeCheck.php'; 21require_once $JSON_SCHEMA_PATH . 'Entity/JsonPointer.php'; 22require_once $JSON_SCHEMA_PATH . 'Constraints/UndefinedConstraint.php'; 23require_once $JSON_SCHEMA_PATH . 'Constraints/SchemaConstraint.php'; 24require_once $JSON_SCHEMA_PATH . 'Constraints/Factory.php'; 25require_once $JSON_SCHEMA_PATH . 'Validator.php'; 26

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

投稿2020/07/22 10:44

YufanLou

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問