我是MVC的新手,刚开始练习它.我正在创建一个中小型企业网站,并且不想使用任何大型框架,所以我找到了
this,到目前为止它工作得很好.我似乎唯一不理解的是如何在子文件夹中呈现视图.
我有3种药物需要显示信息,它们的结构如下:
这是药物控制器:
- <?PHP
- class MedicinesController extends Controller
- {
- /**
- * Construct this object by extending the basic Controller class
- */
- public function __construct()
- {
- parent::__construct();
- Auth::checkAuthentication();
- }
- /**
- * Handles what happens when user moves to URL/medicines/index
- **/
- public function index()
- {
- $this->View->render('medicines/index');
- }
- /**
- * Handles what happens when user moves to URL/medicines/medicine1
- **/
- public function medicine1()
- {
- $this->View->render('medicines/medicine/info',array(
- 'files' => FilesModel::getMedicineFiles())
- );
- }
- /**
- * Handles what happens when user moves to URL/medicines/medicine1/forms/male
- **/
- public function male()
- {
- $this->View->render('medicines/imnovid/forms/male');
- }
- }
这是处理控制器的类:
- /**
- * Class Application
- * The heart of the application
- */
- class Application
- {
- /** @var mixed Instance of the controller */
- private $controller;
- /** @var array URL parameters,will be passed to used controller-method */
- private $parameters = array();
- /** @var string Just the name of the controller,useful for checks inside the view ("where am I ?") */
- private $controller_name;
- /** @var string Just the name of the controller's method,useful for checks inside the view ("where am I ?") */
- private $action_name;
- /**
- * Start the application,analyze URL elements,call according controller/method or relocate to fallback location
- */
- public function __construct()
- {
- // create array with URL parts in $url
- $this->splitUrl();
- // creates controller and action names (from URL input)
- $this->createControllerAndActionNames();
- // does such a controller exist ?
- if (file_exists(Config::get('PATH_CONTROLLER') . $this->controller_name . '.PHP')) {
- // load this file and create this controller
- // example: if controller would be "car",then this line would translate into: $this->car = new car();
- require Config::get('PATH_CONTROLLER') . $this->controller_name . '.PHP';
- $this->controller = new $this->controller_name();
- // check for method: does such a method exist in the controller ?
- if (method_exists($this->controller,$this->action_name)) {
- if (!empty($this->parameters)) {
- // call the method and pass arguments to it
- call_user_func_array(array($this->controller,$this->action_name),$this->parameters);
- } else {
- // if no parameters are given,just call the method without parameters,like $this->index->index();
- $this->controller->{$this->action_name}();
- }
- } else {
- // load 404 error page
- require Config::get('PATH_CONTROLLER') . 'ErrorController.PHP';
- $this->controller = new ErrorController;
- $this->controller->error404();
- }
- } else {
- // load 404 error page
- require Config::get('PATH_CONTROLLER') . 'ErrorController.PHP';
- $this->controller = new ErrorController;
- $this->controller->error404();
- }
- }
- /**
- * Get and split the URL
- */
- private function splitUrl()
- {
- if (Request::get('url')) {
- // split URL
- $url = trim(Request::get('url'),'/');
- $url = filter_var($url,FILTER_SANITIZE_URL);
- $url = explode('/',$url);
- // put URL parts into according properties
- $this->controller_name = isset($url[0]) ? $url[0] : null;
- $this->action_name = isset($url[1]) ? $url[1] : null;
- // remove controller name and action name from the split URL
- unset($url[0],$url[1]);
- // rebase array keys and store the URL parameters
- $this->parameters = array_values($url);
- }
- }
- /**
- * Checks if controller and action names are given. If not,default values are put into the properties.
- * Also renames controller to usable name.
- */
- private function createControllerAndActionNames()
- {
- // check for controller: no controller given ? then make controller = default controller (from config)
- if (!$this->controller_name) {
- $this->controller_name = Config::get('DEFAULT_CONTROLLER');
- }
- // check for action: no action given ? then make action = default action (from config)
- if (!$this->action_name or (strlen($this->action_name) == 0)) {
- $this->action_name = Config::get('DEFAULT_ACTION');
- }
- // rename controller name to real controller class/file name ("index" to "IndexController")
- $this->controller_name = ucwords($this->controller_name) . 'Controller';
- }
- }
配置
- /**
- * Configuration for: Folders
- * Usually there's no reason to change this.
- */
- 'PATH_CONTROLLER' => realpath(dirname(__FILE__).'/../../') . '/application/controller/','PATH_VIEW' => realpath(dirname(__FILE__).'/../../') . '/application/view/',/**
- * Configuration for: Default controller and action
- */
- 'DEFAULT_CONTROLLER' => 'index','DEFAULT_ACTION' => 'index',
和渲染
- public function render($filename,$data = null)
- {
- if ($data) {
- foreach ($data as $key => $value) {
- $this->{$key} = $value;
- }
- }
- require Config::get('PATH_VIEW') . '_templates/header.PHP';
- require Config::get('PATH_VIEW') . $filename . '.PHP';
- require Config::get('PATH_VIEW') . '_templates/footer.PHP';
- }
编辑
如果我做var_dump();我得到这个输出:
- D:\Programs\wamp64\www\ermp.ee\application\core\Application.PHP:84:
- object(Application)[3]
- private 'controller' => null
- private 'parameters' =>
- array (size=2)
- 0 => string 'forms' (length=5)
- 1 => string 'male' (length=4)
- private 'controller_name' => string 'medicines' (length=9)
- private 'action_name' => string 'imnovid' (length=7)
简单的网址
当您访问http://ermp.ee/medicines/时,它会呈现application / view / medicines / index.PHP文件,原因如下:
- $this->View->render('medicines/index');
当您访问http://ermp.ee/medicines/medicine1/forms/male时,它会使用文件参数呈现application / view / medicines / info.PHP文件
- $this->View->render('medicines/medicine/info'...
您将视图文件名直接传递给View.表单和男性存储在Application的私有属性参数中.
在这种情况下,controller_name是MedicinesController,action_name是medicine1.
与男性的网址
当您访问http://ermp.ee/medicines/male时,action_name是男性,但由于以下行,呈现的视图是药品/ imnovid / forms / male.PHP:
- $this->View->render('medicines/imnovid/forms/male');
无论视图的路径是什么,都从URI获取action_name.根据动作名称使用路径只是一种惯例,您可以随意渲染任何您想要的内容.