zacao/slimvc

PHP Slim MVC 框架骨架/模板项目

维护者

详情

github.com/zacao/slimvc

主页

安装: 301

依赖: 0

建议者: 0

安全: 0

星标: 30

关注者: 8

分支: 21

类型:项目

v1.1.0 2015-08-27 13:59 UTC

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]/
      • ...
    • ...
  • lib/ - 与官方 Composer 类库在 PSR-4 标准 对应的自定义类库
  • public/ - 根目录及公共资产文件,例如图片、CSS 和 JS
    • [迷你应用程序-1]/
      • index.php <-- 在此处初始化 Slim!
    • [迷你应用程序-2]/
      • index.php <-- 在此处初始化 Slim!
    • ...

应用程序文件夹

这里应该是存储您自己的代码的主要文件夹,例如控制器、模型、视图、中间件等。

路由器

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');
});
  1. 路由器文件按字母数字顺序加载和排序,因此您可以通过适当的文件名优先级路由器,例如,v1.default.router.php、v1.xxx.router.php(感谢 Wout 的评论
  1. 强烈建议使用命名空间调用控制器

控制器

存储定义在路由器中的控制器类文件。它必须每个文件一个类,并且文件名应与控制器类名相同。

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.jsonlib 文件夹下的文件以获取详细信息。

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);
    }
}

公共

这里是文档根目录(.htaccessindex.php)以及每个微应用的仓库,用于存储公共静态资源,例如图片、CSS 和 JavaScript。

Packagist

https://packagist.org.cn/packages/zacao/slimvc

许可

该项目采用 MIT 公共许可证发布。