Kiểu dữ liệu – Biến – Toán tử trong C#

Trong bài hôm nay, tui sẽ nói qua các kiểu dữ liệu built-in của C#, cách khai báo biến và các toán tử thường sử dụng. Bài này hơi lý thuyết một tí, nhưng cũng phải ngó qua một tí xem sao nhé các bạn.

1. Kiểu dữ liệu built-in:

Các thông tin mà chúng ta tiếp cận hằng ngày trên khắp mọi nẻo của phương tiện truyền thông ví dụ như:

  • Giá USD hôm nay bao nhiêu
  • Chỉ số chứng khoán hôm nay lên hay xuống
  • Hôm nay ai sẽ bị làm “củi” để đốt lò……

Để hiển thị, lưu trữ các thông tin này thì chúng ta cần có kiểu dữ liệu để mang nó vào trong chương trình và sau đó xử lý. Vậy kiểu dữ liệu là gì?

Kiểu dữ liệu (data type) là một tập hợp gồm các nhóm dữ liệu:

  • Có cùng đặc tính
  • Có cùng các lưu trữ
  • Có cùng cách thao tác xử lý

Cụ thể trong C#, có các loại kiểu dữ liệu built-in như sau:

Integer

Name .NET Type Description Range
sbyte System.SByte 8-bit signed integer -128:127 (-27 : 27 – 1)
short System.Int16 16-bit signed integer -32,768:32,767 (-215 : 215 – 1)
int System.Int32 32-bit signed integer -2,147,483,648:2,147,483,647 (-231 : 231 – 1)
long System.Int64 64-bit signed integer -9,223,372,036,854,775,808:
9,223,372,036,854,775,807 (-263 : 263 – 1)
byte System.Byte 8-bit unsigned integer 0:255 (0 : 28 – 1)
ushort System.UInt16 16-bit unsigned integer 0:65,535 (0 : 216 – 1)
uint System.UInt32 32-bit unsigned integer 0:4,294,967,295 (0 : 232 – 1)
ulong System.UInt64 64-bit unsigned integer 0:18,446,744,073,709,551,615 (0 : 264 – 1)

Floating-Point:

Name .NET Type Description Range
float System.Single 32-bit, single-precision
floating point
-3.4 x 1038 : 3.4 x 1038
double System.Double 64-bit, double-precision
floating point
±5.0 x 10-324 : ±1.7 x 10308

 

Decimal:

Name .NET Type Description Range
decimal System.Decimal 128-bit, high-precision decimal notation ±1.0 x 1028 : ±7.9 x 1028

 

Boolean:

Name .NET Type Description Range
bool System.Boolean True or false true or false

 

Char:

Name .NET Type Description Range
char System.Char Unicode character Represents a single 16-bit (Unicode) character

 

2. Biến – Variable:

Biến (variable) là một vùng bộ nhớ trên RAM, dùng để lưu giữ một giá trị nào đó khi chương trình đang chạy, và giá trị này có thể thay đổi hoặc không.

Một biến là một ánh xạ tương ứng của dữ liệu được chứa trên RAM.

Khai báo biến:

Khai báo biến trong C# được viết như sau:

<data_type> var_name;

hoặc:

<data_type> var_name = value | defined_var;

Giá trị phải tương ứng với kiểu dữ liệu

3. Toán tử – Operator:

Toán tử là các ký hiệu để thực thi một thao tác tính toán nào đó. C# cung cấp các loại toán tử như sau:

Simple Assignment Operators – Toán tử gán

  • Được sử dụng nhiều nhất khi lập trình.
  • Dùng để gán một giá trị hay một toán hạng bên phải cho toán hạng bên trái.
  • Ký hiệu là dấu “=”

Simple Arithmetic Operators – Toán tử số học

Giả sử có hai biến a = 17 và b = 4

Toán tử Mô tả Biểu thức Kết quả
+ Cộng a + b 21
Trừ a – b 13
* Nhân a * b 68
/ Chia (lấy phần nguyên) a / b 4
% Chia (lấy phần dư) a % b 1

 

Comparison Operators – Toán tử so sánh

Giả sử có hai biến a = 13 và b = 8

Toán tử tả Biểu thức Kết quả
> Lớn hơn a > b true
>= Lớn hơn hoặc bằng nhau a >= b true
< Nhỏ hơn a < b false
<= Nhỏ hơn hoặc bằng nhau a <= b false
== Bằng nhau a == b false
!= Không bằng nhau a != b true

 

Conditional Logical Operators – Toán tử logic điều kiện

Dùng để kết hợp kết quả của nhiều biểu thức điều kiện lại với nhau.

Giả sử có 4 biến: a = 10, b = 4, c = 5, d = 2

Toán tử Mô tả Biểu thức Kết quả
&& Logical AND (a > b) && (c > d) true
|| Logical OR (a < b) || (c > d) true
! Logical NOT !(a == b) true

 

Bitwise Operators – Toán tử logic trên bit

Đây là toán tử logic nhưng nó được sử dụng trên bit. Toán tử này cũng ít dùng

Toán tử tả Biểu thức
& Bitwise AND a & b
| Bitwise OR a | b
^ Bitwise XOR a ^ b
~ Bitwise Negation ~a

 

Shift Operators – Toán tử dịch chuyển bit

Là cách dịch bit qua trái hoặc qua phải. Sau khi dịch chuyển sang trái hoặc sang phải bao nhiêu bit, các bit còn trống thì thêm 0. Toán tử này cũng ít dùng, nên các bạn cũng không cần quan tâm nó nhiều lắm.

Giả sử: a = 34, b = 7

Toán tử tả Biểu thức Kết quả
>> Dịch sang phải 3 bit a >> 3 3
<< Dịch sang trái 3 bit b << 3 56

 

