控制器和模型之间的MVC类

问题描述 投票:1回答:3

我正在Phalcon PHP中构建应用程序,我可以从网站和API访问数据库。

在普通的网站上我会像这里一样创建MVC:

- app
-- controllers
-- models
-- views
- public

但我遇到了API和Web重复代码的问题。

示例代码:

class Users extends Model {
    // ...
    protected $id;
    protected $username;
    protected $email;
    // setters and getters, validation
}

class UserController extends ControllerBase {
    // ...
    public function loginAction() {
        if ($this->request->isPost()) {
            // ... get post
            // check login is correct
            // create session
            // redirect
        }
        $this->view->var = $var;
    }
}

class ApiController extends ControllerBase {
    // ...
    public function loginAction() {
        if ($this->request->isPost() //or put) {
            $json = $this->request->getJsonRawBody();
            // ... get json
            // check login is correct
            // create session
        }
        $response->setStatusCode('2xx/4xx', 'msg');
        $response->setJsonContent([
            'status' => 'OK / ERROR',
            'message' => '$msg / $ex->getMessage()'
        ]);
    }
}

现在我将创建具有逻辑的类,以便检查用户数据是否正确。我觉得这样的课:

class MyClass extends ParentClass {
    public function login($username, $password) {
        $user = Users::findFirstByEmail($email);
        if ($user->password === hash($password)) {
            $successLogin = new UserSuccessLogins();
            $successLogin ->setId('id');
            $successLogin ->setIpAddress('ip');
            $successLogin ->save();
        } else {
            $failedLogin = new UserFailedLogins();
            $failedLogin->setId('id');
            $failedLogin->setIpAddress('ip');
            $failedLogin->save();
        }
    }
}

现在我可以在像这样的控制器中使用它:

class UserController extends ControllerBase {
    public function loginAction() {
        if ($this->request->isPost()) {
            $c = new MyClass();
            if ($c->login($username, $password)) {
                // redirect
            } 
        }
        $this->view->var = $var;
    }
}

class ApiController extends ControllerBase {
    public function loginAction() {
        if ($this->request->isPost() //or put) {
            $c = new MyClass();
            if ($c->login($username, $password)) {
                // send json OK
            } else {
                // send json Error
            }
        }
    }
}

什么是最好的方法?我不想在模型类中使用逻辑。我已经阅读了关于插件和组件的内容,但我不知道如何创建好的自我评论代码。

php model-view-controller phalcon
3个回答
1
投票

你可能正在寻找Phalcon Multi Module,看看qazxsw poi。除了“前端”和“后端”模块,您还可以添加“API”模块。


0
投票

好的,我将使用这里的组件扩展我的项目:

this example

现在,我的代码可能如下所示:

-app
--components
--controllers
--models
--views
-public

如果没有人有更好的主张,我会在几天内解决这个话题。


0
投票

您的建议是一个不错的选择,但是如果您希望以更好的方式分离和隔离职责,您可以尝试使用服务层,例如use Phalcon\Mvc\Model; class Users extends Model { // ... protected $id; protected $username; protected $email; // setters and getters, validation } use Phalcon\Mvc\User\Component; class UserComponent extends Component { // class with access to dependecy injector public login ($email, $password) { $user = Users::findFirstByEmail($email); // logic with setting session in $di } } class UserController extends ControllerBase { public function loginAction() { if ($this->request->isPost()) { $userComponent = new UserComponent(); if ($userComponent ->login($username, $password)) { return $this->response->redirect($this->url->getBaseUri(), false, 301); } else { $this->flash->error('message'); } } // setting view variables if not post or login filed $this->view->var = $var; } } class ApiController extends ControllerBase { public function loginAction() { if ($this->request->isPost()) { $userComponent = new UserComponent(); if ($userComponent ->login($username, $password)) { //json OK } else { //json Error } } } } 。您将在哪里:

  • 实体(phalcon生成的模型)
  • 存储库(需要获取,更新或保存数据的所有操作)
  • 服务(业务逻辑所在的位置)。

Whit这个调用图可以总结如下:

控制器 - >服务 - >存储库 - >实体

请注意,依赖关系是朝着一个方向发展的,但对于简单的任务,您可以直接在控制器内部使用repo o服务中的实体,取决于您的架构将有多么艰难或灵活。

我希望这是明确的问候。

© www.soinside.com 2019 - 2024. All rights reserved.