no image

Laravel MVCモデルとWebサイト構築

1. はじめに

はしへいです。Laravelでサンプルサイト以外のWebページを表示させてみました。
今回はMVCモデルを意識しつつ、ユーザからリクエストがあった際に、以下を実行し結果を返すページを作成しました。

  1. USERのブラウザエージェント情報及びアクセス元IPアドレスを表示する。
  2. データベースに存在するMariaDBアカウント情報(host,user)を表示する。

2. MVCモデルとは

MVCはModel,View,Controllerの略で各々役割が異なります。各役割は以下の図の様になっております。 役割を分けてコーディングする事で、目的毎に機能を分離でき、プログラムの保守性、再利用性が上がります。 Modelではデータと処理ロジックを、Viewでは見た目を、Controllerでは主にアクセス受付とModel、Viewへの橋渡しを行います。LaravelではMVCモデルを参考にしてサイト構築できる様になっています。

3. LaravelでWebページを構築する

3-1. LaravelでWebページを構築する際の流れ

設定ファイルの作成順序に特に縛りはありませんが、 データや処理の流れを意識するためにも、今回は処理の順序に合わせて作成しました。

3-2. プロジェクトの作成

先ずは新規Laravelプロジェクトを作成します。

$ cd [project-parent-directory]
$ laravel new [project-name]
$ sudo chown -R www:www [laravel-project-root]

3-3. ルーティングの設定

Webサイトは複数のページから構成されています。ルーティングはURLへのアクセスを基に、ユーザからのリクエストを適切なControllerに引き渡す役割を担います。先に掲載したMVCモデルの図では、UserからControllerへのアクセス(ユーザがブラウザからURLアクセス)が該当します。
ドメイン/IPアドレスのルートに対する全てのリクエストは最初に”public/index.php”に引き渡されます。

項目
設定ファイル [laravel-project-root]/routes/web.php
設定構文 Route::get(‘[アクセスさせたいパス]’, ‘[コントローラ名@アクション]’);
説明 https://domainname/myfirstpage にアクセスすると、
“myfirstController” Controllerの “index” メソッドを実行します。

3-4. Controllerの設定

コントローラは(ルーティングされた)ユーザの操作を受付、ユーザの操作を基にModelへデータの操作指示を行います。Modelの操作が完了したら、ViewへModelの操作結果の確認を指示します。コントローラはコマンドでプロジェクト毎に生成する必要があります。

$ cd [laravel-project-root]
$ sudo php artisan make:controller myfirstController
$ sudo chown apache:apache ./app/Http/Controllers/myfirstController.php
$ ls -l ./app/Http/Controllers/myfirstController.php
-rw-r--r--. 1 apache apache 124 May 17 15:31 ./app/Http/Controllers/myfirstController.php

ファイル内でindexアクションの実行を指定します。
ユーザーエージェント情報の取得はPHPの機能で実装します。

$ vi ./app/Http/Controllers/myfirstController.php

* 2行目に記載しているAppのLinux上での実際のPATHはappであるが、Appとする必要があります。

use App\models\mysqlModel;

3-5. Modelの設定

通常であればアプリケーション用にデータベース及びテーブルを作成し操作しますが、 今回はMySQL/MariaDBに最初から備わっているmysqlデータベースを利用して、 ユーザー一覧を抽出してみます。具体的には次の操作をコンソールから実施した際に得られる結果を、 Webページ上に出力します。

//コンソールからMariaDBコンソールへログイン
$ mysql -u [username] -p

//データベースを選択
MariaDB > use [database name];

//ユーザー名一覧を確認
MariaDB > select host,user from user;

MariaDBへの接続設定をenvファイルへ記載します。

$ cat [laravel-project-root]/.env | grep DB_*
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mysql
DB_USERNAME= [your mysql user]
DB_PASSWORD= [your user password]

* root以外のユーザからmysql データベースを操作する際は、grant optionを付与してください。

MariaDB > grant all privileges on *.* to [email protected] with grant option;

laravelではModelの作成場所は指定されていませんが、マニュアルページで推奨されているapp配下に作成します。

$ cd [laravel-project-root]
$ sudo php artisan make:model models/myfirstModel
$ sudo chown apache:apache ./app/models/myfirstModel.php
$ sudo vi ./app/models/myfirstModel.php

3-6. Viewの設定

Viewは操作されたModelの結果を視覚化しユーザに返します。具体的には、HTML/CSS/JSやPHPによるWebページが該当します。このViewのファイルには”.blade.”が含まれますが、これはBlade表記を利用する上で必要となります。

$ cd [laravel-project-root]
$ cd resources/views/
$ sudo touch myfirstpage.blade.php
$ sudo chown apache:apache myfirstpage.blade.php
$ sudo vi myfirstpage.blade.php

3-7. Webサイトへのアクセス

以下の様にURLへアクセスすると作成したページを閲覧可能です。

DocumentRootを[laravel-project-root]/public にしている場合。

https://[ServerDomain or IPaddress]/myfirstpage

DocumentRootを上記以外にしている場合。

https://[ServerDomain or IPaddress]/[laravel-project-path]/public/myfirstpage 

4. エラーへの対応

4-1. サイトアクセス時に404エラーが表示される(Apacheの場合)

WebサーバにApacheを利用していてエラー404になる場合は、allow overrideの設定が問題かも知れません。この場合、httpd.confの該当箇所を以下の様にすれば閲覧可能となります。

変更前

AllowOverride None

変更後

AllowOverride All

4-2. PHP PDOエラー

WebページURLへアクセスすると、PHPのExceptionページが表示される。
“could not find driver (SQL: select `host,user` from `user` limit 1)”と表示される。
この場合、phpinfo(); 等でサーバの設定を確認すると、PDO driversにmysqlが存在しない可能性がある。

データベースとしてMariaDBやMySQLを利用している場合は、php-mysqlndをインストールする事で解決する事ができる。PostgreSQL等を利用している場合は対応するPDOをインストールすれば良い。

$ sudo yum install --enablerepo=remi,remi-php73 php-mysql
$ sudo systemctl restart httpd

問題なく構成されると、以下の様にPDO driversのenabled対象にmysqlが追加されます。