search
HomeBackend DevelopmentPHP TutorialDetailed explanation of contracts in Laravel5_PHP tutorial

Detailed explanation of contracts in Laravel5

There is a new thing in Laravel5 called contracts, so what exactly is it? What's the use? How to use it? Let’s discuss it.

Let’s first take a look at the definition of contracts in the official documents:

Laravel's Contracts are a set of interfaces that define the core services provided by the framework.
This means that Laravel's Contracts are a collection of core service interfaces provided by the framework.

In other words, each Contract is an interface, corresponding to a core service of the framework.

Then what’s the point? The explanation given by the official website is also very simple: using interfaces is for loose coupling and simplicity.

Let’s not talk about the big ideas first, let’s talk about some practical information and see how to use contract

First browse the contracts interface list:

The code is as follows:


IlluminateContractsAuthGuard
IlluminateContractsAuthPasswordBroker
IlluminateContractsBusDispatcher
IlluminateContractsCacheRepository
IlluminateContractsCacheFactory
IlluminateContractsConfigRepository
IlluminateContractsContainerContainer
IlluminateContractsCookieFactory
IlluminateContractsCookieQueueingFactory
IlluminateContractsEncryptionEncrypter
IlluminateContractsRoutingRegistrar

... There are too many, I am too lazy to post any more, it is in the official website manual. Let's take the IlluminateContractsRoutingRegistrar contract to demonstrate it.
First, open app/Providers/AppServiceProvider.php and pay attention to the register method:

The code is as follows:


public function register()
{
$this->app->bind(
'IlluminateContractsAuthRegistrar',
'AppServicesRegistrar'
);
}

$this->app is the Application object and also the container object. Through the $this->app->bind method we bind a class AppServicesRegistrar that implements the IlluminateContractsAuthRegistrar interface.

Note that IlluminateContractsAuthRegistrar is a contract. AppServicesRegistrar This class file is in app/Services/Registrar.php.

Then we look at the AppHttpControllersAuthAuthController controller class and see that it has a __construct constructor:

The code is as follows:


public function __construct(Guard $auth, Registrar $registrar)
{
$this->auth = $auth;
$this->registrar = $registrar;

$this->middleware('guest', ['except' => 'getLogout']);
}

It has two parameters, and the corresponding class namespace can be seen at the beginning of the script:

The code is as follows:


use IlluminateContractsAuthGuard;
use IlluminateContractsAuthRegistrar;

Both of these are contracts, but let’s take Registrar here. We noticed that the interface type of $registrar is only specified through the parameter type, but when it is actually called, it is actually the AppServicesRegistrar class. This is the dependency. With the injection feature, Laravel will automatically search the container for classes or objects that implement the interface IlluminateContractsAuthRegistrar. If there are any, they will be taken out and passed to the constructor as actual parameters.

The entire usage process can actually be summarized into two steps:

Register an object that implements the contract interface with the container.
The constructor parameter type is specified as a contract interface class, and the framework will automatically find objects that meet the conditions.
So let’s talk about the benefits of contract.

Loose coupling

The official website gives an example to explain what tight coupling is and why the Contract interface can be loosely coupled.

Let’s take a look at the tightly coupled code first:

The code is as follows:


class Repository {
/**
* The cache.
*/
protected $cache;
/**
* Create a new repository instance.
*
* @param SomePackageCacheMemcached $cache
* @return void
*/
public function __construct(SomePackageCacheMemcached $cache)
{
$this->cache = $cache;
}
/**
* Retrieve an Order by ID.
*
* @param int $id
* @return Order
*/
public function find($id)
{
if ($this->cache->has($id))
{
//
}
}
}

You can see that a detailed cache implementation SomePackageCacheMemcached is injected into the constructor. If you change Redis as the cache server or change the API method, you need to modify it. If the project is large, you don't know how many places need to be modified.

So, how does the Contract interface solve this problem? Please see the code:

The code is as follows:


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

Note that we use an interface for cache implementation, namely contract, IlluminateContractsCacheRepository, because it is just an interface, and you don’t need to care whether it is memcache or redis behind it.

Simplicity

If all services use interface definitions, it is easy to determine the functions required by a service, making it easier to maintain and expand, and the contract interface can also be regarded as a concise document that is easy to read.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/962926.htmlTechArticleDetailed explanation of contracts in Laravel5 There is a new thing called contracts in Laravel5, so what exactly is it? What's the use? How to use it? Let’s discuss it. Let’s go first...
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
How do you create and use an interface in PHP?How do you create and use an interface in PHP?Apr 30, 2025 pm 03:40 PM

The article explains how to create, implement, and use interfaces in PHP, focusing on their benefits for code organization and maintainability.

What is the difference between crypt() and password_hash()?What is the difference between crypt() and password_hash()?Apr 30, 2025 pm 03:39 PM

The article discusses the differences between crypt() and password_hash() in PHP for password hashing, focusing on their implementation, security, and suitability for modern web applications.

How can you prevent Cross-Site Scripting (XSS) in PHP?How can you prevent Cross-Site Scripting (XSS) in PHP?Apr 30, 2025 pm 03:38 PM

Article discusses preventing Cross-Site Scripting (XSS) in PHP through input validation, output encoding, and using tools like OWASP ESAPI and HTML Purifier.

What is autoloading in PHP?What is autoloading in PHP?Apr 30, 2025 pm 03:37 PM

Autoloading in PHP automatically loads class files when needed, improving performance by reducing memory use and enhancing code organization. Best practices include using PSR-4 and organizing code effectively.

What are PHP streams?What are PHP streams?Apr 30, 2025 pm 03:36 PM

PHP streams unify handling of resources like files, network sockets, and compression formats via a consistent API, abstracting complexity and enhancing code flexibility and efficiency.

What is the maximum size of a file that can be uploaded using PHP ?What is the maximum size of a file that can be uploaded using PHP ?Apr 30, 2025 pm 03:35 PM

The article discusses managing file upload sizes in PHP, focusing on the default limit of 2MB and how to increase it by modifying php.ini settings.

What is Nullable types in PHP ?What is Nullable types in PHP ?Apr 30, 2025 pm 03:34 PM

The article discusses nullable types in PHP, introduced in PHP 7.1, allowing variables or parameters to be either a specified type or null. It highlights benefits like improved readability, type safety, and explicit intent, and explains how to declar

What is the difference between the unset() and unlink() functions ?What is the difference between the unset() and unlink() functions ?Apr 30, 2025 pm 03:33 PM

The article discusses the differences between unset() and unlink() functions in programming, focusing on their purposes and use cases. Unset() removes variables from memory, while unlink() deletes files from the filesystem. Both are crucial for effec

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools