Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

Developing Angular and ASP.NET Core Applications

Angular ve ASP.NET Core, modern web uygulamaları oluşturmak için popüler bir kombinasyondur. Angular, güçlü bir JavaScript framework'üdür ve zengin kullanıcı arayüzleri oluşturmak için kullanılır. ASP.NET Core ise, hızlı, hafif ve modüler bir web çatısıdır ve sunucu tarafı iş mantığını yönetmek için kullanılır.

Settings Up Web API

Creating data models


Angular ve ASP.NET Core uygulamaları geliştirirken, Web API’yi kurma süreci oldukça önemlidir. Bu süreç, veri modellerini oluşturma adımını içerir ve genellikle veritabanıyla iletişim kurulacağı için oldukça kritiktir.

1. ASP.NET Core Web API Projesi Oluşturma:

İlk adım olarak, ASP.NET Core projesi oluşturmanız gerekmektedir. Bunun için Visual Studio’da veya terminal üzerinden aşağıdaki komutu kullanabilirsiniz:

dotnet new webapi -n MyWebAPI
2. Veri Modellerini Oluşturma:

Veri modelleri, Web API’nin temelini oluşturur. Bu modeller, API üzerinden iletişim kurulan veri nesnelerini temsil eder. Örneğin, bir müşteri veri modeli şöyle olabilir:

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    // Diğer özellikler buraya eklenebilir
}

3. Veri Modellerini Bağlama:

Veri modellerini kullanabilmek için, genellikle bir veritabanı bağlantısı gerekir. ASP.NET Core’da Entity Framework Core bu iş için sıkça tercih edilen bir araçtır. Örneğin, bir veritabanı bağlantısı ve müşteri veri modeli arasındaki ilişkiyi şu şekilde tanımlayabilirsiniz:

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }

    public DbSet<Customer> Customers { get; set; }
}
4. Veri Modellerini Controller ile İlişkilendirme:

Veri modellerine erişimi sağlamak için, genellikle bir veya daha fazla controller oluşturulur. Bu controller’lar, HTTP isteklerini karşılayarak ilgili işlemleri gerçekleştirir. Örneğin, müşteri veri modeli için bir controller oluşturmak için:

[ApiController]
[Route("api/[controller]")]
public class CustomersController : ControllerBase
{
    private readonly ApplicationDbContext _context;

    public CustomersController(ApplicationDbContext context)
    {
        _context = context;
    }

    // GET: api/customers
    [HttpGet]
    public async Task<ActionResult<IEnumerable<Customer>>> GetCustomers()
    {
        return await _context.Customers.ToListAsync();
    }

    // GET: api/customers/5
    [HttpGet("{id}")]
    public async Task<ActionResult<Customer>> GetCustomer(int id)
    {
        var customer = await _context.Customers.FindAsync(id);

        if (customer == null)
        {
            return NotFound();
        }

        return customer;
    }

    // POST: api/customers
    [HttpPost]
    public async Task<ActionResult<Customer>> PostCustomer(Customer customer)
    {
        _context.Customers.Add(customer);
        await _context.SaveChangesAsync();

        return CreatedAtAction(nameof(GetCustomer), new { id = customer.Id }, customer);
    }

    // Diğer HTTP istekleri buraya eklenebilir (PUT, DELETE, vb.)
}
5. Dependency Injection Ayarları:

Controller içinde DbContext gibi servislere ihtiyaç duyulduğunda, ASP.NET Core’un Dependency Injection (DI) mekanizmasından faydalanılır. Bu nedenle, DbContext gibi servisleri ConfigureServices metodunda eklemelisiniz:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddControllers();
}
Sonuç:

Bu adımlar, ASP.NET Core üzerinde bir Web API projesinde veri modellerini oluşturmayı içerir. Bu modelleri kullanarak, API’nin istemcilere nasıl veri sağlayacağını tanımlayabilirsiniz. Bu adımları izleyerek, Web API’lerinizi başarıyla oluşturabilir ve kullanabilirsiniz.

Adding a service and data

Angular ve ASP.NET Core uygulamalarını bir araya getirirken, Web API’ye hizmet eklemek ve veri işleme önemli bir adımdır. Bu, genellikle Angular istemcisi tarafından kullanılacak olan verilerin sağlanmasını içerir.

1. Angular Uygulamasında Servis Oluşturma:

Angular uygulamanızda, Web API’ye erişim sağlamak için bir Angular servisi oluşturmanız gerekmektedir. Bunun için Angular CLI aracılığıyla terminalde aşağıdaki komutu kullanabilirsiniz:

ng generate service data

Bu komut, data.service.ts adında bir TypeScript dosyası oluşturacaktır.

2. Angular Servisi ile HTTP İstekleri Yapma:

Oluşturduğunuz servis içinde, Web API’ye HTTP istekleri yapacak olan fonksiyonları tanımlamanız gerekmektedir. Örneğin, müşterileri getirmek için bir HTTP GET isteği yapmak için:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Customer } from './customer.model';

@Injectable({
  providedIn: 'root'
})
export class DataService {

  private apiUrl = 'https://localhost:5001/api/customers'; // Web API URL

  constructor(private http: HttpClient) { }

  getCustomers(): Observable<Customer[]> {
    return this.http.get<Customer[]>(this.apiUrl);
  }

  // Diğer HTTP istekleri buraya eklenebilir (POST, PUT, DELETE, vb.)
}
3. Angular Uygulamasında Servisi Kullanma:

Servisi, Angular bileşenlerinde kullanmak için, servisi bileşenin constructor’ına enjekte etmeniz gerekmektedir. Örneğin, bir bileşende müşteri listesini kullanmak için:

import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
import { Customer } from './customer.model';

@Component({
  selector: 'app-customers',
  templateUrl: './customers.component.html',
  styleUrls: ['./customers.component.css']
})
export class CustomersComponent implements OnInit {

  customers: Customer[];

  constructor(private dataService: DataService) { }

  ngOnInit(): void {
    this.getCustomers();
  }

  getCustomers(): void {
    this.dataService.getCustomers()
      .subscribe(customers => this.customers = customers);
  }
}
Sonuç:

Bu adımlar, Angular uygulamasında bir servis oluşturarak ve bu servisi kullanarak Web API’ye HTTP istekleri yapmayı içerir. Bu sayede Angular istemcisi, ASP.NET Core Web API’si aracılığıyla veri alabilir ve işleyebilir. Bu adımları izleyerek, Angular ve ASP.NET Core’u bir araya getirerek veri akışını sağlayabilirsiniz.

Create API endpoint

Angular ve ASP.NET Core uygulamalarını bir araya getirirken, API endpoint’lerini oluşturmak önemli bir adımdır. Bu endpoint’ler, istemcilerin (Angular uygulaması gibi) API’ye erişim sağlamasını ve belirli işlemleri gerçekleştirmesini sağlar.

1. ASP.NET Core Web API’sinde Controller Oluşturma:

API endpoint’leri oluşturmak için ASP.NET Core Web API projesinde bir veya daha fazla controller sınıfı oluşturmanız gerekir. Örneğin, müşterilerle ilgili işlemleri gerçekleştirecek bir controller oluşturmak için:

using Microsoft.AspNetCore.Mvc;
using MyWebAPI.Models;
using System.Collections.Generic;

namespace MyWebAPI.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class CustomersController : ControllerBase
    {
        private readonly ICustomerRepository _customerRepository;

        public CustomersController(ICustomerRepository customerRepository)
        {
            _customerRepository = customerRepository;
        }

        [HttpGet]
        public IEnumerable<Customer> GetCustomers()
        {
            return _customerRepository.GetCustomers();
        }

        [HttpGet("{id}")]
        public IActionResult GetCustomer(int id)
        {
            var customer = _customerRepository.GetCustomerById(id);

            if (customer == null)
            {
                return NotFound();
            }

            return Ok(customer);
        }

        [HttpPost]
        public IActionResult AddCustomer(Customer customer)
        {
            _customerRepository.AddCustomer(customer);
            return CreatedAtAction(nameof(GetCustomer), new { id = customer.Id }, customer);
        }

        // Diğer HTTP istekleri buraya eklenebilir (PUT, DELETE, vb.)
    }
}
2. Servis Katmanını Oluşturma:

Veri işleme mantığını controller’dan ayırarak, iş mantığını servis katmanına yerleştirmek iyi bir uygulama mimarisi uygulamasıdır. Bu nedenle, bir servis sınıfı oluşturmalısınız. Örneğin:

using MyWebAPI.Models;
using System.Collections.Generic;

namespace MyWebAPI.Services
{
    public interface ICustomerRepository
    {
        IEnumerable<Customer> GetCustomers();
        Customer GetCustomerById(int id);
        void AddCustomer(Customer customer);
        // Diğer CRUD işlemleri buraya eklenebilir
    }

    public class CustomerRepository : ICustomerRepository
    {
        private readonly List<Customer> _customers = new List<Customer>();

        public IEnumerable<Customer> GetCustomers()
        {
            return _customers;
        }

        public Customer GetCustomerById(int id)
        {
            return _customers.Find(c => c.Id == id);
        }

        public void AddCustomer(Customer customer)
        {
            _customers.Add(customer);
        }

        // Diğer CRUD işlemleri buraya eklenebilir
    }
}
3. Dependency Injection Ayarları:

Servis sınıfını, controller’a enjekte etmek için Dependency Injection (DI) kullanmalısınız. Bu, ConfigureServices metodu içinde gerçekleştirilir. Örneğin:

using Microsoft.Extensions.DependencyInjection;
using MyWebAPI.Services;

namespace MyWebAPI
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<ICustomerRepository, CustomerRepository>();
            services.AddControllers();
        }
        
        // Diğer yapılandırma ayarları buraya eklenebilir
    }
}
Sonuç:

Bu adımlar, ASP.NET Core Web API’sinde bir API endpoint’i oluşturmayı içerir. Bu sayede istemciler (örneğin, Angular uygulaması) API’ye erişebilir ve belirli işlemleri gerçekleştirebilir. Bu adımları izleyerek, API’lerinizi oluşturabilir ve istemcilere hizmet verebilirsiniz.

Read API endpoint

Angular ve ASP.NET Core uygulamaları oluştururken, Web API’lerle iletişim kurma işlemi genellikle bir dizi HTTP isteği kullanılarak gerçekleştirilir.

1. Angular’da HTTP İsteği Gönderme:

Angular uygulamanızda, Web API’den veri almak için HTTP istekleri gönderebilirsiniz. Bunun için Angular’ın HttpClient modülünü kullanabilirsiniz. Örneğin, müşteri verilerini getirmek için bir Angular servisi oluşturabiliriz:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Customer } from './customer.model';

@Injectable({
  providedIn: 'root'
})
export class DataService {

  private apiUrl = 'https://localhost:5001/api/customers'; // Web API URL

  constructor(private http: HttpClient) { }

  getCustomers(): Observable<Customer[]> {
    return this.http.get<Customer[]>(this.apiUrl);
  }
}
2. ASP.NET Core Web API’de Controller Ayarları:

Web API tarafında, istemcinin (Angular uygulaması gibi) veri taleplerine yanıt vermek için bir controller ayarlanmalıdır. Örneğin, müşteri verilerini getiren bir controller oluşturabiliriz:

