Suy nghĩ một chút về các MVC framework

24 views
Skip to first unread message

Huy

unread,
Jan 16, 2008, 1:04:53 PM1/16/08
to PHPVietnam
Tôi chợt nhớ về thời kỳ cách đây khỏang hơn 2 năm khi tôi mới bắt đầu
tập làm web.

Lúc đó sử dụng free host và design từng trang một bằng FrontPage.
"Website" của tôi là một cấu trúc thư mục thực sự với các file HTML.
Kiểu như:
/about/index.html
/news/news-1.html
...

Ngày nay chúng ta sử dụng các MVC framework. Website có cấu trúc như
sau:

/:controller/:action


Vậy nếu tôi muốn website của tôi có cây thư mục sâu hơn thì sao ?

Theo tôi cấu trúc controller/action không phản ánh được bản chất của
một website như tôi hình dung cách đây 2 năm. :D

Viết lung tung chút xíu cho vui, bà con thích thì thảo luận tý :D!

Huy

unread,
Jan 16, 2008, 1:08:02 PM1/16/08
to PHPVietnam
À, tôi viết rõ hơn chút.

Ý tôi là, mô hình MVC này cố quy một website thành các action, module
thay vì các trang, thư mục như lẽ ra nó phải như thế :D.

Huy

unread,
Jan 16, 2008, 1:26:32 PM1/16/08
to PHPVietnam
Tôi lại viết rõ thêm chút nữa :D.

Ví dụ với một web site được xây dựng từ MVC framework như symfony,
Cake... khi chúng ta vào một trang, chúng ta đã gọi một action được
cài đặt sẵn trên website đó, thay vì truy cập vào một web page

Ví dụ:
site.com/user/new -> gọi function new thuộc controller user thay vì
truy cập vào trang web "new" thuộc thư mục "user".

Tất nhiên, đây sẽ chỉ trở thành vấn đề nếu chúng ta đi sâu vào "bản
chất".
Vậy, như trên, với một MVC framework, chúng ta đang xây dựng một cái
gì ? Một application hay một web site ?
Không, weblog của tôi sắp ra mắt là một web site chứ không phải là một
application. Vậy nhưng tôi đã dùng Cake, và kiến trúc bên trong của nó
không phải là kiến trúc của một web site theo cách hiểu "strict".

Vậy tôi nghĩ kiến trúc MVC mà symfony, Cake, Rails, Spring, Struts
đang theo đuổi ... không hợp để làm web site :D.

Nguyen Kha

unread,
Jan 16, 2008, 5:08:49 PM1/16/08
to phpvi...@googlegroups.com
Chúng ta còn có thể sử dụng router mà, đâu phải nhất thiết cứ phải theo kiểu /:controller/:action

An Vu

unread,
Jan 16, 2008, 6:46:48 PM1/16/08
to phpvi...@googlegroups.com
thật ra tôi ko hiểu bác Huy đang nói gì. Ví dụ trong symfony, không có controller/action mà chỉ có module/action, và các action được đặt trong các module chỉ để chia nhóm dễ quản lý. Còn những thứ hiện trên url thì hoàn toàn có thể tuỳ biến được, như bác Kha nói, đó là sử dụng routing, mà routing thực chất cũng chỉ là .htaccess

On 1/17/08, Nguyen Kha <dongu...@gmail.com> wrote:
Chúng ta còn có thể sử dụng router mà, đâu phải nhất thiết cứ phải theo kiểu /:controller/:action





--
An Vũ
http://www.symfony.vn

Huy

unread,
Jan 16, 2008, 9:19:28 PM1/16/08
to PHPVietnam
Bác An Vu ko hiểu ý tôi à ?

Đây không phải là vấn đề về URL. symfony chỉ dùng từ ngữ khác thôi,
bản chất nó vẫn vậy đúng ko ?

Vấn đề là ở cái "bản chất".

Trước đây tôi làm web tĩnh, tôi làm ra các file HTML cố định cho từng
trang. Bây giờ với Cake chẳng hạn, tôi không tạo ra các "trang" mà tạo
ra các "action". Mà bản chất của web từ khi nó ra đời đến nay đâu phải
là các "action" đúng không ?

On Jan 17, 6:46 am, "An Vu" <a...@toan2.com> wrote:
> thật ra tôi ko hiểu bác Huy đang nói gì. Ví dụ trong symfony, không có
> controller/action mà chỉ có module/action, và các action được đặt trong các
> module chỉ để chia nhóm dễ quản lý. Còn những thứ hiện trên url thì hoàn
> toàn có thể tuỳ biến được, như bác Kha nói, đó là sử dụng routing, mà
> routing thực chất cũng chỉ là .htaccess
>

