Aslında ne yaptığını görebilseniz yada anlayabilseniz çok daha iyi olur.Laravel de sonuçta php kullanıyor.
Bütün herşeyi düzenli bir mantık çerçevesinde ele alınmış.Laravelde her bir kavramın mutlak ölçütte bir ServiceProvider dosyası var demektir.
O halde specific olarak bir cache sistemi kullanılcaksa bunun provideri CacheServiceProvider olmalıdır.
config/app.php içine bakarsanız providers dizisi içinde bunu görürsünüz.
https://github.com/laravel/laravel/blob/master/config/app.php#L145
buradaki gibi...Yani sana cache mekanizmasını kullandırtan bu provider...
Peki ne yapılmış bu service provider da...
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->singleton('cache', function ($app) {
return new CacheManager($app);
});
$this->app->singleton('cache.store', function ($app) {
return $app['cache']->driver();
});
$this->app->singleton('memcached.connector', function () {
return new MemcachedConnector;
});
}
Mantıken baktığınızda bir provider bir register methodu yada bir boot methodu bünyesinde barındırır.İlk register çalıştırılır daha sonra boot çalıştırılır.Register da mutlaka bir container kayıt yapılır.Baska amaçla kullanan varmıdır bilmiyorum.Bence kullanılmamalı.
burada da baktığınızda 3 tane singleton kayıt görüyorsunuz.
cache abstractı bizim icin onemli.Zira bunun için laravel bir facadeye sahiptir.
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Support/Facades/Cache.php
Cache facadesi ne demek..Daha öncede anlatıldı.Facadeler container kayıtlarına ulaşan proxy araçlarıdır.Bu yüzden.
Cache facadesi aslında service providerda kayıtlı cache abstractına karsılık gelen CacheManager sınıfını çağırır...
Hal böyle olunca..
Cache::put("foo","bar");
aslında
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Cache/CacheManager.php bu linkteki sınıfta yer alan..
/**
* Dynamically call the default driver instance.
*
* @param string $method
* @param array $parameters
* @return mixed
*/
public function __call($method, $parameters)
{
return $this->store()->$method(...$parameters);
}
magic bir yöntem çalıştırılır.ve işlemi burası yapar.Php class bilgisi iyi olan biri ne yaptığını çok rahatlıkla görebilir.
İlk olarak store methoduna boş bir parametre gönderilerek çağırılmış..
Store methoduna bakarsanız şu şekildedir..
/**
* Get a cache store instance by name, wrapped in a repository.
*
* @param string|null $name
* @return \Illuminate\Contracts\Cache\Repository
*/
public function store($name = null)
{
$name = $name ?: $this->getDefaultDriver();
return $this->stores[$name] = $this->get($name);
}
adından da anlasılacağı gibi driver burada belirtilir..Yani cache nin file cache mi redis cache mi memcache cache mi? desteklenen cacheleri yine bu sınıf içinde görebilirsiniz...
isterseniz siz doğrudan
Cache::store('redis')->put('a','b');
olarakta kullanabilirsiniz.Direkt olarak redise atama yapacaktır...
burada getDefaultDriver() ile belirtilen kısım store methoduna boş parametre gonderilirse..
sizin config dizini icinde ki cache dosyasındaki default driveriniza göre işlem yapacaktır..
/**
* Get the default cache driver name.
*
* @return string
*/
public function getDefaultDriver()
{
return $this->app['config']['cache.default'];
}
daha sonra get methodu ile resolve yapılır aslında...
/**
* Attempt to get the store from the local cache.
*
* @param string $name
* @return \Illuminate\Contracts\Cache\Repository
*/
protected function get($name)
{
return $this->stores[$name] ?? $this->resolve($name);
}
aslında önemli olan kısım driverlara yoneldiğimiz resolve kısmı...Bu methodda aşağıdaki gibi iş yapar..
/**
* Resolve the given store.
*
* @param string $name
* @return \Illuminate\Contracts\Cache\Repository
*
* @throws \InvalidArgumentException
*/
protected function resolve($name)
{
$config = $this->getConfig($name);
if (is_null($config)) {
throw new InvalidArgumentException("Cache store [{$name}] is not defined.");
}
if (isset($this->customCreators[$config['driver']])) {
return $this->callCustomCreator($config);
} else {
$driverMethod = 'create'.ucfirst($config['driver']).'Driver';
if (method_exists($this, $driverMethod)) {
return $this->{$driverMethod}($config);
} else {
throw new InvalidArgumentException("Driver [{$config['driver']}] is not supported.");
}
}
}
özel bir drivera karşılık gelmiyorsa doğrudan else methoduna gidersiniz..bu da aslında çok basit bir şeyi açıklıyor.
$driverMethod = 'create'.ucfirst($config['driver']).'Driver';
driver neyse o methodu çalıştırıyor..
Cache::put('a','b');
dediğiniz zaman aslında createFileDriver demiş oluyorsunuz...(Configteki değere göre tabi)
o methodda aslında bu:
/**
* Create an instance of the file cache driver.
*
* @param array $config
* @return \Illuminate\Cache\Repository
*/
protected function createFileDriver(array $config)
{
return $this->repository(new FileStore($this->app['files'], $config['path']));
}
Böylece laravelin default desteklediği driverleri başı create sonu Driver ile biten methodlara baktığınızda bunlar laravel tarafından desteklenmiş oluyor default olarak...
createFileDriver
createMemcachedDriver
createNullDriver
createRedisDriver
createDatabaseDriver
createDynamodbDriver
createArrayDriver
createApcDriver
bunlar desteklenir..
Yani siz:
Cache::store('file')->put();
Cache::store('memcached')->put();
Cache::store('null')->put();
Cache::store('redis')->put();
Cache::store('database')->put();
Cache::store('dynamodb')->put();
Cache::store('array')->put();
Cache::store('apc')->put();
herhangi birisini ihtiyaclarınıza göre kullanabilirsiniz..
Aslında en nihayetinde işi yapan
/**
* Create a new cache repository with the given implementation.
*
* @param \Illuminate\Contracts\Cache\Store $store
* @return \Illuminate\Cache\Repository
*/
public function repository(Store $store)
{
$repository = new Repository($store);
if ($this->app->bound(DispatcherContract::class)) {
$repository->setEventDispatcher(
$this->app[DispatcherContract::class]
);
}
return $repository;
}
bu methoddur..Oda bir sınıfa karsılık gelir..
$repository = new Repository($store);
Oda bu sınıf...
https://github.com/laravel/framework/blob/5.8/src/Illuminate/Cache/Repository.php
Yani kullandığınız put get methodları bu repository icindedir...
iyi çalışmalar...