首頁 後端開發 php教程 Laravel 服務容器實例教學之深入理解控制反轉(IoC)與依賴注入(DI)

Laravel 服務容器實例教學之深入理解控制反轉(IoC)與依賴注入(DI)

Apr 18, 2018 am 09:21 AM
laravel 實例 教學

這篇文章介紹的內容是關於Laravel 服務容器實例教程之深入理解控制反轉(IoC)和依賴注入(DI),有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

友情提示:本文有點長,但絕對都是乾貨,請耐心讀完,必有收穫!

容器,字面上理解就是裝東西的東西。常見的變數、物件屬性等都可以算是容器。容器能夠裝什麼,全部取決於你對容器的定義。當然,有這樣一種容器,它存放的不是文字、數值,而是物件、物件的描述(類別、介面)或是提供物件的回調,透過這種容器,我們得以實現許多高階的功能,其中最常提到的,就是「解耦」 、「依賴注入(DI)」。本文就從這裡開始。

IoC 容器—— Laravel 的核心

Laravel 的核心是一個IoC 容器,根據文檔,稱其為“服務容器”,顧名思義,該容器提供了整個框架中需要的一系列服務。作為初學者,很多人會在這一個概念上犯錯,因此,我打算從一些基礎的內容開始講解,透過理解物件導向開發中依賴的產生和解決方法,來逐漸揭開「依賴注入」的面紗,逐漸理解這神奇的設計理念。

本文一大半內容都是透過舉例來讓讀者去理解什麼是 IoC(控制反轉) 和 DI(依賴注入),透過理解這些概念,來更加深入。更多關於 laravel 服務容器的用法建議閱讀文件即可。

IoC 容器誕生的故事

講解 IoC 容器有很多的文章,我之前也寫過。但現在我打算利用當下的靈感重新來過,那就開始吧。

超人與超能力,依賴的產生

物件導向編程,有以下幾樣東西無時不刻的接觸:介面、類別還有物件。這其中,介面是類別的原型,一個類別必須遵守其實現的介面;物件則是一個類別實例化後的產物,我們稱之為一個實例。當然這樣說肯定不利於理解,我們就實際的寫點中看不中用的程式碼輔助學習。

怪物橫行的世界,總歸需要點超級人物來擺平。

我們把一個「超人」當作一個類,

class Superman {}
登入後複製

我們可以想像,一個超人誕生的時候肯定擁有至少一個超能力,這個超能力也可以抽象為一個對象,為這個物件定義一個描述他的類別吧。一個超能力肯定有多種屬性、(操作)方法,這個盡情的想像,但是目前我們先大致定義一個只有屬性的“超能力”,至於能幹啥,我們以後再豐富:

class Power {
   /**
    * 能力值
    */
   protected $ability;

   /**
    * 能力范围或距离
    */
   protected $range;

   public function __construct($ability, $range)
   {
       $this->ability = $ability;
       $this->range = $range;
   }
}
登入後複製

這時候我們回過頭,修改一下之前的「超人」類,讓一個「超人」創建的時候被賦予一個超能力:

class Superman
{
   protected $power;

   public function __construct()
   {
       $this->power = new Power(999, 100);
   }
}
登入後複製

這樣的話,當我們創建一個「超人」實例的時候,同時也創造了一個「超能力」的實例,但是,我們看到了一點,「超人」和「超能力」之間不可避免的產生了一個依賴。

所謂“依賴”,就是 “我若依賴你,我就不能離開你”。

在一個貫徹物件導向程式設計的專案中,這樣的依賴隨處可見。少量的依賴並不會有太過直覺的影響,我們隨著這個例子逐漸鋪開,讓大家慢慢意識到,當依賴達到一個量級時,是怎樣一番噩夢般的體驗。當然,我也會自然而然的敘述如何解決問題。

一堆亂麻- 可怕的依賴

之前的例子中,超能力類別實例化後是一個具體的超能力,但是我們知道,超人的超能力是多元化的,每種超能力的方法、屬性都有不小的差異,沒辦法透過一種類別描述完全。我們現在進行修改,我們假設超人可以有以下多種超能力:

飛行,屬性有:飛行速度、持續飛行時間

蠻力,屬性有:力量值

能量彈,屬性有:傷害值、射擊距離、同時射擊個數

我們創建瞭如下類:

class Flight
{
   protected $speed;
   protected $holdtime;
   public function __construct($speed, $holdtime) {}
}

class Force
{
   protected $force;
   public function __construct($force) {}
}

class Shot
{
   protected $atk;
   protected $range;
   protected $limit;
   public function __construct($atk, $range, $limit) {}
}
登入後複製

為了省事兒我沒有詳細寫出 __construct() 這個建構函數的全部,只寫了需要傳遞的參數。

好了,這下我們的超人有點「忙」了。在超人初始化的時候,我們會根據需要來實例化其擁有的超能力嗎,大致如下:

class Superman
{
   protected $power;

   public function __construct()
   {
       $this->power = new Fight(9, 100);
       // $this->power = new Force(45);
       // $this->power = new Shot(99, 50, 2);
       /*
       $this->power = array(
           new Force(45),
           new Shot(99, 50, 2)
       );
       */
   }
}
登入後複製

我們需要自己手動的在構造函數內(或其他方法裡)實例化一系列需要的類,這樣並不好。可以想像,假如需求變更(不同的怪物橫行地球),需要更多的有針對性的新的超能力,或者需要變更超能力的方法,我們必須 重新改造 超人。換句話說就是,改變超能力的同時,我還得重新製造個超人。效率太低了!新超人還沒創造完成世界早已被毀滅。

这时,灵机一动的人想到:为什么不可以这样呢?超人的能力可以被随时更换,只需要添加或者更新一个芯片或者其他装置啥的(想到钢铁侠没)。这样的话就不要整个重新来过了。

对,就是这样的。

我们不应该手动在 “超人” 类中固化了他的 “超能力” 初始化的行为,而转由外部负责,由外部创造超能力模组、装置或者芯片等(我们后面统一称为 “模组”),植入超人体内的某一个接口,这个接口是一个既定的,只要这个 “模组” 满足这个接口的装置都可以被超人所利用,可以提升、增加超人的某一种能力。这种由外部负责其依赖需求的行为,我们可以称其为 “控制反转(IoC)”。

工厂模式,依赖转移!

当然,实现控制反转的方法有几种。在这之前,不如我们先了解一些好玩的东西。

我们可以想到,组件、工具(或者超人的模组),是一种可被生产的玩意儿,生产的地方当然是 “工厂(Factory)”,于是有人就提出了这样一种模式: 工厂模式。

工厂模式,顾名思义,就是一个类所依赖的外部事物的实例,都可以被一个或多个 “工厂” 创建的这样一种开发模式,就是 “工厂模式”。

我们为了给超人制造超能力模组,我们创建了一个工厂,它可以制造各种各样的模组,且仅需要通过一个方法:

class SuperModuleFactory
{
   public function makeModule($moduleName, $options)
   {
       switch ($moduleName) {
           case 'Fight': 
               return new Fight($options[0], $options[1]);
           case 'Force': 
               return new Force($options[0]);
           case 'Shot': 
               return new Shot($options[0], $options[1], $options[2]);
       }
   }
}
登入後複製

这时候,超人 创建之初就可以使用这个工厂!

class Superman
{
   protected $power;

   public function __construct()
   {
       // 初始化工厂
       $factory = new SuperModuleFactory;

       // 通过工厂提供的方法制造需要的模块
       $this->power = $factory->makeModule('Fight', [9, 100]);
       // $this->power = $factory->makeModule('Force', [45]);
       // $this->power = $factory->makeModule('Shot', [99, 50, 2]);
       /*
       $this->power = array(
           $factory->makeModule('Force', [45]),
           $factory->makeModule('Shot', [99, 50, 2])
       );
       */
   }
}
登入後複製

可以看得出,我们不再需要在超人初始化之初,去初始化许多第三方类,只需初始化一个工厂类,即可满足需求。但这样似乎和以前区别不大,只是没有那么多 new 关键字。其实我们稍微改造一下这个类,你就明白,工厂类的真正意义和价值了。

class Superman
{
   protected $power;

