0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel、web.phpのルーティングとコントローラーのつながりがよくわからない

Last updated at Posted at 2020-07-08

LaravelのRoutesとView、Controllerのつながりについての質問

問題点、質問:htmlからリンクで指定したルーティングにデバックが通らない。(<aタグ>GETメソッド)

Route::resourceは問題なく処理が通るのですが、追加で記述した
Route::get('/book/csvDownload','BookController@csvDownload')->name('book.csvDownload');
がうまく通りません。

デバッグで試してみるとRoute::resourceはコントローラー側に処理が通っているのに対し、追記したものはコントローラー側に処理が来ていません。

html(php)でリンク(<a>タグ)先にアクセスするとき、ルーティングの設定(web.php)を基にコントローラーへ割り振っているという認識です。
また、開発環境にはeclipse(php,xampp)、webサーバにはapacheサーバを使っています。

ルーティングの設定ファイル(web.php)

web.php
use Illuminate\Support\Facades\Route;

//RouteResourceメソッドを使用することで、Restfulなルーティングを行うことができる
Route::resource('book','BookController');
/*この場合、以下のようにルーティングされます。
 * GET   |   /book           |   BookController@index    |一覧画面表示
 * GET   |   /book/{book}    |   BookController@show     |詳細画面表示
 * GET   |   /book/create    |   BookController@create   |登録画面表示
 * POST  |   /book           |   BookController@store    |登録処理
 * GET   |  /book/{book}/edit|   BookController@edit     |編集画面表示
 * PUT   |   /book/{book}    |   BookController@update   |編集処理
 * DELETE|  /book/{book}     |   BookController@destroy  |削除処理
 */
//問題のルーティング箇所
//このURLにアクセスされたときにcsvファイルに情報を出力する処理に飛ばす
Route::get('/book/csvDownload','BookController@csvDownload')->name('book.csvDownload');

コントローラーファイル

BookController.php
namespace App\Http\Controllers;
use App\Book;
use Illuminate\Http\Request;

/**
**
**前略
**
*/
 public function destroy($id){
        $book=Book::findOrFail($id);
        $book->delete();

        return redirect("/book");
    }

    public function create(){
        $book=new Book();
        return view('book/edit',compact('book'));
    }

    public function store(Request $request){
        $book = new Book();
        $book->name = $request->name;
        $book->price = $request->price;
        $book->author = $request->author;
        $book->save();

        return redirect("/book");
    }
//問題のメソッド
    public function csvDownload(){
        //データベースからすべてのデータを抽出
        $books=Book::all();

        //指定されたディレクトリ空のcsvファイルを生成
        $res = touch("C:\Users\y_takeuchi\Downloads\books.csv");

        if($res==false){
            rmdir("C:\Users\y_takeuchi\Downloads\books.csv");
            return redirect("/book");
        }

        //指定したパスのファイルを書き込みで開く
        $file = fopen('C:\Users\y_takeuchi\Downloads\books.csv','w');

        //csv作成
        fputcsv($file,['name','price','author']);
        foreach($books as $entity){
            fputcsv($file, [$entity->name,$entity->price,$entity->author]);
        }
        fclose($file);

        return redirect("/book");

View

index(.blade).php
<!DOCTYPE html>
<html>
<head>
<title>Laravel Sample</title>
<link rel="stylesheet"  href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container ops-main">
	<div class="row">
		<div class="col-md-12">
			<h3 class="ops-title">書籍一覧</h3>
		</div>
	</div>
	<div class="row">
		<div class="col-md-11 col-md-offset-1">
			<table class="table text-center">
				<tr class="text-center">
					<th>ID</th>
					<th>書籍名</th>
					<th>価格</th>
					<th>著者</th>
					<th>削除</th>
				</tr>
				@foreach($books as $book)
				<tr>
					<td><a href="/sample/book/{{$book->id}}/edit">{{$book->id}}</a></td>
					<td>{{$book->name}}</td>
					<td>{{$book->price}}</td>
					<td>{{$book->author}}</td>
					<td>
						<form action="/sample/book/{{$book->id}}" method="post">
							<input type="hidden" name="_method" value="DELETE">
							<input type="hidden" name="_token" value="{{csrf_token()}}">
							<button type="submit" class="btn btn-xs btn-danger" aria-label="Left Align">
								<span class="glyphicon glyphicon-trash"></span>
							</button>
						</form>
					</td>
				</tr>
				@endforeach
			</table>

<!--問題の箇所
			<div><a href="/sample/book/create" class="btn btn-default">新規作成</a></div>
			<div><a href="/sample/book/csvDownload" class="btn btn-default">csvダウンロード</a></div>
-->		
            </div>
	</div>
</div>
</body>
</html>
<!-- Laravelではビューの作成にBladeというテンプレートを使っています。 -->

試みたこと:

・キャッシュが残っているという情報があったので、php artisan route:listでクリーンしました。

・Route::resourceがあると、ほかのルーティングが通らないのかと思い、Route::resourceを

:get('/book','BookController@index');
Route::get('/book/{book}','BookController@show');
Route::get('/book/create','BookController@create');
Route::post('/book','BookController@store');
Route::get('/book/{book}/edit','BookController@edit');
Route::put('/book/{book}','BookController@update');
Route::delete('/book/{book}','BookController@destroy');```
と書き直しました。すると、つぎは、```Route::get('/book/create','BookController@create');```も処理が通らなくなってしまいます。

・テンプレート側を\<a>タグではなく\<form>タグで送信しましたが、結果は同じく表示されませんでした。

・NotFound404にはならず、画面が遷移せずにその場にとどまったままURLだけ変わっています。

ご教授いただけるとありがたいです。

参考サイト引用:https://qiita.com/sano1202/items/6021856b70e4f8d3dc3d
0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?