Aura.Uriは、URLなどを論理的に作成・分析できますよというクラスです。
ってつい先日やった気がするな。
さて、どちらが優秀か試してみましょう。
Factory::getInstance($http)みたいなstaticメソッドが無く、いちいち無意味なインスタンス化をしないといけないのがよくわかりません。
基本的にZend\Uri\Uriと同等のことができますが、is**の検証系メソッドはありません。
AuraはtoString()のようなメソッドをあまり持たず、マジックメソッド__toString()で文字列変換を実装しています。
なので文字列にしたい場合はStringにキャストしましょう。
プロパティは概ねStringですが、pathとqueryだけクラスになっています。
そしてこのAura\Uri\Queryには問題があります。
まずQuery::buildString()が何故かprotectedなので、Zend\Uri\Uri::setQueryのような配列形式での投入ができません。
そしてヘルプでは$url->query->baz = 'zab';とか書いてありますが、実はこれが正しく動作しません。
Aura\Uri\Queryは\ArrayObjectをextendsしているのですが、呼び出しの引数に\ArrayObject::ARRAY_AS_PROPSを記述していないせいで、プロパティと配列が別の値として扱われます。
Aura\Uri\Queryは内部値を配列形式で取り扱っているため、プロパティで指定した値は反映されません。
思いっきりバグじゃねーかこれ。
指定するときは配列形式で指定するか、setFromString()を使いましょう。
なおsetFromString()は他の値を全部消して上書きするので、上記例ではaとbが消えています。
AuraPHPの記事
ってつい先日やった気がするな。
さて、どちらが優秀か試してみましょう。
<?php require_once('path/to/channel/vendor/autoload.php'); // Aura.Uri $http = 'http://example.com/foo/../bar.php?a=1&b=2#hoge'; $factory = new Aura\Uri\Url\Factory($_SERVER); $uri = $factory->newInstance($http); // 分析 // スキーマを取得 $uri->scheme; // http // ユーザ名/パスワードを取得 $uri->user; // NULL $uri->pass; // NULL // ホスト名を取得 $uri->host; // example.com // ポート番号を取得 $uri->port; // NULL // パスを取得 (string)$uri->path; // /foo/../bar.php (string)$uri->query; // a=1&b=2 $uri->query->getArrayCopy(); // array('a'=>'1', 'b'=>'2') $uri->fragment; // hoge // 参照を解消 $uri->get(); // /fuga.php?c=3&d=4 // 作成 $uri->setScheme('https'); $uri->setUser('user'); $uri->setPass('pass'); $uri->setHost('example.jp'); $uri->setPort(443); $uri->path->setFromString('/fuga.php'); $uri->setFragment(''); // $uri->query->buildString(array('c'=>3, 'd'=>4)); // Fatal error:Call to protected method $uri->query->a = 5; // 正しく動作しない $uri->query['b'] = 6; // OK $uri->query->setFromString('c=3&d=4'); // OK (string)$uri; // https://user:pass@example.jp:443/fuga.php?c=3&d=4
Factory::getInstance($http)みたいなstaticメソッドが無く、いちいち無意味なインスタンス化をしないといけないのがよくわかりません。
基本的にZend\Uri\Uriと同等のことができますが、is**の検証系メソッドはありません。
AuraはtoString()のようなメソッドをあまり持たず、マジックメソッド__toString()で文字列変換を実装しています。
なので文字列にしたい場合はStringにキャストしましょう。
プロパティは概ねStringですが、pathとqueryだけクラスになっています。
そしてこのAura\Uri\Queryには問題があります。
まずQuery::buildString()が何故かprotectedなので、Zend\Uri\Uri::setQueryのような配列形式での投入ができません。
そしてヘルプでは$url->query->baz = 'zab';とか書いてありますが、実はこれが正しく動作しません。
Aura\Uri\Queryは\ArrayObjectをextendsしているのですが、呼び出しの引数に\ArrayObject::ARRAY_AS_PROPSを記述していないせいで、プロパティと配列が別の値として扱われます。
Aura\Uri\Queryは内部値を配列形式で取り扱っているため、プロパティで指定した値は反映されません。
思いっきりバグじゃねーかこれ。
指定するときは配列形式で指定するか、setFromString()を使いましょう。
なおsetFromString()は他の値を全部消して上書きするので、上記例ではaとbが消えています。
AuraPHPの記事
PR