using Microsoft.AspNetCore.Mvc;
using MyWebAPI.Models;
using MyWebAPI.Services;
using System.Collections.Generic;

namespace MyWebAPI.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class CustomersController : ControllerBase
    {
        private readonly ICustomerRepository _customerRepository;

        public CustomersController(ICustomerRepository customerRepository)
        {
            _customerRepository = customerRepository;
        }

        [HttpGet]
        public IEnumerable<Customer> GetCustomers()
        {
            return _customerRepository.GetCustomers();
        }

        // Diğer HTTP istekleri buraya eklenebilir (GET by id, POST, PUT, DELETE, vb.)
    }
}
3. Dependency Injection ve Servis Ayarları:

Controller, bir servise (örneğin, veritabanı işlemleri gerçekleştiren bir servis) ihtiyaç duyduğunda, ASP.NET Core’un Dependency Injection (DI) mekanizmasını kullanarak servisi enjekte eder. Bu, ConfigureServices metodu içinde gerçekleştirilir:

using Microsoft.Extensions.DependencyInjection;
using MyWebAPI.Services;

namespace MyWebAPI
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<ICustomerRepository, CustomerRepository>();
            services.AddControllers();
        }
        
        // Diğer yapılandırma ayarları buraya eklenebilir
    }
}
Sonuç:

Bu adımlar, Angular uygulaması ve ASP.NET Core Web API arasında veri alışverişi için gerekli adımları içerir. Angular istemcisi, HTTP istekleri kullanarak Web API’ye belirli bir endpoint’ten veri talep eder ve Web API bu isteği alarak ilgili veriyi sağlar. Bu şekilde, uygulamalar arasında veri alışverişi sağlanır ve Angular uygulaması Web API’nin sağladığı verileri kullanabilir.

Update API endpoint

Angular ve ASP.NET Core uygulamaları geliştirirken, Web API üzerinde güncelleme işlemlerini gerçekleştirmek önemlidir. Bu, mevcut veriyi değiştirmek veya güncellemek için kullanılır.

1. Angular’da Güncelleme İsteği Gönderme:

Angular uygulamanızda, Web API’ye güncelleme isteği gönderebilirsiniz. Bunun için Angular’ın HttpClient modülünü kullanabilirsiniz. Örneğin, bir müşterinin bilgilerini güncellemek için bir Angular servisi oluşturabiliriz:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Customer } from './customer.model';

@Injectable({
  providedIn: 'root'
})
export class DataService {

  private apiUrl = 'https://localhost:5001/api/customers'; // Web API URL

  constructor(private http: HttpClient) { }

  updateCustomer(customer: Customer): Observable<Customer> {
    const url = `${this.apiUrl}/${customer.id}`;
    return this.http.put<Customer>(url, customer);
  }
}
2. ASP.NET Core Web API’de Güncelleme İşlemi:

Web API tarafında, istemcinin (Angular uygulaması gibi) gönderdiği güncelleme isteğine yanıt vermek için bir controller’da güncelleme (update) metodu tanımlanmalıdır. Örneğin, bir müşteriyi güncellemek için bir controller metodunu aşağıdaki gibi oluşturabiliriz:

using Microsoft.AspNetCore.Mvc;
using MyWebAPI.Models;
using MyWebAPI.Services;

namespace MyWebAPI.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class CustomersController : ControllerBase
    {
        private readonly ICustomerRepository _customerRepository;

        public CustomersController(ICustomerRepository customerRepository)
        {
            _customerRepository = customerRepository;
        }

        [HttpPut("{id}")]
        public IActionResult UpdateCustomer(int id, Customer customer)
        {
            if (id != customer.Id)
            {
                return BadRequest();
            }

            var existingCustomer = _customerRepository.GetCustomerById(id);
            if (existingCustomer == null)
            {
                return NotFound();
            }

            _customerRepository.UpdateCustomer(customer);

            return NoContent();
        }
    }
}
3. Servis Katmanında Güncelleme İşlemi:

Güncelleme işlemini gerçekleştirmek için, gerekli güncelleme işlemlerini servis katmanında yapmalısınız. Örneğin, bir müşteriyi güncellemek için bir servis metodu aşağıdaki gibi olabilir:

using MyWebAPI.Models;

namespace MyWebAPI.Services
{
    public interface ICustomerRepository
    {
        void UpdateCustomer(Customer customer);
        // Diğer CRUD işlemleri buraya eklenebilir
    }

    public class CustomerRepository : ICustomerRepository
    {
        private readonly List<Customer> _customers = new List<Customer>();

        public void UpdateCustomer(Customer customer)
        {
            var existingCustomer = _customers.Find(c => c.Id == customer.Id);
            if (existingCustomer != null)
            {
                // Müşteri bilgilerini güncelle
                existingCustomer.Name = customer.Name;
                existingCustomer.Email = customer.Email;
                // Diğer özellikler de güncellenebilir
            }
        }

        // Diğer CRUD işlemleri buraya eklenebilir
    }
}
Sonuç:

Bu adımlar, Angular uygulaması ve ASP.NET Core Web API arasında bir API endpoint’ini güncellemek için gerekli adımları içerir. Angular istemcisi, güncelleme isteği göndererek Web API’deki belirli bir kaydı güncelleyebilir ve Web API bu isteği alarak ilgili güncellemeyi gerçekleştirir. Bu şekilde, uygulamalar arasında veri güncelleme işlemi sağlanır ve Angular uygulaması Web API’nin sağladığı güncellenmiş verileri kullanabilir.

Delete API endpoint

Angular ve ASP.NET Core uygulamaları geliştirirken, Web API üzerinde silme işlemlerini gerçekleştirmek de önemlidir. Bu, mevcut veriyi kaldırmak veya silmek için kullanılır.

1. Angular’da Silme İsteği Gönderme:

Angular uygulamanızda, Web API’ye silme isteği gönderebilirsiniz. Bunun için Angular’ın HttpClient modülünü kullanabilirsiniz. Örneğin, bir müşteriyi silmek için bir Angular servisi oluşturabiliriz:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class DataService {

  private apiUrl = 'https://localhost:5001/api/customers'; // Web API URL

  constructor(private http: HttpClient) { }

  deleteCustomer(id: number): Observable<void> {
    const url = `${this.apiUrl}/${id}`;
    return this.http.delete<void>(url);
  }
}
2. ASP.NET Core Web API’de Silme İşlemi:

Web API tarafında, istemcinin (Angular uygulaması gibi) gönderdiği silme isteğine yanıt vermek için bir controller’da silme (delete) metodu tanımlanmalıdır. Örneğin, bir müşteriyi silmek için bir controller metodunu aşağıdaki gibi oluşturabiliriz:

using Microsoft.AspNetCore.Mvc;
using MyWebAPI.Services;

namespace MyWebAPI.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class CustomersController : ControllerBase
    {
        private readonly ICustomerRepository _customerRepository;

        public CustomersController(ICustomerRepository customerRepository)
        {
            _customerRepository = customerRepository;
        }

        [HttpDelete("{id}")]
        public IActionResult DeleteCustomer(int id)
        {
            var existingCustomer = _customerRepository.GetCustomerById(id);
            if (existingCustomer == null)
            {
                return NotFound();
            }

            _customerRepository.DeleteCustomer(id);

            return NoContent();
        }
    }
}
3. Servis Katmanında Silme İşlemi:

Silme işlemini gerçekleştirmek için, gerekli silme işlemlerini servis katmanında yapmalısınız. Örneğin, bir müşteriyi silmek için bir servis metodu aşağıdaki gibi olabilir:

using MyWebAPI.Models;

namespace MyWebAPI.Services
{
    public interface ICustomerRepository
    {
        void DeleteCustomer(int id);
        // Diğer CRUD işlemleri buraya eklenebilir
    }

    public class CustomerRepository : ICustomerRepository
    {
        private readonly List<Customer> _customers = new List<Customer>();

        public void DeleteCustomer(int id)
        {
            var existingCustomer = _customers.Find(c => c.Id == id);
            if (existingCustomer != null)
            {
                _customers.Remove(existingCustomer);
            }
        }

        // Diğer CRUD işlemleri buraya eklenebilir
    }
}
Sonuç:

Bu adımlar, Angular uygulaması ve ASP.NET Core Web API arasında bir API endpoint’ini silmek için gerekli adımları içerir. Angular istemcisi, silme isteği göndererek Web API’deki belirli bir kaydı silebilir ve Web API bu isteği alarak ilgili silme işlemini gerçekleştirir. Bu şekilde, uygulamalar arasında veri silme işlemi sağlanır ve Angular uygulaması güncellenmiş verileri Web API aracılığıyla kullanabilir.

Testing API endpoints using Postman


API uç noktalarını test etmek için Postman oldukça yaygın bir araçtır. Postman, API’lerinizi test etmek, sınamak ve hata ayıklamak için kullanılabilen kullanıcı dostu bir platform sağlar. İşte Postman kullanarak API uç noktalarını test etme adımları:

1. Postman İndirme ve Kurulum:

İlk adım olarak, Postman’i resmi web sitesinden indirip bilgisayarınıza kurmanız gerekmektedir. Postman’in web sitesine buradan ulaşabilirsiniz.

2. Postman Projesi Oluşturma:

Postman’in arayüzünde sol üst köşede “New” butonuna tıklayarak yeni bir proje oluşturun. Proje adını ve gerekirse açıklamayı girin.

3. Yeni Bir Request Oluşturma:

Projenizi oluşturduktan sonra sol üst köşede “New” butonuna tıklayarak yeni bir request oluşturun. Bir HTTP metodunu (GET, POST, PUT, DELETE) seçin ve URL’yi girin.

4. Headerları Ayarlama (Opsiyonel):

İstek başlıklarını ayarlamak için “Headers” sekmesine geçin. Burada isteğe özel başlıklar ekleyebilirsiniz. Örneğin, Authorization, Content-Type vb.

5. Body (Gövde) Ayarlama (Opsiyonel):

İstek gövdesini belirlemek için “Body” sekmesine geçin. Burada JSON, form-data, raw (plain text, XML, JSON) gibi seçenekler arasından birini seçerek gövdeyi ayarlayabilirsiniz.

6. Request’i Gönderme:

Request ayarlarınızı tamamladıktan sonra, sağ üst köşede bulunan “Send” butonuna tıklayarak isteği gönderebilirsiniz.

7. Response’i İnceleme:

API’den gelen yanıtı “Response” sekmesinde görebilirsiniz. Bu bölümde yanıtın durum kodu, başlıkları ve gövdesi bulunur.

Kod Örneği:

Örnek olarak, bir GET isteğini test etmek için:

  • HTTP Method: GET
  • URL: https://localhost:5001/api/customers

Bu istek, Web API’nizin /api/customers endpoint’ine bir GET isteği gönderecek ve müşteri verilerini döndürecektir.

Postman’i kullanarak diğer HTTP metodlarını (POST, PUT, DELETE vb.) ve farklı endpoint’leri test edebilirsiniz. Bu şekilde, Web API’nizin doğru çalışıp çalışmadığını ve beklenen yanıtları verip vermediğini doğrulayabilirsiniz.

