Larave – ディレクティブ

概要

ディレクティブ(directive)はBladeテンプレート内に記述し、テンプレート内でPHPの処理・制御をおこなったり、共通のレイアウトを扱うといった処理を指示する。

ディレクティブは@キーワードのように書き、そのキーワードに応じて必要な表現が続く。

ロジック制御系ディレクティブ

分岐系ディレクティブ

@if

@unless

@empty

@isset

ループ系ディレクティブ

@for

@foreach

@forelse…@empty

@while

@break

PHPのbreakと同じ使い方。

@continue

PHPのcontinueと同じ使い方。

$loop変数

$loop->index 現在のインデックス(0, 1, 2, …)
$loop->iteration 現在の繰り返し数(1, 2, 3, …)
$loop->remaining あと何回繰り返すか
$loop->count 配列の要素数
$loop->first 繰り返しの最初かどうか
$loop->last 繰り返しの最後かどうか
$loop->depth 繰り返しのネストの深さ
$loop->parent ネストしている場合の親のループ変数

共通化・再利用関係ディレクティブ

レイアウト関係ディレクティブ

レイアウト関係はこちらにまとめている。

@extends/@yields/@section

  • @extendsでレイアウトとして使う親のビューを指定
  • @yieldで個別ビューで埋めるべきプレースホルダーを指定
  • 個別ビューやサブレイアウトで@sectionを指定し、対応する@yieldを具体の内容で埋める

@show

@parent

部分HTML関係ディレクティブ

@include

@includeディレクティブは、別に準備された共通の部分ビューをその場所に読み込む。第2引数に連想配列を指定して、引数を渡すことができる。

例として、以下は共通して読み込まれる部分ビュー。

そして以下は、@includeで上のHTMLを読み込むビュー。

@component/@slot

@includeと同じように共通の部分ビューを読み込むが、変数を指定するのに連想配列で渡す方法と@slotディレクティブで指定する方法がある。

以下は@componentで読み込まれる部品側のファイル。

そして以下は、この部品を読み込んで使う親のファイル。

@each

@eachディレクティブは、配列やコレクションの内容を取り出しながら、その内容を繰り返してビューに適用していく。

ビュー2はコレクションが空のときに使われるビュー。

たとえば以下のような部分ビューを準備しておいて、

以下のように@eachを使うことで、配列の要素1つずつに同じ部分ビューの内容を適用させることができる。

この結果、@componentの時と同じようなリストが配列の要素に対応して作られる。

@import/@component/@eachの使い分け

これら3つを使い分けるシーンについて、以下のように考えてみた。

@import
ある程度の規模の定型部分ビューの一部を変数で与えながら再利用する場合。
@component
個別ビューでHTMLの一部を設定しながら一定の構造を持たせる場合。
@each
コレクションの内容に応じたリスト項目の表示など、部分HTMLに対して定型で内容が変化する場合。

 

Linux – シェル

確認

現在のシェル

echo $SHELL

使用可能なシェル

cat /etc/shells

bashへのリンク

多くのLinuxでは、/bin/shはそのままのsh(Bourne Shell)ではなく、bashへのシンボリックリンクになっている。

スクリプトの書き方と実行

1行目にShebang

スクリプトの1行目で実行するシェルを指定する。この1行目の表現はShebangと呼ばれる。

#!/bin/bash

実行権限を与える

普通にスクリプトを作成した場合、実行権限がない。

chmodで実行権限を与える。全ユーザーで実行可能にするなら755を指定。

chmod 755 スクリプト名

パスを指定して実行する

スクリプトの場所にパスが通っていない場合は、カレントディレクトリーからのパスで指定して実行。

./スクリプト名

フルパスでもよい。

スクリプトがパスが通っている場所にあるなら、スクリプト名だけで実行可能。

 

Laravel – ルーティングの基礎

ルーティングファイル

  • Laravelのルーティングはルーティングファイルに書く
  • ルーティングファイルの場所はapp/routes/web.php

ルーティングの書き方

ビューの雛形

生成直後のルーティングファイルでは下記のルーティングのみが書かれており、準備されたビューファイルが返されるようになっている。

