phalcon框架默认mvc结构如下
phalcon_test/
|----app //应用目录
| |----config //配置目录
| | |----config.php
| | |----loader.php
| | |----services.php
| |----controllers //控制器目录
| | |----ControllerBase.php
| | |----IndexController.php
| |----library //类库目录
| |----migrations //数据库迁移文件目录
| |----models //数据库模型目录
| |----views //视图目录
| | |----index
| | | |----index.volt
| | |----index.volt
| | |----layouts
|----cache //缓存目录
|----index.html
|----public //入口目录
| |----.htaccess
| |----index.php //入口文件
| |----css
| |----files
| |----img
| |----js
| |----temp
|----.htrouter.php
|----.htaccess
<code>注:phalcon框架的目录的结构可以随自己的情况自定义。</code>
分析默认结构中的主入口文件:phalcon_test -> public -> index.php
<?php
use Phalcon\Di\FactoryDefault;
error_reporting(E_ALL);
define('BASE_PATH', dirname(__DIR__)); //定义基础目录
define('APP_PATH', BASE_PATH . '/app'); //定义app目录
try {
/**
* 创建服务容器
*/
$di = new FactoryDefault();
/**
* 读取config文件中的服务(给服务容器注册服务)
*/
include APP_PATH . "/config/services.php";
/**
* 获取注册的配置服务数据
*/
$config = $di->getConfig();
/**
* 创建自动加载器 $loader、注册自动加载目录
*/
include APP_PATH . '/config/loader.php';
/**
* 创建程序应用
* 发送响应的内容
*/
$application = new \Phalcon\Mvc\Application($di);
echo $application->handle()->getContent();
} catch (\Exception $e) {
/**
* 捕捉错误信息
*/
echo $e->getMessage() . '<br>';
echo '<pre>' . $e->getTraceAsString() . '</pre>';
}
下面我们来调整下项目目录结构:
phalcon_test/
|----apps
| |----front
| | |----controllers
| | | |----IndexController.php
| | |----models
| | |----views
| | | |----index
| | | | |----index.phtml
|----public
| |----.htaccess
| |----index.php
| |----css
| |----files
| |----img
| |----js
| |----temp
|----.htrouter.php
|----.htaccess
调整框架主入口文件:phalcon_test -> public -> index.php
<?php
use Phalcon\Loader; //加载器
use Phalcon\Di\FactoryDefault;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\View;
use Phalcon\Mvc\Application;
use Phalcon\Mvc\Url;
error_reporting(E_ALL);
try{
//创建自动加载器
$loader = new Loader();
//注册命名空间
$loader->registerNamespaces([
'Front\Controllers' => '../apps/front/controllers/',
'Front\Models' => '../apps/front/models/',
])->register();
//创建服务容器并注册服务
$di = new FactoryDefault();
//使用命名空间一定要设置派遣器
$di->set('dispatcher', function () {
$dispatcher = new Dispatcher();
$dispatcher->setDefaultNamespace('Front\Controllers\\');
return $dispatcher;
});
//设置视图目录
$di->set('view', function(){
$view = new View();
$view->setDI($this);
$view->setViewsDir('../apps/front/views/');
return $view;
});
//创建程序应用,并发送响应内容
$app = new Application($di);
echo $app->handle()->getContent();
}catch (Exception $e){
echo $e->getMessage();
}
默认主控制器:phalcon_test -> apps -> front -> controllers -> IndexController.php
namespace Front\Controllers;
use Phalcon\Mvc\Controller;
class IndexController extends Controller{
public function indexAction() {
$this->view->test='hello flycorn...';
}}
默认主视图:phalcon_test -> apps -> front -> views -> index -> index.phtml
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1><?= $test;?></h1>
</body>
</html>
<code>注:如果调整完目录结构无法访问项目,请重启服务,如果访问任何控制器都显示的是index默认的视图,请检查路由重写规则!</code>
定制一个多模块的框架结构(前后台模块)
phalcon_test/
|----apps
| |----frontend //前台
| | |----controllers
| | | |----IndexController.php
| | |----views
| | | |----index
| | | | |----index.phtml
| | |----Module.php //前台模块
| |----backend //后台
| | |----controllers
| | | |----IndexController.php
| | |----views
| | | |----index
| | | | |----index.phtml
| | |----Module.php //后台模块
| |----models //数据模型
| |----Bootstrap.php //应用入口
|----public
| |----.htaccess
| |----index.php //项目入口
| |----css
| |----files
| |----img
| |----js
| |----temp
|----.htrouter.php
|----.htaccess
项目入口文件:phalcon_test -> public -> index.php
use Apps\Bootstrap;
include dirname(__DIR__).DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.'Bootstrap.php';
$bootstrap = new Bootstrap();
$bootstrap->run();
应用入口文件:phalcon_test -> apps -> Bootstrap.php
namespace Apps;
use Phalcon\Di\FactoryDefault;
use Phalcon\Mvc\Application;
use Phalcon\Mvc\Router;
class Bootstrap
{
public function run()
{
try{
/**
* 创建容器
*/
$di = new FactoryDefault();
/**
* 注册路由
*/
$di->set('router', function () {
$router = new Router();
$router->setDefaultModule("frontend");
//后台路由
$router->add("/admin", array(
'module' => 'backend',
'controller' => 1,
'action' => 2,
));
$router->add("/admin/:controller", array(
'module' => 'backend',
'controller' => 1,
'action' => 2,
));
$router->add('/admin/:controller/:action', array(
'module' => 'backend',
'controller' => 1,
'action' => 2,
));
//前台路由
$router->add(':controller/:action', array(
'module' => 'frontend',
'controller' => 1,
'action' => 2,
));
return $router;
});
/**
* 创建应用
*/
$app = new Application($di);
/**
* 注册模块
*/
$app->registerModules(array(
'frontend' => array(
'className' => 'Apps\Frontend\Module',
'path' => '../apps/frontend/Module.php'
),
'backend' => array(
'className' => 'Apps\Backend\Module',
'path' => '../apps/backend/Module.php'
)
));
//发送响应
echo $app->handle()->getContent();
}catch(Exception $e){
echo $e->getMessage();
}
}
}
前台模块:phalcon_test -> apps -> frontend -> Module.php
namespace Apps\Frontend;
use Phalcon\Loader;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\View;
use Phalcon\Db\Adapter\Pdo\Mysql;
class Module{
/**
* 注册命名空间
*/
public function registerAutoloaders()
{
$loader = new Loader();
$loader->registerNamespaces(array(
'Apps\Frontend\Controllers' => '../apps/frontend/controllers/',
'Apps\Models' => '../apps/models/',
));
$loader->register();
}
/**
* 注册服务
* @param $di
*/
public function registerServices($di)
{
//注册派遣器
$di->set('dispatcher', function () {
$dispatcher = new Dispatcher();
$dispatcher->setDefaultNamespace('Apps\Frontend\Controllers\\');
return $dispatcher;
});
//注册视图
$di->set('view', function () {
$view = new View();
$view->setViewsDir('../apps/frontend/views/');
return $view;
});
//注册数据库
$di->set('db', function () {
return new Mysql(
[
"host" => "localhost",
"username" => "root",
"password" => "123456",
"dbname" => "phalcon_test"
]
);
});
}
}
后台模块:phalcon_test -> apps -> backend -> Module.php
namespace Apps\Backend;
use Phalcon\Loader;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\View;
use Phalcon\Db\Adapter\Pdo\Mysql;
class Module{
/**
* 注册命名空间
*/
public function registerAutoloaders()
{
$loader = new Loader();
$loader->registerNamespaces(array(
'Apps\Backend\Controllers' => '../apps/backend/controllers/',
'Apps\Models' => '../apps/models/',
));
$loader->register();
}
/**
* 注册服务
* @param $di
*/
public function registerServices($di)
{
//注册派遣器
$di->set('dispatcher', function () {
$dispatcher = new Dispatcher();
$dispatcher->setDefaultNamespace('Apps\Backend\Controllers\\');
return $dispatcher;
});
//注册视图
$di->set('view', function () {
$view = new View();
$view->setViewsDir('../apps/backend/views/');
return $view;
});
//注册数据库
$di->set('db', function () {
return new Mysql(
[
"host" => "localhost",
"username" => "root",
"password" => "123456",
"dbname" => "phalcon_test"
]
);
});
}
}
前台控制器:phalcon_test -> apps -> frontend -> controllers -> IndexController.php
namespace Apps\Frontend\Controllers;
use Phalcon\Mvc\Controller;
class IndexController extends Controller
{
public function indexAction()
{
echo '前台模块';
}
}
后台控制器:phalcon_test -> apps -> backend -> controllers -> IndexController.php
namespace Apps\Backend\Controllers;
use Phalcon\Mvc\Controller;
class IndexController extends Controller
{
public function indexAction()
{
echo '后台模块';
}
}
Github上也提供的各种phalcon的mvc结构,也可以按照自己的场景自定义。
Phalcon MVC
网友评论