Increment and Decrement Operators – Toán tử tăng giảm

Dùng để tăng 1 hoặc giảm 1. Nó là kết hợp của một phép cộng/trừ với một phép gán.

Toán tử Biểu thức tả
++ (2 dấu cộng viết liền nhau) ++a Tăng giá trị thêm 1 và trả về giá trị mới
a++ Trả về giá trị hiện tại, sau đó tăng thêm 1
— (2 dấu trừ viết liền nhau) –a Giảm giả trị đi 1 và trả về giá trị mới
a– Trả về giá trị hiện tại, sau đó giảm đi 1

 

Assignment and Lambda Operators – Toán tử gán rút gọn

Cái này dùng hơi bị nhiều luôn nhé

Toán tử Biểu thức Biểu thức tương tương
+= a += (expr) a = a + (expr)
-= a -= (expr) a = a – (expr)
*= a *= (expr) a = a * (expr)
/= a /= (expr) a = a / (expr)
%= a %= (expr) a = a % (expr)
<<= a <<= (expr) a = a << (expr)
>>= a >>= (expr) a = a >> (expr)
&= a &= (expr) a = a & (expr)
|= a |= (expr) a = a | (expr)
^= a ^= (expr) a = a ^ (expr)

 

The Conditional Operator – Toán tử điều kiện

Condition ? expr_1 : expr_2;

Nếu condition có giá trị là true thì nó trả về expr_1, ngược lại thì trả về expr_2. Cái này khi học tới phần câu lệnh rẽ nhánh if, sẽ minh họa rõ hơn cho các bạn.

Tạm thời các bạn cứ chấp nhận như vậy đi. Sau này, khi vào các bài sau, có bài tập thì các bạn sẽ hiểu rõ hơn.

Read More

Tổng quan về ngôn ngữ C#

Do tui sẽ dùng ngôn ngữ C# là chính để minh họa các kỹ thuật lập trình, cho nên tui cũng muốn giới thiệu tổng quan về ngôn ngữ C# cho các bạn biết qua trước.

1. Lập trình là gì?

Nói theo cách bình dân học vụ thì lập trình là lập ra những chương trình bắt máy tính làm theo, thực thi một nhiệm vụ, một công việc nào đó. Ví dụ:

  • Chương trình giải phương trình bậc II
  • Chương trình soạn thảo notepad.
  • Chương trình kế toán.

Nhìn tổng thể thì một chương trình máy tính nó gồm 3 khối như sau:

2. Ngôn ngữ lập trình:

Để máy tính nó hiểu chúng ta muốn nói gì, thì phải có ngôn ngữ riêng để giao tiếp với nó, ra lệnh cho nó làm thì nó mới làm. Vậy là ngôn ngữ lập trình nó ra đời, tính đến thời điểm này thì có hàng tá ngôn ngữ từ dễ hiểu đến khó hiểu, ví dụ như: C, C++, C#, Java, PHP, Javascript, Python, Scala, Kotlin….. Đến đây, các bạn có thể ngạc nhiên: douma, mày giỏi dữ máy tính, hiểu hết hàng tá ngôn ngữ kia luôn hả?

Xin thưa là không, cái này chỉ là cách chúng ta chuyển tiếp ngôn ngữ tự nhiên (Tiếng Việt, Tiếng Tàu, Tiếng Thái, Tiếng Pháp….) sang ngôn ngữ lập trình thôi. Sau đó, sẽ có một trình biên dịch hoặc trình thông dịch để chuyển ngôn ngữ lập trình thành mã máy (chỉ là một dãy số 0 và 1) thì khi đó máy tính nó mới hiểu.

Cụ thể ở đây là ngôn ngữ C#. Có thể nói C# là ngôn ngữ chính trong .NET Framework của Microsoft với những điểm sáng sau:

  • C# là ngôn ngữ thuần hướng đối tượng.
  • Kết hợp được điểm mạnh của C/C++ và Java
  • Đơn giản, hiện đại, dễ học

3. Keyword trong C#:

Khi khai báo TÊN BIẾN, TÊN HÀM hoặc TÊN CLASS thì không được dùng những keyword này. Các keyword này đều phải viết chữ thường (lowercase) khi sử dụng.

abstract const extern int out short typeof
as continue false interface override sizeof uint
base decimal finally internal params stackalloc ulong
bool default fixed is private static unchecked
break delegate float lock protected string unsafe
byte do for long public struct ushort
case double foreach namespace readonly switch using
catch else goto new ref this virtual
char enum if null return throw void
checked event implicit object sbyte true volatile
class explicit in operator sealed try while

4. Quy tắc đặt tên biến, hàm, class:

  • Không có khoản trắng (space) giữa các ký tự.
  • Ký tự đầu tiên phải là: a-z, A-Z, _, @, không được là số 0-9 hoặc các ký tự đặc biệt: # % & ! *…
  • Các ký tự tiếp theo có thể là a-z, A-Z, 0-9, _, nhưng không chứa @ hoặc các ký tự đặc biệt: # % & ! *…

Để tiện cho việc thực hành, các bạn vào xem bài sau để cài đặt bộ Visual Studio bản Free:

https://codingpearls.com/revit-addin-csharp/cai-dat-visual-studio-2017-community.html

Read More

Sử dụng JSON để truyền nhận dữ liệu trong Restful

Trong bài Sử dụng tham số đường dẫn khi tạo Restful url, các bạn đã biết các truyền dữ liệu theo kiểu tham số của url endpoint rồi. Trong bài này, tui sẽ nói về việc sử dụng JSON để truyển nhận dữ liệu giữa Client và Server, nhưng trước tiên tui phải nói sơ qua JSON cho những ai chưa bao giờ biết JSON là gì.

