Zend Framework - การกำหนดเส้นทาง

แผนที่เส้นทาง Request URIเป็นวิธีการเฉพาะของคอนโทรลเลอร์ ในบทนี้เราจะดูวิธีการใช้งานเส้นทางใน Zend Framework

โดยทั่วไป URI ใด ๆ มีสามส่วน -

  • ส่วนชื่อโฮสต์
  • ส่วนเส้นทางและ
  • กลุ่มการค้นหา

ตัวอย่างเช่นใน URI / URL - http://www.example.com/index?q=data, www.example.com คือกลุ่มชื่อโฮสต์ index คือกลุ่มเส้นทางและ q=dataคือกลุ่มข้อความค้นหา โดยทั่วไปการกำหนดเส้นทางจะตรวจสอบไฟล์Page segmentกับชุดของข้อ จำกัด หากข้อ จำกัด ใด ๆ ตรงกันก็จะส่งกลับชุดของค่า หนึ่งในค่าหลักคือตัวควบคุม

การกำหนดเส้นทางยังตรวจสอบเซ็กเมนต์โฮสต์เซ็กเมนต์การค้นหาขอวิธี HTTP ขอส่วนหัว HTTP ฯลฯ ในบางสถานการณ์

เส้นทางและ RouteStack

เส้นทางเป็นวัตถุหลักในการกำหนดเส้นทาง Zend Framework มีอินเทอร์เฟซพิเศษสำหรับออบเจ็กต์เส้นทางRouteInterface. ออบเจ็กต์เส้นทางทั้งหมดต้องใช้ RouteInterface รายชื่อทั้งหมดของ RouteInterface มีดังต่อไปนี้ -

namespace Zend\Mvc\Router;  
use Zend\Stdlib\RequestInterface as Request;  
interface RouteInterface { 
   public static function factory(array $options = []); public function match(Request $request); 
   public function assemble(array $params = [], array $options = []); 
}

วิธีการหลักคือ match. วิธีการจับคู่นี้จะตรวจสอบคำขอที่ระบุกับข้อ จำกัด ที่กำหนดไว้ในนั้น หากพบรายการที่ตรงกันจะส่งกลับค่าRouteMatchวัตถุ. ออบเจ็กต์ RouteMatch นี้ให้รายละเอียดของคำร้องขอที่ตรงกันเป็นพารามิเตอร์ พารามิเตอร์เหล่านี้สามารถดึงออกมาได้RouteObject ใช้ getParams วิธี.

รายชื่อ RouteObject ที่สมบูรณ์มีดังนี้ -

namespace Zend\Mvc\Router;  
class RouteMatch { 
   public function __construct(array $params); public function setMatchedRouteName($name); 
   public function getMatchedRouteName(); 
   public function setParam($name, $value); 
   public function getParams(); 
   public function getParam($name, $default = null); 
}

โดยทั่วไปแอปพลิเคชัน MVC ทั่วไปมีหลายเส้นทาง แต่ละเส้นทางนี้จะได้รับการประมวลผลตามลำดับ LIFO และจะมีการจับคู่และส่งคืนเส้นทางเดียว หากไม่มีเส้นทางที่ตรงกัน / ส่งคืนแอปพลิเคชันจะแสดงข้อผิดพลาด“ ไม่พบหน้า” Zend Framework มีอินเทอร์เฟซสำหรับประมวลผลเส้นทางRouteStackInterface. RouteStackInterface นี้มีตัวเลือกในการเพิ่ม / ลบเส้นทาง

รายการทั้งหมดของ RouteStackInterface มีดังต่อไปนี้ -

namespace Zend\Mvc\Router;  
interface RouteStackInterface extends RouteInterface { 
   public function addRoute($name, $route, $priority = null); public function addRoutes(array $routes); 
   public function removeRoute($name); public function setRoutes(array $routes); 
}

Zend framework มีการใช้งาน RouteStack อินเทอร์เฟซและมีดังนี้ -

  • SimpleRouteStack
  • TreeRouteStack

ประเภทของเส้นทาง

Zend framework มีออบเจ็กต์เส้นทางสำเร็จรูปจำนวนมากสำหรับทุกสถานการณ์ภายใต้เนมสเปซ "Zend \ Mvc \ Router \ Http" เพียงพอที่จะเลือกและใช้ออบเจ็กต์เส้นทางที่เหมาะสมสำหรับสถานการณ์ที่กำหนด

