zacao / slimvc
PHP Slim MVC 框架骨架/模板项目
Requires
- slim/slim: 2.*
This package is not auto-updated.
Last update: 2020-08-07 18:47:40 UTC
README
这是一个关于 Slim 框架 的 MVC 骨架/模板的项目。
- 支持多应用(微应用)
- 演示用示例数据库
- 使用 Vagrant 的开发环境
设置
您可以直接使用 Vagrant 启动骨架,或者手动设置环境...
使用 Vagrant(推荐)
安装依赖
安装 Vagrant
首先,您需要从 http://www.vagrantup.com/downloads.html 下载 vagrant 设置,然后运行它。
安装 Oracle VirtualBox
现在,您需要下载 VirtualBox,使用以下链接下载 VirtualBox 的最新版本 https://virtualbox.ac.cn/wiki/Downloads
安装应用程序
$ git clone https://github.com/zacao/slimvc.git --recurse-submodules
$ cd slimvc
$ vagrant up
注意
-
上面的 vagrant up 命令还会触发 Vagrant 通过指定的 URL 下载 chef/centos-7.0 虚拟机镜像。如果检测到您的系统上不存在该镜像,Vagrant 才会这样做。
-
设置需要一些时间来完成,请喝杯咖啡,享受吧!
-
设置完成后,在您的浏览器中浏览到 http://slimvc.dev/,您应该看到一个默认的欢迎页面!您也可以尝试其他 URL,例如 http://slimvc.dev/v1/programmers,以及 http://slimvc.dev/v1/programmers/1
-
由于 Windows 下的 VirtualBox,您可能会遇到一些错误,没问题,请几秒钟后重新运行安装程序,如下所示,(如果您在 Windows 10 下遇到问题,请在重新运行之前查看以下 Windows 10 下 VirtualBox 失败创建主机只读适配器问题)
$ vagrant reload --provision
手动设置
安装 Composer
如果您还没有安装 Composer,按照以下步骤安装,http://getcomposer.org/doc/00-intro.md#installation
安装应用程序
安装 Composer 后,从您想要安装的目录中运行以下命令。
(假设您全局安装了 composer 到 /usr/bin/composer,或者请将 composer
替换为 php composer.phar
),
$ composer create-project zacao/slimvc [project-name]
将 [project-name]
替换为您新项目的目录名,然后按照以下步骤操作
-
设置您的虚拟主机文档根。如果您的项目中包含多个应用(微应用),请阅读 官方指南 以配置 Apache/Nginx。
-
子域:每个微应用都有一个专用的域名相关联
+-- public/ | +-- [mini-app-1]/ <-- Document root! | | +-- index.php <-- initialize Slim here! | +-- [mini-app-2]/ <-- Document root! | | +-- index.php <-- initialize Slim here!
-
子文件夹:迷你应用程序共享相同的域名,每个迷你应用程序作为该域名的子文件夹运行
+-- public/ <-- Document root! | +-- [mini-app-1]/ | | +-- index.php <-- initialize Slim here! | +-- [mini-app-2]/ | | +-- index.php <-- initialize Slim here!
-
-
确保
apps/[迷你应用程序名称]/var/
目录下的文件夹对您的 Web 服务器用户/组可写,例如日志、缓存和临时文件。
文件夹结构
- apps/
- [迷你应用程序-1]/ <-- 应用程序文件夹(下面详细说明)
- controllers/ - 控制器类
- models/ - 模型类
- views/ - 模板文件
- routers/ - 按功能分组 Slim 路由,应命名为 name.router.php
- middlewares/ - Slim 自定义中间件类
- etc/ - 配置文件,例如 production.php、development.php
- var/ - 可写文件夹,例如日志、缓存、临时文件等
- [迷你应用程序-2]/
- ...
- ...
- [迷你应用程序-1]/ <-- 应用程序文件夹(下面详细说明)
- lib/ - 与官方 Composer 类库在 PSR-4 标准 对应的自定义类库
- public/ - 根目录及公共资产文件,例如图片、CSS 和 JS
- [迷你应用程序-1]/
- index.php <-- 在此处初始化 Slim!
- [迷你应用程序-2]/
- index.php <-- 在此处初始化 Slim!
- ...
- [迷你应用程序-1]/
应用程序文件夹
这里应该是存储您自己的代码的主要文件夹,例如控制器、模型、视图、中间件等。
路由器
Slim 路由按功能分组,命名格式为 [name].router.php。与 Slim 官方示例 不同,我们使用 <namespace>\<class_name>:<method_name>
格式来定义可调用的路由,与 Slim 官方文档中使用的闭包不同。
v1.default.router.php
// default index action, GET / $app->get('/', 'Sample\Controller\IndexController:actionIndex') ->name('get-homepage'); $app->group('/v1', function () use ($app) { // get programmers list, GET /v1/programmers $app->get('/programmers', 'Sample\Controller\ProgrammerController:actionGetProgrammers') ->name('get-programmers-list'); // get programmer detail, GET /v1/programmers/:id $app->get('/programmers/:id', 'Sample\Controller\ProgrammerController:actionGetProgrammer') ->conditions(array('id' => '\d+')) ->name('get-programmer-detail'); });
- 路由器文件按字母数字顺序加载和排序,因此您可以通过适当的文件名优先级路由器,例如,v1.default.router.php、v1.xxx.router.php(感谢 Wout 的评论)
- 强烈建议使用命名空间调用控制器
控制器
存储定义在路由器中的控制器类文件。它必须每个文件一个类,并且文件名应与控制器类名相同。
IndexController.php
namespace Sample\Controller; use Slimvc\Core\Controller; class IndexController extends Controller { /** * Default index action */ public function actionIndex() { $this->getApp()->contentType('text/html'); $data = array( 'title' => 'It works!', 'content' => 'Have fun with Slim framework in MVC way!' ); $this->render("index/index.phtml", $data); } }
配置(etc)
与 Slim 配置格式相同,请参阅原始的 Slim 配置文档
development.php
ini_set('display_errors', true); ini_set('display_startup_errors', true); ini_set('log_errors', true); ini_set('html_errors', 1); error_reporting(E_ALL | E_STRICT); // with E_STRICT for PHP 5.3 compatibility return array( 'debug' => true, // Templates settings 'templates.path' => APP_DIR . '/views', // Logging settings 'logs.level' => Slim\Log::DEBUG, // PDO database settings 'pdo' => array( 'default' => array( 'dsn' => 'mysql:host=localhost;dbname=sample', 'username' => 'root', 'password' => '', 'options' => array( \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'", ) ), ), );
中间件
有关标准 Slim 中间件类的信息,请参阅原始的 Slim 中间件文档
模型
模型类应该在这里。您可以根据自己的喜好实现模型类。
ProgrammerModel.php
namespace Sample\Model; use Slimvc\Core\Model; class ProgrammerModel extends Model { /** * Get programmer by id * * @param int $id the programmer id * @param array $fields the fields to be return * * @return mixed|static */ public function getProgrammer($id, $fields = array()) { // TODO: we just using PDO for example here, a DAL(Database Access Layer) is strongly recommended if ($fields && is_array($fields)) { // make sure the dynamical fields are safe foreach ($fields as $key => $field) { $fields[$key] = "`" . str_replace("`", "``", $field) . "`"; } unset($key, $field); $fieldsStr = join(',', $fields); } else { $fieldsStr = '*'; } $sql = 'SELECT ' . $fieldsStr . ' FROM `programmers` WHERE id = ? LIMIT 1'; $sth = $this->getReadConnection()->prepare($sql); $sth->setFetchMode(\PDO::FETCH_ASSOC); $sth->execute(array(intval($id))); return $sth->fetch(); } }
视图
默认 Slim 格式的模板文件,请参阅原始的 Slim 中间件文档
var
可写条目的位置,例如日志、缓存和临时文件
lib
将您的自定义类文件放在这里,在此示例中,我们使用 PSR-4 作为自动加载标准,请参阅 composer.json
和 lib
文件夹下的文件以获取详细信息。
composer.json
"autoload": { "psr-4": { "Slimvc\\": "lib/Slimvc", "Sample\\Controller\\": "apps/sample/controllers", "Sample\\Model\\": "apps/sample/models", "Sample\\Middlewares\\": "apps/sample/middlewares" } }
在 lib
文件夹下创建了 Slimvc\Core\Controller 和 Slimvc\Core\Model 示例类。
Controller.php
namespace Slimvc\Core; abstract class Controller { protected $appName = "default"; protected $config = array(); /** * Gets the Slim Application instance * * @return \Slim\Slim */ protected function getApp() { return \Slim\Slim::getInstance($this->appName); } /** * Gets the configuration instance of the related Slim Application * * @return array */ protected function getConfig() { return $this->config; } /** * Constructor * * @param array $config the configurations */ public function __construct($config = array()) { $this->config = $this->getApp()->container['settings']; if ($config && is_array($config)) { $this->config = array_merge($config, $this->config); } } /** * Render a template * * @param string $template The name of the template passed into the view's render() method * @param array $data Associative array of data made available to the view * @param int $status The HTTP response status code to use (optional) */ protected function render($template, $data = array(), $status = null) { $this->getApp()->render($template, $data, $status); } }
公共
这里是文档根目录(.htaccess
及 index.php
)以及每个微应用的仓库,用于存储公共静态资源,例如图片、CSS 和 JavaScript。
Packagist
https://packagist.org.cn/packages/zacao/slimvc
许可
该项目采用 MIT 公共许可证发布。