Laravelでtry~catchとthrowを実験.Exception処理の動きを理解

Laravelでの例外処理について解説していきます。

Q. try ~ catch 処理とは

下記の記法です。

try {
    // 例外が発生する可能性のあるコード
} catch (Exception $e) {
    // 例外が発生した場合に行う処理
}

例外が発生する可能性がある場合に、
例外が発生すると処理が中断したり・停止することを防ぐために
try{ } で判断して → catch{ } で対処します。

Q. try ~ catch 例外処理を実施してみる

public function testExcetion() {
    try {
        // 例外が発生する可能性のあるコード
        $error = 5/0; // errorが発生する処理を実行
throwする必要有り。
    } catch (Exception $e) {
        // 例外が発生した場合に行う処理
    }
}

この処理を実施した場合、何も発生しません。
本来であれば、$error = 5/0; が実施されると Division by zero error のエラーが発生します。しかし、上記のtry ~ catch 処理の場合は何も表示されません。

それは、tryで例外が発生したものをキャッチして、catch内で処理させています。catch内では、受け取った例外に対して何も扱っていないので、変化無しです。

Q. try ~ catch 例外処理を受け止め

public function testExcetion() {
    try {
        // 例外が発生する可能性のあるコード
        $error = 5/0;
throwする必要有り。
    } catch (Exception $e) {
        // 例外が発生した場合に行う処理
        echo $e->getMessage(); // error messageを取得 (echo で出力)
    }
}

Division by zero error が表示されます。

Q. try は何をエラーと判断しているのか

public function testExcetion() {
    try {
        // 例外が発生する可能性のあるコード
        throw new Exception("error発生です!!!!");
throwする必要有り。
    } catch (Exception $e) {
        // 例外が発生した場合に行う処理
        echo $e->getMessage(); // error messageを取得 (echoで出力)
    }
}

error発生です!!!! が出力されます。

try{}内では、Exception を throwされることをきっかけに検知して、catchへ処理を移します。 (Exceptionは様々なClassあり)

dockerコンテナ内で生成したファイルを、ホスト(PC)へDL(連携)する方法

dockerコンテナ内でpythonのライブラリをinstallし、そのライブラリをzip化。 そして、そのzipファイルをホスト環境(ローカルPC)へ連携することを実現します。

①:phpのライブラリをinstallするdockerコンテナ環境を構築

ファイル構成

/ 
 L Dockerfile
 L entrypoint.sh
Dockerfile
FROM python:3.7

RUN apt-get update && apt-get install -y zip unzip

#pipでinstallしたいディレクトリ$$パッケージを指定&&インストール
RUN pip install --target ./python google-api-python-client google-auth requests-oauthlib

ADD entrypoint.sh /
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

・imageのベースはphp 3.7をpullしてきています。
・pip install で installしたいライブラリを。※今回zipファイルで連携したいライブラリ郡です。
・entrypoint.shをコンテナ上に追加・コンテナでの操作権限を付与して、コンテナで上で、コンテナ上でコマンド実行可能な状態を作る。(コマンドの具体は、entrypoint.shに記載)
・ENTRYPOINTに /entrypoint.shを指定して、コンテナ起動後の実行を指定

②:ライブラリをZip化 / entrypoint.shにてコードで実行

entrypoint.sh
!/bin/bash -eu
 SRC=/python
 DIST=/dist/layer.zip
 zip -q -r ${DIST} ${SRC}
 /bin/bash

・コンテナ上の/python ディレクトリをzip化して、 DISTで指定したディレクトリ位置へ
・コンテナ内を確認するために、 /bin/bash を起動させる。

・DIST=/dist/layer.zip というdistディレクトリが突然現れました。これは、後に、run する際にバインドマウントする際に連携するディレクトリです。※詳細は下記

③:バインドマウントをして、dockerコンテナとホストを連携

docker build でimageを作成

docker build . -t {imageのnameを指定}

docker run で コンテナ起動 &&

docker run --rm -v $(pwd):/dist -it {imageのname}

rm:終了後、コンテナ削除

今回の処理の一番重要な部分は、

-v $(pwd):/dist 

ここです。

ここのバインドマウントの処理によって、
$(pwd):ホストの現在のディレクトリ

/dist :コンテナ上の distディレクトリ
を連携しています。
※FROM python:3.7にはdistは存在しないので、このタイミングで自動生成される。

この後、
>>②:ライブラリをZip化 / entrypoint.shにてコードで実行

>> zip -q -r ${DIST} ${SRC} の処理によって
dist へLayer.zipが生成されています。

④:ホスト環境 / dockerコンテナ環境で確認

④-1:ホスト環境を確認

ファイル構成

/ 
 L Dockerfile
 L entrypoint.sh
 L Layer.zip

上記のようになってると思います。

④-2:dockerコンテナ環境を確認

/bin/bashでコンテナを起動していると思いますので、コンテナの中身を確認していきましょう。

distディレクトリに移動して、その中で空のディレクトリを生成してみて下さい。

cd dist && mkdir gogo

そうすると、コンテナ上の/dist/gogoディレクトリが生成されます。

それと同時に、ホスト環境でも下記のようになっていると思います。

/ 
 L Dockerfile
 L entrypoint.sh
 L Layer.zip
 L gogo

⑤:バインドマウント

https://matsuand.github.io/docs.docker.jp.onthefly/storage/

バインドマウントを利用する際の副作用として、これが良いことか悪いことかはわかりませんが、コンテナー 内に動作するプロセスを通じて ホスト のファイルシステムに変更がかけられるということです。 たとえばシステムにとって重要なファイル、ディレクトリを生成、編集、削除ができてしまいます。 セキュリティに影響を及ぼしかねない強力な能力がここにあって、ホストシステム上の Docker 以外のプロセスへも影響します。

Laravelでデータベースから取得したデータをviewで表示するとエラーが生じる

データベースから取得した結果を、

viewで、{{}} 内でそのまんま表示した際に

htmlspecialchars() expects parameter 1 to be string, array given

というエラーが生じた。

{{}}  の中には、stringを含めなさい。とのこと。

あれ??データベースから取得した結果は、stringではないのか??ということで混乱していました。

データベースから取得する際には、
DBファサード でget()メソッドを使ってデータ取得をしました。

調べた結果、
Illuminate\Support\Collection というデータ型でデータが返って来るとのことでした。( stdClassオブジェクト を含んでいる)そして、これはこのまんまでは、stringではないのです。
これを展開してあげる必要があります。

https://readouble.com/laravel/5.7/ja/queries.html

この、Collection型を展開するには、目的によっていろいろなメソッドが用意されているので、ご確認ください。

laravel 6.xでユーザーログイン・新規登録を一瞬で作成する方法

phpのフレームワークといえば、laravelですね。
フレームワークは簡単に機能が追加していける一方で、処理を理解するのが少し大変だと思います。

今回は、Webサービスを使う上で、使用頻度の高いユーザーログイン・新規登録を簡単に追加する実装方法を紹介します。

 ターミナル(コマンドプロンプト)で下記を実装してあげてください。

composer require laravel/ui "^1.0" --dev 
php artisan ui vue --auth

https://readouble.com/laravel/6.x/ja/authentication.html

ただし、これを実装するためには、composerという管理ツールをインストール&設定しておく必要があります。お気を付けください。