勘違いで多くの時間を無駄にすることが多々あり、今回もそのケース。
<勘違い>
ControllerからViewに連想(ハッシュ)配列を渡そうとして(勘違い)、
htmlspecialchars() expects parameter 1 to be string, array given
期待されたパラメータ1は文字なのに、配列が渡されているよ
、というエラーが来た。
<正しくは>
発生したファイルはViewだったので、連想配列の受け取り時にエラーが出たのだと勘違いしていたら、ViewからControllerに連想配列を返そうとして生じたエラーだった。
ControllerからViewに配列をわたし、php-foreachやjs-echo、jq-$.echoで繰り返し処理する場合にも生じたりする。View側に連想配列を渡すときに、改行やクォテーションが文字列に変換されてしまい、配列じゃなくなったりする(のだと思う)。この場合の処理は、このページの最後に記載してます。
エラーコード
// $param=['ap'=>'apple','bn'=>'banana','rm'=>'remon']
<input type="hiddem" name="param" value="{{$param}}"/>
inputで配列を送ろうとしてのエラー。
初心者ならではの、ですね。
@php
foreach($param as $key =>$value)
{
echo '<input type="hidden" name="param['.$key.']" value="'.$value.'"/>';
}
これでControllerへのRequestに連想配列を渡せた。
エラーの発生個所やエラー内容の特定に数時間かけてしまった。
初心者って凄く時間を掛けてしまうのですね。
controller->script
//controller --------------------
$param=['param'=>$param];
return view('/',$param);
//blad.php --------------------
<script>
$(function(){
console.log({{$param}});
});
</script>
<body>
{{$param}}
</body>
同一ファイル内で javascript -> php(ララベル-bladeで)
<script>
window.onload=function(){
var param = 222;
document.cookie = "sample="+param+"";
}
</script>
<body>
@php
$sample = COOKIE['sample'];
echo $sample;
@endphp
</body>
// 実行結果
// 222
laravelController -> view.javascript に連想配列を送受信
どうやら、コントローラからjavascriptに連想配列を直接送受信できないらしい。送受信のステップは、
- Controller側で、連想配列を、Jsonコードに変換してviewに送信
- viewで、受信した連想配列をJSON.parse()する
- parseした配列を回す
$person = Person::get(['id','name','e-mail'])->toJson();
return view('top',['person'=>$person]);
<script>
$(function(){
var personArray = JSON.parse('<?php echo $person; ?>');
$.each(personArray,function(key,value){
console.log(value);
});
});
</script>