カテゴリー: PHP

Home / カテゴリー: PHP

Class ‘RAFIE\Twig\TwigViewServiceProvider’ not found

2015-05-10 | Laravel5, PHP | コメントはまだありません

結論:psr-0とpsr-4で読み込み方が違うのでそれ用の指定をcomposer.jsonに追加してあげると解決した。

なんとphpの話題

Laravel5というのを触り始めまして、もうこれがなんだかハッピーな感じの作りになっているんで自宅でも触って練度高めていこうというモチベーションがあるんです。大変に珍しいことです。
最近のphp開発とはこうなんですというエッセンスがあるので、時代から取り残されていた部分を一挙に取り返さないといかん、と思っております。名前空間とかトレイトとか、よく分かってないけどそういうやつね。

で、ちょうどFlaskで作りかけて放置していた物があったので、それをLaravel5で移植してみます。
Laravel5 + Twig + React + Stylus + webpack といった感じ。いまどきのアレコレてんこ盛り。
Reactはまだよく分かってないが、webpackでStylusをコンパイル?すると、jsの中にcssの表現も一緒に入っちゃって、なんかもんげー感じです。ファイルの分割の機能がwebpackにはあるので、cssファイルとして別途吐き出させることも可能なはず。そこまでは理解が進んでないのでまたこんど。

さて掲題の件。
さいしょこそ普通に

こういうかんじでLaravel5にTwigを組み込み、使ってました。
が、たぶんartisanコマンド使ったあたりで突如、

FatalErrorException in ProviderRepository.php line 150: Class ‘RAFIE\Twig\TwigViewServiceProvider’ not found

こんなエラー発生。ほんとに突然です。前後でcomposer.jsonを書き換えたとかもなかった(はず)。
あまりにも急なことだったので、寝ぼけてファイルの移動でもやらかしたかとオロオロしたりとか。vendorディレクトリとcomposer.lockをまるっと消してcomposer installで再構築してみても症状が変わらない。まったく意味がわかんなかったんですが、Laravel5本か、どっかのブログか、qiitaでみた記述をふと思い出しました。
いわく、何か一つでもPSR-4形式でのモジュール読み込みをした瞬間から、特に指定がなければLarabel全体がPSR-4で動作するものとしてなんとかかんとか。
うろ覚えなんで話半分で。
さしあたりそのぼんやりしたヒントを手がかりにして、ぐぐります。
「psr-0 psr-4 php」とか「composer.json psr-4 autoload」とか、雑なキーワードですが、仕方ない。何も分かってない状態。

不思議とヒット

探してみるといろいろ出てきます。

あら、これなんじゃないの?

psr-0とpsr-4以外記述方法に違いはありませんが、設定値の意味が変わっています。
ComposerでPSR-4仕様のオートロードを設定する | Beaglee技術blog

ほう。ほうほう。どうせ意味分かってないのだしということで、書き方を真似してみます。

さあどうだ。画面をリロードしてみます。

Whoops, looks like something went wrong.

ウープスじゃねえよぶっ飛ばすぞ。
あ、そうだアレやんないと。

composer dump-autoload

リロード。
はい、解決ですよかった。
かなりラッキーパンチで解決したからよかったようなものの、あたしには難しかったよ。
ともあれ、これで開発の続きができるというものです。よかった。

かんけいないけどGistって便利ね。なんだこれ。

記事中にあるLaravel5本とはこれのこと。

phpのmakeでコケる

2014-01-22 | PHP | コメントはまだありません

ローカルにVirtualBoxアレして、サーバ作ってんの。
php5.5.8を入れたろうと思ってあれこれ中
ざくっとmake test

ext/standard/basic_functions.o: In function `zm_startup_basic’:
/tmp/php-5.5.8/ext/standard/basic_functions.c:3648: undefined reference to `zm_startup_password’
ext/standard/basic_functions.o:(.rodata+0xae0): undefined reference to `zif_password_hash’
ext/standard/basic_functions.o:(.rodata+0xaf4): undefined reference to `zif_password_get_info’
ext/standard/basic_functions.o:(.rodata+0xb08): undefined reference to `zif_password_needs_rehash’
ext/standard/basic_functions.o:(.rodata+0xb1c): undefined reference to `zif_password_verify’
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `SSL_CTX_use_certificate_chain_file@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `SSL_CTX_set_verify@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `ASN1_STRING_type@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `CRYPTO_free@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `SSL_get_shutdown@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `SSL_get_verify_result@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `d2i_PKCS12_fp@OPENSSL_1.0.0′
/usr/lib/i386-linux-gnu/libcurl.so: undefined reference to `EVP_cleanup@OPENSSL_1.0.0′

もういやじゃー
なんなのじゃー

メモ:いまのとこのconfigure
./configure –with-mysql –enable-cgi –with-openssl –with-zlib –with-curl –with-config-file-path=/etc –enable-opcache=no

短い。
なーんかcurlとopensshで転ぶんだよなー。めんどくさい。

タイトル長すぎか。まあいいか。
VPSに適当にphp5.5.8(mysql,openssl,enable-cgiが有効)を放り込み、fuelphpをセットアップしております。

oilでアプリケーションを生成するあたりで、最後に
php composer.phar update
こんなのやりますな。すると
Writing lock file
Generating autoload files
Error – date_default_timezone_get(): It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone ‘UTC’ for now, but please set date.timezone to select your timezone. in COREPATH/classes/fuel.php on line 161