เส้นทางที่มีดังต่อไปนี้ -

  • Hostname - ใช้เพื่อจับคู่ส่วนโฮสต์ของ URI

  • Literal - ใช้เพื่อจับคู่ URI ที่แน่นอน

  • Method - ใช้เพื่อจับคู่วิธี HTTP ของคำขอที่เข้ามา

  • Part - ใช้เพื่อจับคู่ส่วนของส่วนเส้นทาง URI โดยใช้ตรรกะที่กำหนดเอง

  • Regex - ใช้เพื่อจับคู่ส่วนเส้นทาง URI ตามรูปแบบ Regex

  • Schema - ใช้เพื่อจับคู่ URI Schema เช่น http, https เป็นต้น

  • Segment - ใช้เพื่อจับคู่เส้นทาง URI โดยแบ่งออกเป็นหลายส่วน

ให้เราดูวิธีการเขียนตัวอักษรและเส้นทางส่วนที่ใช้บ่อยที่สุด โดยปกติเส้นทางจะระบุไว้ในไฟล์คอนฟิกูเรชันของแต่ละโมดูล -module.config.php.

เส้นทางที่แท้จริง

โดยปกติเส้นทางจะถูกสอบถามตามลำดับ LIFO เส้นทาง Literal ใช้สำหรับการจับคู่เส้นทาง URI

มีการกำหนดดังที่แสดงด้านล่าง -

$route = Literal::factory(array( 
   'route' => '/path', 
   'defaults' => array('controller' => 'Application\Controller\IndexController', 
      'action' => 'index',), 
));

เส้นทางข้างต้นตรงกับ /path ใน url คำขอและส่งคืน index เป็น action และ IndexController เป็นตัวควบคุม

เส้นทางกลุ่ม

เส้นทางแบบแบ่งกลุ่มจะใช้เมื่อใดก็ตามที่ URL ของคุณควรมีพารามิเตอร์ตัวแปร

มีการอธิบายไว้ด้านล่าง -

$route = Segment::factory(array( 
   'route' => '/:controller[/:action]', 
   'constraints' => array( 
      'controller' => '[a-zA-Z][a-zA-Z0-9_-]+', 
      'action' => '[a-zA-Z][a-zA-Z0-9_-]+', 
   ), 
   'defaults' => array( 
      'controller' => 'Application\Controller\IndexController', 
      'action' => 'index',), 
));

ในที่นี้กลุ่มจะแสดงด้วยเครื่องหมายจุดคู่และตามด้วยอักขระที่เป็นตัวเลขและตัวอักษร หากคุณเก็บเซ็กเมนต์ไว้เป็นทางเลือกก็จะปิดด้วยวงเล็บ แต่ละส่วนอาจมีข้อ จำกัด ที่เกี่ยวข้อง ข้อ จำกัด แต่ละข้อเป็นนิพจน์ทั่วไป

การกำหนดค่าเส้นทางในโมดูลการสอน

ให้เราเพิ่มเส้นทางเซ็กเมนต์ในโมดูลการสอนของเรา อัปเดตไฟล์การกำหนดค่าโมดูลการสอน -module.config.php สามารถดูได้ที่ myapp/module/Tutorial/config.

<?php  
namespace Tutorial;  
use Zend\ServiceManager\Factory\InvokableFactory; 
use Zend\Router\Http\Segment;  
return [ 
   'controllers' => [ 
      'factories' => [ 
         Controller\TutorialController::class => InvokableFactory::class, 
      ], 
   ], 
   'router' => [ 
      'routes' => [ 
         'tutorial' => [ 
            'type'    => Segment::class, 
               'options' => [ 
                  'route' => '/tutorial[/:action[/:id]]', 
                  'constraints' => [ 
                     'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
                     'id'     => '[0-9]+', 
                  ], 
                  'defaults' => [
                     'controller' => Controller\TutorialController::class, 
                     'action'     => 'index', 
                  ], 
               ], 
            ], 
      ], 
   ], 
   'view_manager' => [ 
      'template_path_stack' => ['tutorial' => __DIR__ . '/../view',], 
   ], 
];

เราได้เพิ่มเส้นทางสำหรับไฟล์ Tutorialโมดูล. เราเป็นเพียงขั้นตอนเดียวในการจบโมดูลการสอนของเรา เราจำเป็นต้องเพิ่มView สำหรับโมดูลของเราซึ่งเราจะเรียนรู้ในบทต่อไป