- 投稿日:2020-04-04T22:02:15+09:00
Laravelのバリデーションについて
バリデーションについてまとめてみた。
バリデーションとは、ルールに対してあっているか、あっていないかを判断する。
postControllerpublic function update(Request $request) { $request->validate([ 'name' => 'require|string|max:20', //入力必須、文字列、20文字以内 'text' => 'require|max:300', //入力必須、300じ以内 'date' => 'require|date', //入力必須、日付 'email' => 'require|email', //入力必須、email型 ]); return view ('posts.index',['post'=>true]); //viewに返す }postControllerにpostにフォームで送られたデータをバリデーションする。
'フォーム名' => 'バリデーションルール',
バリデーションルールに通れば、ビューに返すことができ、できなければ、自動でリダイレクトする。
自動リダイレクトしないパターン
Validatorクラスのmakeメソッドを使う。(use Validator;)
postControllerpublic function update(Request $request) { $validator = Validator::make($request->all(),[ 'name' => 'require|string|max:20', 'text' => 'require|max:300', 'date' => 'require|date', 'email' => 'require|email', ]); return view('post',['post'=> true]); //バリデーションエラーだった場合の処理 if($validator->fails()) { return redirect('posts.error',['post'=>fail]); } }この場合でも自動リダイレクトさせたい場合は、 ->validate(); とする。
たくさんのバリデーションルールがあるので、いろいろ試して見ると良い。
- 投稿日:2020-04-04T17:24:19+09:00
Laravelで Target class [App\Http\Controllers\***] does not exist. エラー!
Laravel6 あるある言いたい
コピペでルーティングとコントローラを増やして、ついついやっちまうミス。
えぇ〜なんでぇ〜ってなります。以下を確認しよう!
1. コントローラのnamespaceのパスが違う。
コントローラのnamespaceが違うとClassを見つけられません。
パスがあっているか確認しよう。
これが一番あります。2. 複製したコントローラのエクステンドしているパスが違う
管理画面を作ったりすると、Contoller.phpとは別に管理画面用にBaseControllerのエクステンドを作っていたりする事あれば、そこも確認しよう。3. ルーティングのスペルミスかパスが違う
コントローラのパスとスペルミスを確認しよう。
artisan route:list でエラーがでなくなるまで、
web.phpのルーティングの記述を1行1行コメントアウトして、間違い箇所を特定しましょ。これくらいですね。
凡ミスで時間とられないように、気をつけましょ。
- 投稿日:2020-04-04T13:32:37+09:00
October CMS (Laravel) 検索結果にページネーションを使う
WHEREでクエリ結果を絞り込んで、その結果をページネーションするところで、指定ページが効かないなど少しハマったのでメモ。(現在October CMSで使用しているLaravelは5.5なので、それ以降のLaravelバージョンでは挙動がもしかしたら違うかもしれない。)
ググると「
MyModel::paginate(10, ['*'])
でOK」みたいな情報はたくさん出てくるが、WHERE
などで絞り込むときはどうするのか。
また、常にWHERE
があるとは限らないので、MyModel::where()
を使うのもキレイではない。
そして、取得するカラムも指定したい。うまくいった書き方
MyModel::select($columns)
でクエリオブジェクトを作成する。- クエリオブジェクトに対して
where
メソッドでクエリ条件を必要に応じて追加する。- クエリオブジェクトで
paginate
メソッドでページネータを作成する。下記はWeb APIのコントローラ内でクエリ処理を実施している例。
public function list() { $columns = [ 'id', 'name', 'description', 'type', ]; // Search conditions $name = Input::get('name'); $type = Input::get('type'); $page = Input::get('page'); $perPage = Input::get('per_page', 15); // 15 is framework default // To specify columns, they must be specified in select(). $query = MyModel::select($columns); // <- (1) if (!empty($name)) { $query = $query->where('name', 'like', '%'.$name.'%'); // <- (2) } if (!empty($type)) { $query = $query->where('type', '=', $type); // <- (2) } // For proper functionality of pagination, columns also passed to paginate() return $query->paginate($perPage, $columns, 'page', $page); // <- (3) }ポイント:カラムの指定について
(1)の
MyModel::select($columns)
でカラムを指定しないと全てのデータが返される(1)で指定していても(3)の
$query->paginate()
でも指定する必要がある。ここで指定しないとページ指定が効かないなどページネーションが正常に動作しない。次ページ、前ページのURLの修正
ページネータは次ページや前ページのURLを提供してくれるが、GETパラメータで渡した検索条件を同様にこれらのURLには入れてくれないので自分で入れる必要がある。
上記の例で
return
で返しているページネータオブジェクトのappends
メソッドでこれらのURLにGETパラメータを追加することができる。受け取ったのと同じパラメータをそのまま入れてやれば良い。// For proper functionality of pagination, columns also passed to paginate() $paginator = $query->paginate($perPage, $columns, 'page', $page); // Add query string to the next/prev URLs. $queryParams = [ 'name' => $name, 'type' => $type, 'per_page' => $perPage, ]; if (!empty($queryParams)) { $paginator->appends($queryParams); } return $paginator;
- 投稿日:2020-04-04T11:46:54+09:00
Laravelではモデルはコマンドで作る。Base table or view not found: 1146 Table 'XXXX' doesn't existの対応
Laravelに慣れてきた(初心者レベルで)と調子に乗ってたら、ハマって意外と知らなかった基礎知識があったので、自分のためにメモ。
サクサクとデータベースやらモデルやらを作っていたら、明らかにテーブルなどが合っているのに、
Base table or view not found: 1146 Table 'ZZ.XXXX' doesn't exist
というエラー。
調べると「テーブルがありません」というエラーのよう。
合ってるはずなのに、なぜか「zz.」と文字列が付与される。結論、Laravelではartisanコマンドでモデルを作った時にテーブル名が定義されるようで、今回は他のモデルをコピーして作ってしまったので、Laravel側でテーブル名が定義されていなかったという事象。
「zz.」は、Laravelの親ディレクトリの名前でした。
https://qiita.com/igz0/items/d14fdff610dccadb169e
コントローラーやマイグレーションファイルも、コピーして作った方が早いのでつい作っていましたが、きちんとartisanコマンドで作らないと、知らないところで同じような事故の元が増えそう。
今後は、面倒くさがらずにコマンドで各ファイルを作ることにします。
- 投稿日:2020-04-04T00:46:06+09:00
【Laravel】Herokuでのデプロイ
Herokuを利用して、Laravelのアプリのデプロイを行います。その一連の手順をメモします。
DBにはMySQLを利用したいので、その設定も行います。前提
・laravelアプリが作成済み
・Herokuアカウント取得済み
・Heroku CLI導入済み
・DBにはMySQLを利用します。Procfileの作成
まずはLaravel側の設定を行います。
ProcfileというHerokuの設定ファイルを作成。サーバーにApacheを使うこと、public/をドキュメントルートとすることを宣言するために使います。アプリフォルダの直下に作成してください。
Procfileweb: vendor/bin/heroku-php-apache2 public/DBの文字数の設定
Herokuではvarchar型の文字数はデフォルトの255では大きすぎるため191に設定します。
app\Providers\AppServiceProvider.phpのboot()に設定します。AppServiceProvider.appuse Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }アプリをhttpsに対応させる
本番環境の場合にhttpsを強制します。こちらもapp\Providers\AppServiceProvider.phpのboot()に設定します。
AppServiceProvider.apppublic function boot() { if (\App::environment('production')) { \URL::forceScheme('https'); } }Laravel側の設定は以上です。ほかにもあるとは思いますが、これらをしておけば少なくともデプロイには成功すると思います。
Herokuへのログイン
$ Heroku loginHerokuアプリの作成、デプロイ
Herokuアプリを作成します。
$ heroku create myapp –buildpack heroku/phpデプロイはGitを利用したHerokuアプリへのプッシュによって行います。
なのでまずHerokuアプリをリモートとして登録します。myappのところは先ほど作成したHerokuアプリを指定します。$ heroku git:remote -a myappこのHerokuリモートにプッシュしてデプロイします。変更点のコミットを忘れずにしましょう。
$ git add . $ git commit -m 'Add Procfile, varcher length, force https' $ git push heroku masterDBとしてMySQLを利用
HerokuはデフォルトのDBがPostgreSQLであるため、MySQLを使うためにはアドオン「ClearDB」を利用して設定を変更します。
ClearDBは利用自体は無料ですが、クレジットカードの登録が必要となります。Herokuのサイトから行うことができます。クレカの登録をしたら、下記コマンドでClearDBのインストールをします。
$ heroku addons:add cleardb環境変数の設定
アプリの環境変数は.envなどに定義しますが、それらはデプロイされません。したがって環境変数はHerokuアプリに定義する必要があります。
下記コマンドで設定ができます。
$ heroku config:set キー=値DBの環境設定
まずは自分のClearDBのURLを確認します。
$ heroku config:get CLEARDB_DATABASE_URL mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true各キー、値を登録します
$ heroku config:set DB_DATABASE=[データベース名] $ heroku config:set DB_HOST=[ホスト名] $ heroku config:set DB_USERNAME=[ユーザー名] $ heroku config:set DB_PASSWORD=[パスワード]その他の環境設定
$ heroku config:set APP_KEY=$(php artisan key:generate --show) $ heroku config:set APP NAME=myapp $ heroku config:set APP_ENV=herokuこのほかにもメールやapi等の各種環境変数もここで設定します。
マイグレーションの実行
$ heroku run php artisan migrate $ heroku openマイグレーションを実行し、成功したらサイトにアクセスしてみましょう。
下のようなエラーが出た場合、MySQLのvarchar型の文字数を変更がうまくいっていません。
Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes