2017-04-16 24 views
-1

我對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 \型號命名空間裏和類usersModel內checkLogin()函數,我只能訪問使用這個調用models \ usersModel :: checkLogin(),我不認爲這是正確的。我應該不能用models \ usersModel \ checkLogin()調用函數嗎?

第二個問題是在函數checkLogin中,我想在相同的命名空間和同一個類中調用checkEmail函數,但是像checkEmail()這樣的調用,您應該可以毫無錯誤地調用它。發生的錯誤是,試圖從命名空間「myworkplaces \ models」中調用函數「checkEmail」。哪裏有問題?

我用作曲家

致謝
"autoload": { 
    "psr-4": { 
     "myworkplaces\\": "src/" 
    } 
} 

自動加載!

+0

我認爲你的上面的代碼不好,它有錯誤,你想要修正你的上面的代碼。 –

+0

@ sahil-gulati如果我的代碼有錯誤,歡迎所有評論:) – Epifanio

回答

0

這裏我假設沒有其他的語法錯誤,你的類加載器工作正常。

在你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)) 
+0

好的,你說的代碼是,在PHP中,未實例化的類的函數必須是靜態的,不像其他語言。 非常感謝你,我希望它能幫助其他人更好地理解他們是否有同樣的疑問。 – Epifanio

+0

在控制器中。你不必調用函數\ myworkplaces \ models \ usersModel :: checkLogin(),因爲有一個使用myworkplaces \ models「。與models \ usersModel :: checkLogin()它的作品。我的問題是它是否是正確的就像那樣使用它。至於usersModel.php的變化,靜態函數中的public並不是必需的,因爲默認情況下它已經是公開的了。 – Epifanio

+0

yes是非常好的。沒有問題,你可以像使用它一樣'models \ usersModel :: checkLogin()'歡迎... :) –

相關問題