Laravel5.6 新規プロジェクトの動作確認

公開日:2018-06-16

1. 概要

前回作成した Laravel5.6 の新規プロジェクトを使って、試行錯誤をしながら動作確認を行います。

2. ざっくりのフォルダの確認

1. app/Http/Controllers

コントローラーが入っている。

2. public

公開用フォルダ。
.htaccess で、どんな URL でアクセスされても index.php で処理するようにしてある。

3. resources/views

ビューが入っている。
welcome.blade.php が最初のデフォルトの画面のビュー。

4. routes

web.php で、welcome のビューを表示するように定義してある。

3. routes の動作確認

1. view() の引数

routes/web.php抜粋
Route::get('/', function () {
    return view('welcome');
});
となっているため、return view('test'); に変更して、
http://localhost/laravel_test/public/ にアクセスしてみます。

「View [test] not found.」と言うエラーが発生しました。

vendor/laravel/framework/src/Illuminate/View/FileViewFinder.php の findInPaths() でエラーが発生しているため、
exists() のファイルチェックの後に var_dump($viewPath); を追加してみます。
ページにアクセスすると、HTMLのソースの先頭に下記が出力されました。
HTML
string(68) "C:\pleiades\xampp\htdocs\laravel_test\resources\views/test.blade.php"
string(62) "C:\pleiades\xampp\htdocs\laravel_test\resources\views/test.php"
string(62) "C:\pleiades\xampp\htdocs\laravel_test\resources\views/test.css"
resources/views 配下に上記のいずれかのファイルがあれば動きそうです。
resources/views/test.php を作成します。
test.php
<!doctype html>
<html lang="{{ app()->getLocale() }}">
  <head>
    <meta charset="utf-8">
    <title>Test</title>
  </head>
  <body>
    TEST
  </body>
</html>
ページにアクセスすると、画面に TEST と表示されました。
ファイル名を test.blade.php や test.css にリネームしても同様に動きます。
また、findInPaths() ではファイルが見つかるとすぐに return しているため、
上記の3つのファイルがあった場合は、test.blade.php が優先されます。

ちなみに、{{ app()->getLocale() }} は、「en」になりました。
config/app.php の 'locale' => 'en' を 'ja' に変えたところ、「ja」に変わりました。
次にビューに {{ app()->getUrl() }} を追加したところ、エラーが発生しました。
app.php の連想配列に対応したメソッドが用意されている訳ではないようです。
また、エラーメッセージは、
C:\pleiades\xampp\htdocs\laravel_test\storage\framework\views\96f092ee3d72201bc00bd2f96c7342ef167f2232.php
となっていました。
どうやら、ビューのテンプレートファイルは、1度 PHP ファイルに変換されるようです。
出力された php を直接編集したところ、テンプレートとは異なる内容が表示されました。
テンプレートを更新すると、再作成されるようです。
また、ここのファイルを削除しても、再作成されます。
なんとなく、テンプレートファイルを変更しても、画面が変更されないと言う事象がいつか起こりそうな気がします。
試しに古い作成日付のテンプレートファイルを上書きしたところを、出力された PHP ファイルは更新されませんでした。
作成日付を比較して、テンプレートが更新されたかどうかをチェックしているのかもしれません。
とりあえず、反映されなかった場合は、出力された php ファイルを削除すれば良さそうです。

2. URL の変更

web.phpを以下のようにします。
routes/web.php抜粋
Route::get('/', function () {
    return view('welcome');
});
Route::get('/abc/def/', function () {
    return view('test');
});
http://localhost/laravel_test/public/abc/def/ にアクセスすると、TEST と表示されます。

3. ビューのフォルダ階層の変更

web.php の return を、view('test') から view('abc.test') に変更すると、
resources/views/abc/test.blade.php が参照されます。
内部では「.」が「/」に置換されています。

4. ビューに値を渡す

以下のようにします。
routes/web.php抜粋
Route::get('/test/', function () {
    $a = 123;
    return view('test')->with(compact('a'));
});
resources/views/test.blade.php
<!doctype html>
<html lang="{{ app()->getLocale() }}">
  <head>
    <meta charset="utf-8">
    <title>Test</title>
  </head>
  <body>
    {{ $a }}
  </body>
</html>
http://localhost/laravel_test/public/test/ にアクセスすると、123 と表示されます。
CakePHP と同様に、compact() で変数を連想配列に変換して、with() でビューに変数を渡しています。
ビューでは、連想配列から変数に展開され、元の変数名のまま使うことができます。
また、storage/framework/views 配下の出力された PHP ファイルを見ると、
<?php echo e($a); ?>
となっています。
エラーが出た場合は、ここの PHP ファイルを確認したり、
直接編集して、値を確認しても良いかもしれません。

5. コントローラーを使用する

web.php を以下のようにします。
routes/web.php抜粋
Route::get('/test/',  'TestController@test');
app/Http/Controllers 配下に、以下のコントローラーのファイルを作成します。
TestController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
  public function test() {
    $a = "Hello";
    return view('test')->with(compact('a'));
  }
}
ビューは resources/views/test.blade.php を使用します。

http://localhost/laravel_test/public/test/ にアクセスすると、
画面に Hello と表示されます。
Route::get() の2番目の引数に、
「コントローラー名@メソッド名」と文字列で指定すると、
コントローラーの指定されたメソッドが実行されます。