Heim >PHP-Framework >Laravel >Ausführliche Erläuterung von Verträgen und Fassaden in Laravel
Contracts
Contracts befürwortet tatsächlich eine schnittstellenorientierte Programmierung, um den Zweck der Entkopplung zu erreichen. Diese gemeinsamen Schnittstellen wurden von Laravel für Sie entwickelt. Das sind Verträge.
Woher weiß Laravel also, welche Implementierung wir verwenden müssen?
In der Standard-Vertragsbindung von Laravel gibt es diese Definition in „Illuminate/Foundation/Application.php“: Dies ist die Bindung der Standardschnittstellenimplementierung.
Empfohlen: „Laravel Tutorial》
/** * Register the core class aliases in the container. * * @return void */ public function registerCoreContainerAliases() { $aliases = [ 'app' => ['Illuminate\Foundation\Application', 'Illuminate\Contracts\Container\Container', 'Illuminate\Contracts\Foundation\Application'], 'auth' => 'Illuminate\Auth\AuthManager', 'auth.driver' => ['Illuminate\Auth\Guard', 'Illuminate\Contracts\Auth\Guard'], 'auth.password.tokens' => 'Illuminate\Auth\Passwords\TokenRepositoryInterface', 'blade.compiler' => 'Illuminate\View\Compilers\BladeCompiler', 'cache' => ['Illuminate\Cache\CacheManager', 'Illuminate\Contracts\Cache\Factory'], 'cache.store' => ['Illuminate\Cache\Repository', 'Illuminate\Contracts\Cache\Repository'], 'config' => ['Illuminate\Config\Repository', 'Illuminate\Contracts\Config\Repository'], 'cookie' => ['Illuminate\Cookie\CookieJar', 'Illuminate\Contracts\Cookie\Factory', 'Illuminate\Contracts\Cookie\QueueingFactory'], 'encrypter' => ['Illuminate\Encryption\Encrypter', 'Illuminate\Contracts\Encryption\Encrypter'], 'db' => 'Illuminate\Database\DatabaseManager', 'db.connection' => ['Illuminate\Database\Connection', 'Illuminate\Database\ConnectionInterface'], 'events' => ['Illuminate\Events\Dispatcher', 'Illuminate\Contracts\Events\Dispatcher'], 'files' => 'Illuminate\Filesystem\Filesystem', 'filesystem' => ['Illuminate\Filesystem\FilesystemManager', 'Illuminate\Contracts\Filesystem\Factory'], 'filesystem.disk' => 'Illuminate\Contracts\Filesystem\Filesystem', 'filesystem.cloud' => 'Illuminate\Contracts\Filesystem\Cloud', 'hash' => 'Illuminate\Contracts\Hashing\Hasher', 'translator' => ['Illuminate\Translation\Translator', 'Symfony\Component\Translation\TranslatorInterface'], 'log' => ['Illuminate\Log\Writer', 'Illuminate\Contracts\Logging\Log', 'Psr\Log\LoggerInterface'], 'mailer' => ['Illuminate\Mail\Mailer', 'Illuminate\Contracts\Mail\Mailer', 'Illuminate\Contracts\Mail\MailQueue'], 'auth.password' => ['Illuminate\Auth\Passwords\PasswordBroker', 'Illuminate\Contracts\Auth\PasswordBroker'], 'queue' => ['Illuminate\Queue\QueueManager', 'Illuminate\Contracts\Queue\Factory', 'Illuminate\Contracts\Queue\Monitor'], 'queue.connection' => 'Illuminate\Contracts\Queue\Queue', 'redirect' => 'Illuminate\Routing\Redirector', 'redis' => ['Illuminate\Redis\Database', 'Illuminate\Contracts\Redis\Database'], 'request' => 'Illuminate\Http\Request', 'router' => ['Illuminate\Routing\Router', 'Illuminate\Contracts\Routing\Registrar'], 'session' => 'Illuminate\Session\SessionManager', 'session.store' => ['Illuminate\Session\Store', 'Symfony\Component\HttpFoundation\Session\SessionInterface'], 'url' => ['Illuminate\Routing\UrlGenerator', 'Illuminate\Contracts\Routing\UrlGenerator'], 'validator' => ['Illuminate\Validation\Factory', 'Illuminate\Contracts\Validation\Factory'], 'view' => ['Illuminate\View\Factory', 'Illuminate\Contracts\View\Factory'], ];
Bei der Implementierung unserer benutzerdefinierten Schnittstelle können wir sie in ServiceProvider zum Binden verwenden:
$this->app->bind('App\Contracts\EventPusher', 'App\Services\PusherEventPusher');
Facades
Facades bieten a „statische“ Schnittstelle zu Klassen, die im Servicecontainer der Anwendung verfügbar sind. Laravel-„Fassaden“ fungieren als „statische Proxys“ für Basisklassen innerhalb des Service-Containers. Schwer zu verstehen?
Wir öffnen config/app.php im Projektverzeichnis und finden dann
/* |-------------------------------------------------------------------------- | Class Aliases |-------------------------------------------------------------------------- | | This array of class aliases will be registered when this application | is started. However, feel free to register as many as you wish as | the aliases are "lazy" loaded so they don't hinder performance. | */ 'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, 'Blade' => Illuminate\Support\Facades\Blade::class, 'Bus' => Illuminate\Support\Facades\Bus::class, 'Cache' => Illuminate\Support\Facades\Cache::class, 'Config' => Illuminate\Support\Facades\Config::class, 'Cookie' => Illuminate\Support\Facades\Cookie::class, 'Crypt' => Illuminate\Support\Facades\Crypt::class, 'DB' => Illuminate\Support\Facades\DB::class, 'Eloquent' => Illuminate\Database\Eloquent\Model::class, 'Event' => Illuminate\Support\Facades\Event::class, 'File' => Illuminate\Support\Facades\File::class, 'Gate' => Illuminate\Support\Facades\Gate::class, 'Hash' => Illuminate\Support\Facades\Hash::class, 'Input' => Illuminate\Support\Facades\Input::class, 'Lang' => Illuminate\Support\Facades\Lang::class, 'Log' => Illuminate\Support\Facades\Log::class, 'Mail' => Illuminate\Support\Facades\Mail::class, 'Password' => Illuminate\Support\Facades\Password::class, 'Queue' => Illuminate\Support\Facades\Queue::class, 'Redirect' => Illuminate\Support\Facades\Redirect::class, 'Redis' => Illuminate\Support\Facades\Redis::class, 'Request' => Illuminate\Support\Facades\Request::class, 'Response' => Illuminate\Support\Facades\Response::class, 'Route' => Illuminate\Support\Facades\Route::class, 'Schema' => Illuminate\Support\Facades\Schema::class, 'Session' => Illuminate\Support\Facades\Session::class, 'Storage' => Illuminate\Support\Facades\Storage::class, 'URL' => Illuminate\Support\Facades\URL::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, ],
Haben Sie etwas gefunden? Ja, Facades sind eigentlich Aliase für eine Reihe von Klassen, die in config/app.php definiert sind. Es ist nur so, dass diese Klassen alle eine gemeinsame Funktion haben: Sie erben die Basisklasse IlluminateSupportFacadesFacade und implementieren eine Methode: getFacadeAccessor gibt den Namen zurück.
Benutzerdefinierte Fassade
Referenz http://www.tutorialspoint.com/laravel/laravel_facades.htm
Schritt 1 − Erstellen Sie einen ServiceProvider mit dem Namen TestFacadesServiceProvider und verwenden Sie den folgenden Befehl:
php artisan make:provider TestFacadesServiceProvider
Schritt 2 − Erstellen Sie eine zugrunde liegende Proxy-Klasse und nennen Sie sie „Create a Facade“. Klasse namens „TestFacades.php“ für „TestFacades.php“ unter „App/Test“. php“ unter „App/Test/Facades“.
App/Test/Facades/TestFacades.php
<?php namespace App\Test; class TestFacades{ public function testingFacades(){ echo "Testing the Facades in Laravel."; } } ?>
Schritt 4 − Erstellen Sie eine ServiceProviders-Klasse mit dem Namen „TestFacadesServiceProviders.php“ unter „App/Test/Facades“.
App/Providers/TestFacadesServiceProviders.php
<?php namespace app\Test\Facades; use Illuminate\Support\Facades\Facade; class TestFacades extends Facade{ protected static function getFacadeAccessor() { return 'test'; } }
Schritt 5 − Registrieren Sie ServiceProvider in der Klasse config/app.php
Schritt 6− Registrieren Sie den benutzerdefinierten Facade-Alias in config/app.php Test verwenden:
Fügen Sie die folgenden Zeilen in app/Http/routes.php hinzu.<?php
namespace App\Providers;
use App;
use Illuminate\Support\ServiceProvider;
class TestFacadesServiceProvider extends ServiceProvider {
public function boot() {
//
}
public function register() {
//可以这么绑定,这需要use App;
// App::bind('test',function() {
// return new \App\Test\TestFacades;
// });
//也可以这么绑定,推荐。这个test对应于Facade的getFacadeAccessor返回值
$this->app->bind("test", function(){
return new MyFoo(); //给这个Facade返回一个代理实例。所有对Facade的调用都会被转发到该类对象下。
});
}
}
− Besuchen Sie die folgende URL, um die Fassade zu testen.
http://localhost:8000/facadeex, um die Ausgabe anzuzeigen
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Verträgen und Fassaden in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!