たけるのプログラミング

作ったものとか、気ままにアップします。

【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処理について
  1. モデルのインスタンスを生成
  2. そのインスタンスのパラメータに値を設定
  3. 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処理について
  1. all(https://laravel.com/api/6.x/Illuminate/Database/Eloquent/Model.html#method_all)を使い、全レコードを取得
  2. 値をviewに渡す
UPDATE処理について
  1. find(https://laravel.com/api/6.x/Illuminate/Database/Eloquent/Builder.html#method_find)でUPDATEしたいレコード(インスタンス)を取得する
  2. インスタンスのパラメータに値を設定
  3. 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処理について
  1. findでDELETEしたいレコード(インスタンス)を取得する
  2. 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;
    }
}
  1. レスポンスの内容をcontent()https://laravel.com/api/6.x/Illuminate/Http/Response.html#method_contentを使って取得
  2. コンテンツに「ひろゆき」を追加
  3. setContent()https://laravel.com/api/6.x/Illuminate/Http/Response.html#method_setContentでレスポンスに設定
  4. returnする

【Laravel】ミドルウェア1人勉強会_その1【PHP】

readouble.com

によると

ミドルウェア

  • アプリケーションへ送信されたHTTPリクエストをフィルタリングするものである。


基本的にアプリの流れは以下の通り

  1. クライアント(ブラウザ)がリクエス
  2. ルーティングからコントローラを呼び出し
  3. ビューをレンダリングして、レスポンスとしてクライアントへ返される

ここにミドルウェアが加わることにより以下のようになる

  1. クライアント(ブラウザ)がリクエス
  2. ミドルウェアの処理(Before)
  3. ルーティングからコントローラを呼び出し、
  4. ビューをレンダリングして、レスポンスを生成。
  5. ミドルウェアの処理(After)
  6. クライアントへレスポンスを返す。


今回は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,

また全リクエストで使いたかったら、
app/Http/Kernel.phpの$middlewareの配列に追加する。

readouble.com

【Laravel】ビューコンポーザ1人勉強会【PHP】

readouble.com

個人的にLaravelのビューコンポーザについて以下のように理解しました。

  • ビューコンポーザは、全てのページまたは複数のビューで使うような変数をまとめてビューコンポーザに書いておくものである。
  • アクセスしたページがレンダリングされる際に自動的に実行される。


例えば10ページから構成されているWebページがあったとして、10ページ全てに組み込まれているコンテンツ(データ)があったして、コントローラからビューにそのコンテンツのデータを渡したいとき、10ページ分のコントローラのアクションにその処理を書かなくてはいけません。しかし、それでは同じ処理を書いて非常に効率が悪いので、ビューコンポーザを活用する。


実装方法として、2種類ある。


  1. boot関数内に無名クラスでビューコンポーザの処理の定義をする。
  2. ビューコンポーザのクラスを定義して、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'
        );

    }

readouble.com

【PHP】PHPとIFTTTを使って簡単にLINEしてみた!!!【IFTTT】

こんにちは。

LINEは自分にとって革新的なアプリでした。中学時代流行った時、よく友達と夜遅くまでLINEしたものです。笑

というわけで今回はPHPとIFTTTを使ってLINEでメッセージを送りたいと思います。

IFTTTについては以下の記事も書いてます。

takeru232423.hatenablog.com
takeru232423.hatenablog.com

実行結果

f:id:takeru232423:20210917142149j:plain

IFTTTレシピ

f:id:takeru232423:20210917141610p:plain

イベントを受け取り、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);

www.php.net
www.php.net
www.php.net

感想

最近LINE Botに興味を持っています。

飲食店や薬局でLINEを活用していることをよく見るようになりました。

他のサービスと連携がしやすいので可能性は無限大です。

この記事に関してご指摘等ございましたら、コメント頂けるとありがたいです。

【PHP】会員登録なしで投票できる仕組みを考えてみた!【Cookie】

こんにちは。

クッキーといえばステラおばさんのクッキーが好きです、、、、、、



今回はタイトル通り、「会員登録なしで投票できる仕組み」について考えていきたいと思います。

最近、会員登録なしで投票ができるWebアプリを見かけます。

例えば以下のアプリ
tagvote.grinspace.jp

1度投票すると、再投票できない仕組みになっています。

1回目の投票はChromeを用いて投票しました。2回目としてSafariで投票しようとすると、、、投票できました。

つまりリクエストを送ってくるブラウザごとに何か値をプログラム上で設定して、認識していると思います。

結論、Cookieを使っているのではないかと考えました。

実際に同じ現象を再現すべく自分でプログラムを書いてみました。

実行結果

chromeで画面表示
f:id:takeru232423:20210912225428p:plain

投票してみる
f:id:takeru232423:20210912225518p:plain

画面を更新しても上記のまま

そして、そのままSafariで画面表示してみると、投票ができる
f:id:takeru232423:20210912225902p:plain

ソースコード

<!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>

www.php.net

比較的に簡単に実装できました。

感想

インストールとか会員登録とかはユーザーにとって、そのサービスを使うか使わないか判断する要因の一つだと考えています。

上記で紹介した投票サイトや、twitterでよく見かける匿名質問サービスのpeing(
Peing(ペイング) -質問箱- 匿名で質問を受け取ろう
)は会員登録が必要ないので、気軽に使えると感じるユーザーが多いのではないかと感じました。

この記事関して、間違い等ございましたらコメント頂けるとありがたいです。

【PHP】MediaWiki APIを使って情報を取得してみた!!!

MediaWikiAPIを使ってみました。

このAPIを使うことによりWikipediaのデータへアクセスすることができます。

さっそく、使ってみました。

実行結果

自分の好きなNBA選手「カーメロアンソニー」のWikipediaにおける最初の節の文章を取得しました。
f:id:takeru232423:20210908003141p:plain

ソースコード

<!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から情報を取得するためのエンドポイント

https://ja.wikipedia.org/w/api.php

パラメーター actionにqueryを指定し、MediaWikiからデータを取得する

https://ja.wikipedia.org/w/api.php?action=query

パラメーター 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

json出力結果

f:id:takeru232423:20210908003042p:plain

感想

今回MediaWiki APIを使ってみましたが、このAPIは自作でWebアプリを作る際に使いやすいのではないかと思いました!

Wikipediaって本当に色々なジャンルの情報がありますしね!

記事に関して、ご指摘等ございましたらコメントいただけるとありがたいです。