Notlar:
  • Postman’de tüm isteklerinizi ve yanıtlarını kaydedebilir ve organize edebilirsiniz.
  • Postman, collection ve environment gibi özellikler sunar, bu da test sürecinizi daha da yönetilebilir hale getirir.
  • Postman’de test senaryoları oluşturabilir ve koleksiyonlarınızı paylaşabilirsiniz, böylece takımınızla işbirliği yapabilirsiniz.

Getting Started with Angular

Angular key concepts

Angular, modern web uygulamaları geliştirmek için kullanılan popüler bir JavaScript çerçevesidir.

1. Components (Bileşenler):

Angular uygulamalarının yapı taşıdır. Bileşenler, HTML şablonları, TypeScript kodu ve CSS stilleri içeren bağımsız, yeniden kullanılabilir ve kendi mantığına sahip parçalardır. Örneğin, bir bileşenin temel yapısı şu şekildedir:

import { Component } from '@angular/core';

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
  styleUrls: ['./example.component.css']
})
export class ExampleComponent {
  // Bileşen mantığı buraya gelecek
}
2. Modules (Modüller):

Angular uygulamalarını organize etmek için kullanılır. Modüller, bileşenlerin, servislerin ve diğer Angular özelliklerinin bir araya getirilmesini sağlar. Örneğin, uygulamanızın ana modülü şu şekilde olabilir:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
3. Directives (Yönergeler):

Angular, HTML’e özel özellikler ekleyen ve davranışlarını değiştiren yönergeler içerir. Örneğin, ngIf ve ngFor gibi yaygın kullanılan yönergeler şunlardır:

  • ngIf: Belirli bir koşula bağlı olarak bir öğenin görünürlüğünü kontrol eder.
  • ngFor: Bir dizi öğeyi yinelemek için kullanılır.
4. Services (Servisler):

Angular uygulamalarında paylaşılan mantık ve işlevsellik sağlamak için kullanılır. Servisler, bileşenler arasında veri akışını sağlamak, HTTP istekleri yapmak veya uygulama durumunu yönetmek gibi görevleri yerine getirir. Örneğin, bir HTTP servisi şu şekilde olabilir:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Post } from './post.model';

@Injectable({
  providedIn: 'root'
})
export class PostService {
  private apiUrl = 'https://jsonplaceholder.typicode.com/posts';

  constructor(private http: HttpClient) { }

  getPosts(): Observable<Post[]> {
    return this.http.get<Post[]>(this.apiUrl);
  }
}
5. Dependency Injection (Bağımlılık Enjeksiyonu):

Angular, bağımlılık enjeksiyonunu kullanarak bileşenlerin ve servislerin ihtiyaç duyduğu diğer nesneleri sağlar. Bu, bileşenlerin ve servislerin birbirinden bağımsız olmasını ve daha test edilebilir kod yazılmasını sağlar.

6. Routing (Yönlendirme):

Angular uygulamalarında sayfa yönlendirmesi sağlayan bir yapıdır. Bu, farklı bileşenlerin farklı URL’lere göre görüntülenmesini sağlar. Örneğin, bir yönlendirme tanımı şu şekildedir:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';

const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'about', component: AboutComponent }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

Bu kavramlar, Angular’ın temel yapı taşlarını oluşturur ve modern web uygulamaları geliştirmek için kullanılır. Bu kavramlarla daha derinlemesine çalışarak Angular uygulamalarınızı daha etkili bir şekilde geliştirebilirsiniz.

Generating components and services

Angular uygulaması geliştirirken, bileşenler ve servisler oluşturmak oldukça yaygın bir ihtiyaçtır. Bileşenler, kullanıcı arayüzünü oluşturan ve belirli bir işlevselliği temsil eden parçalardır. Servisler ise, uygulamanın farklı bileşenleri arasında veri paylaşımını ve iş mantığını sağlarlar.

Bileşen (Component) Oluşturma:

Angular CLI (Command Line Interface), hızlı ve verimli bir şekilde bileşenler oluşturmanızı sağlar. Terminal veya komut istemcisinde aşağıdaki komutu kullanarak yeni bir bileşen oluşturabilirsiniz:

ng generate component example

Bu komut, example adında yeni bir bileşen oluşturur. Oluşturulan bileşenin dosyaları, projenizin src/app dizinindeki bir klasör içinde bulunur. Oluşturulan bileşenin kod örneği aşağıdaki gibidir:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
  styleUrls: ['./example.component.css']
})
export class ExampleComponent implements OnInit {

  constructor() { }

  ngOnInit(): void {
  }

}
Servis (Service) Oluşturma:

Servisler, uygulamanın farklı bileşenleri arasında veri paylaşımını ve iş mantığını sağlarlar. Angular CLI ile yeni bir servis oluşturmak için terminal veya komut istemcisinde aşağıdaki komutu kullanabilirsiniz:

ng generate service example

Bu komut, example adında yeni bir servis oluşturur. Oluşturulan servisin dosyaları, projenizin src/app dizinindeki bir klasör içinde bulunur. Oluşturulan servisin kod örneği aşağıdaki gibidir:

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class ExampleService {

  constructor() { }

}
Bileşen ve Servis Kullanımı:

Oluşturulan bileşenler ve servisler, diğer bileşenler içinde kullanılabilir. Örneğin, bir bileşen içinde bir servisi kullanmak için:

import { Component, OnInit } from '@angular/core';
import { ExampleService } from '../example.service';

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
  styleUrls: ['./example.component.css']
})
export class ExampleComponent implements OnInit {

  constructor(private exampleService: ExampleService) { }

  ngOnInit(): void {
  }

}

Angular CLI, bileşenlerin ve servislerin oluşturulmasını ve proje yapılarının düzenlenmesini kolaylaştırır. Bu sayede daha düzenli, bakımı kolay ve daha okunabilir bir kod tabanı oluşturabilirsiniz.

Cleaning up code and updating the router

Angular uygulamaları geliştirirken, kodunuzu temiz tutmak ve güncellemek önemlidir. Ayrıca, uygulamanızın yönlendirme (routing) yapısını güncellemek de gerekebilir.

1. Kod Temizleme:

Kodunuzu temizlemek için aşağıdaki adımları takip edebilirsiniz:

  • Kod Düzenleme: Kodunuzu düzenleyin ve uygun bir biçimlendirme kullanın. Bu, kodun daha okunabilir olmasını sağlar.
  • Kod Tekrarını Kaldırma: Tekrar eden kod bloklarını, fonksiyonlar veya bileşenler oluşturarak yeniden kullanılabilir hale getirin.
  • Kod İyileştirmeleri: Kodunuzu iyileştirmek için gereksiz kod parçalarını kaldırın veya daha verimli kod yazma yöntemlerini kullanın.
2. Yönlendiriciyi Güncelleme:

Angular’da yönlendiriciyi güncellemek için aşağıdaki adımları izleyebilirsiniz:

  • Yeni Route Ekleme: Uygulamanıza yeni bir sayfa eklemek için, yönlendirme modülünde (app-routing.module.ts) yeni bir route tanımlayın. Örneğin:
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';
import { NewPageComponent } from './new-page/new-page.component'; // Yeni sayfa bileşeni

const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'about', component: AboutComponent },
  { path: 'new-page', component: NewPageComponent } // Yeni sayfa rotası
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

Yönlendirme Linkleri Güncelleme: Menülerde veya diğer bileşenlerde kullanılan yönlendirme linklerini güncelleyin. Örneğin:

<!-- Menüde yeni sayfaya yönlendirme linki -->
<a routerLink="/new-page">New Page</a>

Yönlendirme Yöntemlerini Güncelleme: Programatik olarak yönlendirme yapmak için Angular’ın Router servisini kullanabilirsiniz. Örneğin, bir düğmeye tıklandığında yeni sayfaya yönlendirme yapmak için:

import { Router } from '@angular/router';

constructor(private router: Router) { }

redirectToNewPage() {
  this.router.navigate(['/new-page']);
}

Yukarıdaki adımları takip ederek, Angular uygulamanızdaki kodu temizleyebilir ve yönlendirme yapısını güncelleyebilirsiniz. Bu, uygulamanızı daha düzenli ve yönetilebilir hale getirecektir.

Designing the Books page

“Books page” tasarımı, bir Angular uygulamasında kitapların listelendiği ve ayrıntılarının görüntülendiği bir sayfa olabilir. Bu sayfanın tasarımı ve geliştirilmesi için aşağıdaki adımları izleyebiliriz:

1. Component Oluşturma:

İlk adım olarak, kitapların listeleneceği bir bileşen oluşturmalıyız. Angular CLI ile yeni bir bileşen oluşturabiliriz. Terminal veya komut istemcisinde şu komutu kullanabiliriz:

ng generate component books

Bu komut, books adında yeni bir bileşen oluşturur. Bileşen dosyaları, src/app/books dizininde bulunur.

2. Kitap Verilerini Alma:

Kitap verilerini almak için genellikle bir servis kullanılır. Örneğin, bir BookService oluşturabiliriz ve kitap verilerini sağlayabiliriz.

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Book } from './book.model';

@Injectable({
  providedIn: 'root'
})
export class BookService {
  private apiUrl = 'https://example.com/api/books';

  constructor(private http: HttpClient) { }

  getBooks(): Observable<Book[]> {
    return this.http.get<Book[]>(this.apiUrl);
  }
}
3. Books Component’inin Tasarımı:

Oluşturduğumuz books bileşeninin HTML şablonunu tasarlayabiliriz. Kitapları listeleyecek ve gerektiğinde ayrıntıları gösterecek bir tasarım oluşturmalıyız.

<!-- books.component.html -->

<div *ngIf="books.length > 0; else noBooks">
  <h2>Books</h2>
  <ul>
    <li *ngFor="let book of books">
      <a [routerLink]="['/books', book.id]">{{ book.title }}</a>
    </li>
  </ul>
</div>
<ng-template #noBooks>
  <p>No books available.</p>
</ng-template>
4. Books Component’inin Kodu:

Bileşenin TypeScript dosyasında, kitap verilerini almak için servisi kullanarak bileşenin veri mantığını oluşturmalıyız.

import { Component, OnInit } from '@angular/core';
import { Book } from '../book.model';
import { BookService } from '../book.service';

@Component({
  selector: 'app-books',
  templateUrl: './books.component.html',
  styleUrls: ['./books.component.css']
})
export class BooksComponent implements OnInit {
  books: Book[] = [];

  constructor(private bookService: BookService) { }

  ngOnInit(): void {
    this.getBooks();
  }

  getBooks(): void {
    this.bookService.getBooks()
      .subscribe(books => this.books = books);
  }
}
5. Routing ve Detay Sayfası:

Kitapların detaylarını gösterecek bir detay sayfası oluşturmalıyız. Bunun için routing ayarlarını yapmalıyız ve bir detay bileşeni oluşturmalıyız.

Örnek Routing Tanımı:
const routes: Routes = [
  { path: 'books', component: BooksComponent },
  { path: 'books/:id', component: BookDetailComponent }
];

Detay Bileşeni Tasarımı:

<!-- book-detail.component.html -->

