laravel.com
上的文档是不够的。任何人都可以指导我如何从头开始在Laravel
创建合同。
我需要在Laravel
中实施合同。现在,我正在使用Laravel 5.4
答案 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
必须具有方法has
和get
,以履行Repository
合同中规定的内容。