Rumah >rangka kerja php >Laravel >Melaksanakan Fasad Laravel yang mudah menggunakan ciri ciri PHP

Melaksanakan Fasad Laravel yang mudah menggunakan ciri ciri PHP

藏色散人
藏色散人ke hadapan
2022-01-27 16:33:012135semak imbas

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 &#39;first&#39;:
            case &#39;find&#39;:
                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 = &#39;test:test&#39;;

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = &#39;a test&#39;;

    /**
     * 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!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam