composer使用相关&mvc实现原理--2019年10月31日
0x01 composer使用相关
composer 官方网址: https://www.phpcomposer.com/
注意:在composer下载的内容会自动适配你绑定的php版本,也就是说,如果你的php版本不够高将有可能无法下载某些应用
打开网址,找到相应的下载点点击即可下载:
下载完,双击开始安装
选择安装路径
选择要绑定的php版本
然后一路next,等待安装完成
最后打开cmd命令行,输入
composer -v
出现以下界面即表示安装完成
由于composer默认的访问源在国外,我们可以通过设置镜像来提高下载速度:https://developer.aliyun.com/composer
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
然后我们可以点击composer官网首页的安装包列表,在搜索框中输入你所需要的应用,并将相应的命令复制到cmd命令行执行即可
这里是默认安装相应版本,如果你想要自定义,可以在最后加上相应命令(使用时去掉括号)
composer create-project laravel/laravel (文件夹名称) (下载的版本,例如:5.8.*)
0x02 MVC实现原理
简单来说就是:通过获取url地址中所请求的资源名称,对相应的处理文件进行引入。例如,请求http://demo.com/index,当我们收到这个请求时,我们就可以去加载相应目录下的index.blade.php(假设相应的处理文件是这个名字)文件来相应这个请求。
直接来看核心代码:
index.php
<?php //路由解析 $server = $_SERVER; //脚本名称 $script_name = $_SERVER['SCRIPT_NAME']; //从客户端发送来的原生请求URI,包括参数 $request_uri = $_SERVER['REQUEST_URI']; //服务器状态中的一个参数,可用来找寻相应的控制器并执行相应的方法 //$path_info = $_SERVER['PATH_INFO']; //实现伪静态的处理 //str_replace把字符串 $request_uri 中的字符 $script_name 替换为 '' $path_info = str_replace($script_name, '', $request_uri); /*假设访问 $script_name = /index.php $request_uri = /index.php/home/index $path_info = /home/index */ //ltrim() 函数移除字符串左侧的空白字符或其他预定义字符。 $path = ltrim($path_info, '/'); //解析控制器和方法 //以特定字符分割字符串,并返回一个数组 $controller_method = explode('/', $path); //控制器一般要首字母大写,但浏览器数据一般是小写,所以要进行转化 //注意要进行异常控制(这里没做) $controller_method[0] = ucfirst($controller_method[0]); //然后根据控制器名称加载相应的php文件 require_once __DIR__ . '/Controllers/' . $controller_method[0] . '.blade.php'; //实例化相应的类 $controller = $controller_method[0]; $method = $controller_method[1]; $res = (new $controller)->$method(); echo '<pre>'; print_r($res);
Home.blade.php
<?php class Home{ public function index() { echo 'hello mvc'; } public function welcome() { require_once __DIR__ . '/../Views/welcome.php'; } }
下面是实现伪静态的文件:
.htaccess
<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] </IfModule>
RewriteEngine On 表示开启url重写功能
RewriteCond 后面的是条件
RewriteRule 后面的是要执行的操作
这一部分可以理解为:
if(%{REQUEST_FILENAME} !-d && %{REQUEST_FILENAME} !-f) ^(.*)$ index.php [L,E=PATH_INFO:$1] //其中%{REQUEST_FILENAME}等同于$_SERVER['REQUEST_FILENAME'] //判断表示:如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写),如果目录存在就直接访问目录不进行RewriteRule;如果都不存在就执行RewriteRule
例如:我们直接访问 http://mvc.com/home/welcome ,它会进行判断,发现不存在这个路径及文件,那么就会去执行RewriteRule,进到index.php中去
然后在index.php中再进行相应的引入,此时index.php相当于一个中转站(路由)
0x03 总结
1. 在实现mvc的过程中,最重要的对象就是服务器返回的超全局变量$_SERVER,最核心的思想是文件引用。简单说就是:根据$_SERVER数组中的元素的值来引用相关文件
2. .htaccess 里可以自定义规则来实现伪静态(但有个问题,他可能会存在文件解析漏洞)