自分用に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;
参考(コメントにも注目)
良いコードの書き方
引数でクラスのインスタンスを生成する
関数内でインスタンスを作るよりもすっきり書ける
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のリクエストが飛ぶ
ルーティングで設定してある「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 ~ を書いていた時にはもう戻れない…。
学習コスト安いって嘘だろ、優秀な人だと安いだろ…。と思っていたけど凡夫でも基本を押さえれば恩恵に預けられる。コントローラ作って、モデル作って、ビューに投げてルート設定してをひたすら繰り返すだけ。
コメント