Laravel 中的 Manager 们 (管理器) ## Laravel 中有哪些管理器 我们很容易从源码中看到 Application 构造方法最后一行, 叫做注册核心容器别名的方法 ```php public function registerCoreContainerAliases() { foreach ([ 'app' => [self::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class, \Psr\Container\ContainerInterface::class], 'auth' => [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class], 'auth.driver' => [\Illuminate\Contracts\Auth\Guard::class], 'blade.compiler' => [\Illuminate\View\Compilers\BladeCompiler::class], 'cache' => [\Illuminate\Cache\CacheManager::class, \Illuminate\Contracts\Cache\Factory::class], 'cache.store' => [\Illuminate\Cache\Repository::class, \Illuminate\Contracts\Cache\Repository::class], 'config' => [\Illuminate\Config\Repository::class, \Illuminate\Contracts\Config\Repository::class], 'cookie' => [\Illuminate\Cookie\CookieJar::class, \Illuminate\Contracts\Cookie\Factory::class, \Illuminate\Contracts\Cookie\QueueingFactory::class], 'encrypter' => [\Illuminate\Encryption\Encrypter::class, \Illuminate\Contracts\Encryption\Encrypter::class], 'db' => [\Illuminate\Database\DatabaseManager::class], 'db.connection' => [\Illuminate\Database\Connection::class, \Illuminate\Database\ConnectionInterface::class], 'events' => [\Illuminate\Events\Dispatcher::class, \Illuminate\Contracts\Events\Dispatcher::class], 'files' => [\Illuminate\Filesystem\Filesystem::class], 'filesystem' => [\Illuminate\Filesystem\FilesystemManager::class, \Illuminate\Contracts\Filesystem\Factory::class], 'filesystem.disk' => [\Illuminate\Contracts\Filesystem\Filesystem::class], 'filesystem.cloud' => [\Illuminate\Contracts\Filesystem\Cloud::class], 'hash' => [\Illuminate\Hashing\HashManager::class], 'hash.driver' => [\Illuminate\Contracts\Hashing\Hasher::class], 'translator' => [\Illuminate\Translation\Translator::class, \Illuminate\Contracts\Translation\Translator::class], 'log' => [\Illuminate\Log\LogManager::class, \Psr\Log\LoggerInterface::class], 'mailer' => [\Illuminate\Mail\Mailer::class, \Illuminate\Contracts\Mail\Mailer::class, \Illuminate\Contracts\Mail\MailQueue::class], 'auth.password' => [\Illuminate\Auth\Passwords\PasswordBrokerManager::class, \Illuminate\Contracts\Auth\PasswordBrokerFactory::class], 'auth.password.broker' => [\Illuminate\Auth\Passwords\PasswordBroker::class, \Illuminate\Contracts\Auth\PasswordBroker::class], 'queue' => [\Illuminate\Queue\QueueManager::class, \Illuminate\Contracts\Queue\Factory::class, \Illuminate\Contracts\Queue\Monitor::class], 'queue.connection' => [\Illuminate\Contracts\Queue\Queue::class], 'queue.failer' => [\Illuminate\Queue\Failed\FailedJobProviderInterface::class], 'redirect' => [\Illuminate\Routing\Redirector::class], 'redis' => [\Illuminate\Redis\RedisManager::class, \Illuminate\Contracts\Redis\Factory::class], 'request' => [\Illuminate\Http\Request::class, \Symfony\Component\HttpFoundation\Request::class], 'router' => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class], 'session' => [\Illuminate\Session\SessionManager::class], 'session.store' => [\Illuminate\Session\Store::class, \Illuminate\Contracts\Session\Session::class], 'url' => [\Illuminate\Routing\UrlGenerator::class, \Illuminate\Contracts\Routing\UrlGenerator::class], 'validator' => [\Illuminate\Validation\Factory::class, \Illuminate\Contracts\Validation\Factory::class], 'view' => [\Illuminate\View\Factory::class, \Illuminate\Contracts\View\Factory::class], ] as $key => $aliases) { foreach ($aliases as $alias) { $this->alias($key, $alias); } } } ``` 我把包含 Manager 的别名挑出来看看 ```php [ 'auth' => [\Illuminate\Auth\AuthManager::class], 'cache' => [\Illuminate\Cache\CacheManager::class], 'db' => [\Illuminate\Database\DatabaseManager::class], 'filesystem' => [\Illuminate\Filesystem\FilesystemManager::class], 'hash' => [\Illuminate\Hashing\HashManager::class], 'log' => [\Illuminate\Log\LogManager::class], 'auth.password' => [\Illuminate\Auth\Passwords\PasswordBrokerManager::class], 'queue' => [\Illuminate\Queue\QueueManager::class], 'redis' => [\Illuminate\Redis\RedisManager::class], 'session' => [\Illuminate\Session\SessionManager::class], ] ``` 仔细看他们都有共同点, 这些功能都是可以由不同的驱动来完成, 而 Manager 就是用来管理驱动的管理器, 当然一般会有一个默认驱动哦 ### auth 管理授权 守卫/驱动 - SessionGuard - TokenGuard ### cache 管理缓存 存储位置/驱动 - Apc - Array - File - Memcached - Null - Redis - Database - Dynamodb ### db 管理数据库 连接/驱动 - mysql - pgsql - sqlite - sqlsrv ### filesystem 管理文件系统 磁盘/驱动 - local - public - s3 ### hash 管理哈希 算法/驱动 - Bcrypt - Argon - Argon2id ### log 管理日志 记录方式/驱动 - single - daily - slack - syslog - errorlog - monolog - custom - stack ### auth.password 管理密码 存储方式/驱动 - database - eloquent ### queue 管理队列 连接/驱动 - sync - database - beanstalkd - sqs - redis - null ### redis 管理 Redis 连接器/驱动 - predis - phpredis ### session 管理 Session 存储位置/驱动 - file - cookie - database - apc - memcached - redis - dynamodb - array 看过这么多例子, 基本上可以意会 Manager 的作用了, 希望后续在功能开发中如果遇到一个功能允许不同驱动来实现的时候第一时间想到 Manager 驱动管理器 ## 案例 安正超的 overtrue/easy-sms 扩展包, 利用不同服务商来驱动, 快速发送短信, 目前支持: 阿里云, 云片, 253创蓝 等等20多个服务商 [https://github.com/overtrue/easy-sms](https://github.com/overtrue/easy-sms "https://github.com/overtrue/easy-sms") 我也写过 achais/shorturl 扩展包, 利用不同服务商来驱动, 快速生成和还原短链接, 目前支持: 百度, 微博 [https://github.com/achais/shorturl](https://github.com/achais/shorturl "https://github.com/achais/shorturl")