1

ZF2があなたにそれをするように促しているので、私は自分のコードを作成しました。そして今、それは実際には名前空間を使用することの全体的なポイント/利点に反していると思い始めています。

すべてを変えたいのですが、ZFが自分たちでやらなかったからといって、自分のやり方でやるのが怖いので、重要なことを1つ見逃しているような気がします。

私のフォルダ/ファイル構造は次のようなものです:

- Application
    - Controller
        IndexController.php
    - Model
        - Table
            User.php
            Building.php
        - Mapper
            User.php
            Building.php
        - Entity
            User.php
            Building.php

したがって、私のコントローラー内では、ZF2が最初に提案するように、コードは次のようになります。

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController,
    Zend\View\Model\ViewModel;

use Application\Model\Entity\User as UserEntity,
    Application\Model\Mapper\User as UserMapper,
    Application\Model\Table\User as UserTable;

class IndexController extends AbstractActionController {
    public function indexAction() {

        $userEntity = new UserEntity;
        $userMapper = new UserMapper;
        $userTable = new UserTable;

ここではいくつかの項目しか示していませんが、アプリケーションが大きくなるにつれて、巨大なuseステートメントが作成され、次のように実行する必要があるようです。

namespace Application;

use Zend\Mvc\Controller\AbstractActionController,
    Zend\View\Model\ViewModel;

use Model;

class IndexController extends AbstractActionController {
    public function indexAction() {

        $userEntity = new Entity\User;
        $userMapper = new Mapper\User;
        $userTable = new Table\User;

ZF2がたくさんのモジュールを持つモジュラーベースのプロジェクトを推進しているからだと思います。しかし、確かに、必要に応じて、そのモジュールの名前空間をスローすることができますか?現在使用されているより修飾された名前でそれを行う必要があります。

4

1 に答える 1

7

ステートメントは名前空間をインポートするuseことであり、どのようにインポートするかについて、コーディング標準はありません。

次の 2 つの点に注意してください。

  1. はい、多くのクラス (または名前空間) を使用すると、複雑になりすぎる可能性があります。したがって、私は通常、クラスを明示的にインポートせずに名前空間をインポートします。例はここ(モジュール機能)、ここ(オートロード)、ここ(例外) にあります。ご覧のとおり、FQCN と名前空間が混在しています。
  2. 「アプリケーションが成長した場合」が怖い場合は、責任をカプセル化するクラスについて考えてください。クラスに複数の責任がある場合は、2 つのクラスに分けます。次に、インポートされた名前空間の数が減少することにも気付くでしょう。

ちなみに、usePSR-2 のガイドラインでは、use ステートメントは;毎回必ず で終了する必要があると規定されています。これではありません:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController,
    Zend\View\Model\ViewModel;

use Application\Model\Entity\User as UserEntity,
    Application\Model\Mapper\User as UserMapper,
    Application\Model\Table\User as UserTable;

class IndexController extends AbstractActionController {
    public function indexAction() {

        $userEntity = new UserEntity;
        $userMapper = new UserMapper;
        $userTable = new UserTable;
    }
}

でもこれは:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

use Application\Model\Entity\User as UserEntity;
use Application\Model\Mapper\User as UserMapper;
use Application\Model\Table\User as UserTable;

class IndexController extends AbstractActionController {
    public function indexAction() {

        $userEntity = new UserEntity;
        $userMapper = new UserMapper;
        $userTable = new UserTable;
    }
}

したがって、次のようにクリーンアップできます。

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

use Application\Model;

class IndexController extends AbstractActionController {
    public function indexAction() {

        $userEntity = new Model\Entity\User;
        $userMapper = new Model\Mapper\User;
        $userTable = new Model\Table\User;
    }
}

また、独自のエンティティとマッパーを使用したいが、別のモジュールのテーブルを使用したい場合、コードは次のようにリファクタリングされます。

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

use Application\Model;
use OtherModule\Model\Table\User as UserTable;

class IndexController extends AbstractActionController {
    public function indexAction() {

        $userEntity = new Model\Entity\User;
        $userMapper = new Model\Mapper\User;
        $userTable = new UserTable;
    }
}
于 2012-11-04T09:15:09.093 に答える