1. JSON là gì?

JSON là viết tắt của cụm từ JavaScript Object Notation. Do Client chủ yếu sử dụng Javascript để tương tác và JSON chính là cách biểu diễn đối tượng trong Javascript luôn nên không cần phải có các bước parsing phức tạp như đối với XML. Đối với JSON, ta chỉ cần Key-Value để biểu diễn đối tượng cũng như dữ liệu. Ví dụ như sau:

Cặp dấu móc { } sẽ định nghĩa đó là một object, và trong object, có thể chứa object khác, ở đây property (hay là Key) “convertTo” là một object, còn các property khác là kiểu String. Để chứa nhiều object trong một array, ta dùng cặp dấu ngoặc vuông [ ].

Sơ sơ qua JSON là như vậy.

2. Lấy dữ liệu JSON từ Server bằng phương thức HTTP GET:

Ví dụ Client sẽ lấy danh sách các quyển sách thông qua endpoint http://localhost:9000/api/books, Server sẽ trả về danh sách giống như trên bằng JSON. Mở gile routes/api.php lên và thêm đoạn code sau:

$entries là một array chứa các array con là những quyển sách nha các bạn, hàm json() của đối tượng Response trong Laravel nó làm cái nhiệm vụ là convert cái array này sang JSON và trả về cho Client. Trong PHP, việc chuyển từ Array sang JSON và ngược lại rất dễ, các bạn sử dụng 2 cái hàm: json_encode() và json_decode() nha (search google để xem thêm nha). Còn trong Laravel thì nó đã làm sẳn cho mình luôn rồi, nên chỉ việc dùng thôi.

Postman để xem nhé:

 

Giờ tui muốn là Server trả về một object, có một property là “books” cá value là một array chứa các quyển sách trên như vầy thì bên Laravel code làm sao:

Các bạn chỉ cần sửa biến $entries lại như sau:

Lại Postman:

Các bạn chú ý sẽ thấy là cái key trong JSON nó giống với cái key trong Array của PHP nha các bạn.

3. Send dữ liệu JSON về Server bằng phương thức HTTP POST:

Cũng là endpoint http://localhost:9000/api/books nhưng với phương thức POST, chúng ta sẽ gửi về Server một quyển sách mới, Server nhận và append vào danh sách hiện tại và trả lại danh sách mới này cho Client. ví dụ ở đây, danh sách hiện tại có 2 quyển sách rồi nhé:

Nếu viết PHP bình thường, chúng ta phải dùng hàm json_decode() để lấy dữ liệu từ trong JSON ra, nhưng trong Laravel thì nó đã tích hợp luôn cái việc đó trong đối tượng Request. Cho nên khi đó, việc lấy từng giá trị thông qua các key tương ứng cũng giống như lấy dữ liệu từ form POST như kiểu làm bình thường thông qua hàm input() của Request.

Postman tiếp:

Chọn tab Body ở phía trên, sau đó click chọn raw, và chọn kiểu dữ liệu gửi đi là JSON(application/json), khi đó, Postman sẽ tự động thêm cái Header là Content-Type: application/json, nếu không thì bên Server sẽ không nhận được dữ liệu là nội dung JSON nha các bạn.

Tiếp theo, các bạn nhập nội dung JSON cần gửi về Server ở cái khung Text ngay bên dưới, Chọn phương thức là POST và click Send thì các bạn sẽ thấy cái list trả về có thêm cái nội dung quyển sách mới.

Chú ý, cái Body ở trên là để chúng ta nhập dữ liệu và gửi về Server, còn Body bên dưới là kết quả trả về (nếu có) từ Server nha các bạn.

OK, vậy là xong rồi đó, hy vọng các bạn có thể hiểu được cách làm việc với JSON.

Read More

Redis Pub/Sub – Cơ chế hoạt động – Cài đặt trên Windows

Chào các bạn. Đó giờ làm laravel, thấy cái thằng Redis chỉ được dùng làm cache nên cũng không quan tâm lắm, chỉ biết nó là dạng memory-database và lưu dữ liệu dạng key-value, hết. Hôm nay, tui lò mò tìm hiểu thì thấy Redis nó còn có một cơ chế gọi là Pub/Sub dùng để làm mấy cái ứng dụng realtime, cũng khá hay nha các bạn, nó giống như là thằng Kafka vậy dùng để làm message delivery tương tự như bài Xây dựng một Realtime Dashboard sử dụng Spark Streaming, Kafka, Nodejs và MongoDB. Bài hôm nay, chủ yếu hướng dẫn các bạn cài Redis trên Windows cũng như xem cái cơ chế Pub/Sub nó ra sau ha.

1. Cài đặt Redis trên Windows:

Nếu vào trang redis.io, các bạn không thấy cái mục download cho windows đâu, hình như là từ version 4.0, nó không còn hổ trợ cho Windows nữa hay sau đó. Nhưng không sau, các bạn vào link sau để tải về nhá: https://github.com/MicrosoftArchive/redis/releases

Chọn version là 3.2.100 (64 bit nhé), và download cái file zip như hình sau:

download xong, các bạn unzip nó ra thư mục nào cũng được, trong bài này tui unzip nó ra thư mục E:\Server\redis\3.2.100, như sau:

Các bạn chú ý 2 cái file: redis-server.exeredis-cli.exe, lát mình sẽ chạy 2 file này để làm demo.

2. Cơ chế Pub/Sub:

  • Pub: Publish, có nghĩa là một producer đẩy dữ liệu vào một channel (kênh) hay còn gọi là topic như trong Kafka
  • Sub: Subscribe có nghĩa là một consumer đăng ký nhận dữ liệu từ một channel hay topic.

Hiểu đơn giản tí, giống như xem truyền hình cáp vậy (ví dụ như SCTV), chúng ta là các consumer, đăng ký (subscribe) vào các kênh như: VTV1, VTV3, VTV6, HBO, Fox Movies…. thì SCTV chính là một producer, đẩy dữ liệu (publish) ra các kênh tương ứng đó và chúng ta chỉ nhận và xem trên TV thôi.

Như hình trên, một subscriber có thể đăng ký nhận data từ nhiều kênh nha các bạn.

3. Demo cơ chế Pub/Sub của Redis:

Do demo chỉ làm trên console, cho nên tui giả sử các bạn đều chuyển về ngay thư mục của Redis (cái thư mục mà unzip hồi nảy), như trong bài thì tui chuyển về thư mục E:\Server\redis\3.2.100 này hết nha.

Mở cmd đầu tiên lên và chạy lệnh:

Nếu nó ra như thế này có nghĩa là Redis Server đã run:

Chú ý: mặc định thì Redis nó listen ở port 6379. Để change thành port 7777, các bạn thêm tham số –port như sau:

Tiếp theo, mở 3 cái cmd lên, chạy cùng một lệnh:

Chúng ta quy định như hình trên nha, 1 PUBLISHER và 2 SUBSCRIBER

ở SUBCRIBER 1, các bạn đăng ký 2 kênh là channel-a và channel-b bằng lệnh subscribe:

ở SUBSCRIBER 2, các bạn đăng ký 1 kênh là channel-a

sau đó, ở PUBLISHER, các bạn phát một message là “Welcome to Channel A” ở channel-a bằng lệnh publish:

thì lập tức ở SUBSCRIBE 1 và SUBSCRIBE 2 sẽ hiện ra đoạn text trên:

Nếu bây giờ, ở PUBLISHER, các bạn phát một message “Welcome to Channel B” ở channel-b:

thì các bạn chỉ thấy SUBSCRIBER 1 nhận cái message đó thôi.

Đấy là cơ chế Pub/Sub của Redis, sau này có thời gian, tui sẽ làm một bài về việc dùng Redis Pub/Sub này kết hợp với Laravel Broadcasting cùng với socket.io để làm cái ứng dụng send message nho nhỏ. Vậy nhé, hẹn gặp lại.

Read More

Sử dụng tham số đường dẫn khi tạo Restful url

Ở bài trước, tui đã làm một cái RESTful endpoint cho các bạn xem thấy cũng ngon ăn ha, dễ òm. Nhưng cuộc đời nó không có đơn giản như vậy và RESTful cũng thế. Trong bài hôm nay, tui sẽ nói về cách sử dụng tham số đường dẫn (path parameter) trong url endpoint.

1. Tham số đường dẫn:

Với một url endpoint, nếu đi với các HTTP verb khác nhau, chúng ta sẽ có những endpoint khác nhau. Do đó, nếu cùng một url endpoint, cùng 1 HTTP verb, nếu số lượng tham số đường dẫn khác nhau cũng sẽ tạo ra các endpoint khác nhau.

Nhìn cái hình trên chắc cũng rõ ràng hơn rồi ha. Đó là cách chúng ta truyền tham số từ phía Client, vậy bên Server chúng ta phải định nghĩa như thế nào để nhận các tham số đó.

Với Url đầu tiên, ta viết như thế này:

{name} là biến parameter của url endpoint, tương ứng với giá trị “peter”, tới chổ này, chúng ta chỉ mới làm cái chổ để nhận giá trị là “peter” thôi. Tiếp theo, chúng ta phải đưa được cái giá trị này vào trong cái hàm callback để xử lý. Trong hàm callback, chúng ta phải khai báo một biến parameter của hàm là $name, biến này là biến của PHP nha và tên biến nên giống tên biến trên cái url để dễ nhớ (các bạn có thể đặt tên biến của hàm callback là $name1, $your_name…, không nhất thiết phải giống nha, nhưng tui khuyên là nên giống, hehe). Túm lại là:

Thử thôi, mở file routes/api.php ra và viết cái đoạn code trên:

Mở Postman lên và gõ cái url: http://localhost:9000/api/hello/peter, kết quả là:

Các bạn có thể thử đổi tên biến $name thành $your_name, rồi thử coi sao nhé.

2. Thứ tự của các tham số đường dẫn trong url:

OK, coi như các bạn đã thử và chạy ngon. Ta xem tiếp cái url thứ 2:

Trên url ta có 2 parameters, thì bên dưới hàm callback cũng phải có 2 cái parameters tương ứng (tên biến thì đã nói như ở trên ha). Viết thử coi sao:

lại Postman:

Oh, quá ngon, chạy mượt. Nhưng giờ các bạn thử đổi thứ tự biến parameter của hàm callback xem sao từ $name, $age thành $age, $name, tên biến thì giữ nguyên y chang:

Postman again:

Ngạc nhiên chưa, giá trị của biến $age = {name} = peter và biến $name = {age} = 25. Tại sao lại bị vậy, lý do? Đó là do thứ tự các biến trên url và trong hàm callback không giống nhau. Vậy từ chổ này, các bạn nhớ cho tui là:

Khi sử dụng tham số đường dẫn, nếu có từ 2 tham số (parameter) trở lên: tên biến có thể giống/khác nhau, nhưng thứ tự các biến tham số phải giống nhau trên cả url và hàm callback

3. Tham số tùy chọn:

Giả sử tui có cái url endpoint như sau: http://localhost:9000/api/age-permission/{age}, nếu như từ 18 tuổi trở lên thì truyền age vào, còn nếu nhỏ hơn 18 tuổi thì không cần truyền:

