認証にemberfireとtoriiを使用して、emberアプリ(ember 2.3.0を使用)を作成しています。ユーザーがログインすると、そのユーザーの uid が toriisession
オブジェクトで利用可能になります。モデルもありuser
、テンプレート、ルートなどで現在のユーザーに関連する他のデータにアクセスしたいと考えています。
次のようなことを行うことで、これを単一のルートで機能させることができます。
let uid = this.get('session').get('uid');
this.store.findRecord('user', uid).then(user => {
console.log(user.get('firstName'));
});
ただし、アクセスする必要があるルート/コントローラーごとにこれを記述する必要がないようにしたいと考えています。
誰かがこれを行うための最良の方法についてアドバイスできますか? サービスを使用する最良の方法は何ですか? その場合、セッション オブジェクトが使用可能になった後にサービス内のコードが実行されるようにするにはどうすればよいですか?
アップデート
次のソリューションでアプリケーションを動作させることができました。
firebase を使用してユーザーをログインするメソッドを作成する
ログイン動作を処理するための mixin を作成しました。これは、ログイン ページとサインアップ ページの両方で使用されます。
// Mixin to handle logging in
import Ember from 'ember';
export default Ember.Mixin.create({
user: Ember.inject.service(),
email: null,
errorMsg: null,
logInUser(email, password) {
// logout existing user if any and then login new user
this.get('session').close()
.then(() => {
// if already a user logged in
this.firebaseLogin(email, password);
})
.catch(() => {
// if no user logged in
this.firebaseLogin(email, password);
});
},
firebaseLogin(email, password) {
this.get("session").open("firebase", {
provider: 'password',
email: email,
password: password
})
.then((data) => {
// If successful, fetch the user and transition to home page
console.log("Successfully logged in as ", data);
this.get('user').loadCurrentUser().then(() => {
this.transitionToRoute('index');
});
})
.catch(error => {
this.set('errorMsg', error);
});
},
});
user
サービスを作成する
user
これは、モデルを認証ユーザーに関連付けるために使用されます。
app/services/user.js
import Ember from 'ember';
export default Ember.Service.extend({
store: Ember.inject.service(),
session: Ember.inject.service(),
currentUser: null,
loadCurrentUser() {
return new Ember.RSVP.Promise((resolve, reject) => {
const uid = this.get('session').get('uid');
if (!Ember.isEmpty(uid)) {
return this.get('store').find('user', uid).then((user) => {
this.set('currentUser', user);
resolve();
}, reject);
} else {
this.set('currentUser', null);
resolve();
}
});
}
});
user
アプリケーションルートにサービスを注入
アプリケーション ルートは、アプリケーションが読み込まれるたびに呼び出されます (たとえば、ユーザーがページを更新したとき)。したがって、@Deovandski が彼の回答で述べたように、ユーザー アカウントをグローバルに使用できるようにするには、アプリケーション ルートに挿入する必要があります。
app/routes/application.js
import Ember from 'ember';
export default Ember.Route.extend({
user: Ember.inject.service(),
beforeModel() {
return this.get("session").fetch()
.then(() => {
// Session retrieved successfully
console.log('session retrieved');
return this.get('user').loadCurrentUser();
})
.catch(() => {
// Session could not be retrieved
this.transitionTo('login');
});
}
});
user
必要な場所にサービスを注入する
その後、次の方法で現在のユーザーにアクセスできます。
user: Ember.inject.service()
...
let currentUser = this.get('user').get('currentUser');