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 – コマンド

基本コマンド

バージョン確認

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

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

 

Linux – Laravelインストール

Composerのインストール

Composerのサイトを参考にしてComposerをインストールする。

Laravelのインストール

Composerを使ってインストールする。

以下の例はグローバルインストールの例だが、最初は以下のようなメッセージが大量に表示された。

zipとunzipが必要

zipとunzipのパッケージをインストールしていなかったので、改めてインストール。

一応はうまくインストールしてくれていた模様。

 

Laravel – プロジェクトの開始

プロジェクトの生成

composer create-project laravel/laravel laravel_test --prefer-dist 6.*

--prefer-distオプションはライブラリーの安定バージョンを指定。

コマンドを実行したディレクトリー下にプロジェクトディレクトリーが作成され、必要なディレクトリーとファイルが配置される。

タイムゾーンとロケール

config/app.phpの以下を変更する。

  • timezoneUTCからAsia/Tokyo
  • localeenからja

データベースの設定

.envファイル設定

.envファイルを修正し、DBMSやDB名などのパラメーターを設定する。

データベース作成

まずmysqlにログイン。

CREATE DATABASE.envで設定したデータベースを作成。

データベースが作成されているか確認。

mysqlから出て、アプリケーションディレクトリー下でマイグレーションを実行。”Migration table created successfully.”を確認。

mysqlでマイグレーションの結果生成されたテーブルを確認できる。

開発用サーバーの起動

普通の場合

以下のように指定して、ブラウザーでlocalhost:8000でアクセス。

Vagrantの場合

Vagrant仮想環境の場合はホストとポート番号を確認して指定する必要がある。

 

Linux – Composerのインストール

概要

Vagrant上のCentOS7仮想環境にComposerをグローバルインストールした記録。

PHPを使ってダウンロード、インストールするのでLinuxの種類には依存しない。

手順の確認

実行スクリプト

ComposerのサイトDownloadの内容を確認。シンプルに進めるなら以下のスクリプトをターミナルで実行するよう書かれている。

それぞれphpのスクリプトを-rオプションで直接実行している。

  • 1行目はインストールファイルのダウンロード
  • 2行目はファイルの確認
  • 3行目でセットアップ実行
  • セットアップファイルの削除

オプション

composer-setup.phpを実行するときのオプションに以下が説明されている。

–install-dir
実行ファイルをインストールするディレクトリーを指定する。
php composer-setup.php --install-dir=bin
–filename
インストールする実行ファイル名を指定する。デフォルトはcomposer.phar
php composer-setup.php --filename=composer

その他に--version--helpも説明あり。

グローバルインストール

指定したファイルにローカルインストールする方法もあるが、ここでは/usr/local/binにグローバルインストールする。

セットアップ実行の際に、/usr/local/binに書き込むためroot権限で実行し、セットアップするディレクトリーとファイル名(composer)を指定している。

プロンプトにcomposerと入力してインストールされたことを確認。

 

Vagrant – PHPインストール – CentOS7

概要

CentOS7へのPHPのインストールはyumを使うが、公式のリポジトリ―ではバージョン5まででPHP7系がインストールできない。

PHP7をインストールするのに、sudo yum install php73 php73-php ...とすると、起動コマンドがphp73になる。これをphpで起動できるようにするのにRemi Repositoryを使わせてもらう。Remi Repositoryをインストールするに当たってはEPEL (Extra Packages for Enterprise Linux)が必要になる。

Remi RepositoryのサイトにあるConfiguration Wizardで条件を指定して、必要な情報を得ておく。設定条件は、

  • Operating system: CentOS7 (maintained until June 2024)
  • Wanted PHP version: 7.3.28 (security only support until December 2021)
  • Type of installation: Default / Single version (simplest way)

Wizard answerとして以下を含む情報が得られる。

  • Command to install the EPEL repository configuration package:
    yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
  • Command to install the Remi repository configuration package:
    yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
  • PHP version 7.3 packages are available for CentOS 7 in remi-php73 repository
  • Command to upgrade (the repository only provides PHP):
    yum update
  • Command to install additional packages:
    yum install php-xxx

