1

オンラインで見つけた高品質で安全だと思われる他のクラスに基づいてユーザークラスを作成しました(ただし、私が学んだことから、実際にはそれほど安全なものはなかったので、それらのいくつかを混ぜ合わせました)。問題は、さまざまなオブジェクトを初期化するスクリプト内で、$User オブジェクトのスニペットが長すぎることです。$Browser = new Browser();他のオブジェクトは、またはと同じくらい必要です$_ = new Translate ($DB, $User->get('Language'));。したがって、このすべてのコードが突然ここにあるのはちょっと見苦しいです。

  /* USER. Handles user data and login/logout/register. */
  $User=new User($DB, Configuration::get('SiteKey'));
  if (isset($_POST['logout']))
    $User->logout();
  else if (isset($_POST['login']) && !$User->login($_POST['email'], $_POST['password']))  // If user tries to login
    $Error->set ('Banner', 'Username or password incorrect. Please try again.');
  else if (isset($_SESSION['email']) && isset($_SESSION['session']))
    $User->loginSession ($_SESSION['email'], $_SESSION['session']);
  else if (isset($_POST['register']))
    $User->add ($_POST);

  /* Language */
  if (!empty ($_POST['lang']) && in_array($_POST['lang'],Configuration::get('SupportedLanguages')))
    {
    $User->set('language', $_POST['lang']);
    $_SESSION['language'] = $_POST['lang'];
    }
  if (!$User->get('language'))
    $User->set('language', Configuration::get('DefaultLanguage'));

このすべてのコードがどこにあるべきかわかりません。これをユーザーのクラス内に配置する必要が__constructor()ありますか、それとも現在のように外部に配置する必要がありますか?

内部で直接使用するよりも$_POST を渡す方が良いため、答えに影響を与える可能性があります (あまりにも多くの変数が渡された __constructor() もあまり良くありません)。

クラス内のコードはここに追加するほど関連性があるとは思いませんが、見たい場合は、私の githubで公開しました。

4

1 に答える 1

1

このすべてのコードがどこにあるのかわかりません。これをユーザーのクラス__constructor()内に配置する必要がありますか、それとも現在のように外部に配置する必要がありますか?

コンストラクターには入れません。このコードを使用しているスクリプトまたはクラスが何であれ、多くの責任を果たしているように見えます。単一責任の原則に従うことを検討し、このコードを認証クラス、セッションクラス、ユーザーオブジェクトを構築できるユーザーファクトリなどの他のクラスに分離することができます。簡潔で、決して注意深くアーキテクチャ化された例ではありません。

class User
{

}

class Session
{

}

class UserFactory
{
  public function create($vars, ...)
  {
  //build user...
  return $user;
  }
}

class Authenticate
{
  public function __construct($userFactory)
  {
    //...
  }

  public function Login($username, $passwd)
  {
    //do stuff...
    return $userFactory->create($vars, ...);
  }

  public function AuthenticateSession($session)
  {
    //...
   return $userFactory->create($vars, ...);
  }
}

渡される変数が多すぎる__constructor()もあまり良くありません

変数をいつでもコレクションオブジェクトにグループ化し、コンストラクターに渡すことができます。たとえば、言語と時間の設定を文化オブジェクトにグループ化できます。

于 2013-01-18T05:32:07.420 に答える