<div *ngIf="book">
  <h2>{{ book.title }}</h2>
  <p><strong>Author:</strong> {{ book.author }}</p>
  <p><strong>Description:</strong> {{ book.description }}</p>
</div>

Bu adımları takip ederek, Angular uygulamanızda “Books page” için bir bileşen oluşturabilir ve tasarlayabilirsiniz. Bu sayede kullanıcılar kitapları listeleyebilir ve her bir kitabın ayrıntılarını görebilirler.

Reading data from Angular

Angular uygulamalarında veri okuma işlemi genellikle HTTP istekleriyle dış API’lerden veya yerel veri kaynaklarından yapılır. Bu süreci anlamak için, Angular’ın HTTP istekleri için HttpClient modülünü ve gelen veriyi bileşenlerde işlemek için Observable’ları kullanırız.

1. HttpClient Modülünü Kullanma:

Angular, HTTP isteklerini yapmak için yerleşik HttpClient modülünü sağlar. Öncelikle, bu modülü kullanarak bir HTTP isteği yaparız. Bunun için öncelikle HttpClientModule‘i uygulamanıza eklemeniz gerekmektedir. Bunun için app.module.ts dosyanıza ekleyebilirsiniz:

import { HttpClientModule } from '@angular/common/http';

@NgModule({
  imports: [
    HttpClientModule
  ]
})
export class AppModule { }
2. Veri Okuma İsteği Gönderme:

HTTP isteği göndermek için HttpClient modülünü bir bileşende kullanabiliriz. Örneğin, bir kitap servisi üzerinden kitap verilerini almak için bir bileşen içinde şu şekilde kullanabiliriz:

import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Component({
  selector: 'app-books',
  templateUrl: './books.component.html',
  styleUrls: ['./books.component.css']
})
export class BooksComponent implements OnInit {
  books: any[] = [];

  constructor(private http: HttpClient) { }

  ngOnInit(): void {
    this.http.get<any[]>('https://api.example.com/books')
      .subscribe(books => {
        this.books = books;
      });
  }
}
3. Observable Kullanma:

HttpClient modülü asenkron HTTP istekleri yapar ve sonuçları bir Observable olarak döndürür. Bu nedenle, veriyi almak için subscribe işlevini kullanmamız gerekmektedir. Böylece, HTTP isteği tamamlandığında gelen veriyi işleyebiliriz.

4. Veriyi İşleme:

Gelen veriyi işlemek ve bileşenin şablonunda kullanmak için bileşen sınıfındaki değişkenlere atarız. Bu değişkenler daha sonra bileşenin HTML şablonunda kullanılabilir.

Örnek Kullanım:
<!-- books.component.html -->

<div *ngFor="let book of books">
  <h2>{{ book.title }}</h2>
  <p><strong>Author:</strong> {{ book.author }}</p>
  <p><strong>Description:</strong> {{ book.description }}</p>
</div>

Yukarıdaki adımları izleyerek, Angular uygulamanızda dış API’lerden veya başka kaynaklardan veri okuma işlemini gerçekleştirebilirsiniz. Bu sayede, kullanıcılarınızın uygulamada dinamik içerikler görmesini sağlayabilirsiniz.

Designing the Create page

“Create page” tasarımı, kullanıcıların yeni içerik oluşturabileceği bir sayfayı ifade eder. Örneğin, yeni bir kitap eklemek için bir form içeren bir sayfa olabilir. Bu sayfanın tasarımını ve geliştirmesini yapmak için aşağıdaki adımları izleyebiliriz:

1. Component Oluşturma:

İlk adım olarak, yeni içeriğin oluşturulacağı bir bileşen oluşturmalıyız. Angular CLI ile yeni bir bileşen oluşturabiliriz. Terminal veya komut istemcisinde şu komutu kullanabiliriz:

ng generate component create-book

Bu komut, create-book adında yeni bir bileşen oluşturur. Bileşen dosyaları, src/app/create-book dizininde bulunur.

2. Form Tasarımı:

Yeni içerik oluşturmak için bir form tasarlamamız gerekmektedir. Form, kullanıcıdan gerekli bilgileri almalıdır. Örneğin, yeni bir kitap eklemek için bir form tasarlayabiliriz:

<!-- create-book.component.html -->

<form (submit)="onSubmit()">
  <div>
    <label>Title: </label>
    <input type="text" [(ngModel)]="newBook.title" name="title" required>
  </div>
  <div>
    <label>Author: </label>
    <input type="text" [(ngModel)]="newBook.author" name="author" required>
  </div>
  <div>
    <label>Description: </label>
    <textarea [(ngModel)]="newBook.description" name="description" required></textarea>
  </div>
  <button type="submit">Create Book</button>
</form>
3. Component Kodu:

Form verilerini işlemek için bileşenin TypeScript dosyasında gerekli kodu eklemeliyiz. Örneğin:

import { Component } from '@angular/core';
import { BookService } from '../book.service';

@Component({
  selector: 'app-create-book',
  templateUrl: './create-book.component.html',
  styleUrls: ['./create-book.component.css']
})
export class CreateBookComponent {
  newBook = { title: '', author: '', description: '' };

  constructor(private bookService: BookService) { }

  onSubmit(): void {
    this.bookService.createBook(this.newBook)
      .subscribe(() => {
        // Yeni kitap başarıyla oluşturulduğunda yapılacak işlemler
        // Örneğin, kullanıcıyı başka bir sayfaya yönlendirebiliriz
      });
  }
}
4. Servis Oluşturma:

Yeni içeriği oluşturmak için bir servis oluşturmalıyız. Bu servis, HTTP isteği göndererek yeni içeriği backend’e kaydetmelidir. Örneğin:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class BookService {
  private apiUrl = 'https://example.com/api/books';

  constructor(private http: HttpClient) { }

  createBook(newBook: any) {
    return this.http.post(this.apiUrl, newBook);
  }
}
5. Form İşleme ve Geri Bildirim:

Formun gönderilmesini ve yeni içeriğin oluşturulmasını takiben, kullanıcıya geri bildirim sağlamak önemlidir. Başarılı bir şekilde içerik oluşturulduğunda veya bir hata meydana geldiğinde kullanıcıya uygun bir mesaj gösterilmelidir.

Yukarıdaki adımları takip ederek, Angular uygulamanızda bir “Create page” tasarlayabilir ve yeni içerik oluşturma işlemini gerçekleştirebilirsiniz. Bu sayede kullanıcılar uygulamanıza yeni içerikler ekleyebilir ve veri tabanınızı güncelleyebilirsiniz.

Adding new data from Angular

Angular uygulamalarında yeni veri eklemek genellikle bir form kullanılarak yapılır. Kullanıcılar formu doldurarak yeni veriyi girer ve bu veri daha sonra bir HTTP isteği aracılığıyla backend’e gönderilir.

1. Form Oluşturma:

Öncelikle, yeni veriyi girmek için bir form oluşturmalısınız. Angular’da form oluşturmak için Angular Forms modülünü kullanabilirsiniz. Örneğin, yeni bir kitap eklemek için bir form oluşturalım:

<!-- new-book-form.component.html -->

<form (submit)="onSubmit()">
  <div>
    <label>Title:</label>
    <input type="text" [(ngModel)]="newBook.title" name="title" required>
  </div>
  <div>
    <label>Author:</label>
    <input type="text" [(ngModel)]="newBook.author" name="author" required>
  </div>
  <div>
    <label>Description:</label>
    <textarea [(ngModel)]="newBook.description" name="description" required></textarea>
  </div>
  <button type="submit">Add Book</button>
</form>
2. Component Kodu:

Formun submit olayını işleyen bir bileşen oluşturmalısınız. Bileşen, formdan alınan veriyi HTTP isteği ile backend’e gönderecek. Örneğin:

import { Component } from '@angular/core';
import { BookService } from '../book.service';

@Component({
  selector: 'app-new-book-form',
  templateUrl: './new-book-form.component.html',
  styleUrls: ['./new-book-form.component.css']
})
export class NewBookFormComponent {
  newBook = { title: '', author: '', description: '' };

  constructor(private bookService: BookService) { }

  onSubmit(): void {
    this.bookService.addBook(this.newBook)
      .subscribe(() => {
        // Yeni kitap başarıyla eklendiğinde yapılacak işlemler
        // Örneğin, kullanıcıyı başka bir sayfaya yönlendirebiliriz
      });
  }
}
3. Servis Oluşturma:

Yeni veriyi backend’e göndermek için bir servis oluşturmalısınız. Bu servis, HTTP POST isteği göndererek yeni veriyi backend’e kaydedecektir. Örneğin:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class BookService {
  private apiUrl = 'https://example.com/api/books';

  constructor(private http: HttpClient) { }

  addBook(newBook: any) {
    return this.http.post(this.apiUrl, newBook);
  }
}
4. Geri Bildirim Sağlama:

Formun gönderilmesini ve yeni verinin başarıyla eklenip eklenmediğini kullanıcıya bildirmek önemlidir. Başarılı bir şekilde veri eklediğinde veya bir hata meydana geldiğinde kullanıcıya uygun bir mesaj gösterilmelidir.

Yukarıdaki adımları takip ederek, Angular uygulamanızda yeni veri ekleyebilir ve kullanıcıların uygulamanıza veri eklemesine izin verebilirsiniz. Bu sayede, uygulamanızın veri tabanını güncelleyebilir ve dinamik içerikler oluşturabilirsiniz.

Designing the Book Details page

“Book Details page” tasarımı, bir kitabın detaylarının görüntülendiği bir sayfayı ifade eder. Bu sayfa genellikle bir kitabın başlık, yazar, açıklama gibi özelliklerini ve gerektiğinde diğer ilgili bilgileri gösterir.

1. Component Oluşturma:

İlk adım olarak, kitap detaylarının gösterileceği bir bileşen oluşturmalısınız. Angular CLI ile yeni bir bileşen oluşturabilirsiniz. Terminal veya komut istemcisinde şu komutu kullanabilirsiniz:

ng generate component book-details

Bu komut, book-details adında yeni bir bileşen oluşturur. Bileşen dosyaları, src/app/book-details dizininde bulunur.

2. Book Details Component Tasarımı:

Kitap detaylarını gösterecek olan bileşenin HTML şablonunu tasarlamalısınız. Örneğin:

<!-- book-details.component.html -->

<div *ngIf="book">
  <h2>{{ book.title }}</h2>
  <p><strong>Author:</strong> {{ book.author }}</p>
  <p><strong>Description:</strong> {{ book.description }}</p>
</div>
3. Book Details Component Kodu:

Bileşenin TypeScript dosyasında, kitap detaylarını almak ve bileşenin şablonunda kullanmak için gerekli kodu eklemelisiniz. Örneğin:

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { BookService } from '../book.service';

@Component({
  selector: 'app-book-details',
  templateUrl: './book-details.component.html',
  styleUrls: ['./book-details.component.css']
})
export class BookDetailsComponent implements OnInit {
  book: any;

  constructor(
    private route: ActivatedRoute,
    private bookService: BookService
  ) { }

  ngOnInit(): void {
    this.getBookDetails();
  }

  getBookDetails(): void {
    const id = +this.route.snapshot.paramMap.get('id');
    this.bookService.getBookById(id)
      .subscribe(book => this.book = book);
  }
}
4. Book Service ve Routing Güncellemeleri:

