Lajur tutorial Laravel berikut akan memperkenalkan kepada anda cara menggunakan ciri PHP untuk melaksanakan Fasad mudah saya harap ia akan membantu anda.
Penerangan ringkas
Facade
boleh membantu saya merealisasikan kaedah statik secara berkesan Laravel
Kebanyakan pek pengembangan menggunakan Facade
. [Disyorkan: Tutorial Video Laravel]Facade
mudah berikut terutamanya menggunakan ciri PHP trait
, kaedah ajaib __callStatic
dan kelas refleksi ReflectionClass
.
Senario Penggunaan
Kebanyakan sistem latar belakang akan mempunyai operasi yang serupa dengan ini:
<?php $user = User::find($id);if (!$user) { throw new \Expection("资源不存在");}
Ini nampaknya tiada apa-apa . Masalah, tetapi akan ada yang berikut:
$article = Article::find($id);if (!$article) { throw new \Expection("资源不存在");}$article->delete();
Cara penulisan ini sangat tidak elegan.
Kod
1. Mula-mula kita patut ada Perkhidmatan
<?phpnamespace App\Services;use App\Traits\ModeServiceTrait;class ModelService extends BaseService{ use ModeServiceTrait;}
2. Cipta Sifat baharu
ciri wujud untuk pelbagai warisan Anda boleh pergi ke tapak web rasmi PHP untuk membaca dokumentasi.
<?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; } /** * 调用不存在的方法时触发 * * @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); }}
Mula-mula kita fokus pada __callStatic
kaedah ajaib ini. Kaedah ini dicetuskan apabila kaedah statik yang tidak wujud dipanggil. Kaedah sihir yang serupa dengannya ialah __call
. Ini menggunakan __callStatic
untuk mencapai kesan Facade
.
__callStatic
mempunyai dua parameter panggil balik $method
ialah 被调用的且不存在的方法
dan $args
ialah parameter (dalam bentuk tatasusunan) yang diluluskan dalam kaedah $method
.
trait
semudah itu sudah selesai.
Gunakan
untuk mencipta yang baharu command
$ php artisan make:command TestCommand
dan tulis kandungan berikut
<?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'); }); }}
Model Article
perlu dicipta sendiri.
Seterusnya anda boleh melihat kesannya:
$ php artisan test:test
Kesimpulan
Dengan cara ini kita meninggalkan penggunaan abstract
abstraksi kelas untuk mencapai kesan yang sama seperti Facade
. Pada masa yang sama, penggunaan semula kod juga dicapai.
Menggunakan program dengan cara ini akan mengambil lebih banyak langkah, tetapi berbanding dengan keanggunan, prestasi tidak penting.
Ungkapan tidak begitu jelas, anda perlu memahaminya dengan mendalam. <
Atas ialah kandungan terperinci Melaksanakan Fasad Laravel yang mudah menggunakan ciri ciri PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!