Contracts
Contracts préconise en fait une programmation orientée interface pour atteindre l'objectif de découplage. Ces interfaces communes ont été conçues pour vous par Laravel. Ce sont des contrats.
Alors, comment Laravel sait-il quelle implémentation nous devons utiliser ?
Dans la liaison Contracts par défaut de Laravel, il y a cette définition dans 'Illuminate/Foundation/Application.php' : Il s'agit de la liaison de l'implémentation de l'interface par défaut.
Recommandé : "Laravel Tutoriel》
/** * 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'], ];
Lors de l'implémentation de notre interface personnalisée, nous pouvons l'utiliser dans ServiceProvider pour la liaison :
$this->app->bind('App\Contracts\EventPusher', 'App\Services\PusherEventPusher');
Façades
Les façades fournissent un Interface "statique" vers les classes disponibles dans le conteneur de services de l'application. Les « façades » Laravel agissent comme des « proxys statiques » pour les classes de base au sein du conteneur de services. Difficile à comprendre ?
Nous ouvrons config/app.php dans le répertoire du projet, puis trouvons
/* |-------------------------------------------------------------------------- | 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, ],
Avez-vous trouvé quelque chose ? Oui, les façades sont en fait des alias pour une série de classes définies dans config/app.php. C'est juste que ces classes ont toutes une fonctionnalité commune, qui est d'hériter de la classe de base IlluminateSupportFacadesFacade et d'implémenter une méthode : getFacadeAccessor renvoie le nom.
Façade personnalisée
Référence http://www.tutorialspoint.com/laravel/laravel_facades.htm
Étape 1 −Créez un ServiceProvider nommé TestFacadesServiceProvider, utilisez la commande suivante :
php artisan make:provider TestFacadesServiceProvider
Étape 2 − Créez une classe proxy sous-jacente et nommez-la Créer une façade classe appelée « TestFacades.php » pour « TestFacades.php » dans « App/Test ». php » dans « App/Test/Facades ».
App/Test/Facades/TestFacades.php
<?php namespace App\Test; class TestFacades{ public function testingFacades(){ echo "Testing the Facades in Laravel."; } } ?>
Étape 4 −Créez une classe ServiceProviders nommée « TestFacadesServiceProviders.php » dans « 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'; } }
Étape 5 − Enregistrez ServiceProvider dans la classe config/app.php
Étape 6− Enregistrez l'alias de façade personnalisé dans config/app.php Test d'utilisation :
Ajoutez les lignes suivantes dans app/ Http/routes.php. − Visitez l'URL suivante pour tester la façade. http://localhost:8000/facadeex pour afficher le résultat Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!<?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的调用都会被转发到该类对象下。
});
}
}