Home  >  Article  >  Backend Development  >  Detailed graphic explanation of the core architecture of Laravel 5.5

Detailed graphic explanation of the core architecture of Laravel 5.5

php中世界最好的语言
php中世界最好的语言Original
2018-03-24 15:36:042848browse

This time I will bring you a detailed graphic explanation of the core architecture of Laravel 5.5. What are the precautions when using the core architecture of Laravel 5.5? Here are practical cases, let’s take a look.

Preface

This article mainly introduces to you the relevant content about the core architecture of Laravel 5.5, and shares it for your reference and study. I will not say anything below. Enough said, let’s take a look at the detailed introduction.

1, Dependency Injection

# method passes in the component name, the framework will automatically instantiate it, and you can directly Use

For example, the most commonly used request object

2, service container

In fact, the core of Laravel is an IoC container. The core of Laravel itself is very lightweight and does not have any magical or substantial application functions. Various functional modules used by many people, such as Route (routing), Eloquent ORM (database ORM component), Request (request), Response (response), etc., are actually provided by class modules that have nothing to do with the core. The process from registration to instantiation of these classes to finally being used by you is actually the responsibility of Laravel's service container.

The service provider is mainly divided into two parts, register (registration) and boot (boot, initialization)

3. Service provider

For a class to be extracted by a container, it must first be registered with the container. Since Laravel calls this container a service container, if we need a service, we must first register and bind the service to the container. Then the thing that provides the service and binds the service to the container is the service provider.

4. Add your own class to the IOC container

##4.1. Create a new validate class

4.2. Create a new validateProvider

##4.3. Bind the validate class to Provider

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ValidateProvider extends ServiceProvider
{
 /**
 * Bootstrap the application services.
 *
 * @return void
 */
 public function boot()
 {
 //
 }
 /**
 * Register the application services.
 *
 * @return void
 */
 public function register()
 {
 $this->app->bind('valicate',function(){
  return new Validate();
 });
 }
}

4.4. Add Provider to the IOC container

##4.5. Use

4.6. Success!

5. Facade

facade is used to provide a unified interface. For example, no matter which cache you use, redis or memcache, the client can use the cache::get() method to obtain the value. As for whether you use redis or memcahe, it depends on which one you have bound in the service provider. The implementation of cache::get() is to inherit the Facade method getFacadeAccessor and return the key value you bind in the container, such as cache, and then the Facade class will use php magic variables

callstatic(), callstatic The logic will parse the service bound to the cache from the container, which is who the service provider mentioned earlier is bound to.

5.1, for example, mail

## in config/app.php

#5.2. This class only returns one mailer

5.3. If you call it The send method, if it does not exist, will enter the callstatic Magic method

5.4、这个方法会得到mailer的实例,即app('mailer')

5.5、这个实例便能调用mailer类的send方法

6、契约

Laravel 的契约是一组定义框架提供的核心服务的接口。例如,Illuminate\Contracts\Queue\Queue契约定义了队列任务所需的方法,而Illuminate\Contracts\Mail\Mailer契约定义了发送电子邮件所需的方法。框架对每个契约都提供了相应的实现。

好处是实现了程序的低耦合和简单性。

低耦合#

首先,让我们来看一些高耦合缓存实现的代码。如下:

<?php
namespace App\Orders;
class Repository
{
 /**
 * 缓存实例。
 */
 protected $cache;
 /**
 * 创建一个仓库实例。
 *
 * @param \SomePackage\Cache\Memcached $cache
 * @return void
 */
 public function construct(\SomePackage\Cache\Memcached $cache)
 {
 $this->cache = $cache;
 }
 /**
 * 按照 Id 检索订单
 *
 * @param int $id
 * @return Order
 */
 public function find($id)
 {
 if ($this->cache->has($id)) {
  //
 }
 }
}

这个类中,程序跟给定的缓存实现高耦合。因为我们依赖于一个扩展包的特定缓存类。一旦这个扩展包的 API 被更改了,我们的代码就必须跟着改变。

同样的,如果我们想要将底层的的缓存技术( Memcached )替换为另一种缓存技术( Redis ),那又得再次修改这个repository类。而repository类不应该了解太多关于谁提供了这些数据或是如何提供的等等。

比起上面的做法,我们可以使用一个简单的、与扩展包无关的接口来改进我们的代码:

<?php
namespace App\Orders;
use Illuminate\Contracts\Cache\Repository as Cache;
class Repository
{
 /**
 * 缓存实例。
 */
 protected $cache;
 /**
 * 创建一个仓库实例。
 *
 * @param Cache $cache
 * @return void
 */
 public function construct(Cache $cache)
 {
 $this->cache = $cache;
 }
}

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

php自定义二维数组排序函数array

phpunit接口自动化测试功能的实现

The above is the detailed content of Detailed graphic explanation of the core architecture of Laravel 5.5. For more information, please follow other related articles on the PHP Chinese website!

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