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