Kitap detaylarını almak için bir servis oluşturmalısınız ve routing ayarlarınızı güncellemelisiniz. Örneğin:

// book.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class BookService {
  private apiUrl = 'https://example.com/api/books';

  constructor(private http: HttpClient) { }

  getBookById(id: number) {
    return this.http.get(`${this.apiUrl}/${id}`);
  }
}
// app-routing.module.ts

const routes: Routes = [
  { path: 'books/:id', component: BookDetailsComponent }
];
5. Linkleri Güncelleme:

Kitapların listelendiği sayfada, her kitabın detaylarına yönlendiren linklerin düzenlenmesi gerekmektedir. Örneğin:

<!-- books.component.html -->

<div *ngFor="let book of books">
  <h2><a [routerLink]="['/books', book.id]">{{ book.title }}</a></h2>
  <p><strong>Author:</strong> {{ book.author }}</p>
</div>

Yukarıdaki adımları takip ederek, Angular uygulamanızda “Book Details page” tasarlayabilir ve kullanıcıların herhangi bir kitabın detaylarını görüntülemesini sağlayabilirsiniz. Bu sayede, kullanıcılar kitapların detaylarını kolayca görebilir ve uygulamanızın kullanılabilirliğini artırabilirsiniz.

Getting a single book from Angular

Angular uygulamalarında, tek bir kitabın detaylarını almak genellikle bir HTTP isteği ile yapılır. Bu, genellikle bir servis aracılığıyla gerçekleştirilir ve kullanıcı belirli bir kitabın detaylarını görüntülemek istediğinde tetiklenir.

1. Servis Oluşturma:

Öncelikle, kitap detaylarını almak için bir servis oluşturmalısınız. Bu servis, backend ile iletişim kurarak belirli bir kitabın detaylarını alacaktır. Angular CLI ile bir servis oluşturabilirsiniz:

ng generate service book

Bu komut, book adında yeni bir servis oluşturur. Servis dosyaları, src/app/book dizininde bulunur.

2. Book Service Kodu:

Servis dosyasında, backend’den kitap detaylarını almak için gerekli HTTP isteğini gönderen bir metod yazmalısınız. Örneğin:

// book.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Book } from './book.model';

@Injectable({
  providedIn: 'root'
})
export class BookService {
  private apiUrl = 'https://example.com/api/books';

  constructor(private http: HttpClient) { }

  getBookById(id: number): Observable<Book> {
    return this.http.get<Book>(`${this.apiUrl}/${id}`);
  }
}
3. Book Modeli Oluşturma:

Book veri modelini oluşturmalısınız. Bu model, backend’den alınan kitap detaylarını temsil edecektir. Örneğin:

// book.model.ts

export interface Book {
  id: number;
  title: string;
  author: string;
  description: string;
}
4. Component Kodu:

Kitap detaylarını almak için bir bileşen oluşturmalısınız. Bu bileşen, servisi kullanarak belirli bir kitabın detaylarını almalıdır. Örneğin:

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Book } from '../book.model';
import { BookService } from '../book.service';

@Component({
  selector: 'app-book-details',
  templateUrl: './book-details.component.html',
  styleUrls: ['./book-details.component.css']
})
export class BookDetailsComponent implements OnInit {
  book: Book;

  constructor(
    private route: ActivatedRoute,
    private bookService: BookService
  ) { }

  ngOnInit(): void {
    const id = +this.route.snapshot.paramMap.get('id');
    this.bookService.getBookById(id)
      .subscribe(book => this.book = book);
  }
}
5. Component Şablonu:

Bileşenin HTML şablonunda, alınan kitap detaylarını göstermek için gerekli HTML kodunu eklemelisiniz. Örneğin:

<!-- book-details.component.html -->

<div *ngIf="book">
  <h2>{{ book.title }}</h2>
  <p><strong>Author:</strong> {{ book.author }}</p>
  <p><strong>Description:</strong> {{ book.description }}</p>
</div>

Yukarıdaki adımları takip ederek, Angular uygulamanızda tek bir kitabın detaylarını alabilir ve kullanıcılarınıza görüntüleyebilirsiniz. Bu sayede, kullanıcılarınız uygulamanızdaki herhangi bir kitabın detaylarını kolayca görüntüleyebilirler.

Updating existing data from Angular

Angular uygulamalarında mevcut veriyi güncellemek genellikle bir form aracılığıyla yapılır. Kullanıcılar formu doldurarak mevcut veriyi günceller ve bu güncelleme daha sonra bir HTTP isteği aracılığıyla backend’e gönderilir.

1. Form Oluşturma:

Öncelikle, mevcut veriyi güncellemek için bir form oluşturmalısınız. Angular’da form oluşturmak için Angular Forms modülünü kullanabilirsiniz. Örneğin, bir kitabın detaylarını güncellemek için bir form oluşturalım:

<!-- update-book-form.component.html -->

<form (submit)="onSubmit()">
  <div>
    <label>Title:</label>
    <input type="text" [(ngModel)]="book.title" name="title" required>
  </div>
  <div>
    <label>Author:</label>
    <input type="text" [(ngModel)]="book.author" name="author" required>
  </div>
  <div>
    <label>Description:</label>
    <textarea [(ngModel)]="book.description" name="description" required></textarea>
  </div>
  <button type="submit">Update Book</button>
</form>
2. Component Kodu:

Formun submit olayını işleyen bir bileşen oluşturmalısınız. Bileşen, formdan alınan güncellenmiş veriyi HTTP isteği ile backend’e gönderecek. Örneğin:

import { Component, Input } from '@angular/core';
import { Book } from '../book.model';
import { BookService } from '../book.service';

@Component({
  selector: 'app-update-book-form',
  templateUrl: './update-book-form.component.html',
  styleUrls: ['./update-book-form.component.css']
})
export class UpdateBookFormComponent {
  @Input() book: Book;

  constructor(private bookService: BookService) { }

  onSubmit(): void {
    this.bookService.updateBook(this.book)
      .subscribe(() => {
        // Kitap başarıyla güncellendiğinde yapılacak işlemler
        // Örneğin, kullanıcıyı başka bir sayfaya yönlendirebiliriz
      });
  }
}
3. Servis Oluşturma:

Mevcut veriyi backend’e göndermek için bir servis oluşturmalısınız. Bu servis, HTTP PUT isteği göndererek mevcut veriyi backend’de güncellemelidir. Örneğin:

// book.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Book } from './book.model';

@Injectable({
  providedIn: 'root'
})
export class BookService {
  private apiUrl = 'https://example.com/api/books';

  constructor(private http: HttpClient) { }

  updateBook(book: Book): Observable<Book> {
    return this.http.put<Book>(`${this.apiUrl}/${book.id}`, book);
  }
}
4. Component Kullanımı:

Mevcut veriyi güncellemek için bileşeni kullanmalısınız. Örneğin, güncelleme formunu kitap detaylarını gösteren bileşene yerleştirebilirsiniz.

Yukarıdaki adımları takip ederek, Angular uygulamanızda mevcut veriyi güncelleyebilir ve kullanıcıların uygulamanızdaki verileri kolayca güncellemesini sağlayabilirsiniz. Bu sayede, uygulamanızın veri tabanını güncelleyebilir ve kullanıcı deneyimini artırabilirsiniz.

Deleting data from Angular

Angular uygulamalarında veri silme genellikle bir kullanıcı eylemiyle tetiklenir, örneğin bir düğmeye tıklama veya bir onay işareti verme gibi. Kullanıcı bu eylemi gerçekleştirdiğinde, silinecek veriye ilişkin bilgiler bir HTTP DELETE isteği aracılığıyla backend’e gönderilir.

1. Silme İsteğini Gönderme:

Öncelikle, silinecek veriyi backend’den silmek için bir HTTP DELETE isteği göndermeniz gerekir. Bunun için bir servis oluşturmanız ve bu servis aracılığıyla backend’e bir HTTP DELETE isteği yapmanız gerekir. Örneğin:

// book.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class BookService {
  private apiUrl = 'https://example.com/api/books';

  constructor(private http: HttpClient) { }

  deleteBook(id: number): Observable<any> {
    return this.http.delete(`${this.apiUrl}/${id}`);
  }
}
2. Silme İşlemini Tetikleme:

Silme işlemi genellikle bir bileşen içinde bir kullanıcı eylemiyle tetiklenir, örneğin bir düğmeye tıklama gibi. Böyle bir bileşen oluşturun ve bu bileşenin kullanıcı eylemini yakalayarak silme işlemini başlatın. Örneğin:

import { Component } from '@angular/core';
import { BookService } from '../book.service';

@Component({
  selector: 'app-delete-book',
  template: '<button (click)="deleteBook()">Delete Book</button>',
  styleUrls: ['./delete-book.component.css']
})
export class DeleteBookComponent {
  constructor(private bookService: BookService) { }

  deleteBook(): void {
    const bookId = 1; // Silinecek kitabın ID'si, isteğe bağlı olarak dinamik olarak alınabilir
    this.bookService.deleteBook(bookId)
      .subscribe(() => {
        // Silme işlemi başarıyla tamamlandığında yapılacak işlemler
        // Örneğin, kullanıcıyı başka bir sayfaya yönlendirebiliriz
      });
  }
}
3. Silme İşlemi Sonrası Geri Bildirim:

Silme işlemi tamamlandıktan sonra kullanıcıya uygun bir geri bildirim sağlamak önemlidir. Başarılı bir şekilde silindiğinde veya bir hata meydana geldiğinde kullanıcıya uygun bir mesaj gösterilmelidir.

Yukarıdaki adımları takip ederek, Angular uygulamanızda veri silme işlemini gerçekleştirebilir ve kullanıcıların uygulamanızdaki verileri kolayca silebilirsiniz. Bu sayede, uygulamanızın veri tabanını güncelleyebilir ve kullanıcı deneyimini artırabilirsiniz.

Handling errors in Angular

Angular uygulamalarında hataları işlemek, kullanıcı dostu bir deneyim sağlamak ve uygulamanın sağlam ve güvenilir kalmasını sağlamak için son derece önemlidir. Hatalar, çeşitli nedenlerden kaynaklanabilir, örneğin geçersiz kullanıcı girişi, ağ bağlantı sorunları, sunucu hataları vb. Bu nedenle, Angular uygulamalarında hata yönetimi, uygulamanın sağlamlığını artırmak için önemli bir adımdır.

1. HTTP Hatalarını İşleme:

Angular uygulamalarında sıkça karşılaşılan hatalardan biri HTTP hatalarıdır. Örneğin, backend’den veri almak için yapılan bir istekte hata oluşabilir. Böyle durumlarda, hata durumunu işlemek için HTTP isteklerine bir hata işleyici eklemelisiniz. Örneğin:

