سنقوم بانشاء مستخدم جديد وعندما نقول ننشيء شيء بالـ API فنحن نقصد تعليمة CREATE وعندما نقول CREATE فحتما سنستعمل الـ POST كما وضحنا بالدرس الماضي
فكيف سنفعل دلك ؟
سوف نقوم بارسال بيانات على شكل JSON بالـ POST الى هدا المسار
http://localhost/webapi/api.php/users
عندما يعرف الـ
API
ان ان البيانات التي أرسلتها عن طريق POST
سيفهم انك ترغب باضافة هده البيانات الى الجدول users
لنفتح ملف
Form
لندخل من خلاله البيانات اللازمة وأفضل فورم هنا سيكون فورم Register
حيث يسمكننا من انشاء مستخدم جديد
ادن سنقوم بانشاء مركب جديد component خاص بتسجيل مستخدم جديد ثم بعدها سنقوم بتركيب مصفوفة البيانات اللازمة التي سيرسلها الـ component الى ملف الخدمة والدي بدوره سيقوم بارسال بيانات المستخدم الى السرفر (API) عن طريق الـ
method POST
1. انشاء المركب المسؤول عن تسجيل حساب register وليكن داخل مجلد اسمه users
ng g c users/register
2. نتفقد الـ app.module ونتأكد انه قد قام بتضمينه كما درسنا بمواضيع الدورة الأولى. حتى ننتجنب أي خطأ
3. نقوم بانشاء route أو بمعنى أوضح مسار لهدا المركب لكي يصبح قابل للوصول اليه .درس الـ routing موجود هنا لمن يرغب بالاطلاع عليه
ننشيء ملف المسؤول عن المسارات
src/app/app.routing.module.ts
نقوم باضافة مركب الـ register داخل مدير المسارات أيضا نقوم بتضمين RgisterComponent كما هو مؤشر بعلامة (+)import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { RegisterComponent } from './users/register/register.component'; //+
const routes: Routes = [
{path: 'register',component: RegisterComponent,} , //+
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
نضيف مدير المسارات
app.routing.module.ts
داخل ملف app.moduleimport { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { UserService } from './services/user.service';
import { HttpClientModule } from '@angular/common/http';
import { RegisterComponent } from './users/register/register.component';
import { AppRoutingModule } from './app.routing.module'; //+
@NgModule({
declarations: [
AppComponent,
RegisterComponent
],
imports: [
AppRoutingModule, // +
BrowserModule,
HttpClientModule,
],
providers: [
UserService,
],
bootstrap: [AppComponent]
})
export class AppModule { }
4. ندهب الى قائمة menu بملف template ونضيف المسار الخاص بالـ register ومسار login والصفحة الرئيسية عن طريق التعليمة routerLink ..طبعا نحن نقصد ملف app.component.html
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<a class="navbar-brand" routerLink="/">CRUD</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" routerLink="/">Home </a>
</li>
</ul>
<a routerLink="/login" class="btn btn-outline-success my-2 my-sm-0" >Login</a>
<a routerLink="/register" class="btn btn-outline-success my-2 my-sm-0" >Register</a>
</div>
</nav>
طبعا الان عندما تحاول الضغط على زر register لن يحدث شيء لأنك لم تضع الدركتيف المسؤول على الانتقال بين components
قم باضافته بملف app.component.html في اي مكان ترغب أن يقوم بتضمين المحتوى داخله
<router-outlet></router-outlet>
لنضعه مثلا فوق جدول المستخدمين الدي قمنا بانشاءه
<div class="container">
<router-outlet></router-outlet>
<br>
<table *ngIf='users' class="table table-dark">
<thead>
<tr>
<th scope="col">ID</th>
<th scope="col">Username</th>
<th scope="col">Email</th>
<th scope="col">password</th>
</tr>
</thead>
<tbody>
<tr *ngFor='let user of users'>
<th scope="row">{{ user.id }}</th>
<td>{{ user.username }}</td>
<td>{{ user.email }}</td>
<td>{{ user.password }}</td>
</tr>
</tbody>
</table>
</div>
الأن سيعمل الزر بنجاح وسيعرض محتوى المكون register الدي سنضع داخله فورم تسجيل (انشاء) المستخدم كما في الصورة
دعك من الجدول حاليا سنتولى أمره لاحقا وسوف ننقله الى المكان المناسب في الوقت المناسب فمايهمنا الان هو تعلم كيفية الانشاء CREATE وأبجدية التواصل مع API
5. سننشيء الأن فورم تسجيل المستخدم .
افتح ملف register.component.ts واضف بيانات الفورم
import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms'; // + اضف
@Component({
selector: 'app-register',
templateUrl: './register.component.html',
styleUrls: ['./register.component.css']
})
export class RegisterComponent implements OnInit {
public title = 'Create User';
public _registerForm:FormGroup;
public _submitted:boolean = false;
constructor(
public _formBuilder:FormBuilder,
) {
this.createForm();
}
public createForm(){
this._registerForm = this._formBuilder.group({
username: ['', Validators.required],
email: ['', Validators.compose([Validators.required, Validators.minLength(6)])],
password: ['', Validators.compose([Validators.required, Validators.minLength(6)])],
});
}
ngOnInit() {
}
onSubmit(elementValues: any) {
this._submitted = true;
console.log('works !');
}
}
أضف فورم التسجيل داخل ملف template
<h1>Register user Form </h1>
<form [formGroup]="_registerForm" (ngSubmit)="onSubmit(_registerForm.value)">
<div class="form-group">
<label>Username</label>
<input class="form-control" [formControl]="_registerForm.controls['username']">
</div>
<div class="form-group">
<label>Email</label>
<input class="form-control" [formControl]="_registerForm.controls['email']">
</div>
<div class="form-group">
<label>Password</label>
<input class="form-control" type="password" placeholder="password" [formControl]="_registerForm.controls['password']" >
</div>
<button type="submit" [disabled]="!_registerForm.valid ">انشاء مستخدم</button>
</form>
قم بتضمين الـ module الخاص بادارة الفورم داخل app.module
import { ReactiveFormsModule } from '@angular/forms';
imports: [
//
ReactiveFormsModule,
//
],
كل شيء جيد والفورم يعمل كما في الصور
لم يتبقى الان سوى تجهيز الدوال التي سترسل هده البيانات الى السرفر (API) والدي سيضيفها الى قاعدة البيانات
6. ندهب الى ملف register ونعدل على دالة onSubmited
onSubmit(elementValues: any) {
this._submitted = true;
this.userService.register(elementValues)
.subscribe(
result => {
console.log('user added !');
console.log(result);
},
error => {
this._submitted = false;
// Validation error
console.log(error);
}
);
}
ليكون الملف بهدا الشكل والاضافات التي اضفناها ستجدها بعلامة (+)
import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms';
import { UserService } from '../../services/user.service'; // + أضف
@Component({
selector: 'app-register',
templateUrl: './register.component.html',
styleUrls: ['./register.component.css']
})
export class RegisterComponent implements OnInit {
public title = 'Create User';
public _registerForm:FormGroup;
public _submitted:boolean = false;
constructor(
public _formBuilder:FormBuilder,
public userService:UserService, // + أضف
) {
this.createForm();
}
ngOnInit() {
}
onSubmit(elementValues: any) { // + أضف
this._submitted = true;
this.userService.register(elementValues)
.subscribe(
result => {
console.log('user added !');
console.log(result);
},
error => {
this._submitted = false;
// Validation error
console.log(error);
}
);
}
public createForm(){
this._registerForm = this._formBuilder.group({
username: ['', Validators.required],
email: ['', Validators.compose([Validators.required, Validators.minLength(6)])],
password: ['', Validators.compose([Validators.required, Validators.minLength(6)])],
});
}
}
تنقصنا دالة register والتي يتوجب علينا انشائها بملف الخدمة users.service وستكون بهدا الشكل
public register(data:any) {
let user = { // بناء مصفوفة المستخدم
"username": data.username,
"password": data.password,
"email": data.email,
};
let url = 'http://localhost/webapi/api.php/users'; // تكوين المسار
return this.httpClient
.post(url , user ) // عملية post
.pipe(
map((response) => {
return response; // تحويل النتيجة الى المكون
})
);
}
ليكون الملف بشكل نهائي هكدى
import { Injectable } from '@angular/core';
import { HttpClient} from '@angular/common/http'; //+
import { map } from 'rxjs/operators'; //+
@Injectable({
providedIn: 'root'
})
export class UserService {
constructor(public httpClient: HttpClient,) { }
public register(data:any) {
let user = { // بناء مصفوفة المستخدم
"username": data.username,
"password": data.password,
"email": data.email,
};
let url = 'http://localhost/webapi/api.php/users'; // تكوين المسار
return this.httpClient
.post(url , user ) // عملية post
.pipe(
map((response) => {
return response; // تحويل النتيجة الى المكون
})
);
}
getUsers(url:string){
return this.httpClient.get(url)
.pipe(
map(res => res)
);
}
}
النتيجة تم انشاء المستخدم عن طريق ميثود POST
ادا كنت تستعمل api اخر مركب على laravel او على symfony أو Yii أو ماشابه عليك ان تتأكد من قيوده لانه لكل api قيود وتعليمات مبرمجة عليه بشكل افتراضي عليك التقيد بها .. ابحث عن الخطأ ادا صادفك بgoogle أو ضعه بخانة التعليقات لنساعدك بحل المشكلة ان امكن دلك
ادا صادفك خطأ بالـ
rxjs
ERROR in node_modules/rxjs/internal/Observable.d.ts(14,10): error TS2393: Duplicate function implementation.
فماعليك سوى تنصيب نسخة مصححة منه
npm install rxjs
الدروس السابقة :
- المستوى الثاني من Angular
- انشاء واختيار api مع قاعدة البيانات mysql - Angular
- انشاء وتمهيد مشروع الدورة angular
- دمج bootstrap & jquery داخل مشروع angular
- انشاء الصفحة الرئيسية للتطبيق angular
- ماهو الفرق بين API و REST API وماهي وظفتهما - angular
- عرض قائمة users وجلبها عبر API من قاعدة البيانات
تعليقات
إرسال تعليق