精华内容
下载资源
问答
  • Laravel底层原理系列

    2020-05-30 00:19:46
    《Advanced Application Architecture With Laravel 4》的中文精校版,这本书中文可以译作 《从学徒到工匠 - 基于 Laravel 4 进行高级应用架构》,主要讲了 Laravel 底层实现原理,以及如何基于 Laravel 进行大型...

    Laravel 从学徒到工匠精校版 地址:

    https://laravelacademy.org/laravel-from-appreciate-to-artisan

    《Advanced Application Architecture With Laravel 4》的中文精校版,这本书中文可以译作 《从学徒到工匠 - 基于 Laravel 4 进行高级应用架构》,主要讲了 Laravel 底层实现原理,以及如何基于 Laravel 进行大型应用设计和架构,作者是大名鼎鼎的 Laravel 框架作者 Taylor Otwell。

    这本书其实网上已经有人翻译过了,为什么学院君还要花费心力重新翻译这个版本(姑且叫做精校版吧),是因为这本书是基于 Laravel 4 写的,里面的很多示例在 Laravel 5 中已经不适用,而现在显然是 Laravel 5 大行其道的时代。

    所以有必要基于 Laravel 5 重新编写书中所以示例,以及将一些 Laravel 5 中新增的,Laravel 4 中被废弃的功能拿出来给大家说道说道,否则新手直接去看原来那本书或者翻译的版本难免会有困惑。

    另外,在某些术语的翻译上做了一些优化,让大家更容易理解,还有吐槽下, Taylor Otwell 大大写的东西有的时候真的感觉对新手不友好啊,所以我会在一些地方根据自己的理解对语言做了一定的润饰,希望可以以通俗易懂的方式呈现在大家面前。

    以上,就是重新翻译这本书的初衷了,即便如此,新手看起来可能还是有些吃力的,毕竟我不能完全脱离原书,所以有什么问题,欢迎与我交流。

    原书分的很碎,有时候一个章节可能就一两段文字,所以我将原书以章为单位对原书的目录结构做了适当的调整,但不影响整体的完整性和前后的一致性,下面是整理后的目录结构:

    0、作者自序

    1、依赖注入篇

    2、服务容器篇

    3、接口即契约篇

    4、服务提供者篇

    5、目录结构篇

    6、应用架构篇

    7、框架扩展篇

    8、设计原则篇

    展开全文
  • 简介Facades 为应用服务容器中的绑定类提供了一个“静态”接口。Laravel 内置了很多 Facades ,可以访问绝大部分 Laravel 的功能。Laravel 的门面作为服务...

    简介

    Facades 为应用服务容器中的绑定类提供了一个“静态”接口。

    Laravel 内置了很多 Facades ,可以访问绝大部分 Laravel 的功能。

    Laravel 的门面作为服务容器中底层类的“静态代理”,相比于传统静态方法,在维护时能够提供更加易于测试、更加灵活、简明优雅的语法。

    Laravel 的所有门面都定义在 Illuminate\Support\Facades 命名空间下。

    我们可以轻松访问到门面:

    use Illuminate\Support\Facades\Cache;
    Route::get('/cache', function () {
        return Cache::get('key');
    });
    

    在整个 Laravel 文档中,很多例子使用了门面来演示框架的各种功能特性。

    何时使用 Facades

    门面有诸多优点,其提供了简单、易记的语法,让我们无需记住长长的类名即可使用 Laravel 提供的功能特性,此外,由于他们对 PHP 动态方法的独到用法,使得它们很容易测试。

    在使用 Facades 时,有些地方还需要特别注意。

    使用 Facades 最主要的风险就是会引起类作用范围的膨胀。

    因为 Facades 使用起来非常简单而且不需要注入,就会使得我们在不经意间在单个类中使用许多 Facades,从而导致类变的越来越大。

    而使用依赖注入的时候,使用的类越多,构造方法就会越长,在视觉上就会引起注意,提醒你这个类有点庞大了。因此在使用 Facades 的时候,要特别注意控制好类的大小,让类的作用范围保持短小。

    在开发与 Laravel 进行交互的第三方扩展包时,建议最好选择注入 Laravel 契约 ,而不是使用 Facades 的方式来使用类。因为扩展包是在 Laravel 本身之外构建,所以你无法使用 Laravel Facades 测试辅助函数。

    Facades Vs. 依赖注入

    依赖注入的主要优点之一是切换注入类的实现的能力。这在测试的时候很有用,因为你可以注入一个 mock 或者 stub ,并断言在 stub 上调用的各种方法。

    通常,真正的静态方法是不可能被 mock 或者 stub。但是,因为 Facades 使用动态方法来代理从服务容器解析的对象的方法调用,我们可以像测试注入的类实例一样来测试 Facades。例如,像下面的路由:

    use Illuminate\Support\Facades\Cache;
     
    Route::get('/cache', function () {
        return Cache::get('key');
    })
    

    我们可以这样编写测试来验证 Cache::get 方法以我们期望的方式被调用:

    use Illuminate\Support\Facades\Cache;
    /**
     * 一个基础功能的测试用例。
     *
     * @return void
     */
    public function testBasicExample()
    {
    Cache::shouldReceive('get')
    ->with('key')
    ->andReturn('value');
    $this->visit('/cache')
    ->see('value');
    }
    

    Facades Vs. 辅助函数

    除了 Facades, Laravel 还包含各种「辅助函数」来实现一些常用的功能,比如生成视图、触发事件、调度任务或者发送 HTTP 响应。

    许多辅助函数的功能都有与之对应的 Facade。例如,下面这个 Facade 的调用和辅助函数的作用是一样的:

    return View::make('profile');
    return view('profile');
    

    这里的 Facades 和辅助函数之间没有实际的区别。当你使用辅助函数时,你可以使用对应的 Facade 进行测试。例如,下面的路由:

    Route::get('/cache', function () {
    return cache('key');
    });
    

    在底层,辅助函数 cache 实际上是调用了 Cache facade 中的 get 方法。

    因此,尽管我们使用的是辅助函数,我们依然可以编写以下测试来验证该方法是否使用我们预期的参数来调用:

    use Illuminate\Support\Facades\Cache;
    /**
     * 一个基础功能的测试用例。
     *
     * @return void
     */
    public function testBasicExample()
    {
    Cache::shouldReceive('get')
    ->with('key')
    ->andReturn('value');
    $this->visit('/cache')
    ->see('value');
    }
    

    Facades 工作原理

    在 Laravel 应用中,门面就是一个为容器中的对象提供访问方式的类。该机制的原理由 Facade 类实现。

    不管是 Laravel 自带的 Facades,还是用户自定义的 Facades ,都继承自 Illuminate\Support\Facades\Facade 类。

    门面类只需要实现一个方法:getFacadeAccessor。正是 getFacadeAccessor 方法定义了从容器中解析什么,然后 Facade 基类使用魔术方法 __callStatic() 从你的门面中调用解析对象。

    在下面的例子中,调用了 Laravel 的缓存系统。通过浏览这段代码,可以假定在 Cache 类中调用了静态方法 get:

    <?php
    namespace App\Http\Controllers;
    use Illuminate\Support\Facades\Cache;
    use App\Http\Controllers\Controller;
    class UserController extends Controller
    {
    /**
         * 显示给定用户的信息。
         *
         * @param  int  $id
         * @return Response
         */
    public function showProfile($id)
    {
    $user = Cache::get('user:'.$id);
    return view('profile', ['user' => $user]);
    }
    }
    

    在上面这段代码中,我们「导入」了 Cache Facade 。这个 Facade 作为访问 Illuminate\Contracts\Cache\Factory 接口底层实现的代理。我们使用 Facade 进行的任何调用都将传递给 Laravel 缓存服务的底层实例。

    如果我们看一下 Illuminate\Support\Facades\Cache 这个类,你会发现类中根本没有 get 这个静态方法:

    class Cache extends Facade
    {
    /**
         * 获取组件的注册名称。
         *
         * @return string
         */
    protected static function getFacadeAccessor() { return 'cache'; }
    }
    

    Cache Facade 继承了 Facade 的基类,并定义了 getFacadeAccessor() 方法。这个方法的作用是返回服务容器绑定的类的名称。

    当用户调用 Cache Facade 中的任何静态方法时, Laravel 会从 服务容器 中解析 cache 绑定,然后在解析出的对象上调用所有的请求方法(本例中是 get)。

    实时门面

    使用实时门面,可以将应用中的任意类当做门面来使用。

    为了说明如何使用这个功能,我们先看一个替代方案。例如我们假设 Podcast 模型有一个 publish 方法,尽管如此,为了发布博客,我们需要注入 Publisher 实例:

    <?php
    namespace App;
    use App\Contracts\Publisher;
    use Illuminate\Database\Eloquent\Model;
    class Podcast extends Model
    {
    /**
         * Publish the podcast.
         *
         * @param  Publisher  $publisher
         * @return void
         */
    public function publish(Publisher $publisher)
    {
    $this->update(['publishing' => now()]);
    $publisher->publish($this);
    }
    }
    

    因为可以模拟注入的发布服务,所以注入发布实例到该方法后允许我们轻松在隔离状态下测试该方法。不过,这要求我们每次调用 publish 方法时,都要传递一个发布服务实例。

    使用实时门面,我们可以在维持这种易于测试的前提下不必显式传递 Publisher 实例。要生成一个实时门面,在导入类前面加上 Facades 命名空间前缀即可:

    <?php
    namespace App;
    use Facades\App\Contracts\Publisher;
    use Illuminate\Database\Eloquent\Model;
    class Podcast extends Model
    {
    /**
         * Publish the podcast.
         *
         * @return void
         */
    public function publish()
    {
    $this->update(['publishing' => now()]);
    Publisher::publish($this);
    }
    }
    

    使用实时门面后,发布服务实例将会通过使用 Facades 前缀后的接口或类名在服务容器中解析。

    在测试的时候,我们可以使用 Laravel 自带的门面测试辅助函数来模拟这个方法调用。

    <?php
    namespace Tests\Feature;
    use App\Podcast;
    use Tests\TestCase;
    use Facades\App\Contracts\Publisher;
    use Illuminate\Foundation\Testing\RefreshDatabase;
    class PodcastTest extends TestCase
    {
    use RefreshDatabase;
    /**
         * A test example.
         *
         * @return void
         */
    public function test_podcast_can_be_published()
    {
    $podcast = factory(Podcast::class)->create();
    Publisher::shouldReceive('publish')->once()->with($podcast);
    $podcast->publish();
    }
    }
    

    Facade 类参考

    下面列出了每个门面及其对应的底层类。

    这是一个查找给定 Facade 类 API 文档的工具。服务容器绑定的可用键值也包含在内。

    Facade服务容器绑定
    AppIlluminate\Foundation\Applicationapp
    ArtisanIlluminate\Contracts\Console\Kernelartisan
    AuthIlluminate\Auth\AuthManagerauth
    BladeIlluminate\View\Compilers\BladeCompilerblade.compiler
    BusIlluminate\Contracts\Bus\Dispatcher
    CacheIlluminate\Cache\Repositorycache
    ConfigIlluminate\Config\Repositoryconfig
    CookieIlluminate\Cookie\CookieJarcookie
    CryptIlluminate\Encryption\Encrypterencrypter
    DBIlluminate\Database\DatabaseManagerdb
    DB (Instance)Illuminate\Database\Connection
    EventIlluminate\Events\Dispatcherevents
    FileIlluminate\Filesystem\Filesystemfiles
    GateIlluminate\Contracts\Auth\Access\Gate
    HashIlluminate\Contracts\Hashing\Hasherhash
    LangIlluminate\Translation\Translatortranslator
    LogIlluminate\Log\Writerlog
    MailIlluminate\Mail\Mailermailer
    NotificationIlluminate\Notifications\ChannelManager
    PasswordIlluminate\Auth\Passwords\PasswordBrokerManagerauth.password
    QueueIlluminate\Queue\QueueManagerqueue
    Queue (Instance)Illuminate\Contracts\Queue\Queuequeue
    Queue (Base Class)Illuminate\Queue\Queue
    RedirectIlluminate\Routing\Redirectorredirect
    RedisIlluminate\Redis\Databaseredis
    RequestIlluminate\Http\Requestrequest
    ResponseIlluminate\Contracts\Routing\ResponseFactory
    RouteIlluminate\Routing\Routerrouter
    SchemaIlluminate\Database\Schema\Blueprint
    SessionIlluminate\Session\SessionManagersession
    Session (Instance)Illuminate\Session\Store
    StorageIlluminate\Contracts\Filesystem\Factoryfilesystem
    URLIlluminate\Routing\UrlGeneratorurl
    ValidatorIlluminate\Validation\Factoryvalidator
    Validator (Instance)Illuminate\Validation\Validator
    ViewIlluminate\View\Factoryview
    View (Instance)Illuminate\View\View

    展开全文
  • 简介Laravel 中的契约是指框架提供的一系列定义核心服务的接口(interface)。例如,Illuminate\Contracts\Queue\Queue 契约定义了队列任务所需的...

    简介

    Laravel 中的契约是指框架提供的一系列定义核心服务的接口(interface)。

    例如,Illuminate\Contracts\Queue\Queue 契约定义了队列任务所需的方法,而 Illuminate\Contracts\Mail\Mailer 契约定义了发送电子邮件所需的方法。

    框架对每个契约都提供了相应的实现。例如,Laravel 提供了具有各种驱动的队列实现和由 SwiftMailer 提供支持的邮件驱动实现。

    所有的 Laravel 契约都有他们自己的 GitHub 库。这为所有可用的契约提供了一个快速参考指南,同时也可单独作为低耦合的扩展包给其他包开发者使用。

    契约 VS. Facades

    Laravel Facades 和辅助函数提供了一种使用 Laravel 服务的简单方法,即不需要通过类型提示并从服务容器中解析契约。在大多数情况下,每个 Facades 都有一个等效的契约。

    不同于门面不需要在构造函数中进行类型提示,契约允许你在类中定义显式的依赖。一些开发者倾向于以契约这种方式明确地定义它们的依赖项,而其它开发者则更喜欢 Facades 带来的便捷。

    对于大多数应用程序来说,不管是使用门面还是契约都可以。但是,如果你正在构建一个扩展包,为了方便测试,你应该强烈考虑契约。

    何时使用契约

    综上所述,使用契约或是 Facades 很大程度上归结于个人或者开发团队的喜好。不管是契约还是 Facades 都可以创建出健壮的、易测试的 Laravel 应用程序。如果你长期关注类的单一职责,你会注意到使用契约还是 Facades 其实没多少实际意义上的区别。

    然而,你可能还是会有几个关于契约的问题。例如,为什么要使用接口?不使用接口会比较复杂吗?下面让我们谈下使用接口的原因:低耦合和简单性。

    低耦合

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

    <?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;
        }
    }
    

    现在,更改之后的代码没有与任何扩展包甚至是 Laravel 耦合。而契约扩展包不包含任何实现和依赖项,你可以轻松地编写任何给定契约的替代实现,来实现不修改任何关于缓存消费的代码就可以替换缓存实现。

    简单性

    当所有 Laravel 的服务都使用简洁的接口定义,就很容易判断给定服务提供的功能。可以将契约视为说明框架功能的简洁文档。

    除此之外,当依赖的接口足够简洁时,代码的可读性和可维护性会大大提高。比起搜索一个大型复杂的类中有哪些可用的方法,不如检索一个简单、 干净的接口来参考更妥当。

    如何使用契约

    Laravel 中的许多类型的类都是通过 服务容器 解析出来的,包括控制器、事件监听器、中间件、任务队列,甚至路由闭包。所以,要获得一个契约的实现,你只需要在被解析的类的构造函数中添加「类型提示」即可。

    例如,看看这个事件监听器:

    <?php
    
    
    namespace App\Listeners;
    
    
    use App\User;
    use App\Events\OrderWasPlaced;
    use Illuminate\Contracts\Redis\Database;
    
    
    class CacheOrderInformation
    {
        /**
         * Redis 数据库实现。
         */
        protected $redis;
    
    
        /**
         * 创建事件处理器实例。
         *
         * @param  Database  $redis
         * @return void
         */
        public function __construct(Database $redis)
    {
            $this->redis = $redis;
        }
    
    
        /**
         * 处理事件。
         *
         * @param  OrderWasPlaced  $event
         * @return void
         */
        public function handle(OrderWasPlaced $event)
    {
            //
        }
    }
    

    当事件监听器被解析时,服务容器会读取类的构造函数上的类型提示,并注入对应的值。

    展开全文
  • 当你理解了 Laravel 的工作原理,用起来才能游刃有余。 这篇文档的目标就是从更高层面向你阐述 Laravel 框架的工作原理。通过对框架更全面的了解,你将会更加自信地构建应用。 如果你不能马上理解所有的内容,不要...

    简介

    当你理解了 Laravel 的工作原理,用起来才能游刃有余。

    这篇文档的目标就是从更高层面向你阐述 Laravel 框架的工作原理。通过对框架更全面的了解,你将会更加自信地构建应用。

    如果你不能马上理解所有的内容,不要失去信心!先试着掌握一些基本的东西,你的知识水平将会随着对文档的探索而不断提升。

    生命周期概览

    请求的入口文件

    Laravel 应用的所有请求入口都是 public/index.php 文件,所有请求都会被 web 服务器(Apache/Nginx)导向这个文件。

    index.php 文件包含的代码并不多,但它是加载框架其它部分的起点。

    <?php
    
    define('LARAVEL_START', microtime(true));
    
    // Register The Auto Loader
    require __DIR__.'/../vendor/autoload.php';
    
    // 创建 Laravel 应用实例(建服务容器实例)
    $app = require_once __DIR__.'/../bootstrap/app.php';
    
    // 运行应用,通过 kernel 处理请求并给出响应
    
    $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
    
    $response = $kernel->handle(
        $request = Illuminate\Http\Request::capture()
    );
    
    $response->send();
    
    $kernel->terminate($request, $response)
    

    在 index.php 文件中载入 Composer 生成的自动加载设置,然后从 bootstrap/app.php 获取 Laravel 应用实例。

    应用的引导文件

    bootstrap/app.php 引导文件的作用是:

    • 创建 app 服务容器实例
    • 在服务容器上注册(绑定)Laravel 框架的核心接口
    • 返回服务容器
    <?php
    
    // 创建服务容器
    $app = new Illuminate\Foundation\Application(
        realpath(__DIR__.'/../')
    );
    
    // 绑定(注册)接口到服务容器
    
    // 绑定 App\Http\Kernel,用于处理 web 请求
    $app->singleton(
        Illuminate\Contracts\Http\Kernel::class,
        App\Http\Kernel::class
    );
    
    // 绑定 App\Console\Kernel,用于处理 CLI 请求
    $app->singleton(
        Illuminate\Contracts\Console\Kernel::class,
        App\Console\Kernel::class
    );
    
    // 绑定 App\Exceptions\Handler,用于处理异常
    $app->singleton(
        Illuminate\Contracts\Debug\ExceptionHandler::class,
        App\Exceptions\Handler::class
    );
    
    // 返回服务容器
    return $app;
    
    

    Laravel 的第一个动作就是创建 app 服务容器实例。

    HTTP/Console 内核

    接下来,请求被发送到 HTTP 内核或 Console 内核(分别用于处理 Web 请求和 Artisan 命令),这取决于进入应用的请求类型。

    这两个内核是所有请求都要经过的中央处理器,现在,让我们聚焦在位于 app/Http/Kernel.php 的 HTTP 内核。

    HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。

    HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。

    HTTP 内核的 handle 方法签名相当简单:获取一个 Request,返回一个 Response,可以把 HTTP 内核看作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。

    服务提供者

    内核启动过程中最重要的动作之一就是为应用载入服务提供者。

    应用的所有服务提供者都配置在 config/app.php 配置文件的 providers 数组中。

    首先,所有提供者的 register 方法被调用,然后,所有提供者被注册之后,boot 方法被调用。

    服务提供者负责启动框架的所有各种各样的组件,比如数据库、队列、验证器,以及路由组件等,正是因为他们启动并配置了框架提供的所有特性,所以服务提供者是整个 Laravel 启动过程中最重要的部分。

    分发请求

    一旦应用被启动并且所有的服务提供者被注册,Request 将会被交给路由器进行分发,路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。

    聚焦服务提供者

    服务提供者是启动 Laravel 应用中最关键的部分,应用实例被创建后,服务提供者被注册,请求被交给启动后的应用进行处理,整个过程就是这么简单!

    应用默认的服务提供者存放在 app/Providers 目录下。

    对 Laravel 应用如何通过服务提供者构建和启动有一个牢固的掌握非常有价值。

    默认情况下,AppServiceProvider 是空的,这里是添加自定义启动和服务容器绑定的最佳位置,当然,对大型应用,你可能希望创建多个服务提供者,每一个都有着更加细粒度的启动。

    展开全文
  • laravel查询底层原理

    2019-03-15 09:47:10
    说明:本文主要学习Laravel Database模块的Query Builder源码。实际上,Laravel通过Schema Builder来设计数据库,通过Query Builder来CURD数据库。Query Builder并不复杂或神秘,只是在PDO扩展的基础上又开放封闭的...
  • Laravel 服务容器是用于管理类的依赖和执行依赖注入的工具。 依赖注入的本质是通过构造函数或者某些情况下通过 setter 方法,将类的依赖注入到类中。 来看一个简单的例子: &lt;?php namespace App\...
  • 服务提供者(Provider)是所有 Laravel 应用程序的引导中心。 你的应用程序以及 Laravel 的所有核心服务都是通过服务提供者进行引导。 在这里,我们说的「引导」其实是指注册,通常,这意味着注册服务,包括注册...
  • Laravel 的门面作为服务容器中底层类的“静态代理”,相比于传统静态方法,在维护时能够提供更加易于测试、更加灵活、简明优雅的语法。 Laravel 的所有门面都定义在 Illuminate\Support\Facades 命名...
  • Laravel 中的契约是指框架提供的一系列定义核心服务的接口(interface)。 例如,Illuminate\Contracts\Queue\Queue 契约定义了队列任务所需的方法,而 Illuminate\Contracts\Mail\Mailer 契约定义了发送电子邮件所...
  • laravel底层代码解析

    2019-10-22 09:31:25
    ... 版权声明:本文为博主原创文章,遵循 ...版权协议,转载请附上原文出处链接和本声明。...Laravel Passport——OAuth2 API 认证系统源码解析(下) ...PHP 自动加载功能原理解析  
  • laravel 底层源码链接

    2019-03-13 16:45:22
    Laravel Passport——OAuth2 API 认证系统源码解析(下)laravel源码解析 Laravel Passport——OAuth2 API 认证系统源码解析(上)laravel源码解析 Laravel Broadcast——广播系统源码剖析laravel源码解析 ...
  • 基于 Laravel 框架构建的 Web 应用处理 HTTP 请求的流程也是如此。所有 HTTP 请求都会被转发到单入口文件public/index.php,处理 HTTP 请求的核心代码如下(忽略 HTTP 请求处理之外的代码): $a...
  • laravel 容器的底层原理简单说明
  • │ 49 当用户不在聊天页面时的实时消息提醒功能 │ 50 聊天窗口前端样式优化及后期优化思路 │ ├─6 学好laravel底层,必须得懂的PHP │ 51 PHP文件的自动加载(autoloading) │ 52通过static关键词来实现...
  • 一、运行原理概述 laravel 的入口文件 index.php 1、引入自动加载 autoload.php 2、创建应用实例,并同时完成了 基本绑定($this、容器类Container等等)、 基本服务提供者的注册(Event、log、routing)、 核心类...
  • Posted on2018年3月5日by学院君 ...这篇文档的目标就是从更高层面向你阐述 Laravel 框架的工作原理。通过对框架更全面的了解,一切都不再那么神秘,你将会更加自信地构建应用。如果你不能马上理解所有这些条...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 807
精华内容 322
关键字:

laravel底层原理