- 投稿日:2020-07-05T19:43:41+09:00
Laravel 7 Angular Token-Based Authentication with JWT
This is a step by step Laravel 7 and Angular 10 Token-Based Authentication tutorial. In this tutorial, we will learn how to combine Laravel and Angular from scratch and create a secure user authentication application.
click here to read more:
https://www.positronx.io/laravel-angular-token-based-authentication-with-jwt/
- 投稿日:2020-07-05T19:38:24+09:00
Laravel 7 Datatables Example | Use Yajra Datatables in Laravel
Create Datatables in Laravel using a third-party package called Yajra Datatables.
click here to read more:
- 投稿日:2020-07-05T18:11:23+09:00
Laravelを用いた開発環境の構築手順
Laravelを用いたプロジェクトの開発手順です。
Laravelのインストール
Composerを使用して、グローバル環境にLaravelをインストールします。
$ composer global require laravel/installerlaravel実行ファイルがどこに設置されても動作するように、composerシステム全体のvendor/binディレクトリに$PATHを登録します。
MACの場合は、下記をターミナルで記述します。$ export PATH=$HOME/.composer/vendor/bin:$PATHプロジェクトの作成
cd
でプロジェクトを作成するディレクトリに移動して、laravel new プロジェクト名
を実行します。$ cd htdocs $ laravel new quick_laravelインストールされたアプリの確認
インストールが完了すると、このようにディレクトリにファイルが作成されます。
メインとなるアプリやディレクトリは、下記のようにそれぞれの役割があります。
.
├── app … アプリ本体コード
│ ├── Console … コンソールアプリ
│ ├── Exception … 例外処理関連
│ ├── Http … webアプリ
│ │ ├── Controllers … コントローラー(リクエストを受け取り、モデルを呼んだりビューに表示をさせる)
│ │ ├── Middleware
│ │ └── Kernel.php
│ ├── Prociders … プロバイダー関連
│ └── User.php
├── bootstrap … アプリ起動時に実行されるコード
├── cofig … アプリの共通設定
├── database … データベース関連
├── public … 公開するディレクトリ(Js、CSS)
├── resources … アプリのリソース関連(Viewファイルなど)
├── routes … ルーティング関連(ルーター:リクエストURLに応じて受け渡し先を決める)
├── storage … アプリが操作するファイルの保存先
├── tests … テストコード関連
├── vendor … Laravel本体とライブラリコード
├── artisan … artisanコマンドの設定
├── composer.json … composerの設定
├── package.json … npmの設定
├── phpunit.xml … テストツールの設定
└── server.php … サーバー起動時に実行するコードサーバーの起動
php artisan serve
でサーバーが立ち上がります。$ php artisan serveこの画面が出たら、OKです。
サーバーは、
ctr + c
で終了できます。
- 投稿日:2020-07-05T14:30:53+09:00
Laravel入門学習ノート part8 『モデル・DBからデータ取得』
今回の内容
モデル
モデルを使わずDB操作
モデルを使ってDB操作前回のpart7で入れたデータを表示してみます。
モデルとは
モデルはMVCのMの部分で、データベースの操作を担当する。
DBに書き込んだり、データを取ってくるのが主な役割。Laravelではモデルはひとつのphpファイルとして作成する。
モデルを使わずDB操作
まずはモデルを使わず、クエリビルダを使ってデータ取得する。
クエリビルダとは、Laravelのメソッドを呼んでいくと、SQL文は書かずにいい感じにデータ取得できる機能。
SQL文を実行する方法もありますが今回は記載しない。コントローラ作成
php artisan make:controller FruitsControllerDBクラスをuseで追加する。
tableメソッドの引数にテーブル名を指定し、getメソッドを呼び出す。
最後にviewを呼び出し、引数に取得したデータを渡してコントローラは完成。FruitsControlleruse Illuminate\Support\Facades\DB; class FruitsController extends Controller{ public function index(){ $fruits = DB::table('fruits')->get(); return view('fruits_list', ['fruits'=> $fruits]); } }
get
でそのまま代入すると$fruits
にテーブルの全データが入ってくる。
データがひとつしかなくても配列型になるので注意。View作成
/views
に適当にビューのファイルを作成する。
今回はfruits_list.blade.php
という名前で作成する。fruits_list.blade.php<h1>Fruits list</h1> <ul> @foreach($fruits as $fruit) <li> {{ $fruit->name }} {{ $fruit->price}}円 </li> @endforeach </ul>今
$fruits
は配列型になっているので@foreach
で回す。
列名を参照するとその列の値を取得できるので、ループ内でそれぞれのnameとpriceを表示している。ルーティング
あとはルーティングするだけ。
web.phpRoute::get('/fruits-list', 'FruitsController@index');ブラウザで
/fruits-list
にアクセスするとリンゴとバナナ(part7で入れたデータ)が表示される。モデルを使って表示
モデル作成
まずはモデル作成。
下記コマンドでモデルの名前を指定して作成する。
今回はFruitモデルを作成する。php artisan make:model Fruit
app
フォルダにFruit
モデルが作成される。Laravelではテーブルを複数形、モデルを単数形の名前で作成すると、モデルとテーブルが自動で紐づくようになっている。
そのため、Fruit
という名前でモデルを作成すれば勝手にfruis
テーブルを参照するようになってくれる。あとは
FruitsController
を書き換えるだけでいい
モデル名::all()
と呼び出すだけで全レコードを取得してくれる。FruitsController.phpuse App\Fruit; class FruitsController extends Controller{ public function index(){ $fruits = Fruit::all(); // ここだけ修正 return view('fruits_list', ['fruits'=> $fruits]); } }
- 投稿日:2020-07-05T08:54:34+09:00
Laravel Lighthouse は React Relay のcursor connectionに対応できなくて惜しい
React Relay
GraphQLクライアントです。
https://relay.dev/他に代表的なものとしてApollo clientがありますが現状Relayを素振り中です。
Relayを選択したい(と今のところ思っている)理由
React Relayのフレームワークに乗っかった方が、生産性が高く、メンテするコード量も少なりそうなので、だったら一度全力で乗っかってみようというフェーズです。
Apollo clientと比較する点の一つとして、RelayではGraphQLサーバ側の仕様に制約を設けています。
- 識別子(ID)の定義の仕方
- コネクション(ページ情報)の定義の仕方 (cursor connection)
- mutation 引数の定義の仕方
- などなど...
https://relay.dev/docs/en/graphql-server-specification
制約があるというとネガティブな印象もありますが、これらの制約があるおかげで、オブジェクトの再取得を効率化できたり、ページネーション周りで必要なスキーマ定義が整備され、設計・実装時に考えることが(おそらく)減ります。
識別子に関しては、このRelayの制約がそのままベストプラクティスとしてGraphQL公式に書かれたりします。https://graphql.org/learn/global-object-identification/
Lighthouse: LaravelベースのGraphQLサーバー
Lighthouseは、Laravelに組み込めるGraphQLサーバーです。
https://lighthouse-php.com/Eloquentと統合可能なディレクティブが多数用意されていて、CRUDだけであればコード量も少なく、GraphQLエンドポイントを構築できそうです。
(リレーション定義等は必要なので、全く書かなくて良いわけではありませんでした。)このディレクティブが非常に楽チンで、@hasManyとか書いておくだけで、Relayのコネクション定義を満たしたスキーマを生成してくれます。
例えばこのようなスキーマを書いたとします。type User @model { id: ID! @globalId name: String! projects: [Project!] @hasMany(type: "connection", relation: "projects") } type Project @model { id: ID! @globalId name: String! status: ProjectStatus! createdAt: DateTime! @rename(attribute: created_at) updatedAt: DateTime! @rename(attribute: created_at) }Lighthouse側でディレクティブを解釈した結果は以下となります。(関連部分の抜粋)
type User implements Node { id: ID! name: String! ownerName: String! iconUrl: String projects( first: Int! after: String ): ProjectConnection } interface Node { id: ID! } type ProjectConnection { pageInfo: PageInfo! edges: [ProjectEdge] } type ProjectEdge { node: Project cursor: String! } type Project implements Node { id: ID! name: String! status: ProjectStatus! createdAt: DateTime! updatedAt: DateTime! }Relayの制約も既に考慮されていて、Laravelの資産も使えて、効率的にGraphQLエンドポイントが構築できます!
しかし、cursor connection には対応していなかった
これが非常に残念かつ致命的と思われるところで、Lighthouseのドキュメントに以下のような記述がありました。
Lighthouse does not support actual cursor-based pagination as of now, see https://github.com/nuwave/lighthouse/issues/311 for details. Under the hood, the "cursor" is decoded into a page offset.
以下のイシューで議論されているようですが、どうも対応予定がなさそうな感じです。
https://github.com/nuwave/lighthouse/issues/311connectionの挙動確認
各種スキーマなど
RDBに以下のusersテーブルとレコードが格納されているとします。
`users` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`) )(* 名称は、php fakerでランダム生成したものです。)
id name 1 若松 修平 2 藤本 千代 3 廣川 舞 4 宮沢 浩 5 小泉 涼平 そして、以下のGraphQLスキーマがあるとします。
(model 等のディレクティブはLighthouse固有です。)type User @model { id: ID! @globalId name: String! } type Query { users: [User!]! @paginate(type: "connection") }cursor connection 前提のクエリ
まずは以下のクエリを投げてみます。
(まだカーソルは指定していません。)query users { users(first: 3) { pageInfo { count currentPage total } edges { cursor node { id ... on User { name } } } } }その結果が以下です。
{ "data": { "users": { "pageInfo": { "count": 3, "currentPage": 1, "total": 10 }, "edges": [ { "cursor": "MQ==", "node": { "id": "VXNlcjox", "name": "若松 修平" } }, { "cursor": "Mg==", "node": { "id": "VXNlcjoy", "name": "藤本 千代" } }, { "cursor": "Mw==", "node": { "id": "VXNlcjoz", "name": "廣川 舞" } } ] } } }2番目のユーザ(id="VXNlcjoy")について返却されたcursorを指定して、今度はこのcursor移行のデータを要求するクエリを投げてみます。
query users { users(first: 3 after: "Mg==") { pageInfo { count currentPage total } edges { cursor node { id ... on User { name } } } } }この結果は、先ほどのクエリと全く変化がありませんでした。
つまり、afterにcursorを指定しても、それが効いていないことになります。期待動作としては、1番目のユーザ(id="VXNlcjox")が除外されて、2,3,4番目のユーザが返却される、というものでしたが、確かにcursor connectionに対応されていないようです。
非Relayならpaginatorを使用できる
Relayの場合は cursor connectionが必須ですが、そうでない場合(Apollo Clientなどを使用する場合)は、この制約はありません。
Lighthouseでは、cursor connectionの他に、paginatorもサポートしています。
これは、page番号を指定する方式でのページング機能です。type Query { users: [User!]! @paginate(type: "paginator") }以下のようなクエリが書けて、こちらは期待通りに動作しました。
query users { users(first: 3 page: 2) { paginatorInfo { count currentPage total currentPage } data { id name } } }Relay対応の楽チンGraphQLサーバをもとめて...
Laravelという資産も生かせて、かつ簡単にGraphQLサーバ建てられそうで良いなあと思っていましたが、Relay前提では厳しそうです。惜しい。
そして今度は harura がいいかなと見始めています。
- 投稿日:2020-07-05T04:50:00+09:00
Laravel入門学習ノート part7 『シーディング』
前回、part6 でテーブル作成しましたが、データが入っていないのでせっかくなのでシーディングで入れてみます。
今回の内容
シーディング
データ挿入
※part6で作成したテーブルを使用します。シーディングとは
seeding
データベースに初期データやダミーデータなどのレコードを挿入できる機能。シーディングするためのファイルをシーダー(seeder)という。
シーダーファイル作成
下記コマンドでファイル名を指定して実行。
今回はFruitsTableSeederという名前で作成する。php artisan make:seeder FruitsTableSeeder実行すると
/database/seeds
フォルダに指定したファイル名で作成される。FruitsTableSeeder<?php use Illuminate\Database\Seeder; class FruitsTableSeeder extends Seeder{ public function run(){ // } }
run
メソッドが用意されているのでここにinsert処理を書いていく。FruitsTableSeederpublic function run(){ $param = [ 'name' => 'バナナ', 'price' => '120' ]; DB::table('fruits')->insert($param); $param = [ 'name' => 'リンゴ', 'price' => '250' ]; DB::table('fruits')->insert($param); }シーダーファイルを登録
このままだとシーダーが作成されただけで動いてくれない。
DatabaseSeeder.php
に登録することでシーディングコマンドで実行されるようになる。登録の仕方は
DatabaseSeeder.php
にサンプルが書いてあるので同じように書く。DatabaseSeeder.phpclass DatabaseSeeder extends Seeder{ public function run(){ // $this->call(UserSeeder::class); $this->call(FruitsTableSeeder::class); } }シーディング実行
コマンドを実行すると登録したシーダーが実行される。
php artisan db:seed確認
- 投稿日:2020-07-05T01:46:21+09:00
先輩に用意してもらったDockerFileを使用してLaravel6の環境を作成した話
目的
- 先輩の記事を参考にLaravel6の環境をDockerを用いて作成した話をまとめる
実施環境
- ハードウェア環境
項目 情報 OS macOS Catalina(10.15.5) ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) プロセッサ 2 GHz クアッドコアIntel Core i5 メモリ 32 GB 3733 MHz LPDDR4 グラフィックス Intel Iris Plus Graphics 1536 MB 前提条件
- 特になし。
前提情報
- 職場の大先輩である@layzy_glpさんのQiitaの記事Dockerで始めるLaravel講座 - Laravel編の記事の方法を参考にLaravel6の環境をDockerを用いて作成する。
読後感
- Dockerコンテナ内のnginxのドキュメントルートディレクトリに「app」と言う名前のLaravel6のアプリを作成する。
概要
- Docker Desktop for Macのインストール
- DockerFileのcloneとコンテナの起動
- Laravelインストーラの取得
- Laravelのインストールとアプリ作成
- 確認
詳細
- Docker Desktop for Macのインストール
- 下記の手順を参考にDocker Desktop for Macをインストールする。
- DockerFileのcloneとコンテナの起動とログイン
- 下記の先輩の記事の「Docker環境を作ろう」の部分を参考に全て実施して必要ファイルのcloneとコンテナの起動・コンテナへのログインを行う。
- Laravelインストーラの取得
- 下記の先輩の記事の「Laravelのインストーラーをインストールしよう」の部分を参考に全て実施してインストーラーを取得する。
Laravelのインストールとアプリ作成
下記のコマンドを実行してnginxのドキュメントルートディレクトリに移動する。
$ cd /usr/share/nginx/html下記コマンドを実行してLaravelのインストールとアプリ作成を行う。
$ composer create-project --prefer-dist laravel/laravel app "6.*"さきのコマンド実行完了後、作成されたappディレクトリに移動して下記コマンドを実行しアプリケーションキーを作成する。
$ php artisan key:generate確認
appディレクトリにて下記コマンドを実行しLaravelのバージョンが6.Xになっていることを確認する。
$ php artisan -Vブラウザにてhttp://localhost:8080にアクセスし、下記の画面が出ることを確認する。
作成されたappディレクトリに移動して下記コマンドを実行しアプリケーションキーを作成する。
$ php artisan key:generate