Laravel学習メモ

Laravelのロゴ Laravel

自分用にLaravelで学習した内容をメモしておく

  1. Route::getの任意パラメーター
  2. コントローラ
    1. コントローラの生成
    2. コントローラの呼び出し
  3. 名前空間(namespace)とuse文について
    1. 参考(コメントにも注目)
  4. 良いコードの書き方
    1. 引数でクラスのインスタンスを生成する
    2. クエリー文字列の取り出し方
      1. 指定して取り出す
      2. すべてのクエリー文字列を配列に取り出す
    3. オーバーライドとは
    4. retrunにて配列のみを返す
    5. $gerdedでオートナンバーのフィールドを設定する
  5. PHPテンプレートの運用
    1. bladeテンプレートの運用
  6. セキュリティについて
    1. CSRF対策
      1. CSRF対策の切り方
  7. ミドルウェアについて
    1. ミドルウェアの生成
    2. ミドルウェアの登録
    3. ミドルウェアの呼び出し
    4. グローバルミドルウェアについて
    5. ミドルウェアのグループ登録について
  8. バリデータについて
    1. Validatorインスタンスを作る
  9. クッキーについて
  10. データベースの設定
    1. database.phpを編集する
    2. .enbを編集する
    3. クエリの発行
    4. クエリビルダの使用
      1. where文メモ
  11. Eloquent ORMについて
    1. 使い方
    2. 最新の1件を取得する
  12. セッションの保存先をファイルからデータベースへ変更する
  13. ペジネーション(ページングのこと)の実装方法
  14. 7-5ユニットテスト
    1. touchコマンドがWinだと存在しない
    2. 最後の演習でpeopleデータベースが生成されない
  15. Laravelの開発方法メモ
    1. クラス継承メモ
    2. postの動きメモ
  16. Laravel所感

Route::getの任意パラメーター

第1位引数に設定したパラメータの末尾に?をつけて、第2引数に = 'パラメーターが無い時に表示される文字'を設定する