Từ 18 ==> http://localhost:9000/api/age-permission/20

Dưới 18 ==> http://localhost:9000/api/age-permission

Khí đó các bạn sẽ cho biến {age} thành {age?} là một biến option và giá trị default của biến $age trong hàm callback là 17, viết như sau:

Nếu có từ 2 tham số trở lên, các tham số tùy chọn (option parameter) thường để ở phía sau cùng

Thử viết xem sao:

Still Postman:

 

Xong, các bạn từ từ khám phá nha. Hẹn gặp lại!

Read More

Restful là gì? Tạo restful api với Laravel 5

Dạo gần đây, tui có build một số RESTful web service (đại khái là tạo một tập hợp các api) để cho một số ứng dụng khác kết nối vào. Nhân tiện, tui sẽ viết một số bài về việc sử dụng Laravel (version lúc đang viết là 5.6) để tạo RESTful api. Kiến thức của tui có bao nhiêu, tui sẽ viết ra bấy nhiêu, mong là giúp được ít nhiều cho các bạn. Vậy Restful là gì? Xem tiếp nào!

Laravel cũng có một framework dạng rút gọn chỉ để làm RESTful, đó là lumen

1. RESTful là gì?

Trước khi viết RESTful api, thì chúng ta cũng cần hiểu cái chữ REST nó là gì để nếu các bạn có đi phỏng vấn xin việc mà bị người ta hỏi thì cũng biết đường mà trả lời.

