IT系技術ブログ

【PHP Laravel】入門チュートリアルサイトの補足【初心者】

PHPのフレームワーク[Laravel]を勉強する際、以下のサイトを参考に勉強させてもらいました。

Laravelの基礎知識

https://newmonz.jp/lesson/laravel-basic/chapter-1

私は、PHPは初心者、Laravelの事前知識が全くない状態でしたが、

とても分かりやすく丁寧な説明とサンプルが充実しており、Laravel入門として勉強するにはとてもお世話になりました。

しかし、チュートリアルとして各章の勉強を進めるにつれて、一部動かなかった点や自分で解く必要のある箇所がありましたので、記述しておきます。

Chapter-3 ミニブログの作成

以下のセクションの内容を元に作成してみましたが、PHP Errorが発生しました。

tinkerの起動

resources/views/articles/index.blade.php(抜粋)

        <form onsubmit="return confirm('本当に削除しますか?')" action="{{ route('articles.destroy', $article) }}" method="post">
            @csrf 
            @method('delete')
            <button type="submit">削除</button>
        </form>

エラーメッセージ

PHP Error: Class "Article" not found in Psy Shell code on line 1

パスが「Article」に対して通っていないため上記のエラーが発生します。

解決方法

以下のコマンドをターミナルで実行します。

composer dump-autoload

Vender配下の当該ファイルにファイルパスが自動的に追加されるそうです。

参考

Laravel エラー辞書(自分用)

Chapter-6 記事の削除

以下のセクションの内容を元に作成してみましたが、コーディングするソース対象の誤りががあるようです。

削除確認ダイアログ

resources/views/articles/index.blade.php(抜粋)

        <form onsubmit="return confirm('本当に削除しますか?')" action="{{ route('articles.destroy', $article) }}" method="post">
            @csrf 
            @method('delete')
            <button type="submit">削除</button>
        </form>

誤:resources/views/articles/index.blade.php(抜粋)

正:resources/views/articles/show.blade.php(抜粋)

Chapter-9 記事のブックマーク

以下のセクションの内容を元に作成してみましたが、「$user->is_bookmark($articleId)」のメソッドが存在しないためエラーが発生します。

attach()とdetach()メソッド

app/Http/Controller/BookmarkController.php(抜粋)

    public function store($articleId) {
        $user = \\Auth::user();
        if (!$user->is_bookmark($articleId)) {
            $user->bookmark_articles()->attach($articleId);
        }
        return back();
    }
		public function destroy($articleId) {
        $user = \\Auth::user();
        if ($user->is_bookmark($articleId)) {
            $user->bookmark_articles()->detach($articleId);
        }
        return back();
    }

「is_bookmark」メソッドの記述

ModelsのUser.phpに次の例のように記述してください。

app\Models\User.php(抜粋)

    public function is_bookmark($articleId)
    {
        $bookmark = Bookmark::where('user_id', $this->id)->where('article_id', $articleId)->get();
        return  count($bookmark) > 0;
    }

「is_bookmark()」メソッドの内容で実行したい処理としては、テーブル「bookmarks」から「user_id」及び「article_id」を指定した結果がデータベースから取得できたかどうかを判定結果を取得したい処理となります。

        $bookmark = Bookmark::where('user_id', $this->id)->where('article_id', $articleId)->get();

「where(‘user_id’, $this->id)」でAuth認証で取得したUser情報のid($this->id)を「user_id」の検索値として設定します。

「where(‘article_id’, $articleId)」で引数で渡した「$articleId」を「article_id」の検索値として設定します。

        return  count($bookmark) > 0;

「count($bookmark)」でテーブル「bookmarks」から取得した件数を取得します。

「return count($bookmark) > 0;」で取得した件数が1件以上であれば、「is_bookmark()」の結果としてtrueを返します。

Chapter-11 初期データの登録

以下のセクションの内容を元に作成してみましたが、まだ未定義のRouteを使用したコードがあるためエラーが発生します。

商品一覧画面

resources/views/products/index.blade.php(抜粋)

~
        <form onsubmit="return confirm('ログアウトしますか?')" action="{{ route('logout') }}" method="post">
            @csrf
            <button type="submit" class="btn btn-sm btn-dark">ログアウト</button>
        </form>
~
                    @foreach ($products as $product)
                    <tr>
                        <td><a href="{{ route('products.edit', $product) }}">{{ $product->id }}</a></td>
                        <td>{{ $product->category->name }}</td>
                        <td>{{ $product->maker }}</td>
                        <td>{{ $product->name }}</td>
                        <td>{{ $product->price }}</td>
                        <td>{{ Carbon\Carbon::parse($product->created_at)->format('Y年m月d日') }}</td>
                    </tr>
                    @endforeach

未定義のRouteを使用している箇所を削除

上記を次の例のように記述してください。

resources/views/products/index.blade.php(抜粋)

~
        <form onsubmit="return confirm('ログアウトしますか?')" action="" method="post">
            @csrf
            <button type="submit" class="btn btn-sm btn-dark">ログアウト</button>
        </form>
~
                    @foreach ($products as $product)
                        <tr>
                            <td><a href="">{{ $product->id }}</a></td>
                            <td>{{ $product->category->name }}</td>
                            <td>{{ $product->maker }}</td>
                            <td>{{ $product->name }}</td>
                            <td>{{ $product->price }}</td>
                            <td>{{ Carbon\Carbon::parse($product->created_at)->format('Y年m月d日') }}</td>
                        </tr>
                    @endforeach

こちらの動かなかった内容についてですが「Chapter-12 商品検索と課題」で課題を実装すれば解決されます。

モバイルバージョンを終了