1

私は手続き型の方法でphpをプログラムしていました。OOP についてもっと学びたいので、新しいプロジェクトのために PHP を OOP 方式でプログラミングすることにしました。

とにかく、ユーザーがログインする必要があるプロジェクトがあるとしましょう。つまり、login.php でユーザーが正しいユーザー名とパスワードを入力すると、index.php にリダイレクトされ、製品テーブルからすべての製品のロードが開始され、index.php に適切に表示されます。

前に、これを行う方法は、login.php に次のコードを含めることでした。

login.php

session_start();
...
if (loggedCorrect($user, $password)) {
     $_SESSION['loggedinuser'] = $user;
     //redirect to index.php
}

index.php

session_start();
if (isset($_SESSION['loggedinuser']) {
      //select fields from products table and display them
      ...
}

したがって、OOP では次のようになります。

login.php

session_start();
$user = new User($user, $password);
if ($user->hasCorrectLogin()) {
     $_SESSION['loggedinuser'] = $user->getUsername();
     //redirect to index.php
}

index.php

session_start();
if (isset($_SESSION['loggedinuser']) {
     $products = new Products();
     //display all products
}

製品クラス

class Products {
    private $productArray;
    ...
    __construct() {
         //select all products from mySQL table then put every product in productArray
    }
...
}

私の質問は次のとおりです。

  1. オブジェクトを開始するとき(私の場合は Products など)。ログインセッションを確認する必要がありますか? もしそうなら、__contruct 内でそれを行うべきですか? または、「class Products」行の前に行う必要がありますか?

  2. x 分ごとに実行される cronjob.php もあります。実行すると、製品などのオブジェクトが作成され、それらが分析されます。したがって、ログイン セッション チェックが必要な場合、cronjob はセッションをサポートしていないため、これを機能させる方法がわかりません。

お知らせ下さい

4

1 に答える 1

1

クイックアンサー

  1. いいえ。ドメイン オブジェクト自体は、ログイン セッションに依存するべきではありません。ただし、User特定のユーザーが表示できる製品のみを表示するなど、特定の機能を実行するためにインスタンスが必要になる場合があります。

  2. #1のため、これは今や些細なことです。

コードレビュー

まず、ログインページのコードを考えてみましょう:

$user = new User($user, $password);
if ($user->hasCorrectLogin()) {

このコードでは、User がデータベースと対話し、資格情報を検証する方法を知っているように見えます。それは、単一のクラスに対して少し責任が大きすぎるようです。

ハッシュ化されたパスワードをオブジェクト内に保持することでパスワードの検証を実行できますが、パスワードを検証する必要があるのは一度だけなので、そのフィールドを保持する必要は実際にはありません。ここでそれを行わないもう 1 つの理由は、オンザフライでパスワードを強化することを検討する必要がある場合です。これは、成長するハードウェアに合わせて拡張するためのサイト ポリシーになる可能性があります (たとえば、bcrypt を使用している場合)。

データベースとのやり取りを行うべきではありません。データベースの対話とパスワードの検証の両方を User クラスから分離するには、認証サービスの追加を検討できます。

try {
    $user = $authService->login($userName, $password);
    $_SESSION['loggedinuser'] = $user;
    // redirect to index.php
} catch (InvalidLoginException $e) {
    // oops, username or password invalid
}

認証サービス内で、抽象化の別のレイヤーを追加して、ユーザー レコードをロードできます (たとえば、データ マッパーを使用)。

ユーザー名だけをセッションに保存する代わりに、User オブジェクト全体を保存することもできます。場合によっては、これにより不整合が生じる可能性がありますが、データベースへのラウンド トリップが節約されます。

それでは、製品概要ページを見てみましょう。

$products = new Products();

命名に関してはProducts、オブジェクトのコレクションを説明するのに適していません。ProductListまたはのような名前ProductCollectionが良いです。

上記の認証と同様に、Productsクラスがどのように設定されるかは不明です。いくつかのストレージから取得する必要があるため、製品のリストを提供するリポジトリを紹介しましょう。

$productRepository = new ProductRepository($db);
$products = $productRepository->getAll();

最も単純なシナリオでは、リポジトリはデータベース インスタンスで初期化されます。必要に応じて、より多くの抽象化レベルを適用できます。

于 2013-09-09T06:20:01.703 に答える