如何在子文件夹PHP中呈现视图
我是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:Programswamp64wwwermp.eeapplicationcoreApplication.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.根据动作名称使用路径只是一种惯例,您可以随意渲染任何您想要的内容. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |