ViewCacheCommand.php
TLDR
The ViewCacheCommand.php
file in the Illuminate\Foundation\Console
namespace contains the ViewCacheCommand
class, which is a Symfony Console Command for compiling Blade templates in a Laravel application. The command clears the view cache before compiling the templates and provides methods for compiling the views and getting the Blade files in a given path.
Methods
handle
Executes the console command. It clears the view cache, loops through each provided path, compiles the Blade views, and displays a success message.
compileViews
Compiles the given view files. Uses the Laravel Blade view engine resolver and compiler to compile the views.
bladeFilesIn
Gets the Blade files in the given path. Filters the file extensions to only include blade
files and uses the Symfony Finder component to search for and retrieve the files.
paths
Gets all of the possible view paths. Retrieves the paths from the Laravel view finder and merges them with the view hints.
<?php
namespace Illuminate\Foundation\Console;
use Illuminate\Console\Command;
use Illuminate\Support\Collection;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Finder\SplFileInfo;
#[AsCommand(name: 'view:cache')]
class ViewCacheCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'view:cache';
/**
* The console command description.
*
* @var string
*/
protected $description = "Compile all of the application's Blade templates";
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->callSilent('view:clear');
$this->paths()->each(function ($path) {
$prefix = $this->output->isVeryVerbose() ? '<fg=yellow;options=bold>DIR</> ' : '';
$this->components->task($prefix.$path, null, OutputInterface::VERBOSITY_VERBOSE);
$this->compileViews($this->bladeFilesIn([$path]));
});
$this->newLine();
$this->components->info('Blade templates cached successfully.');
}
/**
* Compile the given view files.
*
* @param \Illuminate\Support\Collection $views
* @return void
*/
protected function compileViews(Collection $views)
{
$compiler = $this->laravel['view']->getEngineResolver()->resolve('blade')->getCompiler();
$views->map(function (SplFileInfo $file) use ($compiler) {
$this->components->task(' '.$file->getRelativePathname(), null, OutputInterface::VERBOSITY_VERY_VERBOSE);
$compiler->compile($file->getRealPath());
});
if ($this->output->isVeryVerbose()) {
$this->newLine();
}
}
/**
* Get the Blade files in the given path.
*
* @param array $paths
* @return \Illuminate\Support\Collection
*/
protected function bladeFilesIn(array $paths)
{
$extensions = collect($this->laravel['view']->getExtensions())
->filter(fn ($value) => $value === 'blade')
->keys()
->map(fn ($extension) => "*.{$extension}")
->all();
return collect(
Finder::create()
->in($paths)
->exclude('vendor')
->name($extensions)
->files()
);
}
/**
* Get all of the possible view paths.
*
* @return \Illuminate\Support\Collection
*/
protected function paths()
{
$finder = $this->laravel['view']->getFinder();
return collect($finder->getPaths())->merge(
collect($finder->getHints())->flatten()
);
}
}