質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Q&A

1回答

5043閲覧

Laravel8でリンクの生成と記事作成が上手くいかない

Hi1317

総合スコア6

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

0グッド

0クリップ

投稿2020/10/07 01:48

編集2020/10/07 03:01

前提・実現したいこと

Laravel8でコントローラの「index」メソッドにaction()でリンクを作成して、そこから「show」メソッドに移動するという処理を行いたいのですが、「index」メソッドのViewを開くと「Action laravel_practicesController@show not defined.」というエラーが出てしまいました。
エラーについて調べるとルーティングを追加するとあったので、ルーティングに「Route::get('/laravel_practices/{id}', 'laravel_practicesController@show')」を追加したら「index」メソッドは正常に開くようになったのですが、リンクから「show」メソッドに移動すると、
今度は「Target class [laravel_practicesController] does not exist.」のエラーが出てしまっています。

「show」のルーティングをLaravel8の書き方で書くとアクションの定義がなされず、
Laravel8以前のルーティングで書くとリンクに移動するときにクラスが存在しないというエラーが出てしまい、
ルーティングでエラーを解決できません。
Laravel8でactionで生成したリンクのメソッドを表示する方法について他に何かあるでしょうか?

発生している問題・エラーメッセージ

InvalidArgumentException Action laravel_practicesController@show not defined. (View: C:\xampp\htdocs\PHP\sample\resources\views\laravel_practices\index.blade.php)
Illuminate\Contracts\Container\BindingResolutionException Target class [laravel_practicesController] does not exist.

該当のソースコード

"C:\xampp\htdocs\PHP\sample\routes\web.php"

<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\laravel_practicesController; Route::get('/', [laravel_practicesController::class, 'index']); Route::get('/laravel_practices/{id}', [laravel_practicesController::class, 'show']);

"C:\xampp\htdocs\PHP\sample\app\Http\Controllers\laravel_practicesController.php"

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\laravel_practice; use App\Http\Controllers\laravel_practicesController; class laravel_practicesController extends Controller { public function index() { // $laravel_practices = laravel_practice::all(); $laravel_practices = laravel_practice::latest()->get(); // $laravel_practices = []; // dd($laravel_practice->toArray()); return view('laravel_practices.index')->with('laravel_practices', $laravel_practices); } public function show($id) { $laravel_practice = laravel_practice::findOrFail(); return view('laravel_practices.show')->with('laravel_practice', $laravel_practice); } }

"C:\xampp\htdocs\PHP\sample\resources\views\laravel_practices\index.blade.php"

<!DOCTYPE html> <html lang = "ja"> <head> <meta charset = "utf-8"> <title>Blog Posts</title> <link rel = "stylesheet" href = "/css/styles.css"> </head> <body> <div class = "container"> <h1>Blog Posts</h1> <ul> @forelse($laravel_practices as $laravel_practice) <li><a href = "{{action([laravel_practicesController::class, 'show'], $laravel_practice->id)}}">{{$laravel_practice->tittle}}</a></li> @empty <li>No posts yet</li> @endforelse </ul> </div> </body> <html>

"C:\xampp\htdocs\PHP\sample\resources\views\laravel_practices\show.blade.php"

<!DOCTYPE html> <html lang = "ja"> <head> <meta charset = "utf-8"> <title>$laravel_practice->tittle</title> <link rel = "stylesheet" href = "/css/styles.css"> </head> <body> <div class = "container"> <h1>$laravel_practice->tittle</h1> <p>{!! nl2br(e($laravel_practice->body)) !!}</p> </div> </body> <html>

試したこと

ルーティングに「Route::get('/laravel_practices/{id}', 'laravel_practicesController@show')」を追加した
以下、参考記事
https://qiita.com/hththt/items/38906ba3f46ead6bba25
https://dotinstall.com/lessons/basic_laravel_v2/42214
https://dotinstall.com/lessons/basic_laravel_v2/42215
https://teratail.com/questions/116877
https://www.it-swarm-ja.tech/ja/php/laravel-action-not-defined/1051901262/

補足情報(FW/ツールのバージョンなど)

Laravel8
PHP 7.4.10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

そもそもaction()は使わない。

routes/web.phpではname()でルート名を付ける。

php

1Route::get('/home', [HomeController::class, 'index']) 2 ->name('home');

homeへのURLが必要な時はroute()

php

1<a href="{{ route('home') }}">Home</a>

全部にルート名付けるほどではないので付けないこともある。

php

1Route::view('/', 'welcome');

ルート名がない場合はurl()

php

1<a href="{{ url('/') }}">Welcome</a>

もしくは何も使わなくても十分。

<a href="/">Welcome</a>

LaravelのURL生成はこれだけ覚えれば十分。
Laravelには「一応存在はするけど現実的には滅多に使われない機能」が割とある。
action()なんて一度も使ったことない。

Laravel8のviewで使うなら名前空間を全部書く必要がある。

php

1{{ action([App\Http\Controllers\HomeController::class, 'index']) }}

こんな変な使い方よりroute('home')がいい。

投稿2020/10/07 05:59

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hi1317

2020/10/07 06:06

ありがとうございます。 普通にroute関数だけでいいのですね。 Laravel8ではaction関数は使えないって認識でいいのかな
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問