- 投稿日:2021-01-13T22:00:46+09:00
Laravelで手軽にログイン認証機能を実装する
【前提条件】
Lamp環境が正常にインストール出来ている。
Node.jsのインストールが出来ている。
データ・ベースの設定が出来ている。
artisanコマンドがある程度扱える。Node.jsがインストール出来ていない方は@seiba様の記事を参照して下さい
【引用リンク】
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea1、バージョンを確認する
まずはLaravelのバージョンを確認しましょう、以下のコマンドを入力して下さい。
php artisan --versionLaravelのバージョンが6系か7系かを確認します。
2、Laravel/uiをインストールする。
6系の場合は以下のコマンドでインストール
composer require laravel/ui:^1.0 --dev7系の場合は以下のコマンドでインストール
composer require laravel/ui:^2.43、認証機能を実装する
6系、7系共通で以下のコマンドを入力してログイン機能を実装する
php artisan ui vue --authこの時点ではログイン機能は完成していません、この時点でREGISTER場面を
見てみると………フロントエンド部分が実装されていません。
4、フロントエンド部分を実装する〜完成
npmをインストールする
npm installnpmをビルドする
npm run dev最期に忘れずにmigrationコマンドででログイン情報を格納するテーブルを作成する。
php artisan migration完成です
Laravelを立ち上げてみて右端のRegisterをクリックしてみる
すると先程は実装されていなかったフロントエンド部分の実装がなされている。
実際に登録してみる
番外編:どのようにデータが格納されているか
実際にパスワードが格納されているテーブルを見てみるとパスワードが暗号化されて格納されており、手軽に実装出来てかなり高度な認証機能である事がわかる。
| 1 | ララベルユーザー | laravel@gmail.com | NULL | $2y$10$KPPRJJH0fOYl1JocEdQscu3NNl5BrJU.MpEu4AY1I2ye6F5z18Zsq | NULL | 2021-01-13 12:40:02 | 2021-01-13 12:40:02 | +----+--------------------+-------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+参考サイト
【公式版】Laravel公式チュートリアル日本語訳
https://readouble.com/laravel/7.x/ja/authentication.html
- 投稿日:2021-01-13T20:45:12+09:00
Docker x Laravel 脅威の1ファイル!最小構成でローカル開発環境を構築する
docker-compose.yml
の1ファイル、ウェブサーバーコンテナ、データベースサーバーコンテナなしで作成する最小構成のDocker Laravel開発環境です。環境
- PHP: 7.4
- Composer: 2.0
- Docker: 20.10.2
- Docker Compose: 1.27.4
docker-compose.yml
1ファイルのみdocker-compose.yml
docker-compose.ymlversion: "3.8" services: composer: image: composer:2.0 volumes: - ./backend:/work/backend working_dir: /work/backend app: image: php:7.4-cli-buster ports: - 8000:8000 volumes: - ./backend:/work/backend working_dir: /work/backend command: php artisan serve --host=0.0.0.0使い方
Laravelプロジェクトの作成
$ docker-compose run composer create-project --prefer-dist laravel/laravel . # Laravelバージョン指定 $ docker-compose run composer create-project --prefer-dist "laravel/laravel=6.*" .Laravelビルトインサーバーの起動
$ docker-compose up -d appこだわったポイント
Dockerfileのビルドが必要ないこと。
もはやカップ麺を作るより速く、お湯を沸かす時間だけで作れてしまうほどシンプルな構成です。作った理由
Dockerfileのビルドの時間がかかるから。
Laravelのお試し環境を作るのに最強の構成を作るまででもないなという時。GitHub
オススメの記事
- 投稿日:2021-01-13T20:23:31+09:00
【Laravel】コントローラーとは?作成や編集方法を実例で解説。
Laravelのコントローラーについて。実際にコントローラーを作成してブラウザに表示させることで理解を深める。
目次
コントローラーとは?
Laravelのコントローラーでは、クラスを作成しメソッドを定義することができる。
ルーティングファイル(web.php)などにメソッドを記述していくとファイル長が膨大になってしまうため、コントローラーを使用することで、メソッドを利用しやすくなる。
コントローラーの作成方法
・
$ php artisan make:controller コントローラー名
コントローラー名は冒頭大文字のキャメル表記。
例$ php artisan make:controller HelloController Controller created successfully.
コントローラーの保存場所
artisanコマンドを実行すると、app/Http/Controllers内に新たにファイルが生成される。
↓
専用のディレクトリの中に入れたい場合
コントローラー名の前にディレクトリ名を付ければOK。
例:
php artisan make:controller Test/HelloController
コントローラーの中身
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { // }・
namespace App\Http\Controllers;
名前空間。app/Http/Controllers配下にファイルがあるため、そのまま名前空間として指定。
名前空間をつけることで、同じメソッド名でも名前空間が異なればそれぞれ別のメソッドとして使うことができる。
・
use 名前空間
指定した名前空間をインポート。・
use Illuminate\Http\Request;
LaravelのAPIである、名前空間Illuminate\Http\Requestをインポートしている。
これで、Request.phpに定義されているメソッドが使えるようになる。▼Illuminate\Http\Requestの場所
vender > laravel > framework > src > Illuminate > Http > Request
・class HelloController extends Controller
定義したクラス名HelloControllerに、親クラスとして、Controllerクラスを継承している。Controllerクラスには、
validate()
やmiddleware()
など便利なメソッドが定義されている。・
{ // }
ここに、メソッドを記述していく。
コントローラーの作成例
step1. メソッドを定義
//の中に以下を追記
public function message(){ $msg = 'こんにちは'; return $msg; }messageメソッドを呼び出すと、「こんにちは」を返す。
HelloController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { public function message(){ $msg = 'こんにちは'; return $msg; } }
step2. ルーティングで呼び出す
web.phpRoute::get('msg', 'App\Http\Controllers\HelloController@message');URIがmsgにアクセスしたら、HelloControllerのmessageメソッドを実行する。
以上で完了。
▼ブラウザの表示
コントローラー指定時の注意点
Laravel7までは、
App\Http\Controllers\
が省略できたが、Laravel8からは省略するとエラーが表示されるようになった。対策として完全な名前空間で指定した。
他にも、Laravel7の環境と同じにする方法や、アクション構文を使用する方法がある。
Laravel7と同じ環境にする
以下ファイルのコメントアウトを解除する。
app > Providers > RouteServiceProvider.php
解除するコメントアウト//protected $namespace = 'App\\Http\\Controllers';
RouteServiceProvider.phpprotected $namespace = 'App\\Http\\Controllers'; //コメントアウトを解除 /** * Define your route model bindings, pattern filters, etc. * * @return void */ public function boot() { $this->configureRateLimiting(); $this->routes(function () { Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); }); }
ルーティングのコントローラー名を簡略化して完了。web.phpRoute::get('msg', 'HelloController@message');
アクション構文を使用する
ルーティングファイルの冒頭で、
use
を使ってHelloControllerクラスをインポートする。・
use App\Http\Controllers\HelloController;
getメソッドの第二引数で以下を指定。
・[コントローラー名::class, 'メソッド名']
web.phpuse Illuminate\Support\Facades\Route; //デフォルトで記述 use App\Http\Controllers\HelloController; //追記 Route::get('msg', [HelloController::class, 'message']);
コントローラーでviewファイルを呼び出す
コントローラーのメソッドが呼び出されると、viewファイルを描画するプログラムを作成する。
step1. コントローラーの作成
HelloController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloController extends Controller { public function message(){ $msg = 'こんにちは'; $title = 'this is title!'; return view('child', ['hello'=>$msg, 'title'=>$title]); } }HelloControllerのmessageメソッドを実行すると、child.blade.phpを表示する。
その際、
hello
という変数で$msg
を、title
という変数で$title
を渡す。
step2. viewファイルの作成
ここでは、child.blade.phpと、レイアウトとなるapp.blade.phpを作成する。
app.blade.php<html> <head> <title>@yield('title')</title> </head> <body> <div class="container"> @yield('content') </div> </body> </html>親ビューとなるapp.blade.phpを作成。
@yield
で子ビューのセクションを呼び出している。
child.blade.php@extends('layouts.app') @section('title', $title) @section('content') <p>{{ $hello }}</p> @stop
@extends
で親ビューを継承。
@section
でコントローラーから渡された変数を使用。
step3. ルーティングの作成
パス「xxx」にアクセスすると、HelloControllerのmessageメソッドを実行するようにルーティングファイルに記述。
web.phpRoute::get('xxx', 'HelloController@message');以上で完了。
>section, yield, extendの詳細はこちらを参照
▼ブラウザの表示
ページタイトルと、ページの内容に、コントローラーで定義した変数が表示されている。
- 投稿日:2021-01-13T19:02:36+09:00
【Laravel】Illuminateとは何か?ファイルはどこにあるのか?
Laravelでコントローラーを作成した場合などに、
use Illuminate\Http\Request;
といった記述がある。これは名前空間の
Illuminate\Http\Request
をインポートしているということだが、そもそもIlluminate
とはどこにあり、何なのか?Illuminateはどこにあるのか?
Illuminateは、laravelでプロジェクトを作成した時に自動生成される、vendorディレクトリ配下に存在する。
vender > laravel > framework > src > Illuminate
vendorディレクトリはcomposerと依存関係にある。
Illuminateとは?
IlluminateはLaravelのコンポーネントが入っている。
Illuminate\Http\Request
クラスの、hasメソッドのように、各クラスとメソッドが定義されている。Laravelでデフォルトで使えるありがたいメソッドがたくさんあるのは理解できたが、その名前とマッチしなさすぎる、、
IlluminateはLaravel4のコードネームだそうで、このタイミングでcomposerを通じてframeworkをインストールするように認め、それを記念して(?)Illuminateというフォルダに格納されているらしい。(歴史を知らない人にはとにかくわかりにくい!!)
まぁ、Laravelの大事なコンポーネントが置いてある場所ということ。
・参考
Illuminateメソッド一覧
- 投稿日:2021-01-13T17:38:50+09:00
docker+laravelでGeneral error: 1812 が発生
初めに
docker + laravelを使って、なんかプログラムを作ろうと
migrateを行った際に$ docker exec -it docker-sample_php-fpm_1 bash root@39aae0ad8da6:/var/www/html# php artisan migrate Illuminate\Database\QueryException SQLSTATE[HY000]: General error: 1812 Tablespace is missing for table `laravel`.`migrations`. (SQL: select `migration` from `migrations` order by `batch` asc, `migration` asc) at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671 667| // If an exception occurs when attempting to run a query, we'll format the error 668| // message to include the bindings with SQL, which will make this exception a 669| // lot more helpful to the developer instead of just the database's errors. 670| catch (Exception $e) { > 671| throw new QueryException( 672| $query, $this->prepareBindings($bindings), $e 673| ); 674| } 675| +27 vendor frames 28 artisan:37 Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))が発生した。
備忘録として、メモしておく何が起こったか?
出ているエラーをよくみてみると
Tablespace is missing for table `laravel`.`migrations`と出ている。
dokcerのmysqlのコンテナーにログインして、テーブルを確認するとmysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | laravel | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.01 sec) mysql> use laravel; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-------------------+ | Tables_in_laravel | +-------------------+ | failed_jobs | | migrations | | password_resets | | tasks | | users | +-------------------+ 5 rows in set (0.00 sec)migrationsテーブルは存在する。
migrationsテーブルの中身を見てみる。mysql> select * from migrations; ERROR 1812 (HY000): Tablespace is missing for table `laravel`.`migrations`.エラーが出てくる。
解決
色々と調べてみたが、いかが手っ取り早そう
mysql> drop table migrations; Query OK, 0 rows affected (0.02 sec)他のテーブルでもmigrateが詰まったら
drop table tbl_nameを実行すれば良さそう。
それでは素敵なdocker lifeを
- 投稿日:2021-01-13T17:37:10+09:00
curl error 60を解決した
エラーが出ていた元のコード
//$postと$headersについては省略 $ch = curl_init('URL'); $options = [ CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_BINARYTRANSFER => true, CURLOPT_HEADER => true, CURLOPT_POSTFIELDS => $post, ]; curl_setopt_array($ch, $options); $result = curl_exec($ch);エラーが出なくなったコード
$ch = curl_init('URL'); $options = [ CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_BINARYTRANSFER => true, CURLOPT_HEADER => true, CURLOPT_POSTFIELDS => $post, CURLOPT_SSL_VERIFYPEER => false, //追加 CURLOPT_VERBOSE => true, //追加 ]; curl_setopt_array($ch, $options); $result = curl_exec($ch);参考(こちらのラインプッシュを試した際に出くわしたエラーです):https://imoni.net/tips/00xx/0012.html
- 投稿日:2021-01-13T16:30:00+09:00
【Laravel】ディレクトリ構造の理解。どれが使うディレクトリ?各ディレクトリの意味。
Laravelでプロジェクトを作成すると自動で複数のディレクトリ とファイルが作成される。
いじる必要のないディレクトリを知るなど理解を深める。
よく触るディレクトリ
- app (コントローラーがある)
- config (環境設定)
- database (マイグレーションファイル)
- public (画像やファビコンなど)
- resources (ビュー)
- routes (ルーティング)
あまり触らないディレクトリ
- bootstrap (フレームワークの自動処理)
- storage (コンパイル後のファイル)
- tests (テスト用)
- vender (composerの依存ファイル)
最初から存在するか、コマンドやコンパイルで自動生成されるファイルが入る。
appディレクトリ
artisanコマンドによって生成されたディレクトリが配置される。
ほぼすべてのクラスがこの中にある。
・
make
artisanコマンドを実行するとファイルがここに作成される。(make:job
でjobクラスが生成される)・
Console
ディレクトリ
make:command
で作成した、カスタムのartisanコマンドが保存される。・
Exceptions
ディレクトリ
例外処理を記述したファイルを保存する。例外処理のログやレンダリングを変更する場合は、Handlerクラスを変更する。
・
Http
ディレクトリ
コントローラー、ミドルウェア、リクエストが保存される。・
Providers
ディレクトリ
リクエストに対する対応方法を記載したファイルが保存されている。デフォルトで必要なファイルが保存されている。必要に応じて追加可能。
・
Models
ディレクトリ
データベースを操作するためのeloquent modelクラスが保存されている。DBの各テーブルに対応するモデルがあり、クエリを投げてDB操作ができるようになる。
・
Broadcasting
ディレクトリ
make:channel
コマンドで生成したクラスが保存される。
デフォルトでは存在せず、コマンド実行時に生成される。・
Events
ディレクトリ
event:generated
やmake:event
コマンドで生成したイベントクラスが保存される。
デフォルトでは存在せず、コマンド実行時に生成される。・
make:mail
コマンドで生成したクラスが保存される。
デフォルトでは存在せず、コマンド実行時に生成される。Mailオブジェクトには、
Mail::send
メソッドで実行するロジックが保存されている。
bootstrapディレクトリ
基本触らないディレクトリ。
app.php
はフレームワークの自動処理を行うためのファイル。
また、ページ表示の最適化のためのcache
もここに保存される。
configディレクトリ
すべての環境設定ファイルがあるディレクトリ。
▼例:database.php
DBに何を使うかを指定できる。
databaseディレクトリ
DBを構築するための、マイグレーションファイルなどが設置される。
DBにSQLiteを使う場合は、DBとしても使える。
Publicディレクトリ
ここの
index.php
はすべてのリクエストのエントリーポイントとなる。また、クローラに指示を出す
robots.txt
や、ファビコンもこのディレクトリにある。イメージもこのPublicディレクトリ内に保存する。(フォルダ名はimgやimagesが一般的)
Resourcesディレクトリ
公開用のビュー(.blade.php)やリソースがあるファイル。
言語ファイルやcss, jsなどのコンパイル前のリソースもここに入る。
Routesディレクトリ
ルートを定義したファイルが保存されている。
・
web.php
基本的にほぼすべてのルーティングをここに記載する。セッション情報を保存しない、statelessやRESTfull APIの場合は除く。
Storageディレクトリ
コンパイル後のブレードテンプレート、
ログやセッション関連ファイル、キャッシュファイルなどが保存される。・
appディレクトリ
アプリによって生成されたファイルなどが保存される。・
framework
キャッシュなどが保存される。・
logs
ログファイルが保存される。
testsディレクトリ
テスト用のファイルが保存されている。
php artisan test
でテストを実行できる。
vendorディレクトリ
composerの依存ファイルが保存されている。
基本いじらない。
- 投稿日:2021-01-13T15:17:49+09:00
Laravelでサイトマップを分割する
Laravelium/laravel-sitemapを使う
インストール方法は以下
https://github.com/Laravelium/laravel-sitemapサイトマップを分割する
サイトマップに関する設定は
config/sitemap.php
でもできる。
今回は個別に設定するのでコンフィグファイルはいじらない。※
use_limit_size
はfalseのままにする。trueにするとURLが全件出力されないし、ファイル分割もされない。public static function toXml($data){ $sitemap = \App::make('sitemap'); $sitemap->model->setMaxSize(1000); // 1xmlあたりのURL数 foreach ($data as $d) { $sitemap->add( $d->url, $d->last_modified $d->priority, $d->frequency, ); } $sitemap->store('xml', 'sample_sitemap', '/tmp'); //** 出力結果例 **// // sample_sitemap.xml <= サイトマップインデックス // sample_sitemap_0.xml // sample_sitemap_1.xml }設定するだけで分割されるので便利。
しかもサイトマップ(子)をまとめるサイトマップインデックス(親)も作成してくれるので、ファイル数が多くなってもサイトマップインデックス(親)だけSearch Consoleに登録すれば良い。便利。
- 投稿日:2021-01-13T14:16:29+09:00
【Laravel AdminLTE】URLが前方一致する場合、left sidebarがactiveになるようにする
手順
- ViewComposerを導入する
- 「adminlte::partials.sidebar.menu-item」で使用するviewcomposer「SidebarMenuItemComposer」を作成する
- $item['class']に「active」が追加されるようにする
- 「SidebarMenuItemComposer」を「adminlte::partials.sidebar.menu-item」に関連付ける
以下コード
/app/Http/ViewComposers/SidebarMenuItemComposer.php<?php namespace App\Http\ViewComposers\User\Worker; use Auth; use Illuminate\View\View; /** * Class ModalSearchCemeteryComposer * @package App\Http\ViewComposers\User\Worker */ class SidebarMenuItemComposer { /** * @param View $view */ public function compose(View $view) { // 現在のページに応じて左メニューをactiveにする $path = request()->path(); $host = request()->getHttpHost(); $http = $this->isSsl() ? 'https' : 'http'; $item = $view->getData('item'); $pattern = str_replace($http.'://'.$host.'/', '', $item['item']['href']); if (!$item['item']['active'] && ($pattern === $path || strpos($path, $pattern.'/') === 0)) { $item['item']['class'] .= ' active '; } $view->with(['item' => $item['item']]); } //Webサーバー毎にキーと値で判別 private function isSsl() { if (isset($_SERVER['HTTPS']) === true ) // Apache { return ($_SERVER['HTTPS'] === 'on' or $_SERVER['HTTPS'] === '1' ); } elseif (isset($_SERVER['SSL']) === true ) // IIS { return ($_SERVER['SSL'] === 'on' ); } elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) === true ) // Reverse proxy { return (strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https' ); } elseif (isset($_SERVER['HTTP_X_FORWARDED_PORT']) === true ) // Reverse proxy { return ($_SERVER['HTTP_X_FORWARDED_PORT'] === '443' ); } elseif (isset($_SERVER['SERVER_PORT']) === true ) { return ($_SERVER['SERVER_PORT'] === '443' ); } return false; } }/app/Providers/ViewComposerServiceProvider.php<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use View; class ViewComposerServiceProvider extends ServiceProvider { /** * Register services. * * @return void */ public function register() { // } /** * Bootstrap services. * * @return void */ public function boot() { View::composers([ \App\Http\ViewComposers\User\Worker\SidebarMenuItemComposer::class => 'adminlte::partials.sidebar.menu-item', ]); } }
- 投稿日:2021-01-13T13:34:52+09:00
Laravel で画像サイトマップを作る
Laravelium/laravel-sitemapを使う
インストール方法は以下
https://github.com/Laravelium/laravel-sitemapサンプル
add関数の第5引数が画像サイトマップ用の値。
公式には見当たらなかったのでメモ。public function toXmlFile(){ $sitemap = \App::make('sitemap'); $sitemap->add( "http://sample.com/spot/1", // page url "2021-01-12T00:00:00+00:00", // last modified 0.6, // priority "yearly", // frequency [ // 画像サイトマップの設定 [ 'url' => "http://sample.com/spot/1.jpg", 'title' => "サンプルタイトル", 'caption' => "このサンプルは日本語", 'geo_location' => "東京都、新宿区", 'license' => "http://sample.com" ] ] ); }
- 投稿日:2021-01-13T12:21:23+09:00
【Laravel】ブレードテンプレートとは?
個人用メモです。
https://laravel.com/docs/8.x/blade目次
ブレードとは?
Laravelで使用しているテンプレートエンジン。
テンプレートエンジンとは、HTMLとデータ(PHPやJSなど)を組み合わせて出力ようのHTMLファイルを作成するライブラリのこと。
ブレードは
.blade.php
という拡張子のファイルで、HTMLとPHPを合わせて記述することができる。このファイルをブレードテンプレートと呼ぶ。
▼ブレードテンプレートの例
HTMLの中でif文を使うなど。.blade.php<div> <table> @if ($table->getColgroup()) <colgroup> @if ($table->getColgroup()) @foreach ($table->getColgroup()->getCols() as $col) <col width="{{ $col->getWidth() ?: 'auto'}}"> @endforeach @endif </colgroup> @endif </table> </div>divタグやtableタグと、
@if
や@foreach
などphpのコードが混ざっている。
ブレードテンプレートの保存場所
resources/views配下に保存する。
viewsフォルダの中に、.blade.phpファイルが格納されている。
ブレードテンプレートの呼び出し
グローバルに定義されているviewヘルパーで呼び出す。
・
view('ブレードテンプレート名', ['変数名' => '値'])
┗ 第2引数で指定した変数に値を代入して渡す▼viewヘルパーの使用例
Route::get('/', function () { return view('greeting', ['name' => 'James']); });Routeファサードのgetメソッドで
/
のパスにアクセスした場合に、greeting.blade.phpを返す。その際、値Jamesを格納した変数nameを渡す。この文法をブレードシンタックスと呼ぶ。
▼対象のブレード例greeting.blade.phpHello, {{ $name }}.「Hello, James.」が表示される。
・{{ }}の意味
すべて文字列として出力する特殊なecho文。
XSS attack防止仕様(スクリプトを実行しない。)・{!! !!}の意味
{{ }}と異なりエスケープせずそのまま出力する。
タグを出力したい場合など、こちらを使う。XSS attack防止のため、ユーザーが入力した内容を出力する場合は{{ }}を使う。
・{{-- --}}の意味
コメントアウト。
@ブレードディレクティブ
ブレードテンプレート内で@をつけることで、phpの処理を実行することができる。(コードの省略表記)
@if
,@for
,@json
など多数ある。この@をブレードディレクティブと呼ぶ。
@json
ディレクティブブレードテンプレートで簡単にjson形式のデータが入ったデータの呼び出しができる。
@jsonディレクティブ<script> var app = @json($array); </script>ディレクティブを使わない通常表記は下記。
<script> var app = <?php echo json_encode($array); ?>; </script>
@json
ディレクティブの呼び出しデータを整形する第2引数で指定の指示(定義済み定数)を与えると、呼び出したデータを整形できる。
・
@json($変数名, 定義済み定数)
▼主な定義済み定数
定義済み定数 内容 JSON_PRETTY_PRINT 返される結果の書式を、スペースを使って整形 JSON_HEX_TAG すべての < および > をそれぞれ \u003C および \u003E に変換 JSON_NUMERIC_CHECK 数値形式の文字列を数値としてエンコード
・@@ブレードディレクティブのエスケープ
@を2つつけるとブレードディレクティブのエスケープとなる。
.blade.php@@json↓
HTMLページの出力@json
・
@include
ディレクティブブレードビュー内で別のビューを呼び出す。
<div> @include('shared.errors') <form> <!-- Form Contents --> </form> </div>
@include('shared.errors')
の部分に、shared.errors.blade.phpが表示される。viewヘルパーと同じく、第二引数でデータを渡すことができる。
・
@include('view.name', ['status' => 'complete'])
view.name.blade.phpを読み込む。その際、completeというデータを変数$statusで渡す。※注意
存在しないビューファイルを指定した場合はエラーになる。
・
@includeif
存在しない可能性のあるファイルを指定する場合は、
@includeif
を使う。@includeIf('view.name', ['status' => 'complete'])
ディレクティブは他にも多数あり。
詳細はlaravel公式ページにて。
- 投稿日:2021-01-13T12:00:35+09:00
【Laravel】ビュー、ブレードディレクティブとは?
個人メモです。
View
別々のファイルに記述されたHTMLを取り出し一つのページとして表示する機能。
viewの事例
greeting.blade.php<html> <body> <h1>Hello, {{ $name }}</h1> </body> </html>viewの拡張子
.blade.php
この拡張子のファイルをブレードテンプレートと呼ぶ。viewの保存場所
viewsフォルダの中に、.blade.phpファイルが格納されている。viewファイルの呼び出し
グローバルに定義されているviewヘルパーで呼び出す。
・
view('ブレードテンプレート名', ['変数名' => '値'])
┗ 第2引数で指定した変数に値を代入して渡す▼viewヘルパーの使用例
Route::get('/', function () { return view('greeting', ['name' => 'James']); });Routeファサードのgetメソッドで
/
のパスにアクセスした場合に、greeting.blade.phpを返す。その際、値Jamesを格納した変数nameを渡す。この文法をブレードシンタックスと呼ぶ。
▼対象のブレード例greeting.blade.phpHello, {{ $name }}.「Hello, James.」が表示される。
・{{ }}の意味
すべて文字列として出力する特殊なecho文。
XSS attack防止仕様(スクリプトを実行しない。)・{!! !!}の意味
{{ }}と異なりエスケープせずそのまま出力する。
タグを出力したい場合など、こちらを使う。XSS attack防止のため、ユーザーが入力した内容を出力する場合は{{ }}を使う。
・{{-- --}}の意味
コメントアウト。
@ブレードディレクティブ
ブレードテンプレート内で@をつけることで、phpの処理を実行することができる。(コードの省略表記)
@if
,@for
,@json
など多数ある。この@をブレードディレクティブと呼ぶ。
@json
ディレクティブブレードテンプレートで簡単にjson形式のデータが入ったデータの呼び出しができる。
@jsonディレクティブ<script> var app = @json($array); </script>ディレクティブを使わない通常表記は下記。
<script> var app = <?php echo json_encode($array); ?>; </script>
@json
ディレクティブの呼び出しデータを整形する第2引数で指定の指示(定義済み定数)を与えると、呼び出したデータを整形できる。
・
@json($変数名, 定義済み定数)
▼主な定義済み定数
定義済み定数 内容 JSON_PRETTY_PRINT 返される結果の書式を、スペースを使って整形 JSON_HEX_TAG すべての < および > をそれぞれ \u003C および \u003E に変換 JSON_NUMERIC_CHECK 数値形式の文字列を数値としてエンコード
・@@ブレードディレクティブのエスケープ
@を2つつけるとブレードディレクティブのエスケープとなる。
.blade.php@@json↓
HTMLページの出力@json
・
@include
ディレクティブブレードビュー内で別のビューを呼び出す。
<div> @include('shared.errors') <form> <!-- Form Contents --> </form> </div>
@include('shared.errors')
の部分に、shared.errors.blade.phpが表示される。viewヘルパーと同じく、第二引数でデータを渡すことができる。
・
@include('view.name', ['status' => 'complete'])
view.name.blade.phpを読み込む。その際、completeというデータを変数$statusで渡す。※注意
存在しないビューファイルを指定した場合はエラーになる。
・
@includeif
存在しない可能性のあるファイルを指定する場合は、
@includeif
を使う。@includeIf('view.name', ['status' => 'complete'])
ディレクティブは他にも多数あり。
詳細はlaravel公式ページにて。
- 投稿日:2021-01-13T12:00:35+09:00
【Laravel】@sectionとは?テンプレートの継承を実例で解説。
@section
は@yield
と@extends
と一緒に使用するディレクティブ。子ビューで定義したデータを、親ファイルで呼び出すことができる。
目次
@section
の用途@section
の使用手順- 子ビューに
@section
でデータを定義する- 親ビューにデータを受け取る場所を定義する
@yield(セクション名)
@extends
で親ビューを読み込む- 実例
@section
の用途レイアウトを定義したビュー(親)に、別のビュー(子)を表示させる際に、子のビュー毎にレイアウトの一部の表示内容を変更する場合などに使用。
タイトルの出し分けもできる。
@section
の使用手順1. 子ビューに
@section
でデータを定義する
2. 親ビューにデータを受け取る場所を定義する@yield(セクション名)
3.@extends
で親ビューを読み込む以上手順の処理後にページを表示する。
@yield(セクション名)
以外に、@section(セクション名)
~@show
でも呼び出せる。が、コードが長い上にsectionだらけになるので基本使わない。
子ビューに
@section
でデータを定義するデータの定義方法は大きく3種類。
1.
@section('セクション名', 'データ')
2.@section('セクション名')
~@endsection
3.@section('セクション名')
~@stop
1.
@section('セクション名', 'データ')
データ量が少ない場合は、第2引数にデータを定義する。
@section('title', 'Page Title')titleというセクション名を呼び出すと、「Page Title」が表示される。
2.
@section('セクション名')
、@endsection
データ量が多い場合は、
@section
と@endsection
で囲む。@section('content') <p>親ビューに渡す内容</p> @endsection
3.
@section('セクション名')
~@stop
No.2と同じ。
@endsection
は@stop
でも機能する。@section('content') <p>親ビューに渡す内容</p> @stop
親ビューにデータを受け取る場所を定義する
@yield(セクション名)
子ビューで定義したデータを表示する
・@yield(セクション名)
▼@section
~@show
も同じ別の記述@section('sidebar') 好きなコメントを記述できる。 @show
@yield
と異なり好きなコメントを記述できる。
@extends
で親ビューを読み込む子ビューと親ビューを連携させるために、
@extends('親ビュー名')
で親ビューを読み込む親ビューがviewフォルダ直下にない場合は、フォルダ名を
.
で繋ぐ。▼例
以下のようにlayouts/app.blade.phpというレイアウトを呼び出したい場合は、@extends('layouts.app')
とする。view直下にあるレイアウトを呼び出したい場合は、
@extends('app')
のようにすればOK。
実例
▼親ビュー
レイアウトとなる親ビューを以下のようにする。
app.blade.php<html> <head> <title>@yield('title')</title> </head> <body> <div class="container"> @yield('content') </div> </body> </html>titleタグと、divタグの2箇所に
@yield
を設置。
▼子ビューchild.blade.php@extends('layouts.app') @section('title', 'sectionによるデータ受け渡しテスト') @section('content') <p>親ビューに渡すデータ</p> @stop
▼ルーティングの追加
URL「/blade」にアクセスした時に、childビューを表示するようにする。routes/web.phpRoute::get('blade', function() { return view('child'); });
▼画面表示