今天小編給大家分享一下怎么用PHP特性trait實現(xiàn)簡易Laravel Facade的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

沅江網站建設公司創(chuàng)新互聯(lián)公司,沅江網站設計制作,有大型網站制作公司豐富經驗。已為沅江上千家提供企業(yè)網站建設服務。企業(yè)網站搭建\成都外貿網站建設公司要多少錢,請找那個售后服務好的沅江做網站的公司定做!
簡述
Facade 可以有效幫我實現(xiàn)方法的靜態(tài)化。Laravel 大部分的擴展包都使用了 Facade。
下面的簡易 Facade 主要是利用 PHP 的特性 trait,魔術方法 __callStatic,反射類 ReflectionClass。
使用場景
后臺系統(tǒng)大部分都會有類似這樣的操作:
<?php
$user = User::find($id);if (!$user) {
throw new \Expection("資源不存在");}這樣似乎沒有什么問題,但是還會存在下面這樣的:
$article = Article::find($id);if (!$article) {
throw new \Expection("資源不存在");}$article->delete();這樣寫法十分不優(yōu)雅。
上代碼
1、首先我們應該要有一個 Service
<?phpnamespace App\Services;use App\Traits\ModeServiceTrait;class ModelService extends BaseService{
use ModeServiceTrait;}2、新建一個 Trait
trait 為了多繼承而存在的,可以去 PHP官網 看文檔。
<?php
namespace App\Traits;
use \ReflectionClass;
use \Exception;use \ReflectionException;
use Illuminate\Database\Eloquent\Model;
use App\Exceptions\ResourceException;
/**
* @method static Model find(string $className, int $id, callable $callback = null)
*
* @see Model
* @package App\Services
*/trait ModeServiceTrait{
/**
* 回調方法
*
* @param Model|null $model
* @param string $method
* @return Model
* @throws ResourceException
*/
public static function callback(Model|null $model, string $method): Model {
switch ($method)
{
case 'first':
case 'find':
if (!$model) {
throw new ResourceException("資源不存在");
}
break;
default:
break;
}
return $model;
}
/**
* 調用不存在的方法時觸發(fā)
*
* @param $method
* @param $args
* @return false|mixed
* @throws ReflectionException
* @throws ResourceException
* @throws Exception
*/
public static function __callStatic($method, $args)
{
$className = $args[0];
$arg = $args[1];
// 判斷模型類是否存在
if (!class_exists($className)) {
throw new Exception("The class {$className} could not be found. from:" . __CLASS__);
}
// 利用反射實例化其類
$reflection = new ReflectionClass($className);
$instance = $reflection->newInstanceArgs();
// 調用該不存在的方法
$model = call_user_func_array([$instance, $method], [$arg]);
// 如果存在復雜操作交給 callback
return isset($args[2]) ? $args[2]($model) : self::callback($model, $method);
}}首先我們關注 __callStatic 這個魔術方法。 當調用不存在的靜態(tài)方法時會觸發(fā)該方法。和他相似的魔術方法是 __call。這是使用 __callStatic 是為了達到 Facade 的效果。
__callStatic 有兩個回調參數(shù) $method 是 被調用的且不存在的方法,$args 是 $method 方法中所傳遞的參數(shù)(數(shù)組形式)。
這樣一個簡易的 trait 就完成了。
使用
我們新建一個 command
$ php artisan make:command TestCommand
寫入下面的內容
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Services\ModelService;
use App\Models\Article\Article;
class TestCommand extends Command{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'test:test';
/**
* The console command description.
*
* @var string
*/
protected $description = 'a test';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*/
public function handle()
{
$article = ModelService::find(Article::class, 1);
$article = ModelService::find(Article::class, 1, function ($model) {
return $model->load('author');
});
}}其中的 Article 模型需要自己去創(chuàng)建。
接下來就可以看看效果了:
$ php artisan test:test
以上就是“怎么用PHP特性trait實現(xiàn)簡易Laravel Facade”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網頁名稱:怎么用PHP特性trait實現(xiàn)簡易LaravelFacade
轉載來于:http://chinadenli.net/article32/goeosc.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供外貿建站、、網站內鏈、品牌網站制作、服務器托管、ChatGPT
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)