Laravel(PHP) - user000422/0 GitHub Wiki

概要

次に購入する参考書「PHPフレームワーク Laravel Webアプリケーション開発 バージョン8.x対応」

勉強メモ … 2024/04/09 … ビューコンポーザの章P107周辺を少し飛ばした、ミドルウェアの手前で保留しORMへ

学習コスト 実行速度
低い 遅い

Laravel バージョン https://laravelversions.com/ja
下記必要PHPバージョンはGithub等からも担保されてる正確なもの

Laravel PHP セキュリティサポート 備考
8 7.3以降 2023/01 サポート終了
9 8.0以降 2024/02
10 8.1以降 2025/02(伸びる可能性有)

■経験者談
書くのはほとんど ViewController

■構成例
(きれいに作られたCRM) https://github.com/monicahq/monica
(よくできてる)https://github.com/nirav-gajera/laravel-crud-using-repository
(開発時によく使うコマンド一覧)https://dev.to/ericchapman/my-beloved-laravel-cheat-sheet-3l73


導入

■RHEL8

# 一般的
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
chmod +x /usr/local/bin/composer
cd /var/www/html

# Laravelプロジェクト作成
# カレントディレクトリにプロジェクトのディレクトリが作成される(配下にLaravelディレクトリ一式)
composer create-project laravel/laravel sample-app

ディレクトリ解説(どのプロジェクトでも共通)

綺麗にまとめた。

ディレクトリ名 説明
app ★ アプリのプログラム Controller Model 開発したソースを格納
bootstrap アプリ実行時に最初に行われるプログラム 基本的に変更しない
config 設定関連
database DB関連
public 外部公開用 JavaScript css 画像
resources ★ コンパイル前の外部公開用 html(テンプレート) JavaScript × css 画像
routes ★ ルート関連 web.php
storage ファイル保存 logs エラーログ
tests PHPUnit
vendor Laravelの機能 基本手動では変更しない?
Path 説明
app/Http ★ アプリのプログラム Controllers Requests
resources/views ★ テンプレート
storage/logs/laravel.log ログ
config/logging.php ログ設定
config/app.php サービスプロバイダ登録
public/img 表示用画像格納
public/css css

artisanコマンド

# Laravelバージョン確認
php artisan -V

# アプリケーションのディレクトリでコマンドを実行すること

# make:provider コントローラーを作成
php artisan make:controller SampleController
php artisan make:controller Sample/SampleController  # ディレクトリ指定の場合

# make:provider サービスプロバイダを作成
php artisan make:provider SampleServiceProvider

ルーティング

特定のアドレスにアクセスした際にどの処理を実行するか割り当てる。
Webサービスでは基本的に routes/web.php にルートを定義します。(現役エンジニアより)
routes/web.php 以外は使用しない。
laravelのバージョンによりルーティングの記述が異なる
Route::get(アドレス, 呼び出すコントロールとアクション); 実用github参考 https://github.com/monicahq/monica/blob/main/routes/web.php

// routes/web.php

// ※右記はLaravel7構文 Route::get('/', 'SampleController@index');

// 基本型(Laravel 8)
use App\Http\Controllers\SampleController; // useも指定しなければならない

# get URL, [コントローラー::class, 'メソッド名']
Route::get('/', [SampleController::class, 'index']);

// ルートパラメータを渡す(アクションメソッドの引数をテンプレートへ渡す)
Route::get('sample/{sample_data?}', [SampleController::class, 'index']);

// redirect
Route::redirect('/old-url', '/new-url');

コントローラー

コマンドプロンプトでコントローラ(スクリプトファイル)を作成
作成場所 プロジェクト配置場所\プロジェクト名\app\http\Controllers

リクエストはクエリーから取得 URL例)http://localhost:8000/sample?id=hoge

// Controllerクラスを継承すること
// クラス名は「xxxController」のように命名すること
class SampleController extends Controller
{
  // アクションメソッド(ルーティングで呼び出されるアクション)基本型
  public function index()
  {
    return view('sample.index');
  };

  // 引数に「Request $request」、「Response $response」を指定するだけでインスタンスが利用できる
  public function index(Request $request, Response $response) { /* return */ };
}

viewメソッド … アクションメソッドからテンプレートを呼び出す

// 第一引数: [テンプレートフォルダパス].[テンプレートファイル名]
// テンプレートフォルダパスは「resources/views」がカレント
return view('sample.index');

// 第二引数: 連想配列
return view('sample.index', $data);

テンプレート(Blade テンプレートエンジン)

Laravelのビュー基本テンプレート > レンダリング > 表示(クライアント)

テンプレートファイルを作成resources/views/sample/sample_view.php
テンプレートは、コントロールフォルダを作成し、コントロールごとに分けるのが一般的

Bladeテンプレートファイル命名規約 … sample.blade.php ([名].blade.php)
Bladeのインデントはなぜ「半角スペース4つ」なのか。おそらくphpファイルだから…。

継承 … 共通で使用したいテンプレートを継承する機能
セクション … テンプレートページ内の区画(要素)
コンポーネント … さらに部品を独立させたもの ※Ver.7で記述方法が変わった。

<html> <!-- Bladeテンプレート resources/views/sample/sample_view.blade.php -->
<body>

  <!-- 変数をテンプレートに埋め込む(二重かっこで変数名を囲む)-->
  <p>{{$sample}}</p>

  <!-- actionでコントローラーを実行 -->
  <form method="POST" action="/sample_post">
    @csrf <!-- Laravelでは「CSRF対策」が必須のためformには「@csrf」の記述が必ず必要 -->
  </form>

<!-- if ディレクティブ 条件によって表示内容を制御 -->
@if ($sample_color === 'red')
  <p> Hello red </p>
@elseif ($sample_color === 'blue')
  <p> Hello blue </p>
@endif

<!-- for ディレクティブ 繰り返し -->
@foreach ($sample_array as $item)
  <!-- loop 繰り返しディレクティブ用変数 -->
  <!-- loop->index ループ回数を「0」からカウントする -->
@if (9 > $loop->index)
  <p> {{$item}} </p>
@endif
@endforeach

</body>
</html>

<!-- ベースレイアウトの例 views/layouts/app.blade.php -->
<!-- 名称「app.blade.php」は、公式とmonicaで使用されているため確定にしてもよさそう -->
<html>
<head>
  <!-- @yield 指定セクションを埋め込む -->
  <title>@yield('sample_section_name')</title>

  <!-- css publicディレクトリを参照する -->
  <link rel="stylesheet" href="{{ asset('css/app.css') }}">
</head>
<body>
</body>
</html>
// ベースレイアウトを継承するテンプレート これが個別になる

// @extends ベースレイアウトを継承する
@extends('layouts.sample')

// @section 第1引数:セクション名, 第2引数:設定値
@section('sample_section_name', 'sample_value')

// コンポーネント読み込み x-[コンポーネント名]
<x-sample_component />
<!-- コンポーネント views/components/sample_component.blade.php -->
  <p>hello</p>

サービスプロバイダー

サービスプロバイダはアプリケーションに登録しないと動作しない(config/app.php

// サービスプロバイダ
namespace App/Providers;

use Illuminate/Support/ServiceProvider;
use Illuminate/Support/Facades/View; // ビューコンポーザ用

class SampleServiceProvider extends ServiceProvider
{
    // boot アプリ起動時処理
    public function boot()
    {
        // ビューコンポーザ 第一引数:ビュー名、第二引数:関数(またはクラス)
        View::composer('sample_view', 'xxx/xxx');
    }
}

⚠️ **GitHub.com Fallback** ⚠️