【Laravel】Modelクラスを利用したCRUD処理1人勉強会【PHP】
Modelについて
LaravelのEloquentというORMの仕組みにより、データベーステーブルに関連するモデルを作り、オブジェクトを操作する感覚でDB操作することができる。
今回はModelクラス(https://laravel.com/api/6.x/Illuminate/Database/Eloquent/Model.html#method_all)を利用して、CRUD処理(Create Read Update Delete)を実装する。
準備
今回用意したテーブル
php artisan make:migration create_lakers_table
tableの内容を定義したマイグレーションファイル
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateLakersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('lakers', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('lakers'); } }
マイグレーションする
php artisan migrate
ルーティング
//CREATE Route::get('laker/add','LakerController@add'); Route::post('laker/add','LakerController@create'); //READ Route::get('laker/','LakerController@index'); //UPDATE Route::get('laker/edit','LakerController@edit'); Route::post('laker/edit','LakerController@update'); //DELETE Route::get('laker/del', 'LakerController@delete'); Route::post('laker/del','LakerController@remove');
Modelを作成する
tableはlakersと複数形、modelは単数系にする。
php artisan make:model Laker
Controllerを作成する
php artisan make:controller LakerController
CRUDの処理
LakerController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Laker; class LakerController extends Controller { // CREATE処理 public function add(Request $request) { return view('laker.add'); } public function create(Request $request) { $laker = new Laker(); $laker->name = $request->name; $laker->save(); return redirect('/laker'); } // READ処理 public function index() { $lakers = Laker::all(); return view('laker.index',['lakers'=>$lakers]); } // UPDATE処理 public function edit(Request $request) { $laker = Laker::find($request->id); //dd($laker); return view('laker.edit',['laker'=>$laker]); } public function update(Request $request) { $laker = Laker::find($request->id); $laker->name = $request->name; $laker->save(); return redirect('/laker'); } // DELETE処理 public function delete(Request $request) { $laker = Laker::find($request->id); return view('laker.del',['laker'=>$laker]); } public function remove(Request $request) { Laker::find($request->id)->delete(); return redirect('/laker'); } }
CREATE処理について
- モデルのインスタンスを生成
- そのインスタンスのパラメータに値を設定
- saveを使い保存する(https://laravel.com/api/6.x/Illuminate/Database/Eloquent/Model.html#method_save)
※create(https://laravel.com/api/6.x/Illuminate/Database/Eloquent/Builder.html#method_create)を使う方法もある。
READ処理について
- all(https://laravel.com/api/6.x/Illuminate/Database/Eloquent/Model.html#method_all)を使い、全レコードを取得
- 値をviewに渡す
UPDATE処理について
- find(https://laravel.com/api/6.x/Illuminate/Database/Eloquent/Builder.html#method_find)でUPDATEしたいレコード(インスタンス)を取得する
- インスタンスのパラメータに値を設定
- saveで保存
※対象のカラムのレコードをUPDATEするには、update(https://laravel.com/api/6.x/Illuminate/Database/Eloquent/Model.html#method_update)を利用する。where(https://laravel.com/api/6.x/Illuminate/Database/Eloquent/Builder.html#method_where)を使わないと全てのレコードでUPDATEしてしまう。
DELETE処理について
- findでDELETEしたいレコード(インスタンス)を取得する
- delete(https://laravel.com/api/6.x/Illuminate/Database/Eloquent/Model.html#method_delete)を使い削除
【Laravel】ミドルウェア1人勉強会_その2【PHP】
takeru232423.hatenablog.com
readouble.com
前回の記事ではBeforeのミドルウェアについて書いたので、今回はAfterのミドルウェアについて書く。
Afterのミドルウェアは、コントローラの後に実行される。つまりクライアント(ブラウザ)に返されるレスポンスをいじることも可能である。
Afterミドルウェアの例
HogeMiddleware.php
<?php namespace App\Http\Middleware; use Closure; class HogeMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $response = $next($request); $content = $response->content(); $content = $content."<p>ひろゆき</p>"; $response->setContent($content); return $response; } }
- レスポンスの内容をcontent()https://laravel.com/api/6.x/Illuminate/Http/Response.html#method_contentを使って取得
- コンテンツに「ひろゆき」を追加
- setContent()https://laravel.com/api/6.x/Illuminate/Http/Response.html#method_setContentでレスポンスに設定
- returnする
【Laravel】ミドルウェア1人勉強会_その1【PHP】
によると
- アプリケーションへ送信されたHTTPリクエストをフィルタリングするものである。
基本的にアプリの流れは以下の通り
ここにミドルウェアが加わることにより以下のようになる
- クライアント(ブラウザ)がリクエスト
- ミドルウェアの処理(Before)
- ルーティングからコントローラを呼び出し、
- ビューをレンダリングして、レスポンスを生成。
- ミドルウェアの処理(After)
- クライアントへレスポンスを返す。
今回はBeforeの処理について、簡単なプログラムを作る。
Beforeミドルウェアの例
artisanコマンド(php artisan make:middleware HogeMiddleware)を使い、ミドルウェアを作成する。
以下は、URLパラメータのnumberの値が0以下であった場合に、リダイレクト処理するものである。
もしif文に引っ掛からなかった場合、コントローラのアクションが実行される。
HogeMiddleware.php
<?php namespace App\Http\Middleware; use Closure; class HogeMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if($request->number<=0){ return redirect('other'); } return $next($request); } }
あとはミドルウェアを使う処理を設定するだけ
Web.phpで
Route::get('hoge','HogeController@index')->middleware(HogeMiddleware::class);
app/Http/Kernel.phpの$routeMiddlewareの配列に追加する。
'hoge'=>\App\Http\Middleware\HogeMiddleware::class,
【Laravel】ビューコンポーザ1人勉強会【PHP】
個人的にLaravelのビューコンポーザについて以下のように理解しました。
- ビューコンポーザは、全てのページまたは複数のビューで使うような変数をまとめてビューコンポーザに書いておくものである。
- アクセスしたページがレンダリングされる際に自動的に実行される。
例えば10ページから構成されているWebページがあったとして、10ページ全てに組み込まれているコンテンツ(データ)があったして、コントローラからビューにそのコンテンツのデータを渡したいとき、10ページ分のコントローラのアクションにその処理を書かなくてはいけません。しかし、それでは同じ処理を書いて非常に効率が悪いので、ビューコンポーザを活用する。
実装方法として、2種類ある。
- boot関数内に無名クラスでビューコンポーザの処理の定義をする。
- ビューコンポーザのクラスを定義して、boot関数内で設定する。
1 boot関数内に無名クラスでビューコンポーザの処理の定義をする。
まずルーティングを以下のように定義
Web.php
Route::get('composertest','ComposerTestController@index');
コントローラをartisanコマンド(php artisan make:controller ComposerTestController)で作成する。
ComposerTestController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class ComposerTestController extends Controller { // public function index() { return view('test.index'); } }
ビューはこんな感じで値を表示するだけ
test/index.blade.php
<p>表示テスト</p> <p>{{$test_message}}</p>
サービスプロバイダにビューコンポーザを登録する。artisanコマンド(php artisan make:provider ComposerTestProvider)でサービスプロバイダを作成する。
その後、configフォルダのapp.phpのproviders配列に作成したプロバイダークラスを記述しておく。
<?php namespace App\Providers; use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; class ComposerTestProvider extends ServiceProvider { /** * Register services. * * @return void */ /** * Bootstrap services. * * @return void */ public function boot() { // View::composer('test.index', function ($view) { $view->with('test_message','鬼滅の刃2期スタート by ビューコンポーザ'); }); } }
また全てのビューに対してビューコンポーザを適応したい場合は以下のようにする。
View::composer('*', function ($view) { // });
こうすることで、ビューがレンダリングされる際にコンポーザが呼び出され、viewにおけるtest_messageに値が代入される。
2 ビューコンポーザのクラスを定義して、boot関数内で設定する。
以下のようなビューコンポーザクラスを定義
testComposer.php
<?php namespace App\Http\Composers; use Illuminate\View\View; class testComposer { public function compose(View $view) { $view->with('test_message','煉獄さん'); } }
1のプロバイダーのboot関数を以下のように変更し、コンポーザークラスを利用できるようにする。
public function boot() { // View::composer('test.index', 'App\Http\Composers\testComposer' ); }
【PHP】PHPとIFTTTを使って簡単にLINEしてみた!!!【IFTTT】
こんにちは。
LINEは自分にとって革新的なアプリでした。中学時代流行った時、よく友達と夜遅くまでLINEしたものです。笑
というわけで今回はPHPとIFTTTを使ってLINEでメッセージを送りたいと思います。
IFTTTについては以下の記事も書いてます。
takeru232423.hatenablog.com
takeru232423.hatenablog.com
実行結果
IFTTTレシピ
イベントを受け取り、LINE Notifyという公式アカウントからメッセージを送ることができます。
ソースコード
これだけ
<?php $key = "自分のKey"; $url = "https://maker.ifttt.com/trigger/自分のイベント名/with/key/".$key; $values = array( 'value1' => "PHPプログラムからラインしました!!!"); $curl = curl_init($url); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($values)); $response = curl_exec($curl); curl_close($curl);
感想
最近LINE Botに興味を持っています。
飲食店や薬局でLINEを活用していることをよく見るようになりました。
他のサービスと連携がしやすいので可能性は無限大です。
この記事に関してご指摘等ございましたら、コメント頂けるとありがたいです。
【PHP】会員登録なしで投票できる仕組みを考えてみた!【Cookie】
こんにちは。
クッキーといえばステラおばさんのクッキーが好きです、、、、、、
今回はタイトル通り、「会員登録なしで投票できる仕組み」について考えていきたいと思います。
最近、会員登録なしで投票ができるWebアプリを見かけます。
例えば以下のアプリ
tagvote.grinspace.jp
1度投票すると、再投票できない仕組みになっています。
1回目の投票はChromeを用いて投票しました。2回目としてSafariで投票しようとすると、、、投票できました。
つまりリクエストを送ってくるブラウザごとに何か値をプログラム上で設定して、認識していると思います。
結論、Cookieを使っているのではないかと考えました。
実際に同じ現象を再現すべく自分でプログラムを書いてみました。
ソースコード
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <?php //ボタンが押されたらcookieをブラウザにセットする if (!empty($_GET)) { setcookie('is_pushed', $_GET['is_pushed'], time()+60*60*24); header('location:vote.php'); } ?> <form action="" method="GET"> <!--cookieに値があった場合(投票されていた場合)、disabled属性を追加して投票できなくする--> <button type="submit" name="is_pushed" value="pushed" <?php if (isset($_COOKIE['is_pushed'])) { echo 'disabled'; } ?>><?php if (empty($_COOKIE['is_pushed'])) { echo '投票する!'; } else { //cookieに値があった場合(投票されていた場合) echo '投票済み!'; }?></button> </form> </body> </html>
比較的に簡単に実装できました。
感想
インストールとか会員登録とかはユーザーにとって、そのサービスを使うか使わないか判断する要因の一つだと考えています。
上記で紹介した投票サイトや、twitterでよく見かける匿名質問サービスのpeing(
Peing(ペイング) -質問箱- 匿名で質問を受け取ろう
)は会員登録が必要ないので、気軽に使えると感じるユーザーが多いのではないかと感じました。
この記事関して、間違い等ございましたらコメント頂けるとありがたいです。
【PHP】MediaWiki APIを使って情報を取得してみた!!!
このAPIを使うことによりWikipediaのデータへアクセスすることができます。
さっそく、使ってみました。
ソースコード
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <?php $title = 'カーメロ・アンソニー'; $url = "https://ja.wikipedia.org/w/api.php?action=query&prop=extracts&exintro=1&explaintext=1&format=json&titles=".urlencode($title); $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($curl); curl_close(); $response_array = json_decode($response, true);//jsonデコードする、配列にする $page_title = $response_array['query']['pages']['485246']['title']; $explain_text = $response_array['query']['pages']['485246']['extract']; ?> <body> <h1><?php echo $page_title ?></h1> <p><?php echo $explain_text ?></p> </body> </html>
解説
詳しい情報はこちら↓
ja.wikipedia.org
APIから情報を取得するためのエンドポイント
パラメーター actionにqueryを指定し、MediaWikiからデータを取得する
パラメーター propにextractsを指定し、指定されたページのテキストまたはHTMLを取得
https://ja.wikipedia.org/w/api.php?action=query&prop=extracts
パラメーター exintroに何かを指定して、最初の節の内容を取得する
https://ja.wikipedia.org/w/api.php?action=query&prop=extracts&exintro=1
exintroに何かが指定されていればtrueとして扱われます。上記ではexintro=1としましたが、exintro=2でも構いません。
パラメーター explaintextに何かを指定して、プレーンテキストとして抽出する
https://ja.wikipedia.org/w/api.php?action=query&prop=extracts&exintro=1&explaintext=1
パラメーター formatにjsonを指定して、データをjson形式で出力する
https://ja.wikipedia.org/w/api.php?action=query&prop=extracts&exintro=1&explaintext=1&format=json
パラメーター titlesに取得したいページのタイトルを指定する
json出力結果