Laravel 10 PUT:画像を特定のフォルダに格納する

【Laravel】マルチログイン機能を構築し本格的なECサイトをつくってみよう
↑ こちらの教材のメモになります。

  • InterventionImage を諦めて(リサイズだけだし...)、次に進むために画像をアップロードする必要がある。 書き方も変える必要がある。

  • メイントピック:Storage::putFileAs('public/shops/', $imageFile, $fileNameToStore);

    • putでやっていたら、永遠に画像名のフォルダが作られて、そこに画像が格納された。。。
    • 素直にputFileAs()を使うのがよかった。まあ、無事に解決できたし、次にいけるからいく!!
    public function update(Request $request, $id)
    {
        $imageFile = $request->image; //一時保存
        if(!is_null($imageFile) && $imageFile->isValid() ){
            // Storage:putFile('public/shops', $imageFile);
            $fileName = uniqid(rand().'_');
            $extension = $imageFile->extension();
            $fileNameToStore = $fileName. '.' . $extension;

            // dd($imageFile);

            Storage::putFileAs('public/shops/', $imageFile, $fileNameToStore);
        }
    }

参考

【PHP / Laravel】Storage の基本操作まとめ #PHP - Qiita

Laravel 10.x:compact関数

Udemyの教材:【Laravel】マルチログイン機能を構築し本格的なECサイトをつくってみよう【Breeze/tailwindcss】
こちらの学習のメモ書きとして、書いてます!

    public function edit($id)
    {
        $shop = Shop::findOrFail($id);
        return view('owner.shops.edit', compact('shop'));
    }

上記は、ShopController に記載されているものです。

Shopモデルから、引数にわたってくる $id と合致するデータを取得して、
変数 $shop に代入しています。

URL:owner/shops/edit/$id に画面が遷移します。

この際、compact()が、compact($shop)ではなく、compact('shop') になっているのがしっくりこなかったですが、
調べると、compact() は、連想配列を作っているそうです。
今回の例だと、['shop' => $shop] という連想配列になるそう。

【Laravel 10:エラー】Base table or view not found: Table

エラー:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel_umarche.app\http\controllers\admin\owners' doesn't exist


解決方法:
OwnersController.php

store()の中の

修正前:'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:owners'.Owners::class],

修正後:'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:owners'],

unique バリデーションルールで Owners::class を使用していますが、これはモデルのクラスを指定するものです。
しかし、正しくはテーブルの名前を指定する必要があります。

by Chat-GPT 3.5

この解決により、すでに登録されているメアドを登録しようとすると、バリデーションエラーが発生します。

教材:【Laravel】マルチログイン機能を構築し本格的なECサイトをつくってみよう【Breeze/tailwindcss】

Laravel:Carbon, Tailwind CSSが反映されない

Carbon

  • phpのDateTimeの拡張ライブラリ。

Tailwind CSSが反映されない

色々いじって、地道に CSSを自分で当て込めてましたが、Laravel 10 において、
Tailwind CSS を反映させるには、$ npm run devを実行している状態で $ php artisan serveを実行しないと反映されないらしい。。。

調べるのがいいですね。。。時間を溶かしてしまった。。。。が、しかし!これも初心者あるある!さっさと抜け出したい!

入力値を維持する方法

  • バリデーションエラーの後、デフォルトでは、入力値が空にリセットされる
  • それを防ぐ方法として、<input name="email" value="{{ old('email') }}" /> と inputタグに、value属性かつ、old('<name属性の値>') を入力する。

formで入力された値を取得する方法

* 引数:Request $request =>「form で入力された値が Requestクラスになって、それをインスタンス化する」と言う意味 => method injection と呼ぶ
*/
public function store(Request $request)
{
    // $request->name; // <= これは、入力されたオーナー名を取得することを意味している。
}

Laravel:Eloquent

Eloquent(エロクエント)

  • .NET Core MVC で当てはめるとしたら、Serviceだなと思いました。

Controllerに記述すると書いてあるけど、こちらの参考サイトの内容だと、いわゆる「CRUD機能」の内容で、
それはつまり、Service に書くことですね。
というか、公式ドキュメントのEloquentの準備:Laravel 10の冒頭で、ORMだと紹介している。
かつ、それに続く以下の文章の内容で、Service だとハッキリとした。

Eloquentを使用する場合、各データベーステーブルに対応する「モデル」があり、
そのテーブル操作に使用します。
Eloquentモデルは、データベーステーブルからレコードを取得するだけでなく、
テーブルへのレコード挿入、更新、削除(CRUD)も可能です。

Eloquentモデル

これは、.NET Core MVC でいうところの「ViewModel」ですね。

未認証時のリダイレクト処理

  • 場所:Http/Middleware/Authenticate.php
  • ここに、redirectTo()メソッドが実装されているので、そこに追記したいのがあれば、追記する。

アップロードする画像の保存手順

  • storage/app/public:ここに、使う画像を格納する
  • CLIにて、$ php artisan storage:linkを実行。
    • このコマンドは、storage/app/public と public/storage を紐づけて、外部から接続できて格納した画像を見えるようにする。

インターフェイス

Laravelとは、全くではないですが、関係ないインターフェイスについて。

インターフェイスとは、クラスの仕様書である。
そのクラスに、インターフェイスを実装する(当てはめる)と、そのクラスで使えるメソッドやプロパティが、実装したインターフェイスにあるモノのみになる。

Lravel

ファイル生成コマンド:php artisan make:[Hoge] <クラス名>

  • [Hoge]:これを以下のどれかにはてはめる
    • Controller
    • Model
    • Migration
    • Request
    • etc

ルート設定

  • User
  • Admin
  • Owner

上記3つのアカウントログイン機能(マルチログイン)を設定する手順

  • routesフォルダの配下に、「admin.php」「owner.php」ファイルを作成
  • web.phpファイルをコピペする
    • TestConrtoller(複数あれば全て)の記述を削除する
  • auth.phpの中身をコピーして、owner.phprequire authの行と入れ替える。
  • use分は、冒頭に移動する。
    • できた、owner.phpの中身をadmin.phpにコピペする。

エラー:Djangoにて、CSSファイルが読み込まれない

static/hoge/style.css ファイルが、index.htmlに反映されない

何回見直しても、style.css を読み込ませるパスに間違いはないし、ファイル名のタイポもなかったです。 なんだかんだこれに、3時間は費やしました。

【結論】
setting.pyにおいて staticfileを読み込ませる、パスが未設定だった!

# setting.py において、以下の2,3行目(STATICFILES_DIRS ~)が記載されていなかったのが原因でした

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')]

別日にパスも設定されるが、style.cssがまた反映されない状況が起こりました。

  • 解決方法:開発者ツールで、「Network/Disable cached」にチェックマーク入れる。
開発者ツールが表示されたら、リロード時にキャッシュを無効化するオプションを有効化する:

メニューバー上の「Network」タブに移動。
チェックボックスで「Disable cache」(キャッシュを無効化)を有効化(チェックを入れる)。