我正在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
}
}
}
}
什么是最好的方法?我不想在模型类中使用逻辑。我已经阅读了关于插件和组件的内容,但我不知道如何创建好的自我评论代码。
你可能正在寻找Phalcon Multi Module,看看qazxsw poi。除了“前端”和“后端”模块,您还可以添加“API”模块。
好的,我将使用这里的组件扩展我的项目:
this example
现在,我的代码可能如下所示:
-app
--components
--controllers
--models
--views
-public
如果没有人有更好的主张,我会在几天内解决这个话题。
您的建议是一个不错的选择,但是如果您希望以更好的方式分离和隔离职责,您可以尝试使用服务层,例如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
}
}
}
}
。您将在哪里:
Whit这个调用图可以总结如下:
控制器 - >服务 - >存储库 - >实体
请注意,依赖关系是朝着一个方向发展的,但对于简单的任务,您可以直接在控制器内部使用repo o服务中的实体,取决于您的架构将有多么艰难或灵活。
我希望这是明确的问候。