1

我喜欢 Unity 和 Ninject 框架,将 C#.NET 的依赖注入到具有存储库接口等的控制器中,但我正在尝试在 PHP 中寻找替代方案并且正在苦苦挣扎。

我有:

class User
{
    //..
}

interface IUserRepository
{
    public function Repository(); // This can't work as a variable, should I abstract?
}

class UserRepository implements IUserRepository
{
    public function Repository()
    {
        $users = // DAO gets users and returns them..
        // But how does the IUserRepository help me at all? Even if I had ninject or 
        // Unity creating some new link between the UserRepo and IUserRepo?
        return $users;
    }

    public function GetAllUsers()
    {
        // errr.. I'm confused
    }
}

// Something has to say if the AdminController is called, 
// inject into its construct, a new IUserRepository

class AdminController extends Controller
{
    private $repository;
    public function __Construct( $repository )
    {
        $this->repository = $repository;
    }

    public function ActionResult_ListUsers()
    {
        $users = $repository->GetAllUsers();
        // Do some clever View method thing with $users as the model
    }
}

真正的问题是 PHP 和存储库方法。这是如何运作的?你可以看到我有点弄脏了,真的很想把它弄好!

编辑::

更简单的问题。interface关键字有什么好处?当您无法创建一个像类那样的新接口,然后用定义它们的正确类填充时,如何声明一个带有一些未定义方法的接口,然后创建一个实现这些方法的新类来扩展它们?

4

1 回答 1

2

有点广泛的问题,但我会试一试。Symfony 2 是一个现代 php 框架,围绕一个优秀的依赖注入容器构建。Symfony 2 支持 Doctrine 2,这是一个支持存储库的现代 orm 持久层。

浏览这里:http ://symfony.com/doc/current/book/doctrine.html

跳过有关设置的所有细节,而是寻找:

创建实体类

将对象持久化到数据库

从数据库中获取对象

获取部分是存储库发挥作用的地方。这为您提供了在 php 上实现存储库的一种方法的广泛概述。您可能决定对 Symfony 2/Doctrine 2 进行更多研究,或者您可能完全走另一条路。但这会给你一个起点。

就接口而言,我不想这么说,但这是一个真正真正的基本问题。可能想通过一些 OOP 教程?一两句话的解释可能没有多大意义。

==================================================== ==

这可能会有所帮助:

class User
{
    //..
}

interface IUserRepository
{
    public function getAllUsers();
}

class UserRepository extends DoctrineRepository implements IUserRepository
{
    public function getAllUsers()
    {
        return $this->findAll();
    }
}

class AdminController extends Controller
{
    private $repository;
    public function __Construct(IUserRepository $repository )
    {
        $this->repository = $repository;
    }
    public function ActionResult_ListUsers()
    {
        $users = $this->repository->getAllUsers();
        // Do some clever View method thing with $users as the model
    }

您的 User 和 IUserRepository 将驻留在所谓的域层中。

实际的 UserRepository 实现将在服务层中。您可能有多个实现。一个与 sql 数据库交谈。也许另一个与 MongoDB 交谈,或者只是一个文件。

您的控制器位于另一层。它期望接收实现 IUserRepository 的对象,因此具有 getAllUsers 方法。您的控制器并不关心存储库是如何实际实现的。它所知道的只是通过接口公开的内容。

这取决于您的应用程序使用依赖注入来连接事物,以便控制器获取正确的存储库。

于 2013-08-19T21:05:33.910 回答