遅々として進まず: Laravelとクエリー文字列

相変わらず 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

という結果が表示されるのです。とてもややこしいですね。相当にこの考え方に慣れないとスイスイとプログラム書けないですよね。がんばろう

ついに壁を乗り越えた

いやあ長い時間がかかりました ついに高い高い壁を乗り越えることに成功したと思います

関係データベースにおいてその性能をもっとも発揮するのは、「多」対「多」のデータ構造に対するデータの出し入れでしょう

例えば、鎌倉ライブデモンストレーションでは一コマ 1時間15分から1時間30分ぐらいの「コマ」にプログラムを分割します。この「コマ」のことを session と呼ぶことにします。そして、各 sessionには属性として、{begin}, {end}, {title}, {description}, {sponsor}があります。これはそれぞれ意味するところは、開始時刻、終了時刻、そのコマのタイトルあるいは概念、そのコマの説明、スポンサー ということになります。各sessionには「司会」「討論者」「演者」「術者」などを配置せねばなりませんが、これらは何れも「人」であります。

従って、総括的に言えば、各sessionに対して何人もの「人」を関係付けねばならないのです。そこで、この sessionというデータの塊、これを tableと呼ぶのですが、sessionというtableが組みする「人」というtableを作る必要があります。

ここでは、doctorという名前の tableにしましょう。ここで最初に修正します。sessionやdoctorというテーブルには属性の塊がつまっているので、単数形よりも複数形の方が意味が通じやすいですよね。そこでこれらのテーブルに名称を sessionsと doctorsという複数形にします。これらのテーブルから一つのデータ塊を取り出せば、それぞれ sessionと doctorという単数形の呼び名になりますね。

鎌倉ライブデモンストレーションのプログラムを考えてください。朝から夜までいくつもの sessionsがあり、それぞれに参加する人々も複数 つまり doctorsあります。つまり「多くの」sessionと、「多くの」doctorsが意味的につながっている(関係している)のです。これが「多」対「多」の関係データベースということになります。

この関係を矛盾なく維持することは非常に難しく、2つのテーブルの間に、一つ中間テーブルを入れることが普通です。つまり、「多」対「一」 <–> 「一」対「一」 <–> 「一」対「多」というデータ構造にすることにより、結果的に「多」対「多」のデータ構造を実現するのです。

これを Laravelにより実現する方法が分からなかったのです。生の SQL/phpを使用すればこれまで何回も行ってきたので簡単です。でもこの数カ月間 Laravelを習得するために多大な時間、精神力、頭脳などを使ってきたのです。今更諦める訳には行きません。

そしてたった今実現しました。その証拠の snapshotがこれです

いやあ久しぶりです

随分と長いことこのブログを更新して来ませんてでしたね 申し訳ありませんでした

どうしても自分の気持が前向きにならなかったのです 何か特別のことがあったのでしょうか? いやいやそんなことはありません 何も特別のことはありませんでした 何時もの平坦な日常が続いていただけです。

もちろん、新型コロナに起因する皆が経験している閉塞感と不安 それはあります。でもだからといってブログ更新をしなかった訳ではないのです。まあ、何となく疲れた、辛い、しんどい、そんな気持ちがあり、考えてみれば、それらの疲労感のためにブログ更新をして来なかったのでしょう。

この歳になり、これからの自分の人生はどうなるのだろう? そんな不安に襲われます。強い不安ではなく、漠然としたものです。分かって頂けますよね。それは誰しもが潜在的に持つ不安です。人々を哲学に駆り立てる解決できない不安です。それと共に、今まで歩んできた人生に対する反省と、後悔 そんなものにも襲われます。そしてこれらの不安は漠然とした大きなものから、小さな具体的なものまで次々と向かってくる波のように自分の心に打ち付けてくるのです。

普段は明るく何の不安も無く過ごしているように見える自分なのにどうしてこんなことになっているのでしょうか? 新型コロナによってもたらされた社会を覆う漠然とした不安がそのきっかけの大きな部分でしょう。でもそれはきっかけにしか過ぎません。具体的なことはいくつもあります。

自分は世界中の誰よりも実臨床において経皮的冠動脈インターベンション(PCI)の分野で経験と実力を有している、そのように思いますし、それは世界中の人々も認めています。でも正直最近は、「本当にそうなのですか?」という自らに対する問いかけが沸き起こってくるのです。どのような時にそんな気持ちになるのでしょうか? あまり皆さん方には言いたくないのですが・・・・ 本来自分が鍛えてきた若手の手技を見ていて感じることがあるのです その斬新な発想と、恐れを知らない積極性、それを可能とする技術 それらを見て自らに対する脅威と自分の力に対する不安、その2つの想いが、双頭の龍のように自分の心の中に頭をもたげて来るのです。「今まで何十年間も自らの腕を磨いてきた、それなのに追いつき追い越されそうになるとは」。人はそのような状況を喜ばねばならない、と言うでしょうか? 