thiendv

unread,
Jan 16, 2008, 9:27:01 PM1/16/08
to PHPVietnam
Cái này em cũng đồng ý với bác Huy tại sao ko là page mà phải là
action, và tại sao không tách riêng hẳn phần logic trong quá trình sử
lý với cấu trúc vật lý của code :D

An Vu

unread,
Jan 16, 2008, 9:30:51 PM1/16/08
to phpvi...@googlegroups.com
thú thật tôi vẫn không hiểu ý của bác lắm.

Website còn có thể gọi là web application, nghĩa là có phần ứng dụng chạy trên server và "các trang" ở client. Một action không nhất thiết phải ứng với 1 trang, nó có thể là 1 phần của trang (component), không là trang nào cả (ví dụ action kiểu ajax), hoặc rất nhiều trang (ví dụ 1 action create có 2 trang: trang hiện form, trang thông báo create thành công).

Khi phân tích 1 ứng dụng web, nó được chia nhỏ thành module, mỗi module thành các chức năng nhỏ hơn (action) chứ không ai chia nó thành các trang cả. Cho nên tôi nghĩ dùng MVC thì nên từ bỏ cách suy nghĩ của "trang" đi.

none

unread,
Jan 16, 2008, 9:42:11 PM1/16/08
to PHPVietnam
Bản chất Web từ xưa đến giờ nó thay đổi nhiều lắm rồi :D. Nói chung
tui không quan tâm lắm về cái bản chất ở phía dưới. Tui chỉ biết là về
mặt end user, họ vẫn dùng browser để sử dụng kết quả của tui làm
ra :P.

On Jan 17, 9:19 am, Huy <vnsum...@gmail.com> wrote:

Thanh Hoang

unread,
Jan 17, 2008, 12:05:40 AM1/17/08
to phpvi...@googlegroups.com
"Vậy tôi nghĩ kiến trúc MVC mà symfony, Cake, Rails, Spring, Struts
đang theo đuổi ... không hợp để làm web site :D."

@Huy - TÔi ko đồng ý câu này :).
--
Doan Thanh Hoang
Vietnam Commucation Corporation
Innovation.None Stop!

23rd floor, Vincom City Towers B, 191 Ba Trieu, Hanoi
Phone: (84-4) 9743416 - Ext: 783
Mobile: 0906.0906.86
Email: hoan...@gmail.com

lkn

unread,
Jan 17, 2008, 12:42:12 AM1/17/08
to PHPVietnam
Dynamic Web Project mà :D

Huy

unread,
Jan 17, 2008, 2:13:51 AM1/17/08
to PHPVietnam
Theo tôi thì không có gì thay đổi đâu, chỉ là phù hợp và không phù hợp
thôi :D.

Ngay từ khi biết đến MVC tôi đã ngợ ngợ một chút. Sau này thì tôi càng
thấy rõ hơn.

Rõ ràng việc sử dụng router chỉ là giải pháp để lấp sự thiếu sót này.
Khi mà tòan bộ ứng dụng web được quy về các function, các module chứ
không phải là các trang, nói cách khác là các đối tượng được lưu trên
server.

Tư duy cơ bản khi một web developer phát triển một web site đã khác.
Rõ ràng trong Cake, symfony... tư duy của chúng ta đi theo hướng phát
triển các function chứ không phải là tạo ra một trang web.

Ngày xưa, web site PHP đầu tiên mà tôi viết là một website game. Tất
nhiên khả năng của tôi lúc đó rất cùi, và tôi làm đúng theo thói quen
còn lại từ hồi làm HTML: tạo các thư mục và đặt các file PHP vào.
Ví dụ:
.news/view.php?id=23

Nhưng xem ra như thế thì giống một website hơn là các mà tôi làm với
Cake bây giờ.

:D







On Jan 17, 12:42 pm, lkn <lekhac...@gmail.com> wrote:
> Dynamic Web Project mà :D

Huy

unread,
Jan 17, 2008, 2:23:09 AM1/17/08
to PHPVietnam
Tôi vừa viết vừa suy nghĩ nên cứ phải tiếp hòai. Tôi nói thêm về
router trong các framework.

Sở dĩ họ phải phát triển thành phần này là do không thể giải quyết
được vấn đề về URL.
Làm thế nào để tạo ra một cấu trúc URL dài hơn 2 slash nếu không có
router ? Không thể nào !

