在laravel 5.4中创建合同

时间:2017-02-02 05:26:50

标签: laravel contract laravel-5.4

laravel.com上的文档是不够的。任何人都可以指导我如何从头开始在Laravel创建合同。

我需要在Laravel中实施合同。现在,我正在使用Laravel 5.4

2 个答案:

答案 0 :(得分:2)

Contract只是php interfaces的一个奇特名称。我们一直在使用它们而不是新事物。

Contracts/Interfaces帮助我们维护松散耦合的代码库。请参阅下面的doc中的示例。

<?php

namespace App\Orders;

class Repository
{
    /**
     * The cache instance.
     */
    protected $cache;

    /**
     * Create a new repository instance.
     *
     * @param  \SomePackage\Cache\Memcached  $cache
     * @return void
     */
    public function __construct(\SomePackage\Cache\Memcached $cache)
    {
        $this->cache = $cache;
    }

    /**
     * Retrieve an Order by ID.
     *
     * @param  int  $id
     * @return Order
     */
    public function find($id)
    {
        if ($this->cache->has($id))    {
            //
        }
    }
}

Repository实例化时,我们应该提供\SomePackage\Cache\Memcached实例,以便代码能够正常运行。因此,我们的代码与\SomePackage\Cache\Memcached紧密耦合。现在看下面的代码。

<?php

namespace App\Orders;

use Illuminate\Contracts\Cache\Repository as Cache;

class Repository
{
    /**
     * The cache instance.
     */
    protected $cache;

    /**
     * Create a new repository instance.
     *
     * @param  Cache  $cache
     * @return void
     */
    public function __construct(Cache $cache)
    {
        $this->cache = $cache;
    }
}

同样的事情,但现在我们只需要提供一些缓存接口。在幕后,你可以做到这样的事情。

<?php

namespace App\Orders;

use Illuminate\Contracts\Cache\Repository as Cache;

class RedisCache implements Cache {
     // 
}

当上面Repository实例化时,php会查看Illuminate\Contracts\Cache\Repository并且它已由RedisCache类实现。

答案 1 :(得分:0)

恐怕Gayan's answer需要进一步完善才能打Rajan's question

是的,Gayan是正确的,创建一个Contract类基本上意味着创建一个PHP interface

继续上面的Cache示例,如果我们查看它的源代码(可以在this Github repo file上找到它),我们可以看到类似的内容

<?php

namespace Illuminate\Contracts\Cache;

use Closure;

interface Repository
{
    /**
     * Determine if an item exists in the cache.
     *
     * @param  string  $key
     * @return bool
     */
    public function has($key);

    /**
     * Retrieve an item from the cache by key.
     *
     * @param  string  $key
     * @param  mixed   $default
     * @return mixed
     */
    public function get($key, $default = null);

    // the rest...
}

如果我们在laravel应用中使用此界面,则称其为“合同”。它声明了类实现该接口应具有的方法/属性。例如在我们的应用中...

<?php

namespace App\Whatever;

use Illuminate\Contracts\Cache\Repository;

class Foo implements Repository {
     // 
}

然后,类Foo必须具有方法hasget,以履行Repository合同中规定的内容。