無名関数の中でview()メソッドが呼ばれているが、このメソッドの引数文字列に.blade.phpを付けたファイル名のビューファイルが、resources/viewsディレクトリー下で検索されて表示される。

直接出力

ブラウザーに文字列だけを表示する簡単な例として、GETで/topにルーティングして’ようこそ’と表示するには以下の様に書く。

Route::get('top', function() { return 'ようこそ'; });

get()メソッドの第1引数にURI、第2引数にそのURLにGETしたときに返されるコンテンツを指定している。

  • 第1引数のURIは、ドメイン以降のディレクトリー・ファイルで、冒頭の’/‘は付けても付けなくてもよい
  • 第2引数の無名関数は、コントローラーに渡されるコールバック

無名関数の戻り値に直接HTMLを書けば、その内容がブラウザーでパースされて表示される。つまり以下のような書き方もできる(現実的ではないが)。

リクエスト元の指定

第1引数はドメインより後のパスを指定する。たとえばリクエストが

http://www.myapp.com/user/profile

の場合は以下のようになる。

Request::get('/usr/profile', ...);

または

Request::get('usr/profile', ...);

コントローラー・アクション指定

コントローラーとアクションを指定する以下の書き方が一般的。

Route::get('パス', 'コントローラー名@アクション名');

 

Laravel – データベース – 準備

概要

Laravelのプロジェクト開始時の、データベースの準備・設定についてまとめる。

データベースの準備

CREATE DATABASEなどによってプロジェクトで使うデータベースを作成する。以下は新たなデータベースlaravel_test_developmentを作成した例。

.envファイルの修正

データベース接続確認

php artisan migrateでマイグレーションが実行されればデータベースは正常に接続されている。

マイグレーションの結果生成されたファイル。

MySQL側でもテーブルが生成されている。

データベースに接続できないとき

MySQLとPHPのバージョンによっては、認証方法の違いで接続できない場合がある。その対応方法はこちら

 

Laravel – データベースに接続できない

エラー発生

Laravel導入直後にデータベースを接続しようとしたところ、エラーが発生した。

MySQLのバージョンは8.0.23、PHPのバージョンは7.3.28で、MySQLのデフォルトの認証はcacing_sha2_passwordだが、PHPは7.3でもこれに対応しておらずmysql_native_passwordらしい。

MySQLの認証方法変更

認証方法の確認。

rootの認証方法をmysql_native_passwordに変更しようとするが、エラー。

パスワードがポリシーに適合していない。これは新たにMySQLをインストールした時にある状況。パスワード検証内容を確認してみる。

設定するパスワードに合わせてポリシーなどを変更。

改めてrootユーザーの認証方法を変更・確認。

これでPHP7.3以下で接続可能になる。

 

MySQL – パスワード検証

概要

MySQLでユーザーのパスワードを設定する際に、その長さや使われるべき文字数などについて求める内容を設定できる。設定内容は以下のとおり。

  • ポリシー:長さ、文字種類、辞書のいずれを使うか
  • 最小長さ
  • 大文字・小文字の最小数
  • 数字の最小数
  • 記号の最小数
  • 辞書ファイルへのパス

パスワード検証の確認

現在のパスワード検証の内容は以下で確認できる。

SHOW VARIABLES LIKE 'validate_password%';

それぞれの指定内容は以下のとおり。

check_user_name
ユーザー名と一致する場合に拒否するかどうか。
dictionary_file
パスワードチェックに用いる辞書へのパス。デフォルトでは空で辞書チェックは行われない。
length
パスワードの最小文字数。
mixed_case_count
パスワードポリシーがMEDIUM以上の場合に求める大文字・小文字の最小数。
number_count
パスワードポリシーがMEDIUM以上の場合に求める数字の最小数
policy
LOW(0):長さのみ
MEDIUM(1):長さ、数値・大文字・小文字・特殊文字
STRONG(2):長さ、数値・大文字・小文字・特殊文字、辞書ファイル
special_char_count
ポリシーがMEDIUM以上の場合に求める記号の最小数。