Route::get('test/{aaa?}',function ($aaa = 'bbb')

メモ
検索後のパラメーターを乗せて次の画面に渡す時に使う予定

コントローラ

コントローラの生成

コマンドプロンプトにて以下のコマンドを入力

php artisan make:controller コントローラー名

メモ
生成される場所は「app\Http\Controllers」
コントローラーを作成する度に使うので結構使いそう

コントローラの呼び出し

web.php

Route::get('アドレス','コントローラ名@アクション名');

メモ
LaravelはコントローラでDBや表示を制御するみたいなので、コントローラにアクションを設定する作業が一番多そう
各機能をそれぞれが担当しているので、慣れるとわかりやすいと思う

名前空間(namespace)とuse文について

名前空間とはどこに置かれているかを宣言している、当然だけど間違えると動かない。
名前空間により『クラス名の重複を防ぐために長いクラス名を付けていたものを分割できる』ようになった。

コントローラの場合以下のように、設定されている

namespace App\Http\Controllers;

use文はクラスをインポートしている
以下の分は「Request」クラスをインポートしている

use Illuminate\Http\Request;

参考(コメントにも注目)

クラスの名前空間とuse宣言 - Qiita
Laravelを触り始めた頃、名前空間use宣言の2つを調べたけどなんかよくわからなかった気がする。意味簡単に言うと名前空間:ファイルの居場所を示すuse宣言:中で使うクラスを宣言する各場所...

良いコードの書き方

引数でクラスのインスタンスを生成する

関数内でインスタンスを作るよりもすっきり書ける

public function index(Request $request,Response $response)

クエリー文字列の取り出し方

クエリー文字列・・・アドレスに書いてある「?aaa=bbb」みたいなやつ

指定して取り出す

?request->aaa

すべてのクエリー文字列を配列に取り出す

?request->query()

Requestクラスをインスタンス化して引数で渡すのを忘れるな
3年くらい前に作ったサイトだと毎回文頭で取り出してたからこの書き方だとめっちゃ楽(歓喜)

オーバーライドとは

親クラスにあるメソッドを小クラスで再定義すること。

retrunにて配列のみを返す

定数で定義するのもいいけど、こっちも見やすくて良い

   public function rules()
   {
       return [
           'name' => 'required',
           'mail' => 'email',
           'age' => 'numeric|hello',
       ];
   }

$gerdedでオートナンバーのフィールドを設定する

protected $guarded = array('フィールド名');

「値を用意しておかない項目」として設定しておけば良い

PHPテンプレートの運用

resources/viewsのフォルダ内に各コントローラー事にフォルダを作って管理するのがオススメ
コントローラがtestならばresources/views/testのにテンプレートを作ればOK!

bladeテンプレートの運用

上記のviewsフォルダ内にて〇〇〇.blade.phpと命名する
〇〇〇部分の名前で呼び出すので、同名ファイルがある場合は「Bladeの方が優先して読み込まれる」

セキュリティについて

CSRF対策

Laravelでは {{ csrf_field() }}が存在しないフォームは受け付けないようになっている

CSRF対策の切り方

切る前にCSRFについて調べてから切ろう
app\Http\Middlewareの中にある『VerifyCsrfToken.php』の以下の部分に追記する。

    protected $except = [
        'アドレス名'
    ];

アプリ自体で切る場合はHttpにかるkernel.phpの$middlewareGroupsをコメントアウト

ミドルウェアについて

リクエストを行う際に割り込んで処理を行う際に利用する、非ログイン時にログイン画面に飛ばしたりできる

ミドルウェアの生成

php artisan make:middleware 生成するミドルウェア名

Http/Middleware/に生成される

ミドルウェアの登録

app/Http/karnel.phpに登録する
$routeMiddleware配列内に以下のように記述する、ルートごとにミドルウェアを登録する際の配列らしい

' 呼び出す際の名前 ' => \App\Http\Middleware\登録するミドルウェア名::class,

ミドルウェアの呼び出し

ルーティングで呼び出すにはメソッドチェーンにて呼び出せる
以下のuse文を書いて無ければ呼び出せないので注意

use App\Http\Middleware\ミドルウェア名;
->middleware(ミドルウェア名::class);

こっちで呼び出す時にもuse文いるの?

(試してね)
$this->middleware('呼び出す際の名前')

グローバルミドルウェアについて

登録すると「すべてのリクエスト」で利用可能になる(自動でミドルウェアが実行される)
kernel.phpの$middlewareの配列に登録すればOK!
毎回実行する処理を登録しておけば、毎回ページを増やすたびに文頭にクラス呼び出しを追加して…なんて作業をしなくて済む

ミドルウェアのグループ登録について

kernel.phpの$middlewareGroups配列に登録すれば使える
呼び出し方はメソッドチェーンの場合

->middleware('グループ名')

バリデータについて

Validatorインスタンスを作る

$validator = Validator::make( 値の配列 , ルール配列 , メッセージ配列 );

クッキーについて

リクエストでクッキーを取り出して、レスポンスでクッキーを保存する

クッキーを取り出す

$request->cookie( 'キー' );

クッキーを設定する

$responce->cookie( 'キー' , 値 , 分数 )

※分数に10を設定すると10分になる

クッキーの存在チェック

if ($request->hasCookie('キー')

※hasCookieはクッキーが存在すればTRUEを返す

データベースの設定

database.phpを編集する

18行目あたりを適宜変更する

'default' => env('DB_CONNECTION', 'sqlite'),

.enbを編集する

こちらも適宜変更

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

クエリの発行

※コントローラで使用する場合には以下のuse文を追加する(忘れるとNOT.DBエラーが発生)

use Illuminate\Support\Facades\DB;

コントローラで以下のようにDB:selectを実行

DB::select('select * from [テーブル名]');

配列として帰ってくるので、フィールド名をキーに取り出す。一番簡単なやり方らしい(クエリ打ち)

クエリビルダの使用

基本的のこっちの方が記述量が少なくて楽なのでこれを使う
メソッドチェーンで楽々データベース操作
▼クエリ直接入力

DB::select('select * from [テーブル名]');

▼クエリビルダ使用

DB::table('テーブル名')->get();

get(['フィールド名','フィールド名2'])で特定のフィールドだけ取得することができる、get()はselect *に相当する。

where文メモ

AND検索

where(条件)->where(条件)

OR検索

where(条件)->orWhere(条件)

パラメータ配列を使用する場合は「whereRaw」を使う

whereRaw('age >= ? and age <= ?',[$min, $max])

?がプレースホルダーになっている。

ページを作る際に使う

       ->offset($page * 3)
       ->limit(3)

Eloquent ORMについて

PHPのオブジェクトを扱う感覚でレコードを操作できるすごいやつ

使い方

モデルを作る
モデルはappフォルダ内に生成される

php artisan make:model モデル名※単数形

コントローラを作る

php artisan make:controller コントローラ名

最新の1件を取得する

最後に登録した1行を取得したかったけど、first()みたいなのが無かったので。

モデル名::orderBy('created_at', 'desc')->first();

セッションの保存先をファイルからデータベースへ変更する

『\config\session.php』を開く。

'driver' => env('SESSION_DRIVER', 'file'),

を以下のように変更

'driver' => env('SESSION_DRIVER', 'database'),

『\.env』を開く

SESSION_DRIVER=file

を以下のように変更

SESSION_DRIVER=database

セッション用のテーブルは仕様が存在するためマイグレーションを用いて作成する。自動で作ってくれるので楽。
コマンドプロンプトで以下を入力してマイグレーションを作成

php artisan session:table

実行する。

php artisan migrate

これでセッション保存用のデータベースが出来るのでヨシ!

ペジネーション(ページングのこと)の実装方法

コントローラで以下のように変数にセットする

$変数 = DB::table('テーブル名')->simplePaginate(表示数);

モデルで呼び出す場合

$変数 = 'モデル名'::simplePaginate(表示数);

テンプレートで以下のタグで呼び出すと自動で« Previous Next » ができる。
{{ $items->links() }}

今まで面倒なページング処理作ってたけどLIMIT使って頑張るやつ。これで一気に楽になる。ありがたい。

simplePaginateをpaginateにすると数字を選択して飛べるページングが使える。めっちゃ便利(歓喜)

7-5ユニットテスト

touchコマンドがWinだと存在しない

ハマりポイント
空のテスト用データベースを作るとことで以下のtouchコマンドが通らない

touch database/database_test.sqlite

database_test.sqliteと言う空のデータベースを手動で用意すればOK
touchは指定のファイルが無ければ作り、あればタイムスタンプを更新している。

最後の演習でpeopleデータベースが生成されない

seederとファクトリで自動で生成してくれると思うけどされない。
時間が無いので調べないけど、テスト行うときにもう一度調べよう。

Laravelの開発方法メモ

多分Bladeでページを作成
コントローラーを設定
ルーティングを設定
デプロイ

アクションで変数を用意してBladeテンプレートではそれを表示するだけ(だと思う)

クラス継承メモ

バリデータはValidatorクラスを継承して作成する

class クラス名 extends Validator

postの動きメモ

hello/addのsendが押下されるとpostのリクエストが飛ぶ

   
{{ csrf_field() }} name: mail: age:

ルーティングで設定してある「HelloController@create」のメソッドが呼び出される

Route::post('hello/add', 'HelloController@create');

インサートクエリを流して、helloにリダイレクト処理をしている

   public function create(Request $request)
    {
    $param = [
        'name' => $request->name,
        'mail' => $request->mail,
        'age' => $request->age,
    ];
    DB::table('people')->insert($param);
    return redirect('/hello');
    }

ルーティングとコントローラーがどんな動きしてるか覚えないとシステム組む時あたふたする

Laravel所感

2019.09.15
これルーティングとかいろいろしてるけどPHPでそのまま作った方が早くない?
view部分もPHPとhtml混ざってるし大して使う意味がわからない(3章P63まで)

2019.09.16
Larabelは使いこなせばわかりやすいコードを書けるけど、下手に使えば逆に難解になる危険性もある。
bladeテンプレート中々良さそうだけど最適解が何かわからないので、考えて組まないと時間取られそう(3章P93まで)

2019.11.08
laravelで過去に作ったシステム(PHP5)を再構築しているけど、ひたすらDB操作が楽!
モデル作ってそれを呼び出して->get~とかで簡単に操作できる。いちいちselect * from ~ を書いていた時にはもう戻れない…。
学習コスト安いって嘘だろ、優秀な人だと安いだろ…。と思っていたけど凡夫でも基本を押さえれば恩恵に預けられる。コントローラ作って、モデル作って、ビューに投げてルート設定してをひたすら繰り返すだけ。

コメント

タイトルとURLをコピーしました