20200404のlaravelに関する記事は5件です。

Laravelのバリデーションについて

バリデーションについてまとめてみた。

バリデーションとは、ルールに対してあっているか、あっていないかを判断する。
postController
public 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;)

postController
public 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(); とする。

たくさんのバリデーションルールがあるので、いろいろ試して見ると良い。

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

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行コメントアウトして、間違い箇所を特定しましょ。

これくらいですね。
凡ミスで時間とられないように、気をつけましょ。

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

October CMS (Laravel) 検索結果にページネーションを使う

WHEREでクエリ結果を絞り込んで、その結果をページネーションするところで、指定ページが効かないなど少しハマったのでメモ。(現在October CMSで使用しているLaravelは5.5なので、それ以降のLaravelバージョンでは挙動がもしかしたら違うかもしれない。)

ググると「MyModel::paginate(10, ['*']) でOK」みたいな情報はたくさん出てくるが、WHEREなどで絞り込むときはどうするのか。
また、常にWHEREがあるとは限らないので、MyModel::where()を使うのもキレイではない。
そして、取得するカラムも指定したい。

うまくいった書き方

  1. MyModel::select($columns)でクエリオブジェクトを作成する。
  2. クエリオブジェクトに対してwhereメソッドでクエリ条件を必要に応じて追加する。
  3. クエリオブジェクトで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;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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コマンドで作らないと、知らないところで同じような事故の元が増えそう。
今後は、面倒くさがらずにコマンドで各ファイルを作ることにします。

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

【Laravel】Herokuでのデプロイ

Herokuを利用して、Laravelのアプリのデプロイを行います。その一連の手順をメモします。
DBにはMySQLを利用したいので、その設定も行います。

前提

・laravelアプリが作成済み
・Herokuアカウント取得済み
・Heroku CLI導入済み
・DBにはMySQLを利用します。

Procfileの作成

まずはLaravel側の設定を行います。

ProcfileというHerokuの設定ファイルを作成。サーバーにApacheを使うこと、public/をドキュメントルートとすることを宣言するために使います。アプリフォルダの直下に作成してください。

Procfile
web: vendor/bin/heroku-php-apache2 public/

DBの文字数の設定

Herokuではvarchar型の文字数はデフォルトの255では大きすぎるため191に設定します。
app\Providers\AppServiceProvider.phpのboot()に設定します。

AppServiceProvider.app
use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

アプリをhttpsに対応させる

本番環境の場合にhttpsを強制します。こちらもapp\Providers\AppServiceProvider.phpのboot()に設定します。

AppServiceProvider.app
public function boot()
{
    if (\App::environment('production')) {
      \URL::forceScheme('https');
  }
}    

Laravel側の設定は以上です。ほかにもあるとは思いますが、これらをしておけば少なくともデプロイには成功すると思います。

Herokuへのログイン

$ Heroku login

Herokuアプリの作成、デプロイ

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 master

DBとして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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む