尝试从命名空间调用函数 - Silex PHP
Attempted to call function from namespace - Silex PHP
我对自己在Silex的开发有两个疑惑PHP。
usersController.php
namespace myworkplaces\controllers;
use Silex\Application;
use Silex\Api\ControllerProviderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use myworkplaces\models;
class usersController implements ControllerProviderInterface {
public function connect(Application $app) {
$controllers = $app['controllers_factory'];
$controllers->put('/login', array($this, 'login'))->bind('login');
return $controllers;
}
public function login(Application $app, Request $request) {
$email = $app->escape($request->get('email'));
$password = $app->escape($request->get('password'));
if (!filter_var($email, FILTER_VALIDATE_EMAIL))
return $app->json(array ('type' => 'error', 'message' => 'El email no tiene el formato correcto.'), 202);
if (strlen($password) < 5)
return $app->json(array ('type' => 'error', 'message' => 'La contraseña no puede ser menor a 6 carácteres.'), 202);
if (models\usersModel::checkLogin($app, $email, $password)) {
return $app->json(array ('type' => 'info', 'message' => '¡Ten un buen día!'), 201);
} else {
return $app->json(array ('type' => 'error', 'message' => 'Error en la autentificación.'), 202);
}
}}
usersModel.php
namespace myworkplaces\models;
class usersModel {
function checkEmail($app, $email) {
if (($app['db']->users)->findOne([ 'email' => $email ], [ 'projection' => [ 'email' => 1 ] ]) != NULL) {
return true;
} else {
return false;
}
}
function getDataUser($app, $id) {
return ($app['db']->users)->findOne([ '_id' => new \MongoDB\BSON\ObjectID($id) ]);
}
function checkLogin($app, $email, $password) {
if (!checkEmail($app, $email))
return false;
if (password_verify($password, ($app['db']->users)->findOne([ 'email' => $email ], [ 'projection' => [ 'hashPassword' => 1 ] ])['hashPassword'])) {
$user = getDataUser($app, (string)getID($email));
$app['session']->set('user', array('id' => (string)$user['_id'], 'email' => $user['email'], 'username' => $user['username'], 'superadmin' => $user['superadmin'], 'adminPlaces' => $user['adminPlaces']));
return true;
} else {
return false;
}
}}
要访问 myworkplaces\models 命名空间和 class usersModel 中的 checkLogin() 函数,我只能使用此调用 models\usersModel::checkLogin() 进行访问,并且我不要认为这是正确的事情。我不能用 models\usersModel\checkLogin()?
调用函数吗
第二个问题是在函数 checkLogin 中,我想在同一个命名空间和同一个 class 中调用 checkEmail 函数,但是通过像 checkEmail () 这样的调用你应该可以调用它没有错误。发生的错误是,试图从命名空间 "myworkplaces\models" 调用函数 "checkEmail"。问题出在哪里?
我使用composer的自动加载
"autoload": {
"psr-4": {
"myworkplaces\": "src/"
}
}
谢谢!
这里我假设没有其他语法错误并且您的 class 加载程序工作正常。
在你的controller.php
将此更改为:
if (models\usersModel::checkLogin($app, $email, $password)) {
这个:
if (\myworkplaces\models\usersModel::checkLogin($app, $email, $password)) {
在你的usersModel.php
将此更改为:
function checkEmail($app, $email) {
这个:
public function static checkEmail($app, $email) {
将此更改为:
if (!checkEmail($app, $email))
这个:
if (!self::checkEmail($app, $email))
我对自己在Silex的开发有两个疑惑PHP。
usersController.php
namespace myworkplaces\controllers;
use Silex\Application;
use Silex\Api\ControllerProviderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use myworkplaces\models;
class usersController implements ControllerProviderInterface {
public function connect(Application $app) {
$controllers = $app['controllers_factory'];
$controllers->put('/login', array($this, 'login'))->bind('login');
return $controllers;
}
public function login(Application $app, Request $request) {
$email = $app->escape($request->get('email'));
$password = $app->escape($request->get('password'));
if (!filter_var($email, FILTER_VALIDATE_EMAIL))
return $app->json(array ('type' => 'error', 'message' => 'El email no tiene el formato correcto.'), 202);
if (strlen($password) < 5)
return $app->json(array ('type' => 'error', 'message' => 'La contraseña no puede ser menor a 6 carácteres.'), 202);
if (models\usersModel::checkLogin($app, $email, $password)) {
return $app->json(array ('type' => 'info', 'message' => '¡Ten un buen día!'), 201);
} else {
return $app->json(array ('type' => 'error', 'message' => 'Error en la autentificación.'), 202);
}
}}
usersModel.php
namespace myworkplaces\models;
class usersModel {
function checkEmail($app, $email) {
if (($app['db']->users)->findOne([ 'email' => $email ], [ 'projection' => [ 'email' => 1 ] ]) != NULL) {
return true;
} else {
return false;
}
}
function getDataUser($app, $id) {
return ($app['db']->users)->findOne([ '_id' => new \MongoDB\BSON\ObjectID($id) ]);
}
function checkLogin($app, $email, $password) {
if (!checkEmail($app, $email))
return false;
if (password_verify($password, ($app['db']->users)->findOne([ 'email' => $email ], [ 'projection' => [ 'hashPassword' => 1 ] ])['hashPassword'])) {
$user = getDataUser($app, (string)getID($email));
$app['session']->set('user', array('id' => (string)$user['_id'], 'email' => $user['email'], 'username' => $user['username'], 'superadmin' => $user['superadmin'], 'adminPlaces' => $user['adminPlaces']));
return true;
} else {
return false;
}
}}
要访问 myworkplaces\models 命名空间和 class usersModel 中的 checkLogin() 函数,我只能使用此调用 models\usersModel::checkLogin() 进行访问,并且我不要认为这是正确的事情。我不能用 models\usersModel\checkLogin()?
调用函数吗第二个问题是在函数 checkLogin 中,我想在同一个命名空间和同一个 class 中调用 checkEmail 函数,但是通过像 checkEmail () 这样的调用你应该可以调用它没有错误。发生的错误是,试图从命名空间 "myworkplaces\models" 调用函数 "checkEmail"。问题出在哪里?
我使用composer的自动加载
"autoload": {
"psr-4": {
"myworkplaces\": "src/"
}
}
谢谢!
这里我假设没有其他语法错误并且您的 class 加载程序工作正常。
在你的controller.php
将此更改为:
if (models\usersModel::checkLogin($app, $email, $password)) {
这个:
if (\myworkplaces\models\usersModel::checkLogin($app, $email, $password)) {
在你的usersModel.php
将此更改为:
function checkEmail($app, $email) {
这个:
public function static checkEmail($app, $email) {
将此更改为:
if (!checkEmail($app, $email))
这个:
if (!self::checkEmail($app, $email))