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(伸びる可能性有) |
■経験者談
書くのはほとんど View
と Controller
■構成例
(きれいに作られた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 |
# 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);
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');
}
}