パスワード検証内容の変更

それぞれの検証内容は、対応する変数の値をセットすることで変更する。

パスワードポリシー

SET GLOBAL validate_password.policy=LOW/MEDIUM/STRONG;

最小長さ

SET GLOBAL validate_password.length=最小長さ;

など。

 

Laravel – コマンド

基本コマンド

バージョン確認

プロジェクトディレクトリー以下で実行。

php artisan --version

php artisan -V

プロジェクト作成

プロジェクトを作成するディレクトリー下で実行。

composer create-project laravel/laravel project_name <--prefer-dist v.*>

ビルトインサーバー

起動

プロジェクトディレクトリー以下で実行。

php artisan serve --host=HOST/IP --port=PORT

終了

CTRL-C

 

Laravel – ディレクトリー・ファイル構成

概要

Laravelのプロジェクトを作成した際、最初に配置されるディレクトリーとファイル。

ディレクトリー

add controllerやmodelのファイルなどが配置される。
bootstrap アプリケーション起動時にアプリケーションインスタンスを生成するコードが配置されている。
config 各種設定ファイルが配置される。
database データベースのマイグレーションファイル、シードファイルなどが配置される。
public アプリケーションのドキュメントルート。index.phpや.htaccessファイルが配置されている。
resources views、js、sassなどビューに関するディレクトリーが配置されている。
routes ルーティング関係ファイルが配置される。
storage アプリケーション、フレームワークにより保管されるデータ、ログなどが保管される。
tests 自動テストに関するコードが配置される。
vendor Laravel本体やパッケージ群が配置される。

ファイル

.editorconfig
.env 環境設定ファイル。
.env.example
.gitattributes Gitの設定ファイル。
.gitignore Git設定ファイルのうちバージョン管理から外すファイルを定義。
.styleci.yml
README.md
artisan Laravelコマンド実行のためのPHPスクリプト
composer.json Composerの設定ファイルで、パッケージの依存関係が定義される。
composer.lock パッケージのバージョンが自動的に書き込まれる。
package.json npmの設定ファイル
phpunit.xml PHPUnitの設定ファイル。
server.php ビルトインサーバーの設定(Apacheのmod_rewrite対応)
webpack.mix.js Webpack設定ファイル

Linux – sed – 雛形

ls -alの結果の活用

出力行の絞り込み

ディレクトリーの結果だけ取り出すには

ls -al | sed -n '/^d/p'

ファイルの結果だけ取り出すには

ls -al | sed -n '/^-/p'

ディレクトリー名・ファイル名を取り出す

ディレクトリー名とファイル名だけ取り出すには

ls -al | sed 1,3d | sed 's/^.*[0-9][0-9]:[0-9][0-9] //'

ファイル名だけ取り出すには

ls -al | sed -n '/^-/p' | sed 's/^.*[0-9][0-9]:[0-9][0-9] //'

ディレクトリー名だけ取り出すには

ls -al | sed 1,3d | sed -n '/^d/p' | sed 's/^.*[0-9][0-9]:[0-9][0-9] //'

 

Linux – sed

使い方

sed [オプション] スクリプト [ファイル]

  • オプションは必要に応じて指定する
  • ファイルは入力ファイルがある場合に指定する

出力結果の加工

たとえばlsの結果を加工したいような場合、パイプでsedに渡す。

コマンド | sed ...

その結果をファイルに書きだしたい場合はリダイレクト。

コマンド | sed ... > ファイルパス

ファイルの加工

ファイルを入力としてsedで加工したい場合、置換などの表現の後にファイルを指定するか、ファイル出力をパイプでsedに渡す。

sed ... ファイル

cat ファイル | sed ...

ファイル書き換えは-iオプション

同じファイルを置換結果などで書き込む場合、リダイレクトを使うとファイルの内容が空になってしまう。

sed ... ファイル > ファイル

同じファイルの内容を書き換えるには-iオプションを指定する。

sed -i sed ... ファイル

異なるファイルに書き込む場合にはリダイレクトを使ってよい。

sed ... ファイル > 別のファイル

スクリプトの区切り文字は任意

たとえば置換スクリプトs/.../.../gなどの区切り文字は、必ずしも/である必要はない。

s1...1...1gなどスクリプトの内容に表れない任意の文字を使える。

'"で囲む意味

次のような場合はスクリプトをシングルクォート(')かダブルクォート(")で囲む。

  • 置換表現などにスペースを含む場合
  • $などシェルに解釈される文字を含む場合

シングルクォートで囲むと、シェルによる解釈は行われず単なる文字列として扱われ、sedのスクリプトとして解釈される。以下の表現では、sedが$を最終行のアドレスとして扱い、ファイルの最後の1行のみが表示される。

sed -n '$p' ファイル

ダブルクォートで囲むと、シェルの変数($...)などの意味を持つものは処理される(変数が展開されるなど)。たとえば以下の表現はシェル変数$pと解釈され、それが定義されていなければ何も表示されない。

sed -n "$p" ファイル

シェルに解釈される文字を無効化するのには、シングルクォートで囲むほか、その文字をバックスラッシュでエスケープする方法もある。

sed -n \$p ファイル

スクリプト

例として以下のようなlsコマンドの結果をパイプでsedに渡す。

行抽出

以下の指定は、アドレスかパターンで指定された行を表示する。

sed [アドレスorパターン]p

ただしpコマンドは処理された行以外の行も表示されるため、-nオプションで処理された行のみ表示させる。

行番号指定

行抽出は-nオプションを付け、-n 行番号pとする。

sed -n 行番号p

2行目だけを取り出す例。

開始番号と終了番号を指定することもできる。

sed -n 開始番号,終了番号p

4~6行目を取り出す例。

最終行のみを指定する場合は$pとする。この場合はシェルが認識しないよう、$をエスケープするかスクリプト部分をシングルクォートで囲む。

sed -n '$p' または sed -n \$p

最終行を取り出す例。

ただし「最後からn行」といった指定はsedではできないため、tailコマンドを使う。

tail -n 行数

以下の例はlsコマンドの最後3行を表示させている。

-n 行数を指定せずtailだけにすると、デフォルトの10行となる。

パターン指定

/パターン/pでマッチしたパターンの行が対象となる。これに-nオプションを付けて、パターンにマッチした行のみ抽出する。

sed -n /パターン/p

以下はrwxという文字列を含む行のみ抽出している。

置換行のみ抽出

後述の文字置換・文字列置換された行のみを抽出する。

sed -n [y/s]/.../.../gp

以下の例では、rwxRWXに置換した行のみが表示される。

行削除

以下はアドレスやパターンにマッチする行を削除する。

sed [アドレスorパターン]d

行番号指定

sed 行番号dで指定した行を、sed 開始番号,終了番号dで指定した範囲の行を削除する。

以下の例ではls -alの結果から1~3行目を取り除いている。

パターン指定

/パターン/dでマッチするパターンを含む行を削除する。

sed /パターン/d

以下の例では、通常ファイルの出力結果を除いている。

文字置換

1文字置換

sed y/a/A/で、各行の文字aを全てAに置換する。

以下の例では、lsの結果中rの文字をRに置換している。

複数文字置換

sed y/abc/ABC/で、各行のaAに、bBに、cCに置換する。置換前の文字数と置換後の文字数は同じでなければならない。

以下の例では、lsの結果中rwxの文字をそれぞれRWXに置換している。

文字列置換

各行1つだけ置換

sed s/string/STRING/で、各行の最初に現れたstringSTRINGに置換する。

以下の例では各行最初のrootROOTに置換している。

全て置換

sed s/string/STRING/gと末尾にgを付けることで、各行の全てのstringSTRINGに置換する。

パターン削除

文字列置換の後半を//で空にすると、パターンにマッチした部分が削除される。

sed s/パターン//[g]

以下の例では、ls -alの結果から時刻の部分だけを取り除いている。

sedの正規表現の注意点

\wは使えるが\dは使えない

\wは通るが

\dは通らない

{, }\{, \}でエスケープ

エスケープしないと通らないが

エスケープすると通る