   public function __construct(array $modules)
   {
       // 初始化工厂
       $factory = new SuperModuleFactory;

       // 通过工厂提供的方法制造需要的模块
       foreach ($modules as $moduleName => $moduleOptions) {
           $this->power[] = $factory->makeModule($moduleName, $moduleOptions);
       }
   }
}

// 创建超人
$superman = new Superman([
   'Fight' => [9, 100],
   'Shot' => [99, 50, 2]
]);
登入後複製

现在修改的结果令人满意。现在,“超人” 的创建不再依赖任何一个 “超能力” 的类,我们如若修改了或者增加了新的超能力,只需要针对修改 SuperModuleFactory 即可。扩充超能力的同时不再需要重新编辑超人的类文件,使得我们变得很轻松。但是,这才刚刚开始。

IoC 容器的重要组成 —— 依赖注入

由 “超人” 对 “超能力” 的依赖变成 “超人” 对 “超能力模组工厂” 的依赖后,对付小怪兽们变得更加得心应手。但这也正如你所看到的,依赖并未解除,只是由原来对多个外部的依赖变成了对一个 “工厂” 的依赖。假如工厂出了点麻烦,问题变得就很棘手。

其实大多数情况下,工厂模式已经足够了。工厂模式的缺点就是:接口未知(即没有一个很好的契约模型,关于这个我马上会有解释)、产生对象类型单一。总之就是,还是不够灵活。虽然如此,工厂模式依旧十分优秀,并且适用于绝大多数情况。不过我们为了讲解后面的依赖注入 ,这里就先夸大一下工厂模式的缺陷咯。

我们知道,超人依赖的模组,我们要求有统一的接口,这样才能和超人身上的注入接口对接,最终起到提升超能力的效果。

事实上,我之前说谎了,不仅仅只有一堆小怪兽,还有更多的大怪兽。嘿嘿。额,这时候似乎工厂的生产能力显得有些不足 —— 由于工厂模式下,所有的模组都已经在工厂类中安排好了,如果有新的、高级的模组加入,我们必须修改工厂类(好比增加新的生产线):

class SuperModuleFactory
{
   public function makeModule($moduleName, $options)
   {
       switch ($moduleName) {
           case 'Fight': 
               return new Fight($options[0], $options[1]);
           case 'Force': 
               return new Force($options[0]);
           case 'Shot': 
               return new Shot($options[0], $options[1], $options[2]);
           // case 'more': .......
           // case 'and more': .......
           // case 'and more': .......
           // case 'oh no! its too many!': .......
       }
   }
}
登入後複製

看到没。。。噩梦般的感受!

其实灵感就差一步!你可能会想到更为灵活的办法!对,下一步就是我们今天的主要配角 —— DI (依赖注入)

由于对超能力模组的需求不断增大,我们需要集合整个世界的高智商人才,一起解决问题,不应该仅仅只有几个工厂垄断负责。不过高智商人才们都非常自负,认为自己的想法是对的,创造出的超能力模组没有统一的接口,自然而然无法被正常使用。这时我们需要提出一种契约,这样无论是谁创造出的模组,都符合这样的接口,自然就可被正常使用。

interface SuperModuleInterface
{
   /**
    * 超能力激活方法
    *
    * 任何一个超能力都得有该方法,并拥有一个参数
    *@param array $target 针对目标,可以是一个或多个,自己或他人
    */
   public function activate(array $target);
}
登入後複製

上文中,我们定下了一个接口 (超能力模组的规范、契约),所有被创造的模组必须遵守该规范,才能被生产。

其实,这就是 php 中接口( interface )的用处和意义!很多人觉得,为什么 php 需要接口这种东西?难道不是 java 、 C# 之类的语言才有的吗?这么说,只要是一个正常的面向对象编程语言(虽然 php 可以面向过程),都应该具备这一特性。因为一个 对象(object) 本身是由他的模板或者原型 —— 类 (class) ,经过实例化后产生的一个具体事物,而有时候,实现统一种方法且不同功能(或特性)的时候,会存在很多的类(class),这时候就需要有一个契约,让大家编写出可以被随时替换却不会产生影响的接口。这种由编程语言本身提出的硬性规范,会增加更多优秀的特性。