import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class DataService {
  private apiUrl = 'https://example.com/api/data';

  constructor(private http: HttpClient) { }

  getData(): Observable<any> {
    return this.http.get<any>(this.apiUrl)
      .pipe(
        catchError(this.handleError)
      );
  }

  private handleError(error: HttpErrorResponse) {
    if (error.error instanceof ErrorEvent) {
      // İstemci tarafında bir hata oluştu
      console.error('An error occurred:', error.error.message);
    } else {
      // Sunucu tarafında bir hata oluştu
      console.error(
        `Backend returned code ${error.status}, ` +
        `body was: ${error.error}`);
    }
    // Kullanıcıya geri bildirim sağlamak için bir Observable döndürür
    return throwError('Something bad happened; please try again later.');
  }
}
2. Kullanıcıya Geri Bildirim Sağlama:

Hataların oluştuğu durumlarda kullanıcıya uygun bir geri bildirim sağlamak önemlidir. Kullanıcıya hatanın ne olduğunu ve ne yapması gerektiğini anlatan açıklayıcı bir mesaj göstermelisiniz. Örneğin, bir hata bileşeni oluşturabilir ve bu bileşen aracılığıyla hata mesajlarını kullanıcıya gösterebilirsiniz.

3. Günlükleme (Logging):

Hataları günlükleme, uygulamanın sağlamlığını artırmak ve hata ayıklamayı kolaylaştırmak için önemlidir. Angular uygulamanızda hataları konsola, bir hizmete veya dış bir kayda kaydedebilirsiniz.

4. Global Hata İşleyici Eklemek:

Angular uygulamanıza genel bir hata işleyici eklemek, uygulamanızda oluşan tüm hataları yakalamanıza ve işlemenize olanak tanır. Bunun için Angular’ın ErrorHandler sınıfını genişletebilir ve hata işleme mantığını burada uygulayabilirsiniz.

import { ErrorHandler } from '@angular/core';

export class GlobalErrorHandler implements ErrorHandler {
  handleError(error: any): void {
    // Hata işleme mantığını buraya ekleyin
    console.error('Global error occurred:', error);
  }
}

Bu adımları takip ederek, Angular uygulamanızda hataları etkili bir şekilde işleyebilir ve kullanıcı dostu bir deneyim sağlayabilirsiniz. Hata işleme, uygulamanızın güvenilirliğini artırırken, kullanıcıların uygulamanızla etkileşimini daha olumlu hale getirebilir.

Implementing NgRx to an Existing Angular App

Why NgRx?

NgRx, Angular uygulamalarında durum yönetimi için kullanılan bir kütüphanedir ve genellikle büyük ölçekli uygulamalar için tercih edilir. NgRx, Redux desenine dayanır ve uygulamanın durumunu merkezi bir yerde depolayarak uygulamanın daha öngörülebilir ve yönetilebilir olmasını sağlar. İşte NgRx’nin neden tercih edildiğine dair derinlemesine bir açıklama:

1. Durum Yönetimi:

NgRx, uygulamanın durumunu merkezi bir şekilde yönetir. Bu, uygulamanın tüm bileşenlerinin durumunu tek bir yerde depolayarak, bileşenler arasında durumun paylaşılmasını sağlar. Bu da uygulamanın daha tutarlı ve öngörülebilir olmasını sağlar.

2. Uygulama Karmaşıklığını Yönetme:

Büyük ölçekli Angular uygulamalarında, bileşenler arasında durumun etkileşimi karmaşık hale gelebilir. NgRx, bu tür karmaşıklıkları ele almak için güçlü bir araçtır. Redux’un temel prensiplerine dayanan NgRx, uygulamanın büyümesiyle birlikte karmaşıklığı yönetmek için etkili bir yol sağlar.

3. Tekdüzenlik ve Öngörülebilirlik:

NgRx, Redux desenine dayandığı için uygulamanın durumunun tek yönlü veri akışıyla yönetilmesini sağlar. Bu, uygulamanın daha öngörülebilir ve test edilebilir olmasını sağlar. Ayrıca, Redux’un genel kabul görmüş prensiplerini takip ettiği için ekibinizdeki diğer geliştiricilerin uygulama kodunu daha kolay anlamasını ve işbirliği yapmasını sağlar.

4. Asenkron Eylemleri Yönetme:

NgRx, Redux’tan ilham alarak asenkron eylemleri yönetmek için etkili bir yol sunar. Bu, HTTP istekleri gibi asenkron işlemleri kolayca işleyebilmenizi sağlar. Redux’tan farklı olarak, NgRx Effects kullanarak asenkron işlemleri kolayca ele alabilirsiniz.

5. Güncellemeleri Hızlı ve Kolay Uygulama:

Uygulamanın durumu merkezi bir yerde depolandığından, durum değişiklikleri kolayca izlenebilir ve yönetilebilir hale gelir. Bu, uygulamanın performansını artırabilir ve hataları hızlıca tespit edip düzeltebilmenizi sağlar.

6. Gelişmiş Hata Ayıklama ve Geliştirme Aracı Desteği:

NgRx, gelişmiş hata ayıklama ve geliştirme araçlarıyla entegre olabilir. Redux DevTools gibi araçlar, uygulamanın durumunu ve eylemlerini izlemeyi ve hata ayıklamayı kolaylaştırır.

Bu nedenlerden dolayı, büyük ölçekli Angular uygulamalarında NgRx kullanmak sıkça tercih edilir. Ancak, küçük ve orta ölçekli uygulamalar için gereksiz karmaşıklığa yol açabilir, bu yüzden her zaman uygulama gereksinimlerinizi dikkate almalısınız.

NgRx actions

NgRx, Angular uygulamalarında durum yönetimi için kullanılan bir kütüphanedir ve Redux mimarisine dayanır. Bu, uygulama durumu için merkezi bir depo kullanarak uygulamanın durumunu yönetmenizi sağlar. Bu, özellikle büyük ve karmaşık uygulamalarda durumun tutarlılığını sağlamak ve bileşenler arasında veri akışını kolaylaştırmak için önemlidir.

NgRx içerisindeki ana unsurlardan biri “actions” olarak adlandırılan yapıdır. Actions, uygulamanızdaki belirli bir olayı veya kullanıcı etkileşimini temsil eder. Bunlar, uygulamanızdaki durum değişikliklerini tetiklemek için kullanılır. Bir action, tip adı ve opsiyonel olarak bir payload (veri) içerebilir.

İlk olarak, bir action tanımlayalım. Bir kullanıcı adının güncellenmesini temsil eden bir action düşünelim.

// user.actions.ts

import { createAction, props } from '@ngrx/store';

export const updateUser = createAction(
  '[User] Update User',
  props<{ username: string }>()
);

Yukarıdaki kodda, updateUser adında bir action tanımlıyoruz. Bu, kullanıcı adının güncellenmesini temsil eder. createAction işleviyle bir action yaratıyoruz. İlk argüman, action’un benzersiz bir tanımını sağlar ve ikinci argüman, bu action ile ilişkilendirilen veriyi tanımlar.

Ardından, bu action’u kullanarak bir reducer oluşturuyoruz. Reducer, action’lara yanıt olarak durumu nasıl güncelleyeceğimizi tanımlar.

// user.reducer.ts

import { createReducer, on } from '@ngrx/store';
import * as UserActions from './user.actions';

export interface UserState {
  username: string;
}

export const initialState: UserState = {
  username: ''
};

export const userReducer = createReducer(
  initialState,
  on(UserActions.updateUser, (state, { username }) => ({
    ...state,
    username
  }))
);

Yukarıdaki kodda, updateUser action’ına yanıt olarak durumu güncelleyen bir reducer tanımlıyoruz. createReducer işleviyle bir reducer oluşturuyoruz. on işlevi, belirli bir action’a yanıt olarak durumu nasıl güncelleyeceğimizi tanımlar.

Son olarak, bu action’u bir bileşende kullanarak NgRx Store ile bağlantı kuruyoruz.

// user.component.ts

import { Component } from '@angular/core';
import { Store } from '@ngrx/store';
import { updateUser } from './user.actions';
import { UserState } from './user.reducer';

@Component({
  selector: 'app-user',
  template: `
    <input type="text" [(ngModel)]="username">
    <button (click)="updateUsername()">Update Username</button>
  `
})
export class UserComponent {
  username: string = '';

  constructor(private store: Store<{ user: UserState }>) {}

  updateUsername() {
    this.store.dispatch(updateUser({ username: this.username }));
  }
}

Yukarıdaki bileşen, bir kullanıcı adını güncellemek için bir giriş kutusu ve bir düğme içerir. updateUsername yöntemi, kullanıcı adını güncellemek için Store’a bir eylem gönderir.

Bu örnekler, NgRx actions’un nasıl kullanılacağına dair temel bir anlayış sağlar. Bu, uygulamanızdaki durumu yönetmek ve bileşenler arasındaki iletişimi kolaylaştırmak için güçlü bir araçtır.

NgRx store

NgRx Store, Angular uygulamalarında durum yönetimi için kullanılan bir kütüphanedir. Redux mimarisine dayanır ve uygulamanızdaki tüm durumu merkezi bir depoda tutar. Bu, uygulamanızın durumunun tek bir yerden yönetilmesini sağlar, böylece durumun tutarlılığını korumak ve bileşenler arasında veri akışını kolaylaştırmak daha kolay hale gelir.

NgRx Store’un temel yapı taşları şunlardır:

  1. Actions: Kullanıcı etkileşimlerini temsil eden olaylar.
  2. Reducers: Actions’lara yanıt olarak durumu güncelleyen fonksiyonlar.
  3. Store: Uygulamanın durumunu tutan merkezi bir depo.

Bu üç bileşen bir araya gelerek uygulamanızdaki durumu yönetmenize olanak tanır.

1. Actions:

Actions, uygulamanızda gerçekleşen olayları temsil eder. Bir kullanıcının bir düğmeye tıklaması, bir formu göndermesi veya bir API’den veri alması gibi herhangi bir etkileşim bir action ile temsil edilebilir. Actionlar, genellikle bir tür ve opsiyonel olarak bir payload (veri) içerir.

Örnek bir action:

import { createAction, props } from '@ngrx/store';

export const increment = createAction('[Counter] Increment');

Yukarıdaki kodda, increment adında bir action tanımlıyoruz. Bu, sayaç değerini artırmayı temsil eder.

2. Reducers:

Reducers, actions’lara yanıt olarak uygulamanın durumunu güncelleyen fonksiyonlardır. Bir reducer, mevcut durumu ve bir action’u alır, durumu günceller ve yeni durumu döndürür. Reducer’lar, immutable (değişmez) bir yaklaşım kullanarak durumu günceller, yani mevcut durumu değiştirmek yerine yeni bir durum nesnesi oluştururlar.

Örnek bir reducer:

import { createReducer, on } from '@ngrx/store';
import { increment } from './counter.actions';

export const initialState = 0;

const _counterReducer = createReducer(
  initialState,
  on(increment, state => state + 1)
);

export function counterReducer(state, action) {
  return _counterReducer(state, action);
}

Yukarıdaki kodda, increment action’ına yanıt olarak durumu güncelleyen bir reducer tanımlıyoruz.

3. Store:

Store, uygulamanın durumunu merkezi bir şekilde yöneten bir depodur. Tüm durum bilgisi burada tutulur ve bileşenlerin durumu okumasına ve güncellemesine izin verilir.

Store’un oluşturulması:

import { StoreModule } from '@ngrx/store';
import { counterReducer } from './counter.reducer';

