前言从本章开始,我们继续造轮子,完成一个类似Laravel的现代化PHP框架。为什么叫现代化?因为它必须具备以下几点遵守PSR-4编码规范使用Composer进行包管理标准的HTTP请求方式优雅的使用设计模式一开始我们不需要关心性能问题,先考虑框架有哪些功能需要去实现,这跟实现业务有很大的关系不一样的,加油!开始我的表演。前期做任何事情,都要有前期的准备工作。作为PSR-4的规则,我们的命名空间必须有一个祖先名字,在这里我称他为神圣的《z_framework》至少需要一个GITHUB存储库来存储这个项目https://github.com/CrazyCodes...创建一个作曲家.json文件用于包管理,很简单,phpunit进来了。通过psr-4加载一个项目名{"name":"zframework","require-dev":{"phpunit/phpunit":"^7.0"},"autoload":{"psr-4":{"Zero\\":"src/Zero",}},"autoload-dev":{"psr-4":{"Zero\\Tests\\":"tests/"}}}最后,我们需要考虑目录的结构和我们第一步需要完成的功能,核心结构(这不仅仅是项目结构。它是框架的核心结构)暂时。srcZeroConfig//可能存放一些配置文件的解析器Container//容器解析器Http//请求处理的一些工具Routes//路由处理的一些函数Bootstrap.php//这可能是一个启动脚本Zero.php//也可能是核心入口文件tests//Testdirectory.gitignorecomposer.jsonLICENSEREADME.mdRouting还记得我们刚开始使用Laravel时做的第一件事吗?对,去研究路由,所以我们把路由作为框架的第一步。在研究路由之前,我们需要知道http://www.domain.com/user/create是如何实现的。PHP必须默认请求index.php或default.php。上面的链接其实隐藏了index.php或者default.php,这是Nginx等服务代理为我们做的一个优雅的链接。具体配置如下,其实和Laravel官方服务器提供的是一样的{listen80;服务器名称www.zf.com;根/mnt/app/z_framework/server/public;indexindex.phpindex.htmlindex.htm;location/{try_files$uri$uri//index.php?$query_string;}location~\.php${fastcgi_passphp71:9000;fastcgi_indexindex.php;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;包括fastcgi_params;}}通过try_files$uri$uri//index.php?$query_string;解析请求,通过上面可以得到http://www.domain.com/user/create=======http://www.domain.com/index.php?user/createOK,了解了其中的奥秘之后,我们开始写路由,在src/Routes/Route.phpnamespaceZero\Routes;classRoute{}implementation首先我们创建一个简单的接口文件src/Routes/RouteInterface.phpnamespaceZero\Routes;接口RouteInterface{公共函数Get($url,$callFile);民众函数Post($url,$callFile);公共函数Put($url,$callFile);publicfunctionDelete($url,$callFile);}fromGetrequeststartnamespaceZero\Routes;classRouteimplementsRouteInterface{publicfunctionGet($url,$callFile){}}最后实现Get代码块if(parent::isRequestMethod("GET")){//解释请求方法if(is_callable($callFile)){//判断是否为匿名函数return$callFile();}if($breakUpString=parent::breakUpString($callFile)){//get获取分析/user/createheader('HTTP/1.1404NotFound');}try{//通过反射类获取对象$breakUpString[0]=user$reflectionClass=new\ReflectionClass('App\\Controllers\\'.$breakUpString[0]);//实例化对象$newInstance=$reflectionClass->newInstance();//获取对象中的指定方法,$breakUpString[1]=createcall_user_func([$newInstance,$breakUpString[1],],[]);}catch(\ReflectionException$e){header('HTTP/1.1404NotFound');}}else{header('HTTP/1.1404NotFound');}return"";if如果你想测试上面的代码,你可以使用phpunit,或者笨办法。这里很容易理解。使用笨办法创建一个目录,然后按照Laravel的目录形式创建几个目录,