虽然有些绕,但通过我们接下来的实例,大家会慢慢领会接口带来的好处。

这时候,那些提出更好的超能力模组的高智商人才,遵循这个接口,创建了下述(模组)类:

/**
* X-超能量
*/
class XPower implements SuperModuleInterface
{
   public function activate(array $target)
   {
       // 这只是个例子。。具体自行脑补
   }
}

/**
* 终极* (就这么俗)
*/
class UltraBomb implements SuperModuleInterface
{
   public function activate(array $target)
   {
       // 这只是个例子。。具体自行脑补
   }
}
登入後複製

同时,为了防止有些 “砖家” 自作聪明,或者一些叛徒恶意捣蛋,不遵守契约胡乱制造模组,影响超人,我们对超人初始化的方法进行改造:

class Superman
{
   protected $module;

   public function __construct(SuperModuleInterface $module)
   {
       $this->module = $module;
   }
}
登入後複製

改造完毕!现在,当我们初始化 “超人” 类的时候,提供的模组实例必须是一个 SuperModuleInterface 接口的实现。否则就会提示错误。

正是由于超人的创造变得容易,一个超人也就不需要太多的超能力,我们可以创造多个超人,并分别注入需要的超能力模组即可。这样的话,虽然一个超人只有一个超能力,但超人更容易变多,我们也不怕怪兽啦!

现在有人疑惑了,你要讲的依赖注入呢?

其实,上面讲的内容,正是依赖注入。

什么叫做依赖注入?

本文从开头到现在提到的一系列依赖,只要不是由内部生产(比如初始化、构造函数 __construct 中通过工厂方法、自行手动 new 的),而是由外部以参数或其他形式注入的,都属于依赖注入(DI) 。是不是豁然开朗?事实上,就是这么简单。下面就是一个典型的依赖注入:

// 超能力模组
$superModule = new XPower;
// 初始化一个超人,并注入一个超能力模组依赖
$superMan = new Superman($superModule);
登入後複製

关于依赖注入这个本文的主要配角,也就这么多需要讲的。理解了依赖注入,我们就可以继续深入问题。慢慢走近今天的主角……

更为先进的工厂 —— IoC 容器

刚刚列了一段代码:

$superModule = new XPower;
$superMan = new Superman($superModule);
登入後複製

读者应该看出来了,手动的创建了一个超能力模组、手动的创建超人并注入了刚刚创建超能力模组。呵呵,手动。

现代社会,应该是高效率的生产,干净的车间,完美的自动化装配。

一群怪兽来了,如此低效率产出超人是不现实,我们需要自动化 —— 最多一条指令,千军万马来相见。我们需要一种高级的生产车间,我们只需要向生产车间提交一个脚本,工厂便能够通过指令自动化生产。这种更为高级的工厂,就是工厂模式的升华 —— IoC 容器。

class Container
{
   protected $binds;

   protected $instances;

   public function bind($abstract, $concrete)
   {
       if ($concrete instanceof Closure) {
           $this->binds[$abstract] = $concrete;
       } else {
           $this->instances[$abstract] = $concrete;
       }
   }

   public function make($abstract, $parameters = [])
   {
       if (isset($this->instances[$abstract])) {
           return $this->instances[$abstract];
       }

       array_unshift($parameters, $this);

       return call_user_func_array($this->binds[$abstract], $parameters);
   }
}
登入後複製

这时候,一个十分粗糙的容器就诞生了。现在的确很简陋,但不妨碍我们进一步提升他。先着眼现在,看看这个容器如何使用吧!

// 创建一个容器(后面称作超级工厂)
$container = new Container;

// 向该 超级工厂添加超人的生产脚本
$container->bind('superman', function($container, $moduleName) {
   return new Superman($container->make($moduleName));
});

// 向该 超级工厂添加超能力模组的生产脚本
$container->bind('xpower', function($container) {
   return new XPower;
});

// 同上
$container->bind('ultrabomb', function($container) {
   return new UltraBomb;
});

// ****************** 华丽丽的分割线 **********************
// 开始启动生产
$superman_1 = $container->make('superman', 'xpower');
$superman_2 = $container->make('superman', 'ultrabomb');
$superman_3 = $container->make('superman', 'xpower');
// ...随意添加
登入後複製

