Zend_Acl เป็น component สำหรับเอาไว้จัดการ การควบคุมการเข้าถึงข้อมูล (ผมพยายามแปลมาจาก ACL - Access Control List) อธิบายง่ายๆ คือเอาไว้คุมระดับของการใช้งาน insert/update/delete (หรืออื่นๆ) ข้อมูลนั่นเอง

ตัวอย่างเช่น Administrator ใช้งานหน้า admin สามารถ insert/update/delete ได้ทุกอย่าง, นาย A สามารถ insert/update/delete ข่าวได้อย่างเดียว และนาย B สามารถ insert/update/delete ข้อมูลสินค้าได้อย่างเดียว เป็นต้น

หรืออีกตัวอย่าง ถ้าเป็นกรณี Blogging service คุณเจ้าของ blog สามารถ read/write/publish/edit/delete blog ของตัวเองได้ และ guest (คนทั่วไป) สามารถ read ได้อย่างเดียว เป็นต้น

เหล่านี้เขาเรียกว่า ACL - Access Control List

ใน Zend_Acl ก็จะเกี่ยวข้องกับ 2 สิ่ง ได้แก่:

  • resource คือ สิ่งที่จะถูกคุม เช่น ข่าว, สินค้า, blog, อัลบั้มภาพ เป็นต้น โดยใน Zend_Acl ได้เตรียม Zend_Acl_Resource ไว้ให้ใช้ และมี Zend_Acl_Resource_Interface ไว้ให้ด้วย ถ้าจะ extends ไป implement
  • role คือ สิ่งที่จะทำการเข้าถึง resource เช่น การเขียน, การอ่าน, การลบ เป็นต้น โดยใน Zend_Acl ได้เตรียม Zend_Acl_Role ไว้ให้ใช้ และมี Zend_Acl_Role_Interface ไว้ให้ด้วย ถ้าจะ extends ไป implement

ฝรั่งเขาบอกว่า อธิบายง่ายๆ ได้ว่า "roles request access to resources"

ตัวอย่างการใช้งาน

สมมติว่าเรามีกฏ ในการใช้งานหน้า admin ดังนี้

NamePermissionsResource
news_staffinsert, update, deletenews
guestbook_staffinsert, update, deleteguestbook
administrator(Granted all access)N/A
เราสามารถสร้าง ACL ของเรา และ registry roles และ resources เข้าไป ดังนี้:
	$acl = new Zend_Acl();
 
	// register resources เข้าไปใน acl หรือ เป็นการบอก acl ว่ามี resources อะไรบ้าง
	// หรือ ใน acl ของเรา มีข้อมูลอะไรบ้าง
	$acl->add(new Zend_Acl_Resource('news'));
	$acl->add(new Zend_Acl_Resource('guestbook'));
 
	// register roles เข้าไปใน acl 
	// หรือ ใน acl ของเรา มีการเข้าใช้งานแบบไหนบ้าง 
	// กรณีนี้ เราจะแบ่งเป็น type ของ admin คือเรามี admin 3 ประเภท 
	// ได้แก่ news_staff, questbook_staff และ administrator 
	// ซึ่งจะเข้าใช้งาน resource ได้ตามตารางด้านบน
	$acl->addRole(new Zend_Acl_Role('news_staff'));
	$acl->addRole(new Zend_Acl_Role('questbook_staff'));
	$acl->addRole(new Zend_Acl_Role('administrator'));
 
	// roles for 'news_staff'
	$acl->allow('news_staff', 'news',  'insert');
	$acl->allow('news_staff', 'news',  'update');
	$acl->allow('news_staff', 'news',  'delete');
 
	// roles for 'questbook_staff'
	$acl->allow('questbook_staff', 'questbook',  'insert');
	$acl->allow('questbook_staff', 'questbook',  'update');
	$acl->allow('questbook_staff', 'questbook',  'delete');
 
	// administrator ทำได้ทุกอย่าง (ทุก roles บนทุก resources) ถ้าไม่ระบุ resource และไม่ระบุ 
	$acl->allow('administrator');
เรามี ACL เรียบร้อยแล้ว ตอนจะเอาไปใช้ เช่นหลังจาก login เข้ามาแล้ว admin user นั้นทำอะไรได้บ้าง เราก็ไปถาม ACL ของเรา เช่น
	// ประเภทของ admin user อาจจะได้จากหลังจาก login แล้ว 
	// เราก็ fetch เอาข้อมูลของ admin user นี้มาดู ว่าเขาเป็น type อะไร
	// ในที่นี้สมมตืว่าเขาเป็น news_staff
	$theAdminType = 'news_staff';
	// 'news_staff' ที่เป็นประเภทของ admin user ของเรานี้ จะถูกใช้เป็น key ของ roles
 
	echo $acl->isAllowed($theAdminType, 'news', 'insert') ?  
		 'allowed' : 'denied';	// จะได้ allowed
	echo $acl->isAllowed($theAdminType, 'news', 'update') ?
		 'allowed' : 'denied';	// จะได้ allowed
	echo $acl->isAllowed($theAdminType, 'news', 'delete') ?
		'allowed' : 'denied';	// จะได้ allowed
 
	echo $acl->isAllowed($theAdminType, 'guestbook', 'insert') ?  
		 'allowed' : 'denied';	// จะได้ denied
	echo $acl->isAllowed($theAdminType, 'guestbook', 'update') ?
		 'allowed' : 'denied';	// จะได้ denied
	echo $acl->isAllowed($theAdminType, 'guestbook', 'delete') ?
		'allowed' : 'denied';	// จะได้ denied
	// เมื่อระบุ resource เป็น 'guestbook' จะได้ 'denied' เพราะว่า $theAdminType เป็น 'news_staff'
 
	// ลองจำลองว่า ประเภทของ admin user เป็น administrator 
	$theAdminType = 'administrator';
 
	echo $acl->isAllowed($theAdminType, 'news', 'insert') ?  
		 'allowed' : 'denied';	// จะได้ allowed
	echo $acl->isAllowed($theAdminType, 'news', 'update') ?
		 'allowed' : 'denied';	// จะได้ allowed
	echo $acl->isAllowed($theAdminType, 'news', 'delete') ?
		'allowed' : 'denied';	// จะได้ allowed
 
	echo $acl->isAllowed($theAdminType, 'guestbook', 'insert') ?  
		 'allowed' : 'denied';	// จะได้ allowed
	echo $acl->isAllowed($theAdminType, 'guestbook', 'update') ?
		 'allowed' : 'denied';	// จะได้ allowed
	echo $acl->isAllowed($theAdminType, 'guestbook', 'delete') ?
		'allowed' : 'denied';	// จะได้ allowed
 
	// ได้ 'allowed' หมด เพราะว่า 'administrator' สามารถทำได้ทุกอย่าง กับทุก resources

ข้อมูลเพิ่มเติม: http://framework.zend.com/manual/en/zend.acl.html