yumのアップデート

念のため。

EPELのインストール

yumアップデートでEPELがインストール済みとわかる。インストール済みのリストをとってみると

EPELをインストールする手順の覚え書き。

Remiリポジトリーのインストール

PHP73リポジトリーの有効化

/etc/yum.repos.d/remi-php73.repoを編集。

PHP本体のインストール

インストールの確認。

この時点でインストールされているパッケージの確認。

必要なパッケージのインストール

php-devel php拡張を構築するのに必要なファイル
php-opcache バイトコード化アクセラレーター
php-intl 国際化関数
php-mbstring マルチバイト文字関連
php-mysqlnd MySQLネイティブドライバー
php-pdo PDO
php-xml XML利用
php-xmlrpc XMLデータ交換
php-gd 画像処理関連

基本的な機能

国際化・マルチバイト

データベース関係

XML関係

画像関係

 

PHP – 対話モード

対話モード

開始

-aオプションをつけてphpコマンドを実行する。

php -a

終了

exit

実行例

日本語が入力できない

phpの対話モードで日本語を入力しようとしたところ、変換候補は表示されるが確定すると消えてしまう。

MySQLでもそのような症状があったが、OSのロケール設定とMySQLの文字コード設定で解決した。

OSのロケールは共通でUTF-8、日本語を含むコードをファイルから実行した場合は問題なく表示される。

原因はわかっていない。

phpコマンドのみの場合

オプション-aをつけずにphpコマンドを入力した場合もスクリプト実行ができるが

  • プロンプトが表示されない
  • Enterを入力しても実行されない
  • exitを入力しても終わらない
  • Ctrl-Cで抜け出せるが抜けるだけ

PHPマニュアルに”–with-readline オプションつきで PHP をコンパイルした場合に CLI SAPI で対話シェルが使えるようになりました。”とあるが、このオプションなしでコンパイルされている?

対応策

以下の2点。

  • PHPの実行タグ<?phpで始める
  • 入力終了後にCtrl-Dを入力する(Ctrl-Dで入力を終了させる)

 

 

 

PHP – array_map

概要

array_map()関数は、引数で指定した配列の各要素にコールバック関数を適用した配列を返す。

コールバックの指定方法として、文字列で関数名を渡す方法と、Ver5.3.0以降ではラムダ関数を引き渡す方法がある。

コールバックを文字列で渡す方法

以下の処理では、array_map()の第1引数に文字列でコールバックの関数名を渡している。

コールバックをラムダ関数で渡す方法

以下の処理では、ラムダ式で無名関数を変数にバインドし、array_map()の第1引数にその変数を渡している。結果は上と同じ。

無名関数を直接渡す方法

以下の処理では、無名関数を変数にバインドせず、array_map()の第1引数に直接書いている。

 

PHP – ランダム文字列の生成


str_shuffleによる方法~文字重複なし

概要

この方法の場合、

  • ランダム文字列中の文字は全て異なる
  • ランダム文字列の最大長は36文字

数字とアルファベットで36文字を使う場合、文字列長に対するパターン数は以下の通り(36!/(36-n)!)。

  • 5文字→45,239,040通り(約45百万通り、107のオーダー)
  • 10文字→922,393,263,052,800通り(約900兆通り、1014のオーダー)
  • 16文字→152,901,072,685,905,223,680,000(約1500垓通り、1023のオーダー)

丁寧に書いた場合

コード

処理の流れ

  1. ランダム文字列に使う文字ソースの文字列を準備しておく。
    • const RANDOM_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz'
  2. str_shuffle()関数により、文字ソースの文字をシャッフルした文字列を得る($shuffled_chars)。
  3. substr()関数により、シャッフルされた文字列の先頭から必要な文字数分を切り出す($random_string)