看到没?通过最初的 绑定(bind) 操作,我们向 超级工厂 注册了一些生产脚本,这些生产脚本在生产指令下达之时便会执行。发现没有?我们彻底的解除了 超人 与 超能力模组 的依赖关系,更重要的是,容器类也丝毫没有和他们产生任何依赖!我们通过注册、绑定的方式向容器中添加一段可以被执行的回调(可以是匿名函数、非匿名函数、类的方法)作为生产一个类的实例的 脚本 ,只有在真正的 生产(make) 操作被调用执行时,才会触发。

这样一种方式,使得我们更容易在创建一个实例的同时解决其依赖关系,并且更加灵活。当有新的需求,只需另外绑定一个“生产脚本”即可。

实际上,真正的 IoC 容器更为高级。我们现在的例子中,还是需要手动提供超人所需要的模组参数,但真正的 IoC 容器会根据类的依赖需求,自动在注册、绑定的一堆实例中搜寻符合的依赖需求,并自动注入到构造函数参数中去。Laravel 框架的服务容器正是这么做的。实现这种功能其实理论上并不麻烦,但我并不会在本文中写出,因为……我懒得写。

不过我告诉大家,这种自动搜寻依赖需求的功能,是通过反射(Reflection)实现的,恰好的,php 完美的支持反射机制!关于反射,php 官方文档有详细的资料,并且中文翻译基本覆盖,足够学习和研究:

http://php.net/manual/zh/book.reflection.php

现在,到目前为止,我们已经不再惧怕怪兽们了。高智商人才集思广益,井井有条,根据接口契约创造规范的超能力模组。超人开始批量产出。最终,人人都是超人,你也可以是哦!

重新审视 Laravel 的核心

现在,我们开始慢慢解读 Laravel 的核心。其实,Laravel 的核心就是一个 IoC 容器,也恰好是我之前所说的高级的 IoC 容器。

可以说,Laravel 的核心本身十分轻量,并没有什么很神奇很实质性的应用功能。很多人用到的各种功能模块比如 Route(路由)、Eloquent ORM(数据库 ORM 组件)、Request(请求)以及 Response(响应)等等等等,实际上都是与核心无关的类模块提供的,这些类从注册到实例化,最终被你所使用,其实都是 Laravel 的服务容器负责的。

我们以大家最常见的 Route 类作为例子。大家可能经常见到路由定义是这样的:

Route::get('/', function() {
   // bla bla bla...
});
登入後複製

实际上, Route 类被定义在这个命名空间:Illuminate\Routing\Router,文件 vendor/laravel/framework/src/Illuminate/Routing/Router.php。

我们通过打开发现,这个类的这一系列方法,如 get,post,any 等都不是静态(static)方法,这是怎么一回事儿?不要急,我们继续。

服务提供者

我们在前文介绍 IoC 容器的部分中,提到了,一个类需要绑定、注册至容器中,才能被“制造”。

对,一个类要被容器所能够提取,必须要先注册至这个容器。既然 Laravel 称这个容器叫做服务容器,那么我们需要某个服务,就得先注册、绑定这个服务到容器,那么提供服务并绑定服务至容器的东西,就是服务提供者(Service Provider)。

虽然,绑定一个类到容器不一定非要通过服务提供者。

但是,我们知道,有时候我们的类、模块会有需要其他类和组件的情况,为了保证初始化阶段不会出现所需要的模块和组件没有注册的情况,Laravel 将注册和初始化行为进行拆分,注册的时候就只能注册,初始化的时候就是初始化。拆分后的产物就是现在的服务提供者。

服务提供者主要分为两个部分,register(注册) 和 boot(引导、初始化),具体参考文档。register 负责进行向容器注册“脚本”,但要注意注册部分不要有对未知事物的依赖,如果有,就要移步至 boot 部分。

门面(Facade)

我们现在解答之前关于 Route 的方法为何能以静态方法访问的问题。实际上这个问题文档上有写,简单说来就是模拟一个类,提供一个静态魔术方法__callStatic,并将该静态方法映射到真正的方法上。

