2012-05-15 33 views
0

我正在创建一个MVC文件结构的购物车,并且我有一个购物车控制器 ,它有一组前端和后端的功能。PHP MVC类结构

Class ShoppingCartController{ 

    //frontend function 
    public function viewCart(){ 
      //do something 
      require 'view/viewCart.php'; 
    } 

    //backend function 
    public function viewOrders(){ 
      //do something 
      require 'view/viewOrders.php'; 
    } 
} 

$controll = new ShoppingCartController(); 

if(isset($_GET['action']) && in_array($_GET['action'], get_class_methods($controll))){ 
    call_user_func(array($controll, $_GET['action'])); 
} 

我想要做的就是防止任何来自前端的人能够调用后端函数。所以我想我会设置保护功能并编写两个扩展类来管理权限。像这样

Class ShoppingCartController{ 

    //frontend function 
    protected function viewCart(){ 
      //do something 
      require 'view/viewCart.php'; 
    } 

    //backend function 
    protected function viewOrders(){ 
      //do something 
      require 'view/viewOrders.php'; 
    } 
} 

Class ShoppingCartFrontendController Extends ShoppingCartController{ 
    //frontend function 
    public function viewCartExtended(){ 
      //do something 
      $this->viewCart(); 
    } 
} 

Class ShoppingCartBackendController Extends ShoppingCartController{ 
    //backend function 
    public function viewOrdersExtended(){ 
     //do something 
     $this->viewOrders(); 
    } 
} 

难道大家都会这样做还是有更好的办法?

+0

实际上,这是一个更好的方法。使用现成的框架,或至少看看他们是如何做到的。我保证,你会从他们那里得到很多灵感。 – zafarkhaja

回答

2

我想你可以从阅读this old comment开始。

其基本思想是将控制器包裹在“保护壳”上,保护壳内的物体负责保护。

0

如果我这样做我想补充

//frontend function 
public function viewCartExtended(){ 
     //do something 
     $this->viewCart(); 
} 

//backend function 
public function viewOrdersExtended(){ 
    //do something 
    $this->viewOrders(); 
} 

我的控制器。 一个类来统治他们。

//frontend function 
private function viewCartExtended(){ 
     //do something 
     require 'view/viewCart.php'; 
} 
//backend function 
private function viewOrdersExtended(){ 
    //do something 
    require 'view/viewOrders.php'; 
} 
//public method 
public function get_view($foo){ 
    //test if authed etc.. 
    switch($foo){ 
     case "foo": 
      return viewCartExtended(); 
     break; 
     case "bar": 
      return viewOrdersExtended(); 
     break; 
     ... .. . . 
     .. . 

依此类推。
虽然我不是CI专家。所以这可能不是“最好”的方式;但它保持简单。

+0

感谢您的回复。我想我会用这个,如果有的话只有两个功能和他们在哪里严格互换。但随着视图函数的建立,get_view()函数开始变得非常复杂,首先授权用户,然后计算出他们需要的视图。 –