Nhưng trong cách viết cũ của tôi thì chuyện đó hòan tòan hiển nhiên:
tạo thư mục và file mới!
Ở đây có thể thấy mô hình MVC như trên có weakness: làm cho quá trình
phát triển web trở nên thiếu tự nhiên như nó vốn có.

:D

An Vu

unread,
Jan 17, 2008, 2:27:30 AM1/17/08
to phpvi...@googlegroups.com
ý của bác Huy là ko thể tạo routing kiểu /2007/12/15/topic-title với routing do các framework cung cấp ?

On 1/17/08, Huy < vnsu...@gmail.com> wrote:

Huy

unread,
Jan 17, 2008, 2:42:21 AM1/17/08
to PHPVietnam
Ý tôi là: không phải các framework không giải quyết được, mà cách giải
quyết không tự nhiên. :D

On Jan 17, 2:27 pm, "An Vu" <a...@toan2.com> wrote:
> ý của bác Huy là ko thể tạo routing kiểu /2007/12/15/topic-title với routing
> do các framework cung cấp ?
>
> --
> An Vũhttp://www.symfony.vn

An Vu

unread,
Jan 17, 2008, 2:49:46 AM1/17/08
to phpvi...@googlegroups.com
nếu tự nhiên thì nó phải như thế nào? bác cho 1 ví dụ xem. Tôi vẫn chưa rõ lắm

On 1/17/08, Huy <vnsu...@gmail.com > wrote:

Nguyen Kha

unread,
Jan 17, 2008, 3:49:48 AM1/17/08
to phpvi...@googlegroups.com
Vậy thì bác Huy cho em biết cách viết một website(cấu trúc thư mục và dữ liệu) mà bác cho là của hiện tại là gì được không?

Huy

unread,
Jan 17, 2008, 4:07:40 AM1/17/08
to PHPVietnam

@An Vu:
Nếu tự nhiên thì không cần đến Router :D.
Tự nhiên có nghĩa là tạo web site theo đúng những gì vốn có của một
website: tạo ra các đối tượng mang URL chứ không phải viết các action
rồi map URL đến. :D
Bác hiểu ý tôi chưa ?

Ngày xưa tôi tạo ra các với URL một các hiển nhiên, đơn giản. Bây giờ
tôi phải cố gắng map một URL đến một function. :D Như vậy theo tôi là
không phù hợp, vì bản chất của một web site khác với một tập hợp các
action !

@Nguyen Kha: hiện tại thì tôi chưa đưa ra được kiến trúc gì cả vì tôi
chỉ "suy nghĩ" như title của trang này mà thôi :D
Message has been deleted

poke

unread,
Jan 17, 2008, 4:12:53 AM1/17/08
to PHPVietnam
Ngày quê tôi mới có internet (khoảng năm 1998-1999) tôi muốn "nối
mạng"... tôi được bưu điện tặng một quyển hướng dẫn
sử dụng internet - dịch vụ vnn1269 của VDC , trong sách có đoạn
"nói nôm na website giống như một quyển/tập sách , còn trang web thì
như 1 trang sách "
Như vậy mỗi trang web có địa chỉ vật lý một cách rõ ràng , ta tìm đến
nó một cách chính xác , qua số trang ,
qua chương hồi:
Quyển 1 / Chương 3/ Hồi 16/ trang số 4453
Nhưng hiện nay nếu VDC có viết lại quyển này họ sẽ phải viết .
"Web site là một cái máy bạn cần gì cứ gọi nó sẽ hiển thị cho bạn". :D

Quyển sách/tôi muốn xem/chương 1/trang 1243
Quyển sách/tôi muốn sửa/chương 1/trang 1243

Sẽ thật buồn cười nếu tôi đọc 1 trang sách hay và muốn vợ tôi cùng
đọc :
" em xem phần này nhé /xem/chương 1/trang 1243/dòng 8 "
vì bản thân cái "địa chỉ" lại có chứa động từ mà đáng lẽ ra nó phải là
danh từ
nhưng theo cách truyền thống sẽ tự nhiên hơn
" em xem phần này nhé chương 1/trang 1243/dòng 8 "

Việc diễn ra với cái url cũng tương tự :
" mời mọi người "đọc" tin này http://tintuc.vn/tin/đọc/134" :P
Đúng là hơi "không tự nhiên" , nhưng ngày xưa đã lên web thì chắc chắn
là để đọc , còn ngày nay thì khác (sửa,xóa,thêm, ...)

Ở đây tôi không muốn nói đến router vì như Huy nói , nó là giải pháp
dịch từ cái thiếu tự nhiên qua cái tự nhiên và ngược lại thôi .:D

An Vu

unread,
Jan 17, 2008, 4:34:09 AM1/17/08
to phpvi...@googlegroups.com
bác Huy nên hiểu thế này: URL dành cho người sử dụng và SE chứ không phải để nhìn vào đó biết được tôi đặt tên action là gì trong my web app. Tôi không muốn người ta biết quá nhiều về web app của tôi và tôi muốn google hiểu được và đánh giá cao URL của tôi hơn những URL khác.


On 1/17/08, Huy <vnsu...@gmail.com > wrote:

Nguyen Kha

unread,
Jan 17, 2008, 5:36:53 AM1/17/08
to phpvi...@googlegroups.com
@anh Huy:
Vậy nếu chúng ta viết riêng theo từng file và đặt từng trang theo một cấu trúc thư mục thì chẳng phải là tăng thêm sự rắc rối:
  • Phải inlcude cái file class và function cho từng page.
  • Tiếp tục xen lẫn giữa xử xử lí dữ liệu và hiển thị (view).

lkn

unread,
Jan 17, 2008, 7:02:05 AM1/17/08
to PHPVietnam
news/view.php?id=23 <= làm cách này thì lúc bảo trì, nâng cấp mã cũng
phải gọi là mệt... rồi nghỉ luôn quá :D

Thấy các framework đều làm kiểu
/about/index.html
/news/news-1.html

Mọi thứ đều từ index.php mà ra, đây là cách tốt nhất, dễ bảo trì nâng,
cấp nhất <= mọi người đều bảo thế :D

"Vậy nếu tôi muốn website của tôi có cây thư mục sâu hơn thì sao ?" <=
cứ thêm route cho phù hợp, đâu có gì khó khăn đâu ta.

Route:
/news/rảnh/quá-rảnh/hơi-bị-rảnh/gì-gì-đó-rảnh/(.*)................. =>
controller: news, action: rảnh
param = quá-rảnh/hơi-bị-rảnh/gì-gì-đó-rảnh/122124124124.html

Huy

unread,
Jan 17, 2008, 8:33:59 PM1/17/08
to PHPVietnam
@poke: ý kiến của bạn "ăn" qua một chủ đề khác: chủ đề liên quan đến
REST. :D
RESTful thì để nói sau, ở đây tôi chỉ cố nói về mô hình MVC mà các
framework áp dụng thôi.

@những người còn lại:
Tôi nghĩ là có những mô hình khác để tạo ra các thành phần trong
website một cách tự nhiên hơn là dùng router.

Ý của tôi là: cách bố trí thành các module, controller, action ... có
vẻ không hợp với việc phát triển một website.
Cái sự không hợp này thể hiện qua thành phần Router. Ngày xưa, chúng
ta đâu cần đến Router đúng không ? :D
Vậy mà website của chúng ta vẫn chạy được đấy thôi.

Thêm vào đó nữa, ví dụ ta có URL như sau:

news/sport/football/mu.html

Vậy, ở đây, "news", "sport", "football", "mu" là những "đối tượng" có
liên quan với nhau đúng không ?
"sport" tham chiếu đến phần "news" nhưng chỉ chuyên về "sport"
"football" tham chiếu đến "news-sport" nhưng chỉ chú ý đến bóng đá.
"mu" là một phần tử con của chuyên mục bóng đá.

Với các làm cũ của tôi (file và thư mục), rõ ràng tôi tạo được mối
quan hệ giữa các "đối tượng" với nhau, bằng cách tạo thư mục con cho
một tập hợp con.

Nhưng với symfony chẳng hạn, cấu trúc đó là giả tạo, được map bằng
Router, nhưng bên trong của ứng dụng thì các module ko hề mang cấu
trúc đó. :|

khoa12a7

unread,
Jan 21, 2008, 10:37:50 PM1/21/08
to PHPVietnam
Tôi thấy sử famework codeigniter đáp ứng theo mô hình MVC cũng tương
đối hay và gọn nhẹ

DucthuanX

unread,
Jan 24, 2008, 2:51:32 PM1/24/08
to PHPVietnam
cố sao cho nó "có lý" để mệt thêm thì hơn, hay làm cho nó nhanh + tiện
thì hơn nhỉ :|

darkera13

unread,
Jan 26, 2008, 1:45:11 AM1/26/08
to PHPVietnam
Thật sự là ý bác ý là bỏ Web động đi, ai cần post bài lên đây thì pm
bác(hoặc google) ý (ặc pm kiểu gì, phone đê) rồi bác ý tạo cây thư mục
rồi nhét vô cho nó tự nhiên nhé :|.
Reply all
Reply to author
Forward
0 new messages