このリポジトリには、Laravel の学習と実装のための実用的なアプリケーションとして機能する実験的な E コマース ダッシュボードが含まれています。これをLaravel Breezeでスキャフォールディングし、ローカル開発にはLaravel Valetを使用します。
route()
関数を介して Laravel の名前付きサーバー側ルートを公開し、Vue コンポーネントで簡単にルートを生成できるようにします。このプロジェクトは、これらのテクノロジを使用したフル機能の Web アプリケーションの開発に興味がある人にとって、包括的な例として役立ちます。
リポジトリのクローンを (Valet サイト ディレクトリに) 作成します。
git clone [email protected]:gregrickaby/vue-commerce-lab.git
依存関係をインストールします。
composer install && npm install
.env
ファイルを作成します。
cp .env.example .env
database.sqlite
ファイルを作成します。
touch database/database.sqlite
アプリケーションキーを生成します。
php artisan key:generate
移行を実行します。
php artisan migrate:fresh
データベースをシードします。
php artisan db:seed
PHP バージョンを 8.3 に設定します。
valet isolate [email protected]
サイトを保護します。
valet secure
開発サーバーを開始します。
npm run dev
サイト https://vue-commerce-lab.test にアクセスし、次の認証情報を使用してログインします。
password
モデルはapp/Models
ディレクトリにあります。各モデルには、 database/factories
およびdatabase/seeders
ディレクトリに対応するファクトリとシーダーがあります。
モデルはアプリケーションのデータを管理する責任があります。コントローラーから入力を受信し、それを検証してデータベースに送信します。
このアプリケーションは Vue と Inertia を使用するため、ビューはresources/js/pages
ディレクトリにあり、web.php ファイル経由でルーティングされます。
ビューはユーザーにデータを表示する責任があります。コントローラーからデータを受信し、それをブラウザーにレンダリングします。
コントローラーはapp/Http/Controllers
ディレクトリにあります。各コントローラーには、 tests/Feature
ディレクトリに対応するテストがあります。
コントローラーはリクエストを処理し、レスポンスを返す責任があります。ユーザーから入力を受け取り、それを検証して、モデルに渡します。
ルートはroutes
ディレクトリにあります。 web.php
ファイルには、アプリケーションのすべてのルートが含まれています。
Vue.js ファイルは、 resources/js
ディレクトリにあります。
ディレクトリ構造は標準の Laravel 規則に従っており、TypeScript インターフェイスと型用のtypes
ディレクトリと、ユーティリティとヘルパー関数用のutils
ディレクトリが追加されています。
├── resources
│ ├── css
│ │ └── app.css <-- TailwindCSS
│ ├── js
│ │ ├── Components
│ │ │ ├── Atoms
│ │ │ │ ├── ApplicationLogo
│ │ │ │ │ ├── ApplicationLogo.stories.ts <-- Storybook
│ │ │ │ │ ├── ApplicationLogo.test.ts <-- Test
│ │ │ │ │ ├── ApplicationLogo.test.ts.snap <-- Snapshot
│ │ │ │ │ └── ApplicationLogo.vue <-- Vue Component
│ │ │ ├── Molecules
│ │ │ ├── Organisms
│ │ ├── Layouts
│ │ ├── Pages
│ │ │ ├── Customers
│ │ │ │ ├── Create.vue
│ │ │ │ ├── Index.vue
│ │ │ │ └── {customer} <-- Dynamic route
│ │ │ │ ├── Edit.vue
│ │ │ │ └── Show.vue
│ │ ├── app.ts <-- Vue app
│ │ ├── types
│ │ │ └── index.d.ts <-- Typescript interfaces and types
│ │ └── utils
│ │ └── index.ts <-- Utility and helper functions
│ └── views
│ ├── app.blade.php
│ └── welcome.blade.php
{}
で囲まれたフォルダーは動的ルートです。たとえば、 /Pages/Customers/{customers}/Edit.vue
customers}/Edit.vue は、任意の顧客 ID に一致する動的ルートです。 ID はEdit.vue
コンポーネントで使用できるようになります。
このアプリケーションには、テスト用に PHPUnit と Vitest の両方が装備されています。また、継続的な統合とテストには Github Actions を、UI コンポーネントを個別に開発するには Storybook を利用します。
このアプリケーションには、すべてのモデルとコントローラーの PHPUnit テストが装備されています。 PHP テストは/tests
ディレクトリにあります。
├── tests
│ ├── Feature
│ │ ├── Auth
│ │ │ ├── AuthenticationTest.php
│ │ └── ExampleTest.php
│ └── Unit
│ └── ExampleTest.php
Laravel ルートは、Vue コンポーネントの存在に依存する Inertia 応答を返します。構築されたフロントエンド資産がなければ、これらのコンポーネントは利用できず、これらのルートにリクエストを行うテストで失敗が発生します。これを回避するには、テストの実行中に開発サーバーをバックグラウンドで実行する必要があります。
開発サーバーを起動します。
npm run dev
以下を使用して PHPUnit テストを実行します。
php artisan test
以下を使用して特定のテストを実行します。
php artisan test --filter=CustomerTest
このアプリケーションには、Vue コンポーネントをテストするための Vitest (公式テスト ランナー) と Vue Test Utils (公式テスト ライブラリ) の両方が装備されています。テストはコンポーネントの隣に配置し、 ComponentName.test.ts
名前を付ける必要があります。
├── resources
│ ├── js
│ │ ├── Components
│ │ │ ├── Atoms
│ │ │ │ ├── ApplicationLogo
│ │ │ │ │ ├── ApplicationLogo.stories.ts <-- Storybook
│ │ │ │ │ ├── ApplicationLogo.test.ts <-- Test
│ │ │ │ │ ├── ApplicationLogo.test.ts.snap <-- Snapshot
│ │ │ │ │ └── ApplicationLogo.vue <-- Vue Component
以下を使用してテストを実行できます。
npm run test
Vitest は監視モードでテストを実行するため、コンポーネントに変更を加えて結果をリアルタイムで確認できます。
コンポーネント テストは TypeScript で記述され、アサーションに Vitest API を使用します。以下に例を示します。
import ApplicationLogo from '@/Components/Atoms/ApplicationLogo/ApplicationLogo.vue'
import { mount } from '@vue/test-utils'
import { describe , expect , test } from 'vitest'
/**
* Define a test suite.
*
* @see https://vitest.dev/api/#describe
*/
describe ( 'ApplicationLogo' , ( ) => {
/**
* Mount the component.
*
* @see https://vue-test-utils.vuejs.org/api/#mount
*/
const wrapper = mount ( ApplicationLogo )
/**
* Assert the component renders.
*
* @see https://vitest.dev/api/expect.html
*/
test ( 'component renders' , ( ) => {
expect ( wrapper ) . toBeTruthy ( )
} )
/**
* Assert the component is a SVG.
*/
test ( 'component is SVG' , ( ) => {
wrapper . find ( 'svg' )
} )
/**
* Assert the component matches the snapshot.
*
* @see https://vitest.dev/api/expect.html#tomatchsnapshot
*/
test ( 'component matches snapshot' , ( ) => {
expect ( wrapper . html ( ) ) . toMatchSnapshot ( )
} )
} )
Github Actions は、 main
ブランチへのすべての PR に対してテストも実行します。
このアプリケーションには ESLint が装備されており、TypeScript を解析するように構成されています。 JavaScript および Vue ファイルの自動リンティングはon_save
行われます。
lint を手動で実行することもできます。
npm run lint
このアプリケーションには、Stylelint と TailwindCSS 用の Prettier プラグインが装備されています。自動リンティングとフォーマットはon_save
で行われます。
JavaScript ファイルと PHP ファイルの両方の自動フォーマットは、 on_save
に対して構成されます。詳細については、VSCode の設定と拡張機能の構成を参照してください。
以下を使用して Prettier と Pint を手動で実行します。
npm run format && composer run lint
ストーリーブックを見る: https://gregrickaby.github.io/vue-commerce-lab/
このアプリケーションには、UI コンポーネントを単独で開発するための Storybook が装備されています。ストーリーは CSF に記述し、 resources/js/Components
ディレクトリ内のコンポーネントの隣に配置する必要があります。ストーリーにはComponentName.stories.ts
という名前を付ける必要があります。
├── resources
│ ├── js
│ │ ├── Components
│ │ │ ├── Atoms
│ │ │ │ ├── ApplicationLogo
│ │ │ │ │ ├── ApplicationLogo.stories.ts <-- Storybook
│ │ │ │ │ ├── ApplicationLogo.test.ts <-- Test
│ │ │ │ │ ├── ApplicationLogo.test.ts.snap <-- Snapshot
│ │ │ │ │ └── ApplicationLogo.vue <-- Vue Component
Storybook を次のように実行します。
npm run storybook
以下を使用してストーリーブックを構築します。
npm run build:storybook
MIT ライセンス (MIT)。ライセンスを参照してください