LaravelによるVue単一ページアプリケーションの作成(3)
記事は専門のLaravel開発者コミュニティから転送され、元のリンク:https://learnku.com/laravel/t...
以前に、Laravelによって作成されたVue単一ページアプリケーション(2)において、
このチュートリアルでは、シミュレーションの
コンポーネントのフロントナビゲーションによって
本格的なユーザー・エンド・ポイントの作成
Laravel 5.5を使用した
コントローラとAPIリソースを作成する前に、まずデータベースを設定し、SPAにテストデータを提供するためにデータの埋め込みを行います.
ユーザーデータの入力
次に、
データベースを先に作成して構成しないと、データの埋め込みは使用できません.
データベースの構成
私たちのVue SPA Laravelアプリケーションに実際のデータベースに接続する時です.TablePlusのようなGUIツールを使用してSQLiteまたはMySQLを使用できます.Laravelの初心者であれば、データベースの入門に多くのドキュメントを参照できます.
デバイス上で実行されているMySQLインスタンスがある場合は、次のコマンドラインを使用して、新しいデータベースをすばやく作成できます(ローカル環境でパスワードが設定されていない場合).
データベースがある場合は、
データベース接続を構成したら、データ・テーブルを移行し、埋め込みデータを追加できます.LaravelにはUsersテーブルの移行が付属しており、データを埋め込むために使用しています.
もしあなたが望むならば、あなたも単独の
Usersコントローラ
第2章では、シミュレーションされた
製造環境で
第1のコマンドは、
次のコントローラと
コントロールが直接的です.ページ付き
次に、
奇妙なことに、
次は
今まで、
UsersIndexコンポーネントの変更
ナビゲーション前にデータを読み込む
EMCのコンポーネントは、新しいAPIで動作し、コンポーネントにナビゲートする前にユーザー情報を取得する方法を示す絶好のタイミングです.この方法を用いることで,データを取得した後に新しいルートにナビゲートできる.
ドキュメントを参照すると、完全な例がありますが、ユーザーデータを非同期で取得し、完了した後にのみ
ドキュメントをチェックして完全な例を取得しますが、非同期でユーザーデータを取得し、完了するとnextがトリガーされます(コンポーネントにデータを設定します(変数
このメソッドはPromiseを返さず、完了または失敗したときにコールバックをトリガーすることに注意してください.コールバックは、2つのパラメータを渡します.1つのエラーとAPI呼び出しからの応答です.
我々の
最後に指摘したいのは
次に、
これは、APIからデータが返された
その後、APIが応答に成功すると、
beforeRouteUpdate
コンポーネントがレンダリングされ、ルーティングが変更されると、
コンポーネントがレンダリングされているため、APIから次のユーザーのグループを取得する前に、いくつかのデータ属性をリセットする必要があります.コンポーネントにアクセスできます.したがって、
最後に、これは
UsersIndexのバンドル
このUsersIndexコンポーネントの各セクションを説明しました.すべてのコンポーネントをバンドルし、非常に基本的なページングを行う準備ができています.このチュートリアルでは、ページングの構築方法を説明していません.そのため、独自に奇抜なページングを見つける(または作成する)ことができます.
ページングはvue-routerプログラミングでSPAを参照する方法を示す良い方法です.
これは、ルータフックを使用して非同期データを取得できる新しいフックと方法を備えた完全なコンポーネントです.
もっとわかりやすいなら、ここではGitHub GistとしてのUsersIndex.vue.
ここには新しいことがたくさんあるので、もっと重要な観点を指摘します.この
トリガされたクエリー文字列
3つの計算属性(
次のボタンと前のボタンは、計算された属性を使用して無効にするかどうかを決定し、
コードにはいくつかの冗長性があるかもしれませんが、このコンポーネントは、
Laravel Mixを実行して最新バージョンのJavaScriptを構築することを忘れないでください.
最後に、
次のステップは何ですか?
データベースから実際のデータを取得できる有効なAPIと、LaravelのAPIモデルリソースを使用してバックエンドで簡単なページングリンクを行い、
次に、ユーザーの作成、編集、削除に力を入れます.
axiosクライアントコードをコンポーネントから抽象化することもできますが、これは簡単です.そのため、第4部までコンポーネントに保持します.他のAPI機能が追加されると、専用のHTTPクライアントのモジュールを作成したいと思います.
セクション4-既存のユーザーの編集を続行できます.
vue-router
がルーティングに入る前に、Laravel
を使用してVue SPA
を構築し続けるために、データを非同期でロードする方法を実証します.以前に、Laravelによって作成されたVue単一ページアプリケーション(2)において、
UsersIndex
コンポーネントがAPI
から非同期にユーザをロードすることが完了した.データベースから実際のバックエンドAPI
を構築することを簡略化し、Laravel
のfactory()
メソッドによってAPI
の戻りで偽データをシミュレートすることを選択した.Laravel
でVue
ページを構築したアプリケーションの第1および第2の部分をまだ読んだことがない場合は、まず見てからここに戻ることをお勧めします.ここで待っています.このチュートリアルでは、シミュレーションの
/users
をデータベースによってサポートされているものに置き換えます.私はMySQL
を使うことに慣れていますが、あなたが使いたいデータベースドライバを使うことができます.UsersIndex.vue
ルーティングコンポーネントは、created()
のライフサイクル中にAPI
を介してデータをロードする.次に、第2の部分の最後のfetchData()
の方法の例を示す.created() {
this.fetchData();
},
methods: {
fetchData() {
this.error = this.users = null;
this.loading = true;
axios
.get('/api/users')
.then(response => {
this.loading = false;
this.users = response.data;
}).catch(error => {
this.loading = false;
this.error = error.response.data.message || error.message;
});
}
}
コンポーネントのフロントナビゲーションによって
API
からデータが抽出される場合を示しますが、その前にAPI
に実際のデータを出力する必要があります.本格的なユーザー・エンド・ポイントの作成
Laravel 5.5を使用した
UsersController
の新しいAPIリソースを作成し、JSONデータを返します.コントローラとAPIリソースを作成する前に、まずデータベースを設定し、SPAにテストデータを提供するためにデータの埋め込みを行います.
ユーザーデータの入力
make:seeder
コマンドを使用して、ユーザー・フィルを作成します.php artisan make:seeder UsersTableSeeder
UsersTableSeeder
はとても簡単です.モデルファクトリを使用して50人のユーザーを作成します.create();
}
}
次に、
UsersTableSeeder
をdatabase/seeds/DatabaseSeeder.php
ファイルに追加します.call([
UsersTableSeeder::class,
]);
}
}
データベースを先に作成して構成しないと、データの埋め込みは使用できません.
データベースの構成
私たちのVue SPA Laravelアプリケーションに実際のデータベースに接続する時です.TablePlusのようなGUIツールを使用してSQLiteまたはMySQLを使用できます.Laravelの初心者であれば、データベースの入門に多くのドキュメントを参照できます.
デバイス上で実行されているMySQLインスタンスがある場合は、次のコマンドラインを使用して、新しいデータベースをすばやく作成できます(ローカル環境でパスワードが設定されていない場合).
mysql -u root -e"create database vue_spa;"
# -p
mysql -u root -e"create database vue_spa;" -p
データベースがある場合は、
.env
ファイルに構成DB_DATABASE=vue_spa
を追加します.問題が発生した場合は、ドキュメントに従ってください.これにより、データベースがより容易に動作します.データベース接続を構成したら、データ・テーブルを移行し、埋め込みデータを追加できます.LaravelにはUsersテーブルの移行が付属しており、データを埋め込むために使用しています.
# seeders
composer dump-autoload
php artisan migrate:fresh --seed
もしあなたが望むならば、あなたも単独の
artisan db:seed
命令を使うことができます!このように;50人のユーザーを含むデータベースがあるはずです.apiでクエリーして返すことができます.Usersコントローラ
第2章では、シミュレーションされた
/users
は、routes/api.php
の中で次のように長い.Route::get('/users', function () {
return factory('App\User', 10)->make();
});
製造環境で
php artisan route:cache
を使用して一定の利点を得ることができるように、コントローラクラスを新規に作成します.この方法では、閉パッケージはサポートされていません.コマンドラインにコントローラとUser API
リソースクラスを同時に作成します.php artisan make:controller Api/UsersController
php artisan make:resource UserResource
第1のコマンドは、
app/Http/Controllers/Api
ディレクトリにUser
コントローラを作成し、第2のコマンドはapp/Http/Resources
ディレクトリにUserResource
を作成します.次のコントローラと
Api
ネーミングスペースに対応する新しいroutes/api.php
コード:Route::namespace('Api')->group(function () {
Route::get('/users', 'UsersController@index');
});
コントロールが直接的です.ページ付き
Eloquent API
を返します.
次に、
JSON
応答の例を示します.前のUserResource
のAPI
フォーマットと同様です.{
"data":[
{
"name":"Francis Marquardt",
"email":"[email protected]"
},
{
"name":"Dr. Florine Beatty",
"email":"[email protected]"
},
...
],
"links":{
"first":"http:\/\/vue-router.test\/api\/users?page=1",
"last":"http:\/\/vue-router.test\/api\/users?page=5",
"prev":null,
"next":"http:\/\/vue-router.test\/api\/users?page=2"
},
"meta":{
"current_page":1,
"from":1,
"last_page":5,
"path":"http:\/\/vue-router.test\/api\/users",
"per_page":10,
"to":10,
"total":50
}
}
奇妙なことに、
Laravel
は自動的にページングデータを追加し、ユーザー情報をdata
の属性に割り当てます.次は
UserResource
クラスです. $this->name,
'email' => $this->email,
];
}
}
UserResource
は、セット内の各User
モデルを配列に変換し、UserResource::collection()
方法を提供して、ユーザのセットをJSON
フォーマットに変換する.今まで、
/api/users
インタフェースが1ページのアプリケーションで使用できるはずです.勉強を続けると、新しい戻りが現在のコンポーネントを満たしていないことに気づきます.UsersIndexコンポーネントの変更
then()
を調整することによって、ユーザデータが存在するdata
キーを呼び出すことができ、UsersIndex.vue
コンポーネントを迅速に再動作させることができる.最初は少し斬新に見えましたが、response.data
は応答オブジェクトなので、ユーザーデータをこのように設定することができます.this.users = response.data.data;
fetchData()
と新しいAPIを組み合わせて調整する方法は以下の通りである.fetchData() {
this.error = this.users = null;
this.loading = true;
axios
.get('/api/users')
.then(response => {
this.loading = false;
this.users = response.data.data;
}).catch(error => {
this.loading = false;
this.error = error.response.data.message || error.message;
});
}
ナビゲーション前にデータを読み込む
EMCのコンポーネントは、新しいAPIで動作し、コンポーネントにナビゲートする前にユーザー情報を取得する方法を示す絶好のタイミングです.この方法を用いることで,データを取得した後に新しいルートにナビゲートできる.
beforeRouteEnter
ガードを使用して、コンポーネントに入る前に実装することができます.例Vueルーティングドキュメントは次のとおりです.beforeRouteEnter (to, from, next) {
getPost(to.params.id, (err, post) => {
next(vm => vm.setData(err, post))
})
},
ドキュメントを参照すると、完全な例がありますが、ユーザーデータを非同期で取得し、完了した後にのみ
next()
をトリガーし、コンポーネントにデータを設定します(変数vm
).ドキュメントをチェックして完全な例を取得しますが、非同期でユーザーデータを取得し、完了するとnextがトリガーされます(コンポーネントにデータを設定します(変数
vm
).getUsers
関数は、APIから非同期にユーザを取得し、コンポーネントへのコールバックをトリガーするように見える場合があります.const getUsers = (page, callback) => {
const params = { page };
axios
.get('/api/users', { params })
.then(response => {
callback(null, response.data);
}).catch(error => {
callback(error, error.response.data);
});
};
このメソッドはPromiseを返さず、完了または失敗したときにコールバックをトリガーすることに注意してください.コールバックは、2つのパラメータを渡します.1つのエラーとAPI呼び出しからの応答です.
我々の
getUsers()
メソッドは、最終的にクエリ文字列パラメータとして要求に現れるpage
変数を受け入れる.空(ルーティングにページ番号が渡されていない)の場合、APIはデフォルトでpage=1
に設定されます.最後に指摘したいのは
const params
値です.実際にはこうです{
params: {
page: 1
}
}
次に、
beforeRouteEnter
は、getUsers
関数を使用して非同期データを取得し、next()
をコンポーネントに呼び出して設定する方法を示します.beforeRouteEnter (to, from, next) {
const params = {
page: to.query.page
};
getUsers(to.query.page, (err, data) => {
next(vm => vm.setData(err, data));
});
},
これは、APIからデータが返された
getUsers()
呼び出しのcallback
パラメータです.(err, data) => {
next(vm => vm.setData(err, data));
}
その後、APIが応答に成功すると、
getUsers()
においてこのように呼び出される.callback(null, response.data);
beforeRouteUpdate
コンポーネントがレンダリングされ、ルーティングが変更されると、
beforeRouteUpdate
が呼び出され、Vueは新しいルーティングでコンポーネントを多重化します.例えば、私たちのユーザーが/users?page=2
から/users?page=3
にジャンプしたとき.beforeRouteUpdate
呼び出しは、beforeRouteEnter
と同様である.ただし、前者はthis
をアセンブリで使用することができるため、スタイルが若干異なる場合があります.// ,
// 。
beforeRouteUpdate (to, from, next) {
this.users = this.links = this.meta = null
getUsers(to.query.page, (err, data) => {
this.setData(err, data);
next();
});
},
コンポーネントがレンダリングされているため、APIから次のユーザーのグループを取得する前に、いくつかのデータ属性をリセットする必要があります.コンポーネントにアクセスできます.したがって、
this.setData()
を呼び出し(まだ示していません)、コールバックを必要とせずにnext()
を呼び出すことができます.最後に、これは
UsersIndex
組立体におけるsetData
の方法である.setData(err, { data: users, links, meta }) {
if (err) {
this.error = err.toString();
} else {
this.users = users;
this.links = links;
this.meta = meta;
}
},
setData()
の方法は、オブジェクトプロファイルを使用することによって取得される.data
、links
、およびmeta
のキーは、APIの応答に由来する.data: users
を使用して、data
を新しい変数users
に明確に割り当てます.UsersIndexのバンドル
このUsersIndexコンポーネントの各セクションを説明しました.すべてのコンポーネントをバンドルし、非常に基本的なページングを行う準備ができています.このチュートリアルでは、ページングの構築方法を説明していません.そのため、独自に奇抜なページングを見つける(または作成する)ことができます.
ページングはvue-routerプログラミングでSPAを参照する方法を示す良い方法です.
これは、ルータフックを使用して非同期データを取得できる新しいフックと方法を備えた完全なコンポーネントです.
{{ error }}
-
Name: {{ name }},
Email: {{ email }}
{{ paginatonCount }}
import axios from 'axios';
const getUsers = (page, callback) => {
const params = { page };
axios
.get('/api/users', { params })
.then(response => {
callback(null, response.data);
}).catch(error => {
callback(error, error.response.data);
});
};
export default {
data() {
return {
users: null,
meta: null,
links: {
first: null,
last: null,
next: null,
prev: null,
},
error: null,
};
},
computed: {
nextPage() {
if (! this.meta || this.meta.current_page === this.meta.last_page) {
return;
}
return this.meta.current_page + 1;
},
prevPage() {
if (! this.meta || this.meta.current_page === 1) {
return;
}
return this.meta.current_page - 1;
},
paginatonCount() {
if (! this.meta) {
return;
}
const { current_page, last_page } = this.meta;
return `${current_page} of ${last_page}`;
},
},
beforeRouteEnter (to, from, next) {
getUsers(to.query.page, (err, data) => {
next(vm => vm.setData(err, data));
});
},
// when route changes and this component is already rendered,
// the logic will be slightly different.
beforeRouteUpdate (to, from, next) {
this.users = this.links = this.meta = null
getUsers(to.query.page, (err, data) => {
this.setData(err, data);
next();
});
},
methods: {
goToNext() {
this.$router.push({
query: {
page: this.nextPage,
},
});
},
goToPrev() {
this.$router.push({
name: 'users.index',
query: {
page: this.prevPage,
}
});
},
setData(err, { data: users, links, meta }) {
if (err) {
this.error = err.toString();
} else {
this.users = users;
this.links = links;
this.meta = meta;
}
},
}
}
もっとわかりやすいなら、ここではGitHub GistとしてのUsersIndex.vue.
ここには新しいことがたくさんあるので、もっと重要な観点を指摘します.この
goToNext()
およびgoToPrev()
の方法は、ナビゲーションvue-router
を使用してthis.$router.push
を使用する方法を示している.this.$router.push({
query: {
page: `${this.nextPage}`,
},
});
トリガされたクエリー文字列
beforeRouteUpdate
に新しいページをプッシュしています.また、
の前および次の動作の要素を示します.主に、プログラミングによるナビゲーションのプロセスvue-router
を実証するために使用されます.
を使用して、自動的にページングルート間をナビゲートする可能性があります.3つの計算属性(
nextPage
prevPage
およびpaginatonCount
)を導入して、次のページと前のページのページ番号を決定し、paginatonCount
は現在のページ番号のビジュアルカウントと合計ページ数を表示します.次のボタンと前のボタンは、計算された属性を使用して無効にするかどうかを決定し、
goTo
メソッドは、計算された属性を使用してpage
クエリー文字列パラメータを次のページまたは前のページにプッシュします.次のページまたは前のページが最初のページと最後のページの境界で空の場合、これらのボタンは無効になります.コードにはいくつかの冗長性があるかもしれませんが、このコンポーネントは、
vue-router
がルーティングに入る前にデータを取得する方法を示しています.Laravel Mixを実行して最新バージョンのJavaScriptを構築することを忘れないでください.
# NPM
npm run dev
# Watch to update automatically while developing
npm run watch
# Yarn
yarn dev
# Watch to update automatically while developing
yarn watch
最後に、
UsersIndex.vue
コンポーネントを完全に更新した後に表示されたSPAの結果です.次のステップは何ですか?
データベースから実際のデータを取得できる有効なAPIと、LaravelのAPIモデルリソースを使用してバックエンドで簡単なページングリンクを行い、
キーにデータをパッケージする簡単なページングコンポーネントがあります.次に、ユーザーの作成、編集、削除に力を入れます.
/ users
リソースは実際のアプリケーションにロックされますが、現在は、vue-router
と一緒にデータを非同期でナビゲートおよび抽出する方法を学習するためにCRUD機能を構築しているだけです.axiosクライアントコードをコンポーネントから抽象化することもできますが、これは簡単です.そのため、第4部までコンポーネントに保持します.他のAPI機能が追加されると、専用のHTTPクライアントのモジュールを作成したいと思います.
セクション4-既存のユーザーの編集を続行できます.