Joe*_*ito 10 php model-view-controller controller initialization view
当我问这个问题时,我太困了,对不起,无论如何,为了清楚起见,我准备了2个小时的问题.
我正在尝试组织我的代码并决定组织它mvc'ish(mvc-like),我不知道我是否可以遵循所有原则,但我想至少接近这一点.
我的应用程序有一个前端控制器(dunno,如果我的定义是正确的),所以我的应用程序的所有http请求将通过一个点,在我的情况下,index.php
在我的应用程序的根目录中.
说过我已经设置好了,你可以想象我曾经.htaccess
把所有的请求都指向了index.php
.
我爆炸了,url
并创建了一个阵列,$url[]
就像这样.因此,每当我像这样访问我的应用程序时,http://localhost/app/pagename
它将访问控制器(pagename_controller
)
我是这样做的:
$file = $controller_path . $page . '_controller.php';
if (file_exists($file)) {
require $file;
$class_name = ucfirst($page) . '_controller';
$target = new $class_name();
}
Run Code Online (Sandbox Code Playgroud)
我也将它包装在一个容器中,即"装饰器模式",供将来使用,验证可能.像这样 :
$controller = new Wrap($target);
$controller->index();
Run Code Online (Sandbox Code Playgroud)
我不知道$controller
变量名的使用是否合适所以请原谅我什么时候都错了.
我觉得我可以这样设置我的应用程序:
用户发送请求,怎么样?通过使用应用程序意味着他/她发出一个http请求,它将加载应用程序的初始状态
正如您在我所需的应用程序结构图中所看到的,我只能将第一部分用于将请求定向到单个条目(index.php
)
现在问题是应用程序其他部分的初始化.
截至目前,我有3个文件要设置,但我对如何感到困惑.
index_controller
,index_view
,Template
class Index_controller {
private $model;
private $view;
public function __construct(){
// optional model -> $this->model = 'index'
$this->view = 'index' //
}
public function index(){
$this->load->view($this->view)
}
}
class Index_view {
private $model;
private $template;
public function __construct(Model $model = null){
$this->template = new Template('default');
}
public function view() {
$this->template->assign('css', 'default_css'); // don't know if this is efficient
// or $this->template->assign('header', 'default_header');
// or $this->template->assign('sidebar', 'default_sidebar');
// or $this->template->assign('footer', 'default_footer');
// or any other things I want to use in the template
}
}
class Template {
public $data = array();
private $tmpl;
public function __construct($template) {
$this->tmpl = $template . '_tmpl.php';
}
public function assign($name, $value){
$this->data[$name] = $value;
}
// public function output
// function that will explode the data array and render it out as a webpage
// I'll create templates and
}
Run Code Online (Sandbox Code Playgroud)
有了这些,我现在想知道如何将这些东西联系在一起.目前我有一个system
可以包含类的文件夹,我为该文件夹设置了自动加载器.
我正在考虑创建一个Controller
类和View
类,它充当ActionFactory和ViewFactory,如图所示,尽管我知道这些不是他们的责任.
我在想这个:
class Controller {
protected $load;
public function __construct() {
$this->load = new View();
}
}
class View {
public function __construct() {
// some things i don't know
}
public function view() {
// some things i don't know
}
}
Run Code Online (Sandbox Code Playgroud)
您在我的设置中有什么建议和意见.我怎样才能发起三合会?
好吧,我们不要太纠结于你的实现细节。您可以在其他时间阅读有关保护框架的内容。让我们来处理你的问题...
我实际上创建了一个框架,该框架按照您尝试实现的方式工作。我认为您缺少的是 RoutingHandler 类。路由是对 URL 的物理操作,它告诉您的应用程序要加载哪个控制器以及要运行哪个操作。
在我的世界里我也有模块,所以基本的路由方案是
Module -> Controller -> Action
Run Code Online (Sandbox Code Playgroud)
这三个项目以这种方式映射到我的 URI 方案。变量也可以像这样附加......
http://www.domain.com/module/controller/action/var1/val1/var2/val2
那么,解析 URI 并将控制权传递给适当的控制器和操作后会发生什么?让我们编写一些代码来演示一个简单的例子......
<?php
class indexController extends Controller {
protected function Initialize() {
$this->objHomeModel = new HomeModel;
$this->objHeader = new Header();
$this->objFooter = new Footer();
$this->objHeader
->SetPageId('home');
}
public function indexAction() {
$this->objHeader->SetPageTitle('This is my page title.');
}
}
?>
Run Code Online (Sandbox Code Playgroud)
在该Initialize
方法中,我设置了一些控制器范围的内容,并获取模型的一个实例以供稍后使用。真正的肉在indexAction
方法里。您可以在此处设置要在视图中使用的内容。例如...
public function randomAction() {
$this->_CONTROL->Append($intSomeVar, 42);
}
Run Code Online (Sandbox Code Playgroud)
_CONTROL
是我操作并传递到视图上的值数组。该类Controller
知道如何为视图找到正确的模板,因为它是以操作命名的(并且位于同级目录中)。
父Controller
类获取操作方法的名称并像这样解析它......
indexAction -> index.tpl.php
Run Code Online (Sandbox Code Playgroud)
您还可以在这里做一些其他有趣的事情,例如......
Application::SetNoRender();
Run Code Online (Sandbox Code Playgroud)
...会告诉控制器不要在模板内渲染,而只是完成该方法。这对于您实际上不想输出任何内容的情况很有用。
最后,所有控制器、模型和视图都位于它们自己的目录中,如下所示......
my_module
controllers
indexController.class.php
someotherController.class.php
:
:
models
HomeModel.class.php
:
:
templates
index.tpl.php
someother.tpl.php
:
:
Run Code Online (Sandbox Code Playgroud)
我可以继续说下去,但我是凭记忆写的,这里那里有一些皱纹,但希望这能给你带来思考。
归档时间: |
|
查看次数: |
1642 次 |
最近记录: |