Rumah > rangka kerja php > Laravel > teks badan

Melaksanakan Fasad Laravel yang mudah menggunakan ciri ciri PHP

藏色散人
Lepaskan: 2022-02-09 09:09:20
ke hadapan
2076 orang telah melayarinya

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("资源不存在");}
Salin selepas log masuk

Ini nampaknya tiada apa-apa . Masalah, tetapi akan ada yang berikut:

$article = Article::find($id);if (!$article) {
    throw new \Expection("资源不存在");}$article->delete();
Salin selepas log masuk

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;}
Salin selepas log masuk

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);
    }}
Salin selepas log masuk

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
Salin selepas log masuk

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');
        });
    }}
Salin selepas log masuk

Model Article perlu dicipta sendiri.
Seterusnya anda boleh melihat kesannya:

$ php artisan test:test
Salin selepas log masuk

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!

Label berkaitan:
sumber:learnku.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan