voodoophp / voodoo
一个微型PHP 5.4模块化MVC框架,仅包含启动所需的库
Requires
- php: >=5.4.0
- voodoophp/handlebars: 2.*
- voodoophp/paginator: 2.*
- voodoophp/voodorm: 2.*
This package is not auto-updated.
Last update: 2024-09-23 11:24:28 UTC
README
一个简单、易于使用、直观的PHP框架,适用于那些保持简单的人
名称:Voodoo
许可:MIT
设计:模块化MVC
要求:PHP 5.4
合规性:PSR-2
作者:Mardix
版权:本年 - Mardix
这是Voodoo的概述,请访问VoodooPHP.org以获取框架的完整文档
关于Voodoo!
Voodoo是一个用PHP编写的模块化MVC框架。其主要目标是确保关注点的分离,通过保持代码组织并避免在同一脚本中混合数据库调用、HTML标签和业务逻辑。
Voodoo首先将应用程序组织成一组独立于其他组的MVC结构子集。这些子集称为模块。模块可以是管理员部分、主站、内网,或者用于A/B测试。
模块通过在组件之间强制执行逻辑边界来提高可维护性。通过模块化,Voodoo允许开发人员/设计师同时工作在单个模块上,从而加快程序的开发速度。新功能或新部分可以快速实现,而无需更改其他部分。当不再需要时,可以删除模块,而一切仍然良好。
功能亮点
- 精简
- RESTful
- API就绪
- MVC
- 共享应用程序
- 模块化MVC
- 命名空间
- PSR合规
- 前端控制器
- 模板
- Handlebars(模板系统)
- 智能路由
- VoodOrm
- 注解
- 分页器
- Handlebars
- Bootstrap CSS/JS框架
- HTTP请求
- Voodooist(动态生成代码)
使用Composer安装Voodoo
要安装Voodoo,创建或编辑composer.json
文件,并在'require'部分添加以下代码:
"voodoophp/voodoo": "1.*"
您的composer.json
文件应类似于以下内容:
{
"name": "voodoophp/myapp",
"description": "My awesome Voodoo App",
"require": {
"voodoophp/voodoo": "1.*"
}
}
然后运行以下命令下载Voodoo及其依赖项:
composer install
假设您的composer将包安装在了/vendor
目录下,当您进入/vendor
时,您应该至少看到以下内容:
|
+-- composer.json
|
+-- vendor/
|
+-- composer/
|
+-- voodoophp/
设置 & 文件系统
现在Voodoo已安装,是时候设置它,以便它为您的应用程序创建目录。
假设composer将包安装在了您的/vendor
目录下,Voodoo框架将位于:/vendor/voodoophp/voodoo
输入以下命令:
cd vendor/voodoophp/voodoo/src/Voodoo/Voodooist
php ./setup.php
一旦设置完成,您应该有一个类似于以下的文件系统:
|
+-- App/
|
+-- .htaccess
|
+-- _conf/
|
+-- Www/
|
+-- Config.conf.php
|
+-- Main/
|
+-- Controller/
|
+-- Model/
|
+-- Views/
|
+-- assets/
|
+-- bootstrap/
|
+-- css/
|
+-- img/
|
+-- js/
|
+-- jquery/
|
+-- vendor
|
+-- composer/
|
+-- voodoophp/
|
+-- composer.json
|
+-- .htaccess
|
+-- index.php
|
+-- robots.txt
/App : 包含您的应用程序的模块化MVC
/App/_conf : 包含配置,例如:DB.conf.php用于数据库设置,System.conf.php用于系统级设置,app.json是您的应用程序模式,用于动态创建MVC文件。
/App/Www:这是您的默认应用程序,其中包含您的MVC文件。当有人访问您的应用程序时,他们会在那里,除非您将其更改为另一个应用程序。您还可以有/App/Site1、/App/Site2、/App/Api等,以创建共享同一Voodoo代码库的多应用程序。
/assets/:这是您的应用程序共享资产。为了方便起见,我们添加了Bootstrap和JQuery。
/vendor/:这是composer安装包的地方
/composer.json:这是composer文件
/index.php:这是前端控制器文件,它将所有内容重定向到Voodoo以执行其魔法!
Voodooist
巫毒教是我们的小弟,它将帮助我们正确地为我们的巫毒应用程序创建命名空间化的目录和文件,遵循PSR-0规范。
一旦我们的应用程序设置完成,Voodooist需要:/App/_conf/app.json 和 /App/voodooist.php。这些文件是在初始设置过程中创建的。
- App/_conf/app.json
App/_conf/app.json 是一个JSON文件,包含您的应用程序布局,包括模块、控制器、控制器动作等。Voodooist通过运行此文件来设置您的应用程序。以下是基本的 app.json
{
"createPublicAssets" : true,
"applications" : [
{
"name" : "www",
"modules" : [
{
"name" : "Main",
"template" : "Default",
"isApi" : false,
"omitViews" : false,
"controllers" : [
{
"name" : "Index",
"actions" : ["index", "login", "logout", "about-us"]
},
{
"name" : "Account",
"actions" : ["index", "info", "preferences"]
}
],
"models" : [
{
"name" : "User",
"dbAlias" : "MyDB",
"table" : "user",
"primaryKey" : "id",
"foreignKey" : "%s_id"
},
{
"name" : "User/Preference",
"dbAlias" : "MyDB",
"table" : "user_preference",
"primaryKey" : "id",
"foreignKey" : "%s_id"
}
]
}
]
}
]
}
- /App/Voodoist.php
一旦Voodoo设置完成,您就无需去 /vendor/voodoophp/voodoo/src/Voodoo/Voodooist/setup.php
创建应用程序文件了。Voodoo创建了 /App/voodooist.php
来实现相同的功能。您需要它根据您的 /App/_conf/app.json 动态创建应用程序文件。所有文件都将按照PSR-0规范进行命名空间化,并放置在 /App 下的相应应用程序中。
运行以下代码将执行上述设置的 /App/_conf/app.json
cd /App
php ./voodooist.php
执行 /App/voodooist.php 后,您应该看到类似以下的文件系统
|
+-- App/
|
+-- .htaccess
|
+-- Www
|
+-- Config.conf.php
|
+-- Main
|
+-- Controller/
|
+-- BaseController.php (extends Voodoo\Core\Controller)
|
+-- Index.php (extends BaseController)
::actionIndex()
::actionLogin()
::actionLogout()
::actionAboutUs()
|
+-- Account.php (extends BaseController)
::actionIndex()
::actionInfo()
::actionPreferences()
|
+-- Model/
|
+-- User.php
|
+-- User/Preference.php
|
+-- Views/
|
+-- Index/
|
+-- Index.html
|
+-- Login.html
|
+-- Logout.html
|
+-- AboutUs.html
|
+-- Account/
|
+-- Index.html
|
+-- Info.html
|
+-- Preferences.html
|
+-- _assets/
|
+-- js/
|
+-- css/
|
+-- img/
|
+-- _components/
|
+-- flash-message.html
|
+-- pagination.html
|
+-- _layouts/
|
+-- default.html
|
+-- head-tag.html
|
+-- footer.html
|
+-- header.html
|
+-- assets/ [+]
|
+-- vendor/ [+]
|
+-- index.php
|
+-- .htaccess
应用程序(多应用程序)
应用程序是您程序的最高级别。一切必须在应用程序中。一个应用程序可以是另一个共享相同Voodoo代码库的其他应用程序的网站。因此,Voodoo为多站和多应用程序做好了准备。
您可以有 Site1.com、Site2.com、SiteX.com 所有这些都位于同一环境中,共享相同的入口控制器和相同的Voodoo代码库。由于您的应用程序遵循PSR-0命名空间,因此很容易重用其他应用程序中的代码。
每个应用程序内部都有应用程序模块。默认情况下,Voodoo创建了一个 WWW,这是您网站的默认入口点。在大型应用程序中,应用程序是一组模块。更高级的app.json看起来像这样,有三个应用程序:Www、AnotherApp、Api
/App/_conf/app.json
{
"createPublicAssets" : true,
"applications" : [
{
"name" : "www",
"modules" : [
{
"name" : "Main",
"template" : "Default",
"isApi" : false,
"omitViews" : false,
"controllers" : [
{
"name" : "Index",
"actions" : ["index", "login", "logout", "about-us"]
},
{
"name" : "Account",
"actions" : ["index", "info", "preferences"]
}
],
"models" : [
{
"name" : "User",
"dbAlias" : "MyDB",
"table" : "user",
"primaryKey" : "id",
"foreignKey" : "%s_id"
},
{
"name" : "User/Preference",
"dbAlias" : "MyDB",
"table" : "user_preference",
"primaryKey" : "id",
"foreignKey" : "%s_id"
}
]
}
]
},
{
"name" : "AnotherApp",
"modules" : [
{
"name" : "Main",
"template" : "Default",
"isApi" : false,
"omitViews" : false,
"controllers" : [
{
"name" : "Index",
"actions" : ["index", "info"]
}
]
},
{
"name" : "Admin",
"template" : "Default",
"isApi" : false,
"omitViews" : false,
"controllers" : [
{
"name" : "Index",
"actions" : ["index", "login"]
}
]
}
]
},
{
"name" : "Api",
"modules" : [
{
"name" : "Main",
"template" : "",
"isApi" : true,
"omitViews" : true,
"controllers" : [
{
"name" : "Index",
"actions" : ["index", "status"]
}
]
}
]
}
]
}
运行 /App/voodooist.php 后,您将获得以下结构
|
+-- App/
|
+-- .htaccess
|
+-- Www
|
+-- Config.conf.php
|
+-- Main
|
+-- Controller/
|
+-- BaseController.php (extends Voodoo\Core\Controller)
|
+-- Index.php (extends BaseController)
::actionIndex()
::actionLogin()
::actionLogout()
::actionAboutUs()
|
+-- Account.php (extends BaseController)
::actionIndex()
::actionInfo()
::actionPreferences()
|
+-- Model/
|
+-- User.php
|
+-- User/Preference.php
|
+-- Views/
|
+-- Index/
|
+-- Index.html
|
+-- Login.html
|
+-- Logout.html
|
+-- AboutUs.html
|
+-- Account/
|
+-- Index.html
|
+-- Info.html
|
+-- Preferences.html
|
+-- _assets/
|
+-- js/
|
+-- css/
|
+-- img/
|
+-- _components/
|
+-- flash-message.html
|
+-- pagination.html
|
+-- _layouts/
|
+-- default.html
|
+-- head-tag.html
|
+-- footer.html
|
+-- header.html
|
+-- AnotherApp
|
+-- Config.conf.php
|
+-- Main
|
+-- Controller/
|
+-- BaseController.php (extends Voodoo\Core\Controller)
|
+-- Index.php (extends BaseController)
::actionIndex()
::actionInfo()
|
+-- Views/
|
+-- Index/
|
+-- Index.html
|
+-- Info.html
|
+-- _assets/[+]
|
+-- _components/ [+]
|
+-- _layouts/ [+]
|
+-- Admin
|
+-- Controller/
|
+-- BaseController.php (extends Voodoo\Core\Controller)
|
+-- Index.php (extends BaseController)
::actionIndex()
::actionLogin()
|
+-- Views/
|
+-- Index/
|
+-- Index.html
|
+-- Login.html
|
+-- _assets/[+]
|
+-- _components/ [+]
|
+-- _layouts/ [+]
|
+-- Api
|
+-- Config.conf.php
|
+-- Main
|
+-- Controller/
|
+-- BaseController.php (extends Voodoo\Core\Controller\Api)
|
+-- Index.php (extends BaseController)
::actionIndex()
::actionStatus()
|
+-- assets/ [+]
|
+-- vendor/ [+]
|
+-- index.php
|
+-- .htaccess
模块
模块是您应用程序的第二级别。应用程序是一组模块,而模块是一组MVC应用程序。
每个模块包含一组MVC。默认情况下,如果没有指定模块,Voodoo将回退到 Main
模块。
以下是 Www 应用程序中的 Main 模块的示例。
|
+-- App/
|
+-- .htaccess
|
+-- Www
|
+-- Config.conf.php
|
+-- Main
|
+-- Controller/
|
+-- Index.php
::actionIndex()
::actionAbout()
|
+-- Model/
|
+-- MySampleModel.php
|
+-- View/
|
+-- Index/
|
+-- Index.html
|
+-- About.html
|
+-- _assets/
|
+-- js/
|
+-- css/
|
+-- img/
|
+-- _components/
|
+-- flash-message.html
|
+-- pagination.html
|
+-- _layouts/
|
+-- default.html
|
+-- head-tag.html
|
+-- footer.html
|
+-- header.html
|
+-- assets/ [+]
|
+-- vendor/ [+]
|
+-- index.php
|
+-- .htaccess
所有类都按照PSR-0进行了命名空间化。因此,Www/Main 的主要命名空间如下
App\Www\Main
App\Www\Main\Controller
App\Www\Main\Controller\Index
App\Www\Main\Model
App\Www\Main\Model\MySampleModel
将 Www
替换为您希望使用的任何其他应用程序名称,您将拥有相同的结构。
模块可以用作什么?
模块可以是与主站点分离的网站的其他部分,例如 App\Www\Admin
是管理部分或 App\Www\Api
用于提供API。它可以是你想要的任何东西。它可以用于A/B测试等...
现在您已经了解了Voodoo的结构,让我们来了解它的工作原理
前端控制器:/index.php
在您应用程序的根目录中有一个 index.php。作为前端控制器,其任务是封装Voodoo应用程序的典型请求/路由/分发/响应,通过调用 Voodoo\Core\Application
/index.php
<?php
require_once __DIR__."/App/bootstrap.php";
/**
* Set the application name to use. By default it's Www
* @type string
*/
$appName = "www";
(new Voodoo\Core\Application(APP_ROOT_DIR, $appName))->doVoodoo();
所有内容都首先到这里,然后再去它们需要去的地方
前端控制器根据URL服务多个应用程序
以下示例说明了如何使用相同的代码库实现多站。
根据主机名,每个网站将使用不同的应用程序目录。您需要将所有域名指向相同的IP地址才能使其工作。
让我们使用上面提到的 /App/_conf/app.json 来实现我们的多站
/index.php
<?php
require_once __DIR__."/App/bootstrap.php";
$hostName = Voodoo\Core\Env::getHostName();
switch($hostName) {
case "api.mysite.com" :
$appName = "Api";
break;
case "crazyapps.com" :
$appName = "AnotherApp";
break;
case "site1.com" :
$appName = "Site1";
break;
default: // mydefaultsite.com
$appName = "Www";
}
(new Voodoo\Core\Application(APP_ROOT_DIR, $appName))->doVoodoo();
现在您有一个多站应用程序。太棒了!
智能路由与应用程序执行
Voodoo通过使用URL模式巧妙地将路由到应用程序的正确模块
site.com/Module/Controller/Action/Segments/?paramName=paramValue
-
模块:MVC应用程序的容器
-
控制器:接受用户请求的类
-
动作:控制器类的方法
-
段:传递给动作的额外参数
-
ParamName/ParamValue:查询URL中的参数
Voodoo是如何执行您的应用程序的?
非常首先,Voodoo需要的是一个应用程序名称。应用程序名称包含应用程序的所有模块。这在前端控制器中设置。
然后它会检查模块,如果找到,它将访问该目录
然后检查控制器,它是一个类,如果存在则加载它
然后检查动作,这是控制器中的方法。如果存在,则执行该方法
但如果动作不存在,它将回退到Controller::actionIndex()方法
如果控制器不存在,它将回退到Index.php控制器
如果模块不存在,它将回退到Main模块
应用程序路由(自定义路由)
有时,你可能想改变URL显示的方式。可能是因为SEO目的,或者某些东西已经改变,或者任何其他原因...你将不得不在应用程序配置文件中更改路由,位置在:/App/$AppName/Routes.conf.php
每个应用程序都包含一个Routes.conf.php
文件。它在初始化时由Voodoo\Core\Application
加载,包含必要的设置,如默认加载哪个控制器、视图设置等。它还包含你的应用程序的路由。
如果你打开/App/Www/Routes.conf.php,查找routes键,你应该会找到类似以下的内容
/App/Www/Routes.conf.php
path["(:any)"] = "$1"
它默认使用基本路由模式
site.com/Module/Controller/Action/Segments/?paramName=paramValue
假设你有一个这个URL路径
site.com/users/profile/info/mardix
- users = 模块
- profile = 控制器
- info = 动作
- mardix = 分段
但你希望缩短为:site.com/profile/mardix
你可以在Config.conf.php文件中创建一个新的路由路径,如下所示
path["/profile/(:any)"] = "/Users/Profile/Info/$1"
path["(:any)"] = "$1"
现在当有人输入site.com/profile/mardix
时,应用程序将被重新路由到/Users/Profile/Info/mardix
。
你可以添加尽可能多的路由。此外,路由可以有尽可能多的指令,并且支持正则表达式以进行更高级的匹配。
path["/profile/(:any)"] = "/Users/Profile/Info/$1"
path["/music/([rap|techno|compas]+)/(:num)"] = "/Music/Selection/genre/$1/song/$2"
path["/blog/(:alnum)/(:num)/(:any)"] = "Main/Blog/Category/$1/post/$2/$3/"
path["(:any)"] = "$1"
音乐路由:site.com/music/rap/1526 -> /Music/Selection/genre/{rap}/song/{1526}
Music = module
Selection = controller
genre = action
rap = segement #1, accessed in the controller $this->getSegment(1)
song = segement #2, accessed in the controller $this->getSegment(2)
1526 = segement #3, accessed in the controller $this->getSegment(3)
关于路由需要了解的事项
-
为了减少开销,应用程序的路由在调用任何MVC应用程序之前运行
-
重定向不是重定向。它将路径重定向到新路径,而不会更改地址栏中的URL
-
Voodoo路由不区分大小写。所以访问/Profile/info/mardix和/pRofile/inFo/mardix会导致相同的地方
-
只接受字母数字[AZ-09]字符。所有其他字符在路由时将被忽略。所以/pro-file/info/mardix仍然会导致/Profile/Info/mardix/。同样/about-us/会导致/aboutus/。所以你可以巧妙地编写SEO友好的URL,同时让你的应用程序正常运行,无需烦恼。
重要的是要了解路由是按照添加的顺序匹配的,一旦URL与路由匹配,路由基本上“停止”,并且剩余的路由永远不会尝试。因为默认路由几乎匹配任何内容,包括空URL,新的路由必须放在它之前。
path[/article/(:num)] = "/Blog/Article/Read/$1"
path["/profile/(:any)"] = "/Main/Profile/Info/$1"
path["(:any)"] = "$1"
现在你已经了解了Voodoo如何与前端控制器和路由一起工作,让我们深入到肉的部分。Ayibobo!
模型-视图-控制器
正如你上面已经注意到的,你的MVC应用程序将位于$AppName和$ModuleName下。
-
模型:
App\$AppName\$ModuleName\Model
-
控制器:
App\$AppName\$ModuleName\Controller
-
视图:
App/$AppName/$ModuleName/Views
假设我们正在使用Www
应用程序和Main
模块。
控制器
所有控制器都将位于命名空间:App\Www\Main\Controller
App/Www/Main/Controller/Index.php
<?php
namespace App\Www\Main\Controller;
use Voodoo;
class Index extends BaseController
{
public function actionIndex()
{
$this->view()->setTitle("Hello World");
}
public function actionAboutUs()
{
}
//...
}
所有控制器都由 BaseController
扩展,而 Voodoo\Core\Controller
又扩展了它,其中包含了获取参数、加载视图、获取模型等所需的方法... BaseController
已经被设置好了,你可以与其他控制器共享功能。
视图
所有视图都放在:App/Www/Main/Views
默认情况下,视图是 HTML 模板文件。基于关注点分离原则,视图的作用是显示数据。不包含任何逻辑。为了实现这一点,Voodoo 使用 Mustache.php 作为模板引擎来渲染 HTML。
也可以使用其他引擎,如 Twig 来代替 Mustache。
但是,如果你打算使用 PHP 作为模板系统本身,例如 <title><?= $this->title; ?></title>
,那么我的朋友,我不确定 Voodoo 是否是适合你的工具。无论如何...
这就是带有 Mustache 模板的模板文件看起来像什么
<html>
<head>
<title>{{_app.title}}</title>
</head>
<body>
<ul>
{{#each articles}}
<li>{title}</li>
{{/each articles}}
</ul>
</body>
</html>
模型
默认情况下,所有基于我们的 app.json 的模型都将驻留在命名空间下:App\Www\Main\Model
此外,默认情况下,Voodoo 使用 VoodOrm,这是一个微型的 ORM,它既是一个流畅的查询 API,也是一个 CRUD 模型类。它在 \Voodoo\Core\Model
中扩展。
例如,在 app.json 中创建模型时
{
...
"models" : [
{
"name" : "User",
"dbAlias" : "MyDB",
"table" : "user",
"primaryKey" : "id",
"foreignKey" : "%s_id"
}
]
...
}
-
name:类的名称
-
dbAlias:数据库别名。我们稍后会回到这个问题。
-
table:与该类关联的表名
-
primaryKey:表的键
-
foreignKey:外键
当模型创建时,这些设置将被添加到类中,以便它可以通过 PDO 连接到数据库
/App/Cong/DB.conf.php 和 dbAlias
Voodoo 要求你将你的数据库设置(数据库名称、用户名、密码、主机)存储在 /App/_conf/DB.conf.php
中。每个设置都与一个别名相关联。
数据库连接由 Voodoo\Core\ConnectionManager()
管理,确保每个别名只连接一次,即使被调用 20 亿次(我希望不是,哈哈)。
这就是 /App/_conf/DB.conf.php 的样子
[MyDB]
type = "mysql"
host = "localhost"
port = 3306
user = "root"
password = "my_password"
dbname = "my_db_name"
其中 MyDB
是别名名称。
因此,在 app.json 中 "dbAlias" : "MyDB"
指的是上面的设置,并且 ConnectionManager 将使用它来连接到数据库。
因此,有 dbAlias,允许你将设置放在一个地方,如果你更改了其中的任何内容,比如主机或 dbName,所有使用 MyDB
的类仍然可以正常工作。
通过将模型扩展到 Voodoo\Core\Model
,连接由 Voodoo 聪明地处理,你不需要做任何事情。
所以一旦运行了 App/_conf/app.json,你应该有一个类似下面的模型类
/App/Www/Main/Model/User.php
<?php
namespace App\Www\Main\Model;
use Voodoo;
class User extends Voodoo\Core\Model
{
protected $tableName = "user";
protected $primaryKeyName = "id";
protected $foreignKeyName = "%s_id";
protected $dbAlias = "MyDB";
}
由于 Voodoo 使用 VoodOrm,所以我们自动可以使用 VoodOrm 的所有方法,例如,App\Www\Main\Model\User::find()
,App\Www\Main\Model\User::count()
等...
如你所见,Voodoo 避免了在同一个脚本中将数据库调用、HTML 标签和业务逻辑混合在一起。这就是为什么我们将应用程序的每个部分分开,这种做法被称为关注点分离。
第一个 Voodoo 应用
现在你已经了解了 Voodoo 的工作原理,让我们创建一个简单的应用程序:在路径 site.com/hello-world/
和 site.com/articles
创建一个名为“Hello World”的应用程序
为此,我们将使用 Voodooist 来设置我们的文件。
编辑文件:App/_conf/app.json
{
"createPublicAssets" : true,
"applications" : [
{
"name" : "www",
"modules" : [
{
"name" : "Main",
"template" : "Default",
"isApi" : false,
"omitViews" : false,
"controllers" : [
{
"name" : "Index",
"actions" : ["index", "hello-world", "articles"]
}
],
"models" : [
{
"name" : "Articles",
"dbAlias" : "MyDB",
"table" : "articles",
"primaryKey" : "id",
"foreignKey" : "%s_id"
}
]
}
]
}
]
}
运行以下命令
cd /App
php ./voodooist.php
你应该得到以下文件系统
|
+-- App/
|
+-- .htaccess
|
+-- Www
|
+-- Config.conf.php
|
+-- Main
|
+-- Controller/
|
+-- Index.php
::actionIndex()
::actionHelloWorld()
::actionArticles()
|
+-- View/
|
+-- Index/
|
+-- Index.html
|
+-- HelloWorld.html
|
+-- Articles.html
|
+-- _assets/
|
+-- js/
|
+-- css/
|
+-- img/
|
+-- _components/
|
+-- flash-message.html
|
+-- pagination.html
|
+-- _layouts/
|
+-- default.html
|
+-- head-tag.html
|
+-- footer.html
|
+-- header.html
|
+-- assets/ [+]
|
+-- vendor/ [+]
|
+-- index.php
|
+-- .htaccess
App/Www/Main/Controller/Index.php
<?php
namespace App\Www\Main\Controller;
use App\Ww\Main\Model;
class Index extends BaseController
{
/**
* The default action.
**/
public function actionIndex(){
$this->view()->setPageTitle("Welcome to my Site");
}
/**
* @action hello-world
*/
public function actionHelloWorld(){
$this->view()->setPageTitle("Hello World");
}
/**
* @action articles
*/
public function actionArticles(){
$this->view()->setPageTitle("Latest Articles");
$articles = (new Model\Articles)->find();
$articlesData = [];
foreach ($articles as $article) {
$articlesData[] = [
"id" => $article->getPK(),
"title" => $article->title,
"date" => $this->formatDate($article->published_date)
];
}
$this->view()->assign("articles", $articlesData);
}
}
App/Www/Main/Model/Articles.php
<?php
namespace App\Www\Main\Model;
use Voodoo;
class Articles extends Voodoo\Core\Model
{
protected $tableName = "articles";
protected $primaryKeyName = "id";
protected $foreignKeyName = "%s_id";
protected $dbAlias = "MyDB";
}
创建视图
App/Www/Main/Views/Index/Index.html
<div>
<h3>Welcome to my site</h3>
Blah blah blah
</div>
App/Www/Main/Views/Index/HelloWorld.html
<div>
<h3>Hello World</h3>
Blah blah blah
</div>
App/Www/Main/Views/Index/Articles.html
<div>
<h3>Latest Articles</h3>
<ul>
{{#each articles}}
<li><a href='{{../_app.controller_url}}/read/{{id}}'>{{title}}</a></li>
{{/each}}
</ul>
</div>
App/Www/Main/Views/_layout/default.html
Voodoo 要求一个容器模板文件。容器是动作视图的占位符。容器可以包含页眉、页脚、侧边栏等,但必须包含下面的标签来包含动作视图页面
{{!include @action_view}}
从技术角度来说,容器是您应用程序的布局,而您的动作文件则是要包含在布局中的文件。
那么,我们来创建容器。它位于
/App/Www/Main/Views/_layout/default.html
<html>
<head>
<title>{{_app.title}}</title>
</head>
<body>
{{%include _layouts/header}}
{{!include @action_view}}
{{> _layouts/footer}}
</body>
</html>
现在一切都已经设置好,准备运行。
如果有人访问 site.com/articles/
,他将看到所有文章的列表。
基本上就是这样。
前往 VoodooPHP.org 获取更详细的文档。
VoodooPHP 由 Mardix 创建并发布在 MIT 许可下。
享受吧!
(c) 本年 Mardix
(oof! 写了这么多,2013年6月9日)