我们使用的 Route 类实际上是 Illuminate\Support\Facades\Route 通过 class_alias() 函数创造的别名而已,这个类被定义在文件 vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php 。

我们打开文件一看……诶?怎么只有这么简单的一段代码呢?

<?php 
   namespace Illuminate\Support\Facades;

   /**
    * @see \Illuminate\Routing\Router
    */
   class Route extends Facade {

       /**
        * Get the registered name of the component.
        *
        * @return string
        */
       protected static function getFacadeAccessor()
       {
           return &#39;router&#39;;
       }

}
登入後複製

其实仔细看,会发现这个类继承了一个叫做 Facade 的类,到这里谜底差不多要解开了。

上述简单的定义中,我们看到了 getFacadeAccessor 方法返回了一个 route,这是什么意思呢?事实上,这个值被一个 ServiceProvider 注册过,大家应该知道注册了个什么,当然是那个真正的路由类!

有人会问,Facade 是怎么实现的。我并不想说得太细,一个是我懒,另一个原因就是,自己发现一些东西更容易理解,并不容易忘记。很多细节我已经说了,建议大家自行去研究。

本文整理自:https://www.insp.top/article/learn-laravel-container

相关推荐:

laravel框架中常用目录路径详解

Laravel 的队列系统介绍



以上是Laravel 服務容器實例教學之深入理解控制反轉(IoC)與依賴注入(DI)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在dcat admin中如何實現點擊添加數據的自定義表格功能? 在dcat admin中如何實現點擊添加數據的自定義表格功能? Apr 01, 2025 am 07:09 AM

在dcatadmin(laravel-admin)中如何實現自定義點擊添加數據的表格功能在使用dcat...

在Laravel中如何獲取郵件發送失敗時的退信代碼? 在Laravel中如何獲取郵件發送失敗時的退信代碼? Apr 01, 2025 pm 02:45 PM

Laravel郵件發送失敗時的退信代碼獲取方法在使用Laravel開發應用時,經常會遇到需要發送驗證碼的情況。而在實�...

高級引導教程:掌握自定義和組件 高級引導教程:掌握自定義和組件 Apr 04, 2025 am 12:04 AM

掌握Bootstrap自定義和組件使用的方法包括:1.使用CSS變量和Sass預處理器進行樣式自定義;2.深入了解並修改組件結構和行為。通過這些方法,可以創建獨特的用戶界面,提升網站的響應性和用戶體驗。

Laravel Redis連接共享:為何select方法會影響其他連接? Laravel Redis連接共享:為何select方法會影響其他連接? Apr 01, 2025 am 07:45 AM

Laravel框架中Redis連接的共享與select方法的影響在使用Laravel框架和Redis時,開發者可能會遇到一個問題:通過配置...

Laravel多租戶擴展stancl/tenancy:如何自定義租戶數據庫連接的主機地址? Laravel多租戶擴展stancl/tenancy:如何自定義租戶數據庫連接的主機地址? Apr 01, 2025 am 09:09 AM

在Laravel多租戶擴展包stancl/tenancy中自定義租戶數據庫連接使用Laravel多租戶擴展包stancl/tenancy構建多租戶應用時,...

Bangla 部分模型檢索中的 Laravel Eloquent ORM) Bangla 部分模型檢索中的 Laravel Eloquent ORM) Apr 08, 2025 pm 02:06 PM

LaravelEloquent模型檢索:輕鬆獲取數據庫數據EloquentORM提供了簡潔易懂的方式來操作數據庫。本文將詳細介紹各種Eloquent模型檢索技巧,助您高效地從數據庫中獲取數據。 1.獲取所有記錄使用all()方法可以獲取數據庫表中的所有記錄:useApp\Models\Post;$posts=Post::all();這將返回一個集合(Collection)。您可以使用foreach循環或其他集合方法訪問數據:foreach($postsas$post){echo$post->

在Laravel6項目中如何有效檢查Redis連接的有效性? 在Laravel6項目中如何有效檢查Redis連接的有效性? Apr 01, 2025 pm 02:00 PM

在Laravel6項目中如何檢查Redis連接的有效性是一個常見的問題,特別是在項目依賴於Redis進行業務處理時。以下是...

laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

See all articles