PHP MVC - 在控制器或模型中存储用户变量?

4

在控制器(Controller)或模型(Model)中存储变量的最佳实践是什么? 例如,在脚本执行时,它会从会话中获取用户ID并获取用户类型,如超级管理员,管理员,服务代表,销售代表。我们还会检查用户ID所属的帐户,并获取该帐户的所有设置。

我的问题是,这些值应该存储在控制器(Controller)还是模型(Model)中?

提前致谢。

2个回答

3
在PHP中,想要真正的MVC模式有些奇怪,因为您的模型(model)、视图(view)和控制器(controller)都可以访问$_SESSION。
例如,如果您要登录用户,您的模型将执行以下操作:
class Model{
    ...
    static function login($username, $password){
        $result = Model::getUser($username, $password);

        if(empty($result)){
            return false;
        }
        else
        {
            $_SESSION['userid'] = $result['id'];
            // Assign other information you think you'll need in the session here
        }
    }

    static function loggedIn(){
        if(isset($_SESSION['userid']){
            return true;
        }
        else
        {
            return false;
        }
    }

    static function getAttribute($attr){
        return $_SESSION[$attr];
    }
    ...
}

class Controller{
    function someFxn(){
        $userInfo = Model::getAttribute('someAttr');
    }
}

显然,这段代码需要进行扩展,但它应该正确地显示概念。我在模型中也使用了静态函数,但你可以将模型作为对象。 无论你想如何操作,你都需要从数据库中通过模型每次获取设置,或者将其存储在会话中,将内容存储在$_SESSION中可以减少数据库调用。在实践中,模型操作$_SESSION或数据库。如果您的模型针对某些特定情况(比如创建自己的用户模型),则可以实例化该对象并将信息存储在私有成员中。
控制器的目的是从模型中获取信息,然后相应地呈现页面。实际上,MVC数据流按照以下方式工作:
1. 请求发送到控制器 2. 控制器从模型中获取信息(这是可选的,也许控制器不需要从模型中获取任何信息) 3. 模型将信息返回给控制器(如果您从前一步请求) 4. 控制器将适当的信息传递给视图。

当用户模型获取会话数据,如用户ID时,它会访问数据库并根据其ID获取一些用户设置。我的问题是,我应该将这些设置存储在模型中还是传回控制器,由控制器来存储这些设置。 - M. of CA

0

你将它们存储在模型中(从数据库中获取),通过控制器来提取它们(在页面加载时),并在视图中显示它们的结果(在需要时调用控制器类)。

这是MVC的基本理论...

祝你好运!

我会给你一个简单的汽车对象销售的例子... 这个例子很糟糕,但你可以从中了解MVC的工作原理...

<?
// Data
class Car
{
    private  $_color;

    public function setColor($newC)
    {
        $this->_color = $newC;
    }
    public function getColor()
    {
        return $this->_color;
    }

    private  $_maxSpeed

    public function setMaxSpeed($newMS)
    {
        $this->_maxSpeed = $newMS;
    }
    public function getMaxSpeed()
    {
        return $this->maxSpeed;
    }
}

// Example
$car = new Car();
$car->setColor($dbInfo['color']);
$car->setMaxSpeed($dbInfo['maxSpeed']);

// Controller

class Sales
{
    . . .
    public function SaleCar(Costumer $costumer, Car $car, $quantity)
    {
        if($car->getColor() == "red") // Red is expensive color...
            $car->MultiplyPriceBy(1.5); // Just an example...
        else
            $car->SubsetQuantityBy($quantity); // The car has quantity propery as well... and so on...

        $costumer->setPaymentType("Credit-card");
        . . .
        $costumer->Pay($quantity * $car->getPrice());

        return $finalPrice; // $quantity * $car->getPrice()
    }
    . . .
}

// View
class SalesPanel
{
    . . .
        public function output()
        {
            foreach($this->cars as $car)
            {
                if(in_array($car->getID(), $_POST['car_id']))
                    Sales->SaleCar(Costumer::GetCostumerFromID($_SESSION['uid']), $car, $_POST['quanityty']);
            }

            $output = . . .
            $output .= "Car model GHi675 old by . . . "; // Get info from controller
        }
    . . .
}

?>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接