@NgModule({
  imports: [
    StoreModule.forRoot({ count: counterReducer })
  ]
})
export class AppModule {}

Yukarıdaki kodda, StoreModule.forRoot işlevini kullanarak ana uygulama deposunu oluşturuyoruz. Burada, counterReducer adında bir reducer tanımladık ve count adında bir anahtarla bu reducer’ı ana depoya kaydettik.

Bu örnekler, NgRx Store’u uygulamanıza nasıl entegre edeceğiniz konusunda bir temel sağlar. NgRx Store, büyük ve karmaşık Angular uygulamalarında durum yönetimi için güçlü bir araçtır ve uygulamanızdaki durumu tutarlı bir şekilde yönetmenize yardımcı olabilir.

NgRx reducers

NgRx reducers, Angular uygulamalarında durum yönetimi için kullanılan önemli bir kavramdır. Reducer’lar, uygulamanızdaki durumu güncellemek için actions’lara yanıt olarak çalışan fonksiyonlardır. NgRx Store içinde bulunurlar ve Redux mimarisine dayanırlar.

Reducers, genellikle mevcut durumu ve bir action’u parametre olarak alırlar. Action’a bağlı olarak durumu güncellerler ve yeni durumu döndürürler. Reducer’lar, mevcut durumu değiştirmek yerine yeni bir durum nesnesi döndürerek immutable (değişmez) bir yaklaşımı benimserler.

1. Reducer’ların Tanımlanması:

Öncelikle, reducer’ları tanımlamanız gerekmektedir. Her bir reducer, uygulamanızdaki belirli bir parçayı (state) yönetir. Genellikle, bu reducer’lar birer dosyada organize edilir.

Örnek bir reducer dosyası:

// counter.reducer.ts

import { createReducer, on } from '@ngrx/store';
import { increment, decrement, reset } from './counter.actions';

export const initialState = 0;

const _counterReducer = createReducer(
  initialState,
  on(increment, state => state + 1),
  on(decrement, state => state - 1),
  on(reset, () => initialState)
);

export function counterReducer(state, action) {
  return _counterReducer(state, action);
}

Yukarıdaki kodda, counter.reducer.ts dosyasında bir sayaç reducer’ı tanımlıyoruz. Bu reducer, increment, decrement ve reset adlı actions’lara yanıt olarak durumu günceller.

2. Reducer’ların Birleştirilmesi:

Bir uygulamada genellikle birden fazla reducer olacaktır. Bu reducer’ları birleştirmek için StoreModule.forRoot veya StoreModule.forFeature işlevlerini kullanabilirsiniz. Ana reducer, tüm alt reducer’ları birleştirir.

Örnek bir ana reducer tanımı:

// app.module.ts

import { StoreModule } from '@ngrx/store';
import { counterReducer } from './counter.reducer';

@NgModule({
  imports: [
    StoreModule.forRoot({ counter: counterReducer })
  ]
})
export class AppModule {}

Yukarıdaki kodda, counterReducer adındaki sayaç reducer’ını counter anahtarı altında ana reducer’a ekliyoruz.

3. Reducer’ların Kullanılması:

Reducer’lar, Angular bileşenlerinde Store servisi aracılığıyla kullanılabilir. Bileşenler, store’dan durumu okuyabilir veya store’a dispatch edilen actions’lara tepki verebilirler.

Örnek bir bileşen:

// counter.component.ts

import { Component } from '@angular/core';
import { Store, select } from '@ngrx/store';
import { Observable } from 'rxjs';
import { increment, decrement, reset } from './counter.actions';

@Component({
  selector: 'app-counter',
  template: `
    <button (click)="increment()">Increment</button>
    <div>Current Count: {{ count$ | async }}</div>
    <button (click)="decrement()">Decrement</button>
    <button (click)="reset()">Reset</button>
  `
})
export class CounterComponent {
  count$: Observable<number>;

  constructor(private store: Store<{ counter: number }>) {
    this.count$ = this.store.pipe(select('counter'));
  }

  increment() {
    this.store.dispatch(increment());
  }

  decrement() {
    this.store.dispatch(decrement());
  }

  reset() {
    this.store.dispatch(reset());
  }
}

Yukarıdaki bileşen, bir sayaç bileşenidir. Store’dan sayaç değerini almak için select işlevini kullanır ve actions dispatch etmek için dispatch işlevini kullanır.

Bu rehberde, NgRx reducers’ı nasıl tanımlayacağınız ve kullanacağınız konusunda derinlemesine bir açıklama verilmiştir. Bu, Angular uygulamanızdaki durumu yönetmek için güçlü bir araçtır ve büyük ölçekli projelerde kullanılabilir.

Connecting the dots


“Connecting the dots” olarak adlandırılan süreç, mevcut bir Angular uygulamasına NgRx entegrasyonunu sağlamak için gereken adımların tamamını kapsar. Bu süreç, bileşenler arasındaki veri akışını, uygulama durumu yönetimini ve veri işlemlerini daha etkin bir şekilde kontrol etmenizi sağlar.

Adım 1: NgRx Modülünün Kurulması

Öncelikle, uygulamanıza NgRx modülünü eklemeniz gerekir. Bunun için öncelikle NgRx paketlerini yüklemeniz gerekebilir. Örneğin, aşağıdaki komutları kullanarak NgRx Store’u yükleyebilirsiniz:

npm install @ngrx/store --save

Ardından, AppModule’da StoreModule.forRoot() yöntemini kullanarak NgRx Store’u uygulamanıza tanımlayın. Bu, ana uygulama deposunu oluşturur ve reducers’ları kaydeder.

// app.module.ts

import { StoreModule } from '@ngrx/store';
import { reducers } from './reducers'; // Burada tüm reducers'ları içeren bir modülünüzün olduğunu varsayalım.

@NgModule({
  imports: [
    StoreModule.forRoot(reducers)
  ],
  ...
})
export class AppModule { }
Adım 2: Actions’ların ve Reducer’ların Tanımlanması

Uygulamanızdaki farklı olayları temsil etmek için actions’larınızı tanımlayın. Bu, kullanıcı etkileşimleri veya dış kaynaklardan gelen veriler gibi olayları içerebilir. Daha sonra, bu actions’lara yanıt olarak çalışacak reducer’ları tanımlayın.

// counter.actions.ts

import { createAction } from '@ngrx/store';

export const increment = createAction('[Counter Component] Increment');
export const decrement = createAction('[Counter Component] Decrement');
export const reset = createAction('[Counter Component] Reset');

// counter.reducer.ts

import { createReducer, on } from '@ngrx/store';
import { increment, decrement, reset } from './counter.actions';

export const initialState = 0;

const _counterReducer = createReducer(
  initialState,
  on(increment, state => state + 1),
  on(decrement, state => state - 1),
  on(reset, () => initialState)
);

export function counterReducer(state, action) {
  return _counterReducer(state, action);
}
Adım 3: Store Selektörlerinin Kullanılması

Store selektörleri, store’daki belirli bir parçayı seçmek için kullanılır. Bileşenlerinizde store’daki durumu okumak için bu selektörleri kullanabilirsiniz.

// counter.component.ts

import { Component, OnInit } from '@angular/core';
import { Store, select } from '@ngrx/store';
import { Observable } from 'rxjs';
import { increment, decrement, reset } from './counter.actions';

@Component({
  selector: 'app-counter',
  templateUrl: './counter.component.html',
  styleUrls: ['./counter.component.css']
})
export class CounterComponent implements OnInit {
  count$: Observable<number>;

  constructor(private store: Store<{ count: number }>) {
    this.count$ = store.pipe(select('count'));
  }

  ngOnInit(): void {
  }

  increment() {
    this.store.dispatch(increment());
  }

  decrement() {
    this.store.dispatch(decrement());
  }

  reset() {
    this.store.dispatch(reset());
  }
}
Adım 4: Bileşenler ile Store Bağlantısının Kurulması

Bileşenlerinizde, store’dan durumu okumak ve actions’ları dispatch etmek için gerekli bağlantıları kurun.

Adım 5: Redux DevTools Entegrasyonu (İsteğe Bağlı)

NgRx, Redux DevTools ile entegrasyonu destekler. Bu, uygulamanızdaki durum değişikliklerini izlemek ve hata ayıklamak için kullanışlı olabilir. Entegrasyon için gerekli adımları takip edin ve Redux DevTools’u kullanarak uygulamanızdaki durumu izleyin.

Bu adımları takip ederek, mevcut bir Angular uygulamanıza NgRx entegrasyonunu başarılı bir şekilde gerçekleştirebilirsiniz. Bu, uygulamanızın daha iyi bir durum yönetimi ve veri akışı sağlamasına yardımcı olacaktır.

Implementing Authentication in Your Angular App

Setting up Auth0

Auth0, bir kimlik ve erişim yönetimi platformudur ve Angular uygulamalarında kimlik doğrulama ve yetkilendirme işlemlerini kolaylaştırmak için sıklıkla kullanılır. Auth0’nin sunduğu hizmetlerden yararlanarak Angular uygulamanıza kimlik doğrulama entegrasyonunu hızlı bir şekilde sağlayabilirsiniz.

Adım 1: Auth0 Hesabı Oluşturma

Öncelikle, Auth0 web sitesine giderek bir hesap oluşturmanız gerekmektedir. Auth0 hesabı oluşturduktan sonra, Auth0 Yönetim Arayüzü’ne giriş yapın.

Adım 2: Uygulama Oluşturma

Yönetim arayüzünde, “Applications” bölümüne gidin ve “Create Application” düğmesine tıklayarak yeni bir uygulama oluşturun. Uygulamanızın türünü seçin (Single Page Application), adını belirtin ve oluşturun.

Adım 3: Auth0 SDK Kurulumu

Angular uygulamanıza Auth0’nin resmi Angular SDK’sını ekleyin. Bunu yapmak için, terminalinizde aşağıdaki komutu çalıştırın:

npm install @auth0/auth0-angular
Adım 4: Auth0 Entegrasyonu

Angular uygulamanızın genel modülünde Auth0Provider’ı yapılandırın ve uygulamanın ana bileşeninde Auth0Provider’ı sağlayıcısını kullanarak kimlik doğrulama için gerekli ayarları yapın.

// app.module.ts

import { AuthModule } from '@auth0/auth0-angular';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AuthModule.forRoot({
      domain: 'YOUR_AUTH0_DOMAIN',
      clientId: 'YOUR_AUTH0_CLIENT_ID'
    })
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
Adım 5: Kimlik Doğrulama ve Yetkilendirme

Angular bileşenlerinizde, AuthService‘ı kullanarak kimlik doğrulama ve yetkilendirme işlemlerini gerçekleştirin.

// example.component.ts

import { AuthService } from '@auth0/auth0-angular';

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
  styleUrls: ['./example.component.css']
})
export class ExampleComponent {
  constructor(public auth: AuthService) { }
}
<!-- example.component.html -->

<div *ngIf="auth.isAuthenticated$ | async; else login">
  <p>Welcome, {{ (auth.user$ | async)?.name }}</p>
  <button (click)="auth.logout()">Log out</button>
</div>
<ng-template #login>
  <button (click)="auth.loginWithRedirect()">Log in</button>
</ng-template>

Yukarıdaki kod örneğinde, AuthService‘ı kullanarak kimlik doğrulama durumunu kontrol ediyoruz. Kullanıcı kimlik doğrulaması yapmışsa, hoş geldiniz mesajı ve çıkış düğmesi görüntülenir. Aksi takdirde, giriş düğmesi görüntülenir ve kullanıcı giriş yapmak için yönlendirilir.

Bu adımları takip ederek, Angular uygulamanızda Auth0 entegrasyonunu tamamlayabilirsiniz. Bu sayede kimlik doğrulama ve yetkilendirme işlemlerini güvenli bir şekilde yönetebilirsiniz.

Setting up an authentication service

Angular uygulamanızda kimlik doğrulamasını kurmak, genellikle bir dizi adımdan oluşur. Bunlardan biri, bir kimlik doğrulama servisi oluşturmak ve Angular uygulamanızla iletişim kurmaktır.

Authentication Service Oluşturma: İlk adım olarak, Angular uygulamanızda bir kimlik doğrulama servisi oluşturmanız gerekir. Bu servis, kimlik doğrulaması için gerekli işlevleri sağlar ve diğer bileşenlerle iletişim kurar. Aşağıdaki gibi bir yapı oluşturabilirsiniz:

// authentication.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AuthenticationService {
  private baseUrl = 'http://localhost:5000/api/auth'; // ASP.NET Core API URL'si

  constructor(private http: HttpClient) { }

  login(username: string, password: string): Observable<any> {
    return this.http.post(`${this.baseUrl}/login`, { username, password });
  }

  logout(): Observable<any> {
    return this.http.post(`${this.baseUrl}/logout`, {});
  }

  // İsteğe bağlı: Kullanıcı bilgilerini getirme metodu
  getUserInfo(): Observable<any> {
    return this.http.get(`${this.baseUrl}/userinfo`);
  }
}

Dependency Injection: AuthenticationService’yi kullanabilmek için, Angular bileşenlerine enjekte etmeniz gerekir. Bunu, Angular tarafından sağlanan Dependency Injection mekanizması ile yapabilirsiniz. Bunun için servisinizi Angular modülünüze ekleyin:

// app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule } from '@angular/common/http';

import { AppComponent } from './app.component';
import { AuthenticationService } from './authentication.service';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule
  ],
  providers: [AuthenticationService], // AuthenticationService'yi sağlayın
  bootstrap: [AppComponent]
})
export class AppModule { }

Kimlik Doğrulama İşlemlerini Kullanıcı Arayüzünde Uygulama: Angular bileşenlerinde kimlik doğrulama işlemlerini gerçekleştirmek için AuthenticationService’yi kullanabilirsiniz. Örneğin, bir giriş bileşeni aşağıdaki gibi olabilir:

// login.component.ts

import { Component } from '@angular/core';
import { AuthenticationService } from './authentication.service';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css']
})
export class LoginComponent {
  username: string;
  password: string;

  constructor(private authService: AuthenticationService) { }

  login() {
    this.authService.login(this.username, this.password).subscribe(
      response => {
        // Başarılı giriş işlemi
        console.log('Login successful');
        // İsteğe bağlı: Kullanıcı bilgilerini alma
        this.authService.getUserInfo().subscribe(
          userInfo => {
            console.log('User info:', userInfo);
          },
          error => {
            console.error('Failed to get user info:', error);
          }
        );
      },
      error => {
        console.error('Login failed:', error);
      }
    );
  }
}

Kimlik Doğrulama Sunucusu ile İletişim: Angular uygulamanızın kimlik doğrulama servisi, arka planda ASP.NET Core tabanlı bir API ile iletişim kurar. Bu API, kullanıcı kimlik doğrulama isteklerini işler. API’deki login ve logout gibi yönlendiricilerle eşleşen ASP.NET Core denetleyicileri bulunur ve bu isteklere yanıt verir.

Bu adımları takip ederek, Angular uygulamanızda kimlik doğrulamasını sağlamak için bir temel oluşturabilirsiniz. Bu, genellikle temel bir uygulama için yeterli olacaktır. Ancak, güvenlik gereksinimleriniz doğrultusunda daha fazla özellik eklemek veya özelleştirmek isteyebilirsiniz.

Handling authentication

Angular uygulamanızda kimlik doğrulamasını ele almanın bir yolu, kullanıcı oturumunu takip etmek ve kimlik doğrulaması gerektiren özelliklere erişimi kontrol etmek için bir mekanizma oluşturmaktır. Bu mekanizmayı oluşturmak için bazı adımları izlemeniz gerekecektir:

  1. Route Guards (Rota Koruyucuları): Angular’da rotaları korumak için route guards kullanılır. Bu, belirli bir rotaya erişimin izin verilip verilmediğini kontrol etmenize izin verir. Angular, üç tür rota koruyucusu sağlar: CanActivate, CanActivateChild ve CanLoad. Biz burada CanActivate‘i kullanacağız.
  2. Authentication Service ve Token Yönetimi: Kullanıcı oturumunu izlemek için bir AuthenticationService oluşturmanız gerekecek. Bu servis, kullanıcıyı kimlik doğrulamasına tabi tutar, oturum durumunu takip eder ve kimlik doğrulaması için kullanılan token’ları yönetir.
  3. Angular HTTP Interceptor: Kimlik doğrulaması için her HTTP isteği, yetkilendirme bilgileri içeren bir token ile gönderilmelidir. Bu, Angular’da HTTP interceptor kullanarak kolayca yapılabilir. Her istek gönderilmeden önce bu interceptor aracılığıyla token eklenir.

Şimdi, bu adımları kod örnekleriyle birlikte daha ayrıntılı olarak ele alalım:

1. Route Guard Oluşturma:

// auth.guard.ts

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { AuthenticationService } from './authentication.service';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate {

  constructor(
    private authService: AuthenticationService,
    private router: Router
  ) {}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
      if (this.authService.isLoggedIn()) {
        return true;
      } else {
        this.router.navigate(['/login']);
        return false;
      }
  }
}

2. Authentication Service ve Token Yönetimi:

// authentication.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AuthenticationService {
  private baseUrl = 'http://localhost:5000/api/auth'; // ASP.NET Core API URL'si
  private token: string;

  constructor(private http: HttpClient) { }

  login(username: string, password: string): Observable<any> {
    return this.http.post(`${this.baseUrl}/login`, { username, password })
      .pipe(
        map(response => {
          // Kullanıcı başarılı bir şekilde giriş yaptığında token'ı saklayın
          this.token = response.token;
          return response;
        })
      );
  }

  logout(): Observable<any> {
    // Oturumu sonlandırırken token'ı temizleyin
    this.token = null;
    return this.http.post(`${this.baseUrl}/logout`, {});
  }

  isLoggedIn(): boolean {
    // Token varsa, kullanıcı oturum açmış demektir
    return !!this.token;
  }
}

3. Angular HTTP Interceptor:

// token.interceptor.ts

import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';
import { AuthenticationService } from './authentication.service';

@Injectable()
export class TokenInterceptor implements HttpInterceptor {

  constructor(private authService: AuthenticationService) {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    // Her isteğe token ekleyin
    if (this.authService.isLoggedIn()) {
      request = request.clone({
        setHeaders: {
          Authorization: `Bearer ${this.authService.getToken()}`
        }
      });
    }
    return next.handle(request);
  }
}

4. Interceptor’ı AppModule’e Eklemek:

// app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { RouterModule } from '@angular/router';

import { AppComponent } from './app.component';
import { LoginComponent } from './login.component';
import { AuthGuard } from './auth.guard';
import { AuthenticationService } from './authentication.service';
import { TokenInterceptor } from './token.interceptor';

@NgModule({
  declarations: [
    AppComponent,
    LoginComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    RouterModule.forRoot([
      { path: 'login', component: LoginComponent },
      { path: 'dashboard', component: DashboardComponent, canActivate: [AuthGuard] },
      { path: '', redirectTo: '/login', pathMatch: 'full' }
    ])
  ],
  providers: [
    AuthenticationService,
    AuthGuard,
    { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true }
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

Bu şekilde, Angular uygulamanızda kimlik doğrulamasını ele alabilir ve kullanıcıları yetkilendirilmiş rotalara erişim konusunda kontrol edebilirsiniz. Bu örnek, temel bir kimlik doğrulama ve yetkilendirme sistemi sunar ve projenizin gereksinimlerine göre özelleştirilebilir.

AuthGuard

Angular uygulamalarında, rotalara erişim yetkisi sağlamak için AuthGuard adı verilen bir mekanizma kullanılır. Bu, belirli rotalara erişim iznini kontrol etmenize ve kullanıcıların giriş yapmamışsa belirli rotalara erişimlerini engellemenize olanak tanır. AuthGuard, bir rotanın erişimini kontrol etmek için Angular’daki route guards mekanizmasını kullanır.

1. AuthGuard Oluşturma:

// auth.guard.ts

import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { AuthenticationService } from './authentication.service';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate {

  constructor(
    private authService: AuthenticationService,
    private router: Router
  ) {}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
      // Kullanıcının oturum açıp açmadığını kontrol edin
      if (this.authService.isLoggedIn()) {
        return true; // Kullanıcı oturum açmışsa rotaya erişime izin verin
      } else {
        // Kullanıcı oturum açmamışsa, giriş sayfasına yönlendirin ve rotaya erişimi engelleyin
        this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }});
        return false;
      }
  }
}

2. AuthGuard’ı Rotalara Uygulama:

// app-routing.module.ts

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { LoginComponent } from './login/login.component';
import { AuthGuard } from './auth.guard';

const routes: Routes = [
  { path: '', component: HomeComponent, canActivate: [AuthGuard] },
  { path: 'login', component: LoginComponent },
  // Diğer rotalar...
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

3. AuthGuard Kullanarak Erişim Kontrolü:

AuthGuard’ı bir rotada kullanarak erişim kontrolü sağlayabilirsiniz. Örneğin, aşağıdaki gibi bir kullanıcı profili sayfası rotasında AuthGuard kullanımını görebiliriz:

// app-routing.module.ts

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { UserProfileComponent } from './user-profile/user-profile.component';
import { AuthGuard } from './auth.guard';

const routes: Routes = [
  { path: 'profile', component: UserProfileComponent, canActivate: [AuthGuard] },
  // Diğer rotalar...
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

Bu şekilde, UserProfileComponent rotasına erişmek isteyen kullanıcılar, öncelikle oturum açmış olmalıdır. Aksi halde, AuthGuard kullanıcıyı login sayfasına yönlendirir ve UserProfileComponent rotasına erişimi engeller.

AuthGuard, Angular uygulamanızda rotalara erişim yetkisi sağlamak için güçlü ve yaygın olarak kullanılan bir araçtır. Bu sayede, uygulamanızın güvenliğini artırabilir ve yetkilendirme sürecini yönetebilirsiniz.


Russet renkli boğazlı kazak ve beyaz çantalı bir kadının yandan profili. Gözleri kapalı yukarı bakıyor.

Sadece görülmeyeni gören imkansızı başarabilir. 

Frank L. Gaines

Bir sonraki yazıda görüşmek dileğiyle!”

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


6 + 6 = ?