REST là viết tắt của cụm từ: Respresentational State Transfer. REST dựa vào các verb của HTTP (GET, POST, PUT, DELETE, PATCH, OPTIONS) để truyền và nhận dữ liệu giữa Client và Server. Cùng một url (ví dụ: http://my-domain.com/api/user) hay còn gọi là endpoint, nhưng với GET thì ta có một endpoint, với POST ta lại có một endpoint khác (khác ở đây có nghĩa là cách xử lý và trả dữ liệu về cho client), điều này giúp chúng ta thuận tiện hơn trong việc quản lý các endpoint này, dễ chỉnh sửa và thay đổi hơn so với dùng SOAP.

Đối với một trang web bình thường (ví dụ như là wordpress chẳng hạn), khi web browser gửi một request thông qua cái url như trên thì Server sẽ xử lý và trả về một trang HTML, sau đó web browser nhận và hiển thị trang HTML này ra

Còn đối với RESTful thì client có thể là Web Browser hoặc cũng có thể là một Mobile App, thậm chí là một Web Service khác, thì dữ liệu truyền nhận qua lại chủ yếu là JSON.

Cuối cùng, một điều cần lưu ý là, mối quan hệ giữ Client và Server lúc này là Stateless, có nghĩa là Server không cần biết Client là ai, Server cũng không cần phải lưu session đối với client giống như website “truyền thống”. Server lúc này chỉ cần biết là: à, có một request tới và thỏa một số điều kiện của mình (cần access token chẳng hạn), và mình xử lý và trả dữ liệu cho Client thôi, chấm hết, không day dưa  Happy-Grin

2. Tạo Laravel project:

Trong phạm vi bài này, tui không hướng dẫn chi tiết cái Laravel ra sao nha, chỉ làm nhanh gọn các lệnh thôi sau đó review qua cái cấu trúc thư mục để viết Restful.

Tạo Laravel project:

Đứng ngay thư mục <learn-restful>, tạo app key:

Xong xuôi, các bạn sẽ có cây thư mục như thế này:

Laravel có cung cấp cho chúng ta một cái Web Server nho nhỏ, vừa đủ để test, không cần phải cái Apache luôn. Thử coi cái project có chạy ổn không, ngay tại thư mục <learn-restful> các bạn gõ lệnh:

Sau đó, mở Web Browser lên, gõ: http://localhost:9000 hoặc http://127.0.0.1:9000 xem coi có thấy chữ Laravel to đùng hiện ra không, nếu có thì coi như ta setup project ổn.

Nếu chạy lệnh trên mà không có tham số –port=9000, thì mặc định Server nó sẽ listen ở port 8000

3. Tạo endpoint cho Restful:

Cũng giống như làm web, chúng ta cũng cần phải tạo một cái route để làm endpoint. Trong thư mục routes, các bạn thấy các file sau:

Ở đây chúng ta đang bàn luận về Restful, nên chỉ chú ý đến file api.php thôi, đây là file chứa tất cả các endpoint dùng để xử lý các request từ client. Mở file api.php lên, các bạn thấy nội dung như sau:

Khoan hãy quan tâm đến 3 dòng code từ 16-18, chúng ta sẽ bàn sau. Các bạn chú ý là để nhận request từ client, các bạn phải import thư viện Illuminate\Http\Request nhé bằng từ khóa use

Tới đây, tui muốn tạo một url endpoint như sau: http://localhost:9000/api/hello-world, thì Server sẽ trả về nội dung là “Hello World! Welcome to codingpearls.com”. Mở file api.php, thêm đoạn code như sau:

Hàm Route::get(), có nghĩa là Server sẽ xử lý endpoint này với HTTP verb là GET. tham số thứ nhất chính là url (tạm gọi là part endpoint), tham số thứ 2 chính là một callback function xử lý tương ứng với enpoint này.

Chú ý, các bạn có thấy phân cách giữa domain hoặc subdomain với “hello-world” là chữ “api” không? Tại sao chúng ta không có gõ chữ “api” này trong cái endpoint mà trong cái url lại có. Đáng lẽ phải gõ endpoint là “/api/hello-world” mới đúng chứ? Ở đây các bạn có thể hiểu api chính là prefix của cái endpoint “hello-world”. Giả sử chúng ta có 10 cái endpoint, chẳng lẽ chúng ta lại phãi gõ chữ “api” 10 lần cho 10 cái endpoint à? Kiểu như vầy

Route::get(‘/api/hello-world’, function…)
Route::get(‘/api/hello-world1’, function…)
Route::get(‘/api/hello-world2’, function…)
Route::get(‘/api/hello-world3’, function…)

Để thuận tiện, Laravel mới tạo cái prefix là “api” để cho thuận tiện trong việc viết code, cũng như sửa prefix endpoint, và cái prefix này ở đâu? nó nằm trong file app\Providers\RouteServiceProvider.php.

Mở file này lên, tìm đến hàm mapApiRoutes():

Chính nó, hàm Route::prefix(‘api’), các bạn thử đổi chữ “api” thành chữ khác, ví dụ: “rest-api” chẳng hạn, xong gõ lại cái url là http://localhost:9000/rest-api/hello-world xem sao nhé.

Với Web browser, chúng ta không thể test được với các HTTP verb khác như POST, PUT, DELETE chẳng hạn. Do đó, chúng ta sẽ sử dụng cái app của Chrome là Postman để làm client. Các bạn search bằng từ khóa “chrome postman” rồi cài cái app này vào trình duyệt Chrome nhé. Và sau này sẽ dùng Postman là chính để test cái url endpoint.

Đây là giao diện của Postman:

Bài đầu tiên về RESTful đến đây là kết thúc, hẹn các bạn trong các bài kế tiếp để tìm hiểu sâu hơn về cách login, tạo token, cách sử dụng middleware để verify token, cách nhận json data từ client ..v.v.  Bye

Read More

Tạo Authentication cho module Backend và Frontend trong Laravel 5

Cũng lâu lắm rồi mới có thời gian viết bài mới. Hôm nay, tui sẽ trình bày cách để tạo authentication cho từng module Frontend và Backend. Ở đây tui sẽ mặc định là chúng ta đã tạo 2 module là Frontend và Backend nhé (các bạn có thể xem tại đây).

1. Cấu trúc thư mục:

Giả sử tui có một project tên rubik có các thư mục module BackendFrontend như sau:

2. Database để login:

Để login, giả sử tui có 2 table là usercustomer ở dưới database tương ứng để login ở BackendFrontend như sau:

Database script để tạo 2 table này:

Mỗi table có sẵn 1 account để tí nữa test login

  • alibaba@gmail.com/112233 (user)
  • aladin@gmail.com/123123 (customer)

Các bạn cần tạo model tương ứng cho 2 table trên. Tại thư mục framework/app, các bạn tạo một thư mục tên là Models, trong thư mục Models này, các bạn tạo 2 file model lần lượt là User.phpCustomer.php

Thêm namespace App\Models và file composer.json ở phần psr-4

Bậy giờ các bạn viết phần nội dung cho 2 file User.phpCustomer.php. Có 2 cách:

Một là các bạn extends cái class Illuminate\Foundation\Auth\User có sẵn của nó (xem cái file app/User.php có sẵn thì nó làm theo cách này). Hai là các bạn tự viết lại. Ở đây tui sẽ dùng 2 cách cho 2 file Models/User.phpModels/Customer.php

Models/User.php:

Models/Customer.php:

Kết nối database:

Các bạn mở file framework/.env, edit các biến sau:

Tùy theo username, password của mysql của các bạn là gì thì ghi vô cho đúng nha.

Nếu các bạn có dùng prefix khi tạo table giống tui, thì các bạn mở file config/database.php, tìm cái phần mysql trong mục connections, edit lại phần prefix:

3. Tạo Authentication Provider và Guard:

Trong Laravel 5.4, cơ chế login là dựa trên provider. Mỗi provider sẽ tương ứng với một Model. Ở đây ta có 2 Model là User và Customer dùng để login ở Backend và Frontend, vậy ta cần có 2 provider.

Để sử dụng Provider này trong Controller, Middleware hoặc View, ta cần tạo Guard. Mỗi Guard sẽ ứng với một Provider, 2 Guard khác nhau có thể dùng cùng 1 Provider.

Các bạn mở file framework/config/auth.php

Tìm mục providers, bạn sẽ thấy nó có 1 sẵn cái provider là users, kệ nó, mình thêm vào 2 cái của mình là admincustomer (đặt tên là gì cũng được, đây là key của array):

Có Provider rồi, các bạn tìm cái phần guards (cũng trong file framework/config/auth.php), nó có sẵn 2 cái guard là web và api, cũng kệ nó luôn, tạo 2 cái guard tên là admincustomer (đặt tên gì cũng được, không nhất thiết phải giống với Provider):

Các bạn chú ý là ở phần providers các bạn đặt tên là gì thì ở phần guards, trong cái phần provider thì các bạn ghi đúng cái tên đó nha.

4. Tạo trang login và AuthController:

Sau khi có Provider và Guard rồi, chúng ta làm trang login. Do phần login ở Backend và Frontend đều như nhau, chỉ khác nhau là dùng guard nào thôi, cho nên tui sẽ làm phần Backend, còn phần Frontend thì tương tự nhé

4.1. Tạo view cho trang login:

Tại thư mục Backend/Views, tạo thư mục admin.

Trong thư mục Backend/Views/admin, tạo file login.blade.php:

4.2. Tạo AuthController:

Tại thư mục Backend/Controllers, tạo file AuthController.php:

Chú ý hàm getLogin sẽ trả về giao diện là trang login

Để khi gõ url: http://localhost:8080/learning/rubik/admin/login, cái Route nó hiểu và gọi hàm getLogin của AuthController thì chúng ta phải edit lại cái file Backend/routes.php như sau:

Chú ý cái parameter của hàm group: ‘namespace’ => ‘App\Modules\Backend\Controllers’. Nếu không dùng cái parameter này thì ngay chổ phần gọi hàm của controller, các bạn phải viết đầy đủ namespace như vầy:

Giờ mà các bạn gõ url http://localhost:8080/learning/rubik/admin/login mà nó ra như sau là ok:

4.3. Xử lý phần validate email và password:

Thêm hàm postLogingetLogout vào file Backend/Controllers/AuthController.php:

Edit lại file Backend/routes.php, thêm 2 cái Route cho validate login và logout:

Giờ nếu các bạn click nút “Login” thì nó sẽ báo lỗi (1/1) TokenMismatchException, lý do là Laravel nó sẽ kiểm tra cái token mỗi khi bạn thực hiện một POST request để tránh trường hợp bị cái lỗi Flood Post.

Để thêm cái token, các bạn edit trang Backend/Views/login.blade.php như sau:

Test thôi,

Không ghi email, password gì cả, click “Login” mà nó báo lỗi là ok:

Nhập email: alibaba@gmail.com, password: 112233 mà nó vào được trang Hello Backend có cái link Logout là ok luôn.

Đó là phần login cho Backend, tương tự cho phần Frontend, các bạn gọi cái guard là customer thay cho cái guard admin. Nhớ là cái namespace của Frontend là App\Modules\Frontend\Controllers, chổ nào là Backend thì thay bằng Frontend.

Tại thư mục Frontend/Controllers, tạo file AuthController.php:

Tại thư mục Frontend/Views, tạo thư mục customer.

Trong thư mục Frontend/Views/customer, tạo file login.blade.php:

Edit lại file Frontend/routes.php, thêm 2 cái Route cho validate login và logout:

Nhập email: aladin@gmail.com, password: 123123 để test như phần Backend.

Tới đây, có một vấn đề là nếu bạn không login, thì bạn vẫn vào được trang Hello Backend. Đó là do chúng ta chưa validate được là user đã login hay chưa. Để làm việc này, chúng ta phải dùng Middleware.

5. Tạo Authentication Middleware:

Trong Laravel 5, middleware đóng vai trò là bộ lọc (filter) các request, các bạn tưởng tượng nó như các lớp của củ hành tây vậy. Các request phải “xuyên qua” hết các lớp này thì mới thực thi các callback function của Route hay Controller tương ứng. Do đó ta cũng áp dụng cơ chế này để validate xem user đã login chưa?

  • Nếu login rồi thì thôi, tiếp tục thực hiện.
  • Chưa login, cho về lại trang login

Chúng ta có thể dùng một Middleware cho 2 Module Backend và Frontend, nhưng như thế thì khó quản lý code lắm. Cho nên tui sẽ làm 2 cái Middleware tương ứng cho 2 module Backend và Frontend

5.1. Tạo Middleware cho Backend và Frontend:

Tại thư mục Modules/Backend/Middleware, tạo file AdminAuthentication.php:

Tại thư mục Modules/Frontend/Middleware, tạo file CustomerAuthentication.php:

các bạn chú ý cái namespace App\Modules\Backend\MiddlewareApp\Modules\Frontend\Middleware cũng như 2 cái guard là admincustomer nha.

Để Laravel nó chạy 2 cái Middleware này, các bạn mở file app\Http\Kernel.php, tìm cái biến array $routeMiddleware, thêm vào cuối array này 2 dòng như sau:

Cái hàm xử lý chính trong việc kiểm tra là đã login hay chưa là hàm:

nếu đã login thì thôi, tiếp tục. Còn nếu chưa login thì phần xử lý này nó nằm trong file app/Exceptions/Handler.php, hàm unauthenticated như sau:

Nếu để vậy nó không chạy đâu, các bạn sửa lại tí:

Đổi dòng

thành

Cuối cùng, để dùng 2 cái middleware admin_authcustomer_auth, thì các bạn có thể gọi hàm middleware của Route như sau:

Mở file Backend/routes.php:

thêm hàm middleware vào sau hàm get:

hoặc vào trước hàm get;

Test thôi! Logout nếu đang ở trang Hello Backend. Thử gõ url http://localhost:8080/learning/rubik/admin thì nó sẽ redirect về trang login. Làm tương tự cho file Frontend/routes.php và dùng middleware là customer_auth.

Ngoài ra, nếu cái Route của các bạn gọi hàm của Controller thì các bạn có thể gọi middleware trực tiếp trong Controller luôn và gọi ở hàm __construct(), không cần gọi hàm middleware của Route như trên nữa.

Ví dụ, tui có DashboardController trong Backend:

Trên đây là những gì tui biết về phần Authentication trong Laravel 5, tuy bài viết hơi dài, nhưng các phần đều có liên quan với nhau. Hi vọng là bài này sẽ giúp giải đáp phần nào thắc mắc của các bạn về phần Authentication.  THANK-YOU

Read More

Tạo module Backend và Frontend trong Laravel 5

Xem bài viết version 2

Lúc trước trong series “Xây dựng website QUIZ“, tui có hướng dẫn tạo module. Hôm nay tui sẽ viết lại cái phần tạo module cho Laravel 5.4 thành một bài dạng tips để cho mọi người tiện tham khảo. Bắt đầu nào!

1. Tạo project và các thư mục:

Giả sử, thư mục WEB_ROOT cho project này hiện lại là E:\Server\www\learning:

Tại thư mục WEB_ROOT:

Sau khi tạo xong (không nhất thiết là đặt cái tên là framework nha các bạn, đặt tên gì cũng được), các bạn sẽ có cây thư mục như sau:

Copy các file và thư mục trong thư mục framework/public ra ngoài thư mục rubik như sau:

Mở file rubik/index.php lên,  tim đến 2 dòng sau:

và thay dấu “..” thành tên thư mục “framework” như sau:

Đó là phần Frontend, tiếp theo cũng trong thư mục rubik, tạo thư mục tên là admin cho phần Backend và cũng copy tất cả các file và thư mục trong framework/public vào thư mục admin này:

Mở file admin/index.php lên, tìm 2 dòng sau:

và edit lại như sau:

Do chúng ta copy các file này từ thư mục framework/public ra bên ngoài, cho nên mục đích của việc edit 2 file index.php này là để dẫn lại đường dẫn cho đúng.

Tiếp, chúng ta phải override lại cái hàm public_path(), lý do là ta đã sửa cái thư mục public mặc định thành thư mục gốc rồi. Mở file app\Providers\AppServiceProvider.php, thêm như sau:

Khi gọi hàm helper puclic_path(), các bạn sẽ thấy nó trả về cái thư mục gốc chứa file index.php.

Nếu thử gõ 2 cái url: http://localhost:8080/learning/rubik và http://localhost:8080/learning/rubik/admin mà hiện ra như sau là ổn:

Sau khi tạo xong, các bạn nên xóa cái thư mục framework/public đi, hoặc khi upload source code lên host thì không cần upload thư mục framework/public này.

2. Tạo module Backend và Frontend:

Trước tiên, tại thư mục framework/app, chúng ta tạo thư mục Modules với các thư mục con và file tương ứng như sau:

Sau đó, tại thư mục framework/config, chúng ta tao một file tên là module.php:

Nội dung cho file config/module.php như sau:

Mục đích của việc tạo file config/module.php là để kiểm tra cái url khi nào là vào frontend hoặc backend để điều hướng xửa lý vào các thư mục chứa code tương ứng trong Modules/Backend hay Modules/Frontend.

Để làm việc này, ta phải viết code cho file Modules/ModuleServiceProvider.php như sau:

Để Laravel nó load được cái file ModuleServiceProvider.php này, các bạn mở file framework/config/app.php lên, tìm đến phần array providers (dòng 138), và thêm vào cuối array này dòng App\Modules\ModuleServiceProvider::class

Để cho chắc chắn rằng Laravel 5 nó hiểu cái namespace App\Modules, chúng ta mở file framework/composer.json, tìm đến mục psr-4 nằm trong mục autoload:

Thêm như sau:

3. Xử lý route url cho từng module:

Phần trước, chúng ta đã tạo file routes.php tương ứng cho từng module Backend và Frontend. Bây giờ, trong mỗi file routes.php này, chúng ta sẽ tạo các Route để xem cái ModuleServiceProvider.php nó có thực hiện đúng hay không nha.

Nếu url là http://localhost:8080/learning/rubik thì sẽ in ra câu “Hello Frontend”

Nếu url là http://localhost:8080/learning/rubik/admin thì sẽ in ra câu “Hello Backend”

Nhưng trước hết là chúng ta phải bỏ cái Route xử lý hiển thị cái view mặc định hiển thị chữ “Laravel” to đùng như ở trên đã. Các bạn mở file framework/routes/web.php lên:

và xóa hoặc comment lại cái Route xử lý trang welcome:

Xong, tiếp theo là code cho 2 file routes.php nha

Backend/routes.php

Frontend/routes.php

Thử nào:

  • Url là http://localhost:8080/learning/rubik thì sẽ in ra câu “Hello Frontend”.
  • Url là http://localhost:8080/learning/rubik/admin thì sẽ in ra câu “Hello Backend”.

Nếu hiển thị đúng như vậy thì cái file Modules/ModuleServiceProvider.php nó đã được load và xử đúng. Tui làm được thì các bạn cũng làm được.  THANK-YOU

 

Read More

Cài đặt Visual Studio 2017 Community

Trước đây tui có sài bản Visual Studio Express thì thấy nó thiếu một số chức năng về mặt debug hay run một cái chương trình bên ngoài để debug nên cũng ít quan tâm cái version này. Hôm nay, thấy bản 2017 community có vẻ ngon hơn rồi (bản community là free nha), cài thử xem sao.

Đầu tiên, vào trang web này để download: https://www.visualstudio.com/downloads, như hình sau:

(more…)

Read More

Bài 05 – Backend: Xây dựng trang login

Chào các bạn. Hôm nay tui trở lại với series Xây dựng hệ thống làm trắc nghiệm Quiz. Hiện tại, version mới nhất của Laravel là 5.4, cho nên từ bài này trở đi, tui sẽ làm trên version 5.4 luôn nha. Các bài trước thì lúc đó Laravel vẫn còn là 5.2 nhưng nó không có khác biệt gì lắm đâu, những thao tác của các bài trước làm trên 5.2 thì vẫn có thể làm được trên 5.4. Vậy thống nhất là dùng version 5.4 nha các bạn.

Bài hôm nay sẽ hướng dẫn các bạn tạo một trang login cho module backend, Nói thì nghe dê lắm luôn, nhưng các bạn phải làm các việc sau:

  • Tạo cái User model (đã tạo ở bài trước rồi hen).
  • Tạo cái view cho trang login.
  • Tạo cái Controller để hiển thì trang login, logout.
  • Tạo cái Middleware để kiểm tra xem nếu user chưa login thì sao, mà login rồi thì sao.

Sơ sơ là 4 cái việc như vậy, tiểu tiết thì nhiều. Nhưng trước khi làm, tui muốn update cái phần ModuleServiceProvider tạo ở bài 02 để các bạn nếu có dùng subdomain cho phần admin (ví dụ: admin.mywebsite.com) thì vẫn đáp ứng được. (more…)

Read More