はあ。
最初はたんにphp.iniがないんで怒られてたんですが、php.iniを設置し、date.timezoneの値をセットしてあげてもこの症状が変わらない。
どうもあちこち見た感じ、php.iniに書いても空で初期化されてphpが開始してしまっているみたいな感触。
ちなみに近くにある設定箇所の
;date.default_latitude = 31.7667
;date.default_longitude = 35.2333
;date.sunrise_zenith = 90.583333
;date.sunset_zenith = 90.583333

このへんは、コメントアウトされているにもかかわらずなんか値を保持している状態。
気持ち悪くてかなわない。

いささか消極的な解決法

なんだかfuel.phpで死んでるようなので、
fuel/core/classes/fuel.php
の先頭あたりに以下を記述。
date_default_timezone_set(“Asia/Tokyo”);

やだなあこういうの……。
嫌なのはまああれですが、怒られなくなったのでいったんこれで進めることに。
試し書きでphpinfoとか書いて上げるようなノリの一枚物でも、こういう処置を講じてあげないとだめなのかいな。めんどくさい。

根本的に解決しました

コメント欄参照というと簡単すぎですが、コンパイル時に指定されているphp.iniの位置に、ただしくphp.iniが置かれていないことが原因でした。
あたし/etc/php.iniにおいてたんだけど、phpinfo確認したら

Configuration File (php.ini) Path /usr/local/lib

とあるわけよ。
やんなっちゃうよね。
/usr/local/lib/php.ini
に設置しなおし、php-cgiの再起動(nginxから使うので)して解決。
お騒がせしました。

php array_shift

2013-04-17 | PHP | コメントはまだありません

$a = array();

$a[5] = "5 banme";
$a[4] = "4 banme";
$a[0] = "0 banme";
$a[1] = "1 banme";
$a[2] = "2 banme";

print_r($a);
print(array_shift($a));

そもそもこういうデータを作ったやつを殴るのが先ではあるけど、諸事情あんだよ。現実は色々と散らかってて汚いものなんだ。
で、まあ、察しついたかも知んないけど、結果は、

Array
(
    [5] => 5 banme
    [4] => 4 banme
    [0] => 0 banme
    [1] => 1 banme
    [2] => 2 banme
)

5 banme

というわけで、一番最初に突っ込んだ奴が先頭なんだな。この場合には、配列をこさえた際のインデックス番号にはなんの意味もない。意味ないどころかreset()されて台無しだ。

PHP: array_shift – Manual

mixed array_shift ( array &$array )

array_shift() は、array の最初の値を取り出して返します。配列 array は、要素一つ分だけ短くなり、全ての要素は前にずれます。 数値添字の配列のキーはゼロから順に新たに振りなおされますが、 リテラルのキーはそのままになります。

なので、

$a = array();
$a[5] = "5 banme";
$a[4] = "4 banme";
$a[0] = "0 banme";
$a[1] = "1 banme";
$a[2] = "2 banme";

sort($a);
print_r($a);
print(array_shift($a));

こうしてsort()いれてみる

Array
(
    [0] => 0 banme
    [1] => 1 banme
    [2] => 2 banme
    [3] => 4 banme
    [4] => 5 banme
)

0 banme

納得するであろう形になった。インデックス番号だと思ってたけど添字なんだなコレ。
いやーよかった。

     *      *
  *     +  うそです
     n ∧_∧ n
 + (ヨ(* ´∀`)E)
      Y     Y    *

うそなんだなー

$a = array();
$a[5] = "AAAAA";
$a[4] = "BBBBB";
$a[0] = "CCCCC";
$a[1] = "DDDDD";
$a[2] = "EEEEE";

sort($a);
print_r($a);
print(array_shift($a));

インデックスの番号と中身を組み替えた図。

Array
(
    [0] => AAAAA
    [1] => BBBBB
    [2] => CCCCC
    [3] => DDDDD
    [4] => EEEEE
)

AAAAA

AAAAAは$a[5]だったはずの中身です。
中身でソートしちゃうよねー

こういうときはksort()をつかうんでした。

$a = array();
$a[5] = "AAAAA";
$a[4] = "BBBBB";
$a[0] = "CCCCC";
$a[1] = "DDDDD";
$a[2] = "EEEEE";

ksort($a);
print_r($a);
print(array_shift($a));

これで、

Array
(
    [0] => CCCCC
    [1] => DDDDD
    [2] => EEEEE
    [4] => BBBBB
    [5] => AAAAA
)

CCCCC

一件落着。さて殴りにいこうか。

久々にphp &= ってなんだよの巻

2013-04-12 | PHP | コメントはまだありません

php自体は久々どころではなく日々さわって涙を流しているわけですが。

php -r "$a = true; $a &= true; echo $a;"
1
php -r "$a = true; $a &= false; echo $a;"
0
php -r "$a = false; $a &= false; echo $a;"
0
php -r "$a = false; $a &= true; echo $a;"
0

どっかでfalseが一度でも入ったらfalseなんじゃな。

マニュアルにもあった。

See the Arithmetic Operators
Assignment    Same as:
$a += $b     $a = $a + $b    Addition
$a -= $b     $a = $a - $b     Subtraction
$a *= $b     $a = $a * $b     Multiplication
$a /= $b     $a = $a / $b    Division
$a %= $b     $a = $a % $b    Modulus

See the String Operators
$a .= $b     $a = $a . $b       Concatenate

See the Bitwise Operators page
$a &= $b     $a = $a & $b     Bitwise And
$a |= $b     $a = $a | $b      Bitwise Or
$a ^= $b     $a = $a ^ $b       Bitwise Xor
$a <<= $b     $a = $a << $b     Left shift
$a >>= $b     $a = $a >> $b      Right shift

人の書いたソースにこういうのがあってね。
なんだろうと思ったわけ。