Laravelの基本作成

プロジェクトの中にコントロールを追加する

プロジェクトにコントロール追加

プロジェクトとは

初期化の流れの中で composer create-project laravel/laravel:^13.0 laravel13-app で作ったlaravel13-appがプロジェクトになります。 プロジェクトの中に複数のコントロールを入れることができます。初期化の時にはprojectsというフォルダーを作り、その中にlaravel13-appプロジェクトを 作りましたので、また別のプロジェクトを作るときはprojectsフォルダー配下に別のプロジェクトを追加することになります。 このlaravelではMVC(Model View Control)で作り上げていきます。現在行おうとしていのがMVCのCのControl部分です。

FirstTestというコントローラを追加する

Docker Desktopを起動してから、ubuntuまたはwslを起動します

次にlaravel13-appのプロジェクトに移動して、sailを起動してから、そのプロジェクトにfirstTestという名前のコントロールを追加しましょう。 code .とするとその場所をフォルダーとしてvscodeが起動されるので、appフォルダー配下のHttpフォルダーの配下のControllersフォルダーに FirstTestフォルダーができて、その中にIndexController.phpが生成されているのを確認しましょう。

ubuntuでの作業
cd ~/projects/laravel13-app
./vendor/bin/sail up -d
./vendor/bin/sail artisan make:controller FirstTest/IndexController
code .

コマンドの最期のcode . はVisual Studio Codeをカレントのフォルダーで開くことを表しています。ubuntu側のソースファイルはこれで開いてください。Windowsのデスクトップからアイコンで開くのではubuntuのファイルを開くことは難しいです。

どこに生成されたのか
/projects
  /Laravel13-app
    /app
      /Http
        /Controllers
          /FirstTest
            IndexController.php

さきほどのmake:controllerコマンドで、作成したのはプロジェクトの中の1つのページのひな型です。ではその中身をみてみましょう。

IndexController.phpの内容
<?php

namespace App\Http\Controllers\FirstTest;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class IndexController extends Controller
{
    //
}

内容は、Controllerクラスを継承したIndexControllerオブジェクトを宣言していますが、中身はまだないというものです。 このオブジェクトの関数の戻り値をViewに渡して表示させるのですが、まずはViewを使わず、そのまま表示してみましょう。。

IndexController.phpの変更
class IndexController extends Controller
{
    public function showTest() {
        return 'Laravel13-test';
    }
}

続いて、routeの設定をします。

/routes/web.phpの変更
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Route::get('/firstTest', [\App\Http\Controllers\FirstTest\IndexController::class,
    'showTest']);

このように必要なコントールを追加していきます。ルートが要らなくなったら'/'のfunctionは捨てて構いません。

firstTest起動

ブラウザで「localhost/firstTest」を呼び出します

同じコントロールに引数を追加

おなじfirstTestに引数を追加してみましょう。

/routes/web.phpの変更
Route::get('/firstTest', [\App\Http\Controllers\FirstTest\IndexController::class,
    'showTest']);

Route::get('/firstTest/{p1}', [\App\Http\Controllers\FirstTest\IndexController::class,
    'showPara']);

引数をルーティングで追加して、新しい関数で受け取ってみましょう

IndexController.phpの変更
class IndexController extends Controller
{
    public function showTest() {
        return 'Laravel13-test';
    }
    public function showPara($p1) {
        return "Laravel13-parameter({$p1})";
    }
}

ルーティングを追加して実験します

引数追加

HTMLテンプレートを使用する

ではHTMLテンプレートを作ってviewの力を借りて表示してみましょう

そのために、コントロールを一つ追加します。

TempTest/IndexControllerの作成
./vendor/bin/sail artisan make:controller TempTest/IndexController --invokable

前回と同じようにコントロールを追加しますが、今回はシングルアクションコントールとして作成します。 1つのコントローラーに1つのエンドポイントしか作成できない方式で、firstTestでは引数ありとなしの2つできましたが、 今回はそれを許さない方式です。

routes\web.phpに追加
Route::get('/tempTest',\App\Http\Controllers\TempTest\IndexController::class);

これで /tempTestのurlのコントロールがIndexControllerに渡りますので、そこでindex.blade.phpというファイルに繋ぐように変更しましょう。

\Http\Controllers\TempTest\IndexController.php
class IndexController extends Controller
{
    /**
     * Handle the incoming request.
     */
    public function __invoke(Request $request)
    {
        return view('tempTest.index',['name'=>'Laravel Temprate']);
    }
}

'tempTest.index'でbladeファイルを指示しているので、そこに変数を渡します。

ところでviewsの下にはTempTestフォルダーが無いので作りましょう。またindex.blade.phpファイルを開きます。

\Resources\views\TempTest\index.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>テンプレートテスト</title>
</head>
<body>
    <h1>テンプレートテスト</h1>
    <p>{{ $name }}</p>
</body>
</html>

localhost/tempTest でテンプレートにデータを渡したサンプルが動きます

テンプレート使用