相変わらず Laravelと格闘しています これまでに静的なサイト作成に関しては克服しました。現在挑んでいるのは Databaseからデータを読み書きして、それにより動的にサイトを書き換えるものです。これに関しても、Laravelの枠組のみであれば、まずは大丈夫にまで進歩しました。
現在挑んでいるのは Ajaxを用いて画面遷移無しに、画面を書き換えるものです。これが難しい。
これまでの鎌倉ライブデモンストレーションのプログラムにおいては、生の php, jQuery, javascript, html, css, SQLを用いてこれを実現していましたが、少なくともそれと同等のものを Laravelを用いて実現したいのです。
これが難しく、ネットで調べても的確に記載されているページはありません。また何とかそれらしきものを発見しても、トライすると何やらうまく行かないのです。その過程で明らかなプログラミング・エラーは発見することもしばしばあるのです。自分でもブログに uploadする時、間違いが無いように注意しているのですが、 uploadするまでの過程でエラーを含んだプログラムを uploadすることがしばしばあります。これは、わざとやっている訳ではなく、 programming/bug fixに使用する頭脳の回転と、ブログに uploadする頭脳の回転が異なるからのように思います。少なくとも自分の場合はそうです。さて、先程理解したのは、Laravelを用いて Query文字列をどのように画面に反映するか? というものです。たとえば、
https://www.kamakuraheart.org/?message=SAITO
というものを web browser (Chrome, Safari, Edge, Firefoxなど)の url (ブラウザの上にある窓)に打ち込むと、これは、サーバーに対して、messageという名前の変数に SAITOという文字列をセットして送りました、ということになります。これはクエリー文字列というもので、アドレスの後に?に引き続いて入力するのです。正確には、このようにして打ち込むと、GETというインターネット通信の形式で、サーバーにデータが送り込まれるのです。サーバーはそのデータを処理してから、ブラウザに結果を送り返します。このようにして動的なサーバーが構成されるのです。
さて、この方法を Laravelではどのように実現するのか? それに悩んでいました。
さて、ここからは Laravelについてある程度分かっておられる人でないと何のこっちゃ? です
まず、ルートというものを設定します これは Laravelの各種ファイルの中に以下のように書きます (/routes/web.phpに記述)
Route::get('doctor', 'DoctorController@message);
このルーティングの意味するところは、たとえば、https://www.kamakuraheart.org/doctor?message=SAITO とアクセスがあれば、messageという変数名と、SAITOというデータをペアにして (これを php言語では、連想配列という形式で、プログラム中では、[‘message’ => ‘SAITO]と記述します。
そして今度はこれらのデータをどのように処理して、どこに流すか? を決める Controllerに支持します。先のルーターにおいて、messageというメンバー関数にその処理を任せる、と指示しました (DoctorController@message) そこで、/app/Http/Controllersの中に、DoctorController.phpというファイルをつくり、その中にメンバー関数を追加します
namespace App\Http\Controllers; use App\Doctor; use Illuminate\Http\Request; class DoctorController extends Controller { public function message (Request $request) { $data = $request -> message; return view ('doctor.show1', [ 'message' => $data ]); } }
さて、この DoctorControllerの最後に、’doctor.show1’というのがありますが、これは、この Controllerからの戻り値を、/doctor/show1 というものを用いて (正確には、show1.blade.php というファイル)表示しなさい、ということを表します。
/resources/views/doctor/show1.blade.php というファイルに以下のように記載しました。
@extends ('layouts.app') @section ('content') <div class="form-group form-inline"> これが受け取った値です<br>{{ $message }} </div> @endsection
controllerでは $requestという変数に、utl = ‘https://www.kamakuraheart.org/doctor?message=SAITO というものから、.org/doctor? 以降、つまり message=SAITO というデータが入っています。しかも、この$requestは連想配列の形式でデータが入っています つまり、[‘message’ => ‘SAITO’] という形式です。ここで、php言語の中で、$data = $request -> message; とすれば、 $dataの中に、SAITOというものが入ります。そして最後の [ ‘message’ => $data ]という連想配列データが show1.blade.phpに渡されます。つまり $messageという変数には、$data中身である SAITOが入っているのです。
これを htmlで表すと {{ $message }} となります。ただし、これは .blade.php という形式の Bladeというファイルです。
つまり、
http://www.kamakuraheart.org?message=SAITO
とブラウザに打ち込めば、最終的に
これが受け取った値です
SAITO
という結果が表示されるのです。とてもややこしいですね。相当にこの考え方に慣れないとスイスイとプログラム書けないですよね。がんばろう