镜像网站：http://pkg.phpcomposer.com/https://toran.reimu.io/http://packagist.cn/使用说明：如何使用请看各种镜像网站说明，下面给出第一个镜像的使用说明：将以下配置信息添加到 Composer 的配置文件 config.json 中（系统全局配置）。将以下配置信息添加到你的项目的 composer.json 文件中（针对单个项目配置）。为了避免安装包的时候都要执行两次查询，切记要添加禁用 packagist 的设置，如下：{ "repositories": [ {"type": "composer", "url": "http://pkg.phpcomposer.com/repo/packagist/"}, {"packagist": false} ] }
参考来源：岁寒博客 PHP系列教程，可以认为本文是其系列文章的实践、概要与总结。设计 MVC新建 MFFC/app 文件夹，在 app 中创建 controllers、models、views 三个文件夹，开始正式开始踏上 MVC 的征程。新建 controllers/BaseController.php 文件：使用命名空间<?php /** * BaseController */ class BaseController { public function __construct() { } }新建 controllers/HomeController.php 文件：<?php /** * \HomeController */ class HomeController extends BaseController { public function home() { echo " 控制器成功！ "; } }增加一条路由： Macaw::get('', 'HomeController@home');，打开浏览器直接访问 http://127.0.0.1:3000/，可能出现诸如服务器500内部错误 、HomeController类未找到 等错误。为什么没找到 HomeController 类？因为我们没有让他自动加载，修改 composer.json 为：{ "require": { "codingbean/macaw": "dev-master" }, "autoload": { "classmap": [ "app/controllers", "app/models" ] } }运行 composer dump-autoload，稍等片刻，刷新，你将看到以下内容（别忘了调节编码哦~）：连接数据库新建 models/Article.php 文件，内容为（数据库密码请自行更改）：注：原博客使用 php_mysql.dll 扩展函数mysql_connect来连接数据库，但现在PHP5已不推荐使用 mysql 扩展了。故这里使用pdo来连接：<?php /** * Article Model */ class Article { public static function first() { $pdo = new PDO("mysql:host=localhost;dbname=mffc","root","root"); $rs = $pdo -> query("SELECT * FROM articles limit 0,1"); while($row = $rs -> fetch()) { echo ' '.$row["title"].' '; echo ' '.$row["content"].' '; } } }修改 controllers/HomeController.php 文件：<?php /** * \HomeController */ class HomeController extends BaseController { public function home() { Article::first(); } }刷新，这时候会得到 Article 类未找到的信息，因为我们没有更新自动加载配置：composer dump-autoload在等待的时间里，我们去建立数据库 mffc，在里面建立表 articles，设计两个字段 title、content 用于记录信息，并填充进至少一条数据。你也可以在建立完成 mffc 数据库以后运行以下 SQL 语句：DROP TABLE IF EXISTS `articles`; CREATE TABLE `articles` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL, `content` longtext, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `articles` WRITE; /*!40000 ALTER TABLE `articles` DISABLE KEYS */; DROP TABLE IF EXISTS `articles`; CREATE TABLE `articles` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL, `content` longtext, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `articles` WRITE; /*!40000 ALTER TABLE `articles` DISABLE KEYS */; INSERT INTO `articles` (`id`, `title`, `content`) VALUES (1,'Hello World',' 你好世界内容！ '), (2,'你好世界',' Hello World Content！ '); /*!40000 ALTER TABLE `articles` ENABLE KEYS */; UNLOCK TABLES;然后，刷新！你将看到以下页面：调用视图修改 models/Article.php 为：<?php /** * Article Model */ class Article { public static function first() { $pdo = new PDO("mysql:host=localhost;dbname=mffc","root","root"); $rs = $pdo -> query("SELECT * FROM articles limit 0,1"); while($row = $rs -> fetch()) { return $row; } } }将包含查询结果的数组返回。修改 HomeController：<?php /** * \HomeController */ class HomeController extends BaseController { public function home() { $article = Article::first(); require dirname(__FILE__).'/../views/home.php'; } }其中home.php看起来像这样的： <?php echo $article['title'];?> <?php echo $article['title'];?> <?php echo $article['content'];?> 保存，刷新，你将得到跟上面一模一样的页面，视图调用成功！几乎所有人都是通过学习某个框架来了解 MVC 的，这样可能框架用的很熟，一旦离了框架一个简单的页面都写不了，更不要说自己设计 MVC 架构了，其实这里面也没有那么多门道，原理非常清晰，我说说我的感悟：PHP 框架再牛逼，他也是 PHP，也要遵循 PHP 的运行原理和基本哲学。抓住这一点我们就能很容易地理解很多事情。PHP 做的网站从逻辑上说，跟 php test.php 没有任何区别，都只是一段字符串作为参数传递给 PHP 解释器而已。无非就是复杂的网站会根据 URL 来调用需要运行的文件和代码，然后返回相应的结果。无论我们看到的是 CodeIgniter 这样 180 个文件组成的“小框架”，还是 Laravel 这样加上 vendor 一共 3700 多个文件的 “大框架”，他们都会在每一个 URL 的驱动下，组装一段可以运行的字符串，传给 PHP 解释器，再把从 PHP 解释器返回的字符串传给访客的浏览器。MVC 是一种逻辑架构，本质上是为了让人脑这样的超低 RAM 的计算机能够制造出远超人脑 RAM 的大型软件，其实 MVC 架构在 GUI 软件出现以前就已经成形，命令行输出也是视图嘛。在 MFFC 里，一个 URL 驱动框架做的事情基本是这样的：入口文件 require 控制器，控制器 require 模型，模型和数据库交互得到数据返回给控制器，控制器再 require 视图，把数据填充进视图，返回给访客，流程结束。
参考来源：岁寒博客 PHP系列教程，可以认为本文是其系列文章的实践、概要与总结。基础详细请阅读：http://lvwenhan.com/php/405.html关于FIG（Framework Interoperability Group/框架可互用性小组）的 PSR-0 到 PSR-4 五套 PHP 非官方规范 请自行查阅相关资料。Composer的简介、安装与使用也不再赘述。在合适的地方新建一个文件夹，命名为 MFFC（My First Framework based on Composer），在文件夹下新建文件 composer.json：{ "require": { } }命令行切换到 MFFC 目录下，运行：composer update稍等片刻，会出现如下文件及文件夹：如果以上内容成功出现，恭喜你，Composer 初始化成功！构建路由详细请阅读：http://lvwenhan.com/php/406.html下面我们就开始自己来构建路由，先去 GitHub 搜一下：点此查看搜索结果推荐 https://github.com/NoahBuscher/Macaw，对应的 Composer 包为 codingbean/macaw ，作者应该是在 GitHub 上改名了，这可能会造成一定的困扰。下面开始安装 Macaw 包，更改 composer.json：{ "require": { "codingbean/macaw": "dev-master" } }运行 composer update，成功之后将得到以下目录：下面，就是见证奇迹的时刻！我们将赋予 MFFC 生命力，让它真正地跑起来！新建 MFFC/public 文件夹，这个文件夹将是用户唯一可见的部分。在文件夹下新建 index.php 文件：<?php // Autoload 自动载入 require '../vendor/autoload.php'; // 路由配置 require '../config/routes.php'; 上面一行表示引入 Composer 的自动载入功能，下面一行表示载入路由配置文件。新建 MFFC/config 文件夹，在里面新建 routes.php 文件，内容如下：<?php use NoahBuscher\Macaw\Macaw; Macaw::get('hello', function() { echo "成功！"; }); Macaw::get('(:all)', function($fu) { echo '未匹配到路由 '.$fu; }); Macaw::dispatch();HTTP 服务软件请自行设置伪静态，伪静态代码可参考 Macaw 本身提供的范例。也可以使用 PHP 内置 HTTP 服务器：cd public && php -S 127.0.0.1:3000注意PHP内置的HTTP服务器可能不支持伪静态（即使存在.htaccess之类的伪静态配置文件），跟真实的 Apache 有所出入。上述配置中 Macaw::get('hello'...); 写成Macaw::get('/hello'...); 更好使。访问 http://127.0.0.1:3000/index.php/hello （此为未伪静态化地址）可以看到：访问 http://127.0.0.1:3000/index.php/world （此为未伪静态化地址）可以看到：如果页面乱码，请调整编码为 UTF-8。如果你成功看到以上页面，那么恭喜你，路由配置成功！Macaw 只有一个文件，去除空行总共也就一百行多一点，通过代码我们能直接看明白它是怎么工作的。下面我简略分析一下：Composer 的自动加载在每次 URL 驱动 MFFC/public/index.php 之后会在内存中维护一个全量命名空间类名到文件名的数组，这样当我们在代码中使用某个类的时候，将自动载入该类所在的文件。我们在路由文件中载入了 Macaw 类：“use NoahBuscher\Macaw\Macaw;”，接着调用了两次静态方法 ::get()，这个方法是不存在的，将由 MFFC/vendor/codingbean/macaw/Macaw.php 中的 __callstatic() 接管。这个函数接受两个参数，$method 和 $params，前者是具体的 function 名称，在这里就是 get，后者是这次调用传递的参数，即 Macaw::get('hello',function(){...}) 中的两个参数。第一个参数是我们想要监听的 URL 值，第二个参数是一个 PHP 闭包，作为回调，代表 URL 匹配成功后我们想要做的事情。__callstatic() 做的事情也很简单，分别将目标URL（即 /hello）、HTTP方法（即 GET）和回调代码压入 $routes、$methods 和 $callbacks 三个 Macaw 类的静态成员变量（数组）中。路由文件最后一行的 Macaw::dispatch(); 方法才是真正处理当前 URL 的地方。能直接匹配到的会直接调用回调，不能直接匹配到的将利用正则进行匹配。