CI框架源码研读(路由解析)
上篇文章当中我们提到,在CodeIgniter.php中,解析出你访问的url所对应的controllers和action,然后在调用call_user_func_array()方法,进入到action中,而这里是如何得到这个对应关系的呢,这就是我们现在要讨论的内容。
1、CodeIgniter.php
我们首先来到CodeIgniter.php,发现这其实是在Router类中实现的,如下源码:
$RTR =& load_class('Router', 'core', isset($routing) ? $routing : NULL);
$class = ucfirst($RTR->class);
$method = $RTR->method;
2、Router.php
我们进去Router.php中一探究竟,Router类中的构造函数核心是这里:
$this->_set_routing();
_set_routing方法其实核心做这几步操作:
$_d = $this->config->item('directory_trigger');
$this->set_directory($_d);
$_c = trim($this->config->item('controller_trigger'));
$this->set_class($_GET[$_c]);
$_f = trim($this->config->item('function_trigger'));
$this->set_method($_GET[$_f]);
$this->_parse_routes();
分别从全局变量_GET数组中获取 directory,class,method,他们的trigger可以在配置文件中配置。当然这是在 enable_query_strings 设置为true的情况下。接下来就进入了最关键的方法中_parse_routes方法:
我们在CI的路由配置中,可以如下配置:
$route['products']['put']='product/insert';
就是因为在_parse_routes中的这段代码:
$http_verb = isset($_SERVER['REQUEST_METHOD']) ? strtolower($_SERVER['REQUEST_METHOD']) : 'cli';
$val = array_change_key_case($val, CASE_LOWER);
if (isset($val[$http_verb])){
$val = $val[$http_verb];}
else{continue;}
HTTP verbs (GET, PUT, POST, DELETE, PATCH) 有这么几种.而我们在配置中可以这么配置:
$route['product/(:num)']='catalog/product_lookup_by_id/$1';
是因为_parse_routes中的这段代码:
$key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key);
路由配置中更加可以配置回调函数如:
$route['products/([a-zA-Z]+)/edit/(\d+)']=function($product_type,$id){return'catalog/product_edit/'.strtolower($product_type).'/'.$id;};
是因为有这段代码:
if ( ! is_string($val) && is_callable($val)){
array_shift($matches);
$val = call_user_func_array($val, $matches);
}
而一般的配置:
else if (strpos($val, ') !== FALSE && strpos($key, '(') !== FALSE){
$val = preg_replace('#^'.$key.'$#', $val, $uri);
}
最后调用了:
$this->_set_request(array_values($this->uri->segments));
_set_request方法当中
$this->set_class($segments[0]);
if (isset($segments[1])){
$this->set_method($segments[1]);
}else{
$segments[1] = 'index';
}
set了class和method,这就得到了我们在开始CodeIgniter.php中所需要的class和method
3、Uri.php
这里要说下这个上面uri的来路:
$uri = implode('/', $this->uri->segments);
我们进入Uri类中查看究竟:
核心的方法是_parse_request_uri,在方法体中,
$uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']);
$query = isset($uri['query']) ? $uri['query'] : '';
$uri = isset($uri['path']) ? $uri['path'] : '';
return $this->_remove_relative_directory($uri);
主要是用parse_url解析出url当中的path和query,然后进行去除相对路径的处理。
$this->uri->segments这个成员变量中存储的就是explode('/', trim($uri, '/') 后的数组,在_set_uri_string方法中赋值。

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Alipay PHP...

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

Session hijacking can be achieved through the following steps: 1. Obtain the session ID, 2. Use the session ID, 3. Keep the session active. The methods to prevent session hijacking in PHP include: 1. Use the session_regenerate_id() function to regenerate the session ID, 2. Store session data through the database, 3. Ensure that all session data is transmitted through HTTPS.

The enumeration function in PHP8.1 enhances the clarity and type safety of the code by defining named constants. 1) Enumerations can be integers, strings or objects, improving code readability and type safety. 2) Enumeration is based on class and supports object-oriented features such as traversal and reflection. 3) Enumeration can be used for comparison and assignment to ensure type safety. 4) Enumeration supports adding methods to implement complex logic. 5) Strict type checking and error handling can avoid common errors. 6) Enumeration reduces magic value and improves maintainability, but pay attention to performance optimization.

The application of SOLID principle in PHP development includes: 1. Single responsibility principle (SRP): Each class is responsible for only one function. 2. Open and close principle (OCP): Changes are achieved through extension rather than modification. 3. Lisch's Substitution Principle (LSP): Subclasses can replace base classes without affecting program accuracy. 4. Interface isolation principle (ISP): Use fine-grained interfaces to avoid dependencies and unused methods. 5. Dependency inversion principle (DIP): High and low-level modules rely on abstraction and are implemented through dependency injection.

How to debug CLI mode in PHPStorm? When developing with PHPStorm, sometimes we need to debug PHP in command line interface (CLI) mode...

How to automatically set the permissions of unixsocket after the system restarts. Every time the system restarts, we need to execute the following command to modify the permissions of unixsocket: sudo...

Sending JSON data using PHP's cURL library In PHP development, it is often necessary to interact with external APIs. One of the common ways is to use cURL library to send POST�...