若手は技能だけでなく科学的にデータを纏め、それを論文として世に問う能力も優れています。振り返って自分はどうだったのか? 誰も科学的なデータ取りまとめについて教育を与える人はいなかった、いや 実はそのような機会を拒否してきたからなのでしょう この期に及んで言うべきことではないでしょうが、言い訳させて下さい。

自分が大阪大学に入学したのは 1969年のことです。その年、安田講堂炎上に象徴される東京大学入学試験が無くなった年でした。世の中は、学生運動と暴力的政治運動に覆われ、毎日のように警察機動隊とデモ隊の血で血を洗う暴力的衝突が起こっていて、まちなかにはサイレンの音と、催涙ガスの匂いが立ち込めていました。そんな年に入学し、卒業する時には必然的に「博士号ボイコット、非入局」をスローガンに掲げる「青年医師連合」のちっぽけなリーダーになっていました。

それでも、カテーテル手技に対する渇望があり、その道に進んでいったのです。この時に正しい科学的教育を受けていれば・・・ それが人生の中での取り返しのつかない後悔なのです。もちろん誰の責任でまありません。強いて言えば自分の責任です。

翻って若手を見ると、自由な発送の中で独特の感性に基づいて新しいことを解明し挑んでいく、そのように僕には見えます。正直その姿は羨ましいのです。

新型コロナが問題となってきた頃、2020年の2月初旬であったと思いますが、その頃から僕自身の問題として掲げてきたのが、自らの姿勢を前にやる、そのために今の自分でできること、それは Laravel PHP Frameworkに対する理解を深めることでした。この半年以上来る日も来る日も Laravelを理解しようと、してきました。初めは何処から手をつけていけば良いのか全く分かりませんでした。本をいくら読んでも書いてあることがさっぱり理解できないのです。でも最近はようやく言っていることが半分ぐらいは分かるようになってきました。

いやあバカみたいな話ですが、先週末よりどうしてもわからないことに悩んで来たのです。

The POST method is not supported for this route. Supported methods: PATCH.

<form class="form-group row" method="post" action="{{ url ("/session/{$session -> id}") }}">
    <!-- 擬似的HTTP method宣言 -->
    @csrf
    @method('patch')
    <input id="id" name="id" type="hidden" value="{{ old ('id', $session->id) }}">
    <div class="col-sm-6">
        <label id="begin">開始</label><br>
        <input class="form-control" name="begin" type="datetime" value="{{ old ('begin', $session->begin) }}">
    </div>
この問題解決に一週間近くかかりました。</pre>

エラーの原因は、@method(`patch`)でした 何が間違いか分かりますか? 正しいのは @method(‘patch’) なのです

Laravelによりサイト公開

これまで Coronaが問題となってから、自分でその間に新たな考え方とかスキルを取り入れようとしてきました。そして選択したのが、PHP Frameworkである Laravelにより Home Pageを書き換えることでした。それが本日ようやく達成できました。

これまでの 湘南鎌倉総合病院循環器内科の Home Pageはこれでしたが、Laravelを用いて書き換え、このようになりました。もちろんこの間には見てくれが変化していますが、本質は urlを見れば分かります。urlというのはインターネットの世界での唯一無二の識別文字列です。どんな Browserにも上段に窓がありますが、ここに出てくる文字列が url なのです。そして、Laravelで書き換えた新しい Home Pageではその urlの欄を見れば、例えば以前のスタイルでは経皮的僧帽弁接合不全修復システム (MitraClip)のページを示す url = https://www.kamakuraheart.org/MitraClip/mitraclip.phpだったのですが、現在は https://www.kamakuraheart.org/MitraClip/mitraclip となっています。この2つの文字列何が違うかと言えば、本質的なものはね前者では .phpというファイル識別子(拡張子)がついていました。つまりこれは PHPというweb言語で書かれだプログラム・ファイルであることを明示的に示しています。しかし、後者ではこれがありません。単なる拡張子のある無しの違いにしか過ぎないと思われるかも知れませんが、そこには本質的な違いがあります。後者では mitraclipというものを明示的に要求しているのであり、その表現が PHP programであるとかいうことは関係無いのです。

とは言うものの、Laravelで作成したサイトのプログラムをレンタルサーバーで運用することは一般的には出来ない、とされているのです。それを実現することに随分と時間がかかりました。

Laravel Frameworkの Directoryに public/というのがあるのですが。その中のファイルは全て /www/という公開フォルダに置く必要があります。そうすることにより、たとえば kamakuraheart.orgとしてアクセスできるのです。そして、public/の中にある index.phpが公開されねばならないのです。index.htmlを潰しておけば、Web Serverは優先的に index.phpを見に行きます。僕の使用しているレンタルサーバーでは、/www/の直下に index.phpを置きますので、この index.phpを以下のように修正する必要がありました

require __DIR__.’/../vendor/autoload.php’;
$app = require_once __DIR__.’/../bootstrap/app.php’; というものを

require __DIR__.’/vendor/autoload.php’;
$app = require_once __DIR__.’/bootstrap/app.php’; に書き換える必要があったのです。

何れにしても順調に軽快に現在は動作しています。