20190127のlaravelに関する記事は3件です。

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.みたいな初歩的なものは見つかりやすいかもしれない。
時間があればの話だけど...

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravelで簡単な一言掲示板を作ってみた

はじめに

え~皆さんはじめまして、未来に絶望している学生です。
5日ほど前からlaravelの勉強を始めました。
アウトプットも兼ねて簡単な一言掲示板を作ってみました。

完成したのはこのようなものです。
bandicam 2019-01-27 17-01-44-710.jpg
①新規投稿
名前とコメントとパスワードを入力して送信を押す。パスワードは削除や編集で必要になる。(会員登録とかそういうものではない。)

②削除
投稿の一番左の番号と、投稿した際に入力したパスワードを入れて削除ボタンを押せば削除される。

③編集
同じように番号とパスワードを入力して編集ボタンを押すと、その名前とコメントとパスワードが、新規投稿部分のフォームに表示されるので、それを変えたいように変えて送信を押せば編集される。

ちなみに一画面ですべてのアクションを行っている。

テーブル作成

php artisan make:migration create_posts_table

migartionファイルはこのように書き換える。

database/migrations/2019_01_26_215655_create_posts_table.php
public 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.php
class 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.php
Route::get('post', 'PostController@index');
Route::post('post', 'PostController@selectAction');

複数のフォームによるPOSTの送り先が同じ場所になってしまうので、
フォームごとに名前を付け、それによってコントローラーで追加、削除、編集メソッドへとふりわける必要があった。
参照↓
LaravelのFormで複数Submitボタンを設置したいときのハンドリング方法

最後に

おとなしくページは分けたほうが良いですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ReflectionException : Class ClassName does not exist

Seederとmigrationのクラスをいじってて名前が気に入らなくて、コマンド使わずに、手でリネームしたらクラスがないと怒られた。

ReflectionException  : Class NameSeeder does not exist

// classがないと言われたらこれを打つ。
composer dump-autoload

composer dump-autoloadが面倒くさい Laravel
https://qiita.com/ytake/items/98c438d6a006f61df54a

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む