- 投稿日:2019-01-27T21:29:59+09:00
laravel herokuデプロイ時に起きた問題
あくまで自分用のメモです。
xamppでのテスト環境時では起きず、herokuの本番環境にデプロイしたら発生したエラーについてメモ。
1. ReflectionException Class App\Http\Controllers~~ does not exist
web.php//修正前 //Route::post('test/add','vueController@post'); //修正後 Route::post('test/add','VueController@post'); //##VueControllerを呼び出したい##原因
web.phpからのコントローラー指定の際、コントローラー名の大文字と小文字を間違えるというあり得ないぐらい単純なミス。
xamppでのテスト環境上では小文字のままでも問題なく動いたため、無駄に悩んでしまった。
加えて'v'と'V'という紛らわしいミスで余計に見つからなかったのかもしれない。別にautoloadがうまくいってないとかhttpsの強制とかsessionの不具合とかpost予約語説とかまttttttttったく関係なかった。
でもどの段階で大小区別が変わったのかはまだ不明。
2.
今後またエラーが発生したら追記
どうしてもうまくいかない問題が発生したら時間を開けてから考え直すと結構解決する。
気持ちを変えたり初心に帰ってからコードを見ると1.みたいな初歩的なものは見つかりやすいかもしれない。
時間があればの話だけど...
- 投稿日:2019-01-27T17:52:06+09:00
laravelで簡単な一言掲示板を作ってみた
はじめに
え~皆さんはじめまして、未来に絶望している学生です。
5日ほど前からlaravelの勉強を始めました。
アウトプットも兼ねて簡単な一言掲示板を作ってみました。完成したのはこのようなものです。
①新規投稿
名前とコメントとパスワードを入力して送信を押す。パスワードは削除や編集で必要になる。(会員登録とかそういうものではない。)②削除
投稿の一番左の番号と、投稿した際に入力したパスワードを入れて削除ボタンを押せば削除される。③編集
同じように番号とパスワードを入力して編集ボタンを押すと、その名前とコメントとパスワードが、新規投稿部分のフォームに表示されるので、それを変えたいように変えて送信を押せば編集される。ちなみに一画面ですべてのアクションを行っている。
テーブル作成
php artisan make:migration create_posts_tablemigartionファイルはこのように書き換える。
database/migrations/2019_01_26_215655_create_posts_table.phppublic function up() { Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('comment'); $table->string('password'); $table->timestamps(); }); }php artisan migrateモデル作成
php artisan make:model Post$guardedでidを「値を用意しておかない項目」に指定する。仮に値がnullだとしてもエラー無く動く。
$rulesは、バリデーションのときに呼び出して使う。app\Post.phpclass Post extends Model { protected $guarded = array('id'); public static $rules = [ 'name' => 'required', 'comment' => 'required', 'password' => 'required', ]; }ビュー作成
views\post\index.blade.php<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>掲示板</title> </head> <body> <form action="post" method="post"> {{ csrf_field() }} <input type="hidden" name="id" value="{{ $data->id }}"> <tr><th>名前:</th><td><input type="text" name="name" value="{{ $data->name }}"></td></tr> <tr><th>コメント:</th><td><input type="text" name="comment" value="{{ $data->comment }}"></td></tr> <tr><th>パスワード:</th><td><input type="text" name="password" value="{{ $data->password }}"></td></tr> <tr><th></th><td><input type="submit" name="add" value="送信"></td></tr> </form> <form action="post" method="post"> {{ csrf_field() }} <tr><th>番号:</th><td><input type="text" name="id"></td></tr> <tr><th>パスワード:</th><td><input type="text" name="password"></td></tr> <tr><th></th><td><input type="submit" name="delete" value="削除"></td></tr> </form> <form action="post" method="post"> {{ csrf_field() }} <tr><th>番号:</th><td><input type="text" name="id"></td></tr> <tr><th>パスワード:</th><td><input type="text" name="password"></td></tr> <tr><th></th><td><input type="submit" name="edit" value="編集"></td></tr> </form> @if ($posts !== null) <table> @foreach ($posts as $post) <tr><td>{{ $post->id }}</td><td>{{ $post->name }}</td> <td>{{ $post->comment}}</td><td>{{ $post->created_at }}</td></tr> @endforeach </table> @endif </body> </html>ビューはこの一つのみ。
3つのフォームがあるが、上から新規投稿、削除、編集。
その下には、postsテーブルに保存されている全ての投稿を表示させるコードを書いている。コントローラーとルーティング
controllers\PostController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Post; class PostController extends Controller { public function index(Request $request) { $posts = Post::all(); if (isset($request)) { return view('post.index', [ 'posts' => $posts, 'data' => $request, ]); } else { return view('post.index', [ 'posts' => $posts, ]); } } public function selectAction(Request $request) { if ($request->has('add') && $request->id !== null) { $this->update($request); } elseif ($request->has('add')) { $this->create($request); } elseif ($request->has('delete')) { $this->remove($request); } elseif ($request->has('edit')) { $data = $this->edit($request); if ($data !== null) { return redirect() ->action('PostController@index', [ 'id' => $data['id'], 'name' => $data['name'], 'comment' => $data['comment'], 'password' => $data['password'], ]); } } return redirect('post'); } public function create(Request $request) { $this->validate($request, Post::$rules); $post = new Post; $post->name = $request->name; $post->comment = $request->comment; $post->password = $request->password; $post->save(); } public function remove(Request $request) { $post = Post::find($request->id); if ($post['password'] === $request->password) { Post::find($request->id)->delete(); } } public function edit(Request $request) { $post = Post::find($request->id); if ($post['password'] === $request->password) { return [ 'id' => $post['id'], 'name' => $post['name'], 'comment' => $post['comment'], 'password' => $post['password'], ]; } else { return; } } public function update(Request $request) { $this->validate($request, Post::$rules); $post = Post::find($request->id); $form = $request->all(); unset($form['add']); unset($form['_token']); $post->fill($form)->save(); } }routes\web.phpRoute::get('post', 'PostController@index'); Route::post('post', 'PostController@selectAction');複数のフォームによるPOSTの送り先が同じ場所になってしまうので、
フォームごとに名前を付け、それによってコントローラーで追加、削除、編集メソッドへとふりわける必要があった。
参照↓
LaravelのFormで複数Submitボタンを設置したいときのハンドリング方法最後に
おとなしくページは分けたほうが良いですね。
- 投稿日:2019-01-27T17:15:25+09:00
ReflectionException : Class ClassName does not exist
Seederとmigrationのクラスをいじってて名前が気に入らなくて、コマンド使わずに、手でリネームしたらクラスがないと怒られた。
ReflectionException : Class NameSeeder does not exist // classがないと言われたらこれを打つ。 composer dump-autoloadcomposer dump-autoloadが面倒くさい Laravel
https://qiita.com/ytake/items/98c438d6a006f61df54a
