我是MVC的新手,刚开始练习它.我正在创建一个中小型企业网站,并且不想使用任何大型框架,所以我找到了
this,到目前为止它工作得很好.我似乎唯一不理解的是如何在子文件夹中呈现视图.
我有3种药物需要显示信息,它们的结构如下:
views --medicines ----medicine1 ------info.PHP ------forms --------male.PHP --------female.PHP
这是药物控制器:
<?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.根据动作名称使用路径只是一种惯例,您可以随意渲染任何您想要的内容.