1行で書いた場合

確率

16文字のケースで考えると、1つのパターンが発生する確率はおおよそ1÷1.5×1023 = 6.54×10-23

仮に1秒間に100万個のパターンが生成されるとすると、同じパターンの再帰年数は1/6.54×10-23÷106÷60÷60÷24÷365.25≒4.8×109年、約50億年になる。

str_shuffleによる方法~文字重複あり

概要

この方法の場合、

  • ランダム文字列中に同じ文字が出現し得る
  • ランダム文字列の長さは任意

数字とアルファベットで36文字を使う場合、文字列長に対するパターン数は以下の通り。

  • 5文字→60,466,176通り(約6千万通り、107のオーダー)
  • 10文字→3,656,158,440,062,976通り(約3600兆通り、1015のオーダー)
  • 16文字→7,958,661,109,946,400,884,391,936(約8𥝱通り、1024のオーダー)

丁寧に書いた場合

コード

処理の流れ

  1. ランダム文字列に使う文字ソースの文字列を準備しておく。
    • const RANDOM_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz'
  2. 文字ソースの文字列をランダム文字列の文字数分だけ繰り返した文字列を得る($chars)。
  3. その文字列をシャッフルする($random_chars)。
  4. シャッフルされた文字列の先頭から、ランダム文字列の文字数分だけ切出す($random_string)。

1行で書いた場合

確率

16文字のケースで考えると、1つのパターンが発生する確率はおおよそ1÷8×1024 = 1.25×10-25

仮に1秒間に100万個のパターンが生成されるとすると、同じパターンの再帰年数は1/1.25×10-25÷106÷60÷60÷24÷365.25≒2.5×1011年、約2500億年になる。

array_mapによる方法~文字重複あり

概要

この方法による結果は、str_shuffleによる方法と等価。

丁寧に書いた場合

コード

処理の流れ

  1. ランダム文字列に使う文字ソースの文字列を準備しておく。
    • const RANDOM_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz'
  2. ランダム文字列のための配列を準備する($source_array)。文字列長分の長さの配列を確保すればよいので、ここではarray_fill()を使っている。
    • [0, 0, 0, ..., 0]
  3. 文字ソース文字列からランダムに1つの文字を返すコールバック関数を定義する($random_char)。
  4. ランダム文字を要素とする配列を得る($random_chars)。最初に準備した$source_arrayの各要素にコールバックをマッピングしている。
    • ['a', '9', 'i', ..., 's']
  5. ランダム文字配列をimplode()関数で文字列に変換する($random_string)。
    • 'a9i...s'

1行で書いた場合

先のコードを1行で書くとこうなる。

1行が長くなりすぎるので複数行にすると以下のようになる。

確率

この方法による確率は、str_shuffleによる方法と同じ。

 

PHP – foreachでの参照渡しとunset

概要

  • foreachは値渡しなので、要素の変更が反映されない
  • 要素を参照渡しにすると変更ができる
  • ただしループ終了直後にunsetが必要

雛形としては以下のようになる。

PHP-Manual: foreach

警告

foreach ループを終えた後でも、 $value は配列の最後の要素を参照したままとなります。 unset() でその参照を解除しておくようにしましょう。 さもないと、次のような目に遭うことになるでしょう。

・・・・・

foreachでは要素の変更ができない

以下のように、foreachで配列の要素などを変更しようとしても、値渡しのため変更が反映されない。

参照渡しで変更ができる

以下のように要素を参照で渡すと(要素の変数の前にに'&'を付けると)変更ができるようになる。

注意点

以下のように、その後に再びforeachで内容を参照すると、最後の要素が繰り返し呼ばれてしまう。

unsetによる参照のクリア

参照でforeachを実行した後にunset()でその参照変数をクリアすることで、その後のループは正常に回る。

補足

参照でforeachを回した後、unset()せずに通常のforeachを実行すると、その後にunset()しても最後の要素が指された状態が残ってしまうようだ。