MailMakeCommand.php
TLDR
The MailMakeCommand.php
file is a part of the Laravel framework and is located in the src/Illuminate/Foundation/Console
directory. It defines the MailMakeCommand
class, which is responsible for creating a new email class.
Methods
handle
This method is responsible for executing the console command. If the parent handle
method returns false
and the force
option is not provided, it returns without performing any action. If the markdown
option is not false
, it calls the writeMarkdownTemplate
method.
writeMarkdownTemplate
This method is used to write the Markdown template for the mailable. It determines the path for the template based on the view name and creates the necessary directory structure if it doesn't already exist. It then writes the template contents using the markdown.stub
stub file.
buildClass
This method is responsible for building the class with the given name. It replaces the {{ subject }}
placeholder in the generated class code with the headline version of the mailable name. If the markdown
option is not false
, it also replaces the DummyView
and {{ view }}
placeholders with the actual view name.
getView
This method determines the view name based on the markdown
option. If the option is not provided, it generates the view name based on the argument name. It converts the name to kebab case and joins the parts with periods. The resulting view name has the format mail.name-of-the-mailable
.
getStub
This method returns the stub file path for the generator based on the markdown
option. If the option is not false
, it returns the path to the markdown-mail.stub
stub file; otherwise, it returns the path to the mail.stub
stub file.
resolveStubPath
This method resolves the fully-qualified path to the stub file. If a custom path is provided and the file exists, it returns the custom path; otherwise, it returns the path to the stub file in the stubs
directory of the current file.
getDefaultNamespace
This method returns the default namespace for the class. It appends the Mail
subnamespace to the root namespace.
getOptions
This method returns an array of console command options. It defines the force
and markdown
options with their corresponding short names and descriptions.
<?php
namespace Illuminate\Foundation\Console;
use Illuminate\Console\Concerns\CreatesMatchingTest;
use Illuminate\Console\GeneratorCommand;
use Illuminate\Support\Str;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Input\InputOption;
#[AsCommand(name: 'make:mail')]
class MailMakeCommand extends GeneratorCommand
{
use CreatesMatchingTest;
/**
* The console command name.
*
* @var string
*/
protected $name = 'make:mail';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Create a new email class';
/**
* The type of class being generated.
*
* @var string
*/
protected $type = 'Mailable';
/**
* Execute the console command.
*
* @return void
*/
public function handle()
{
if (parent::handle() === false && ! $this->option('force')) {
return;
}
if ($this->option('markdown') !== false) {
$this->writeMarkdownTemplate();
}
}
/**
* Write the Markdown template for the mailable.
*
* @return void
*/
protected function writeMarkdownTemplate()
{
$path = $this->viewPath(
str_replace('.', '/', $this->getView()).'.blade.php'
);
if (! $this->files->isDirectory(dirname($path))) {
$this->files->makeDirectory(dirname($path), 0755, true);
}
$this->files->put($path, file_get_contents(__DIR__.'/stubs/markdown.stub'));
}
/**
* Build the class with the given name.
*
* @param string $name
* @return string
*/
protected function buildClass($name)
{
$class = str_replace(
'{{ subject }}',
Str::headline(str_replace($this->getNamespace($name).'\\', '', $name)),
parent::buildClass($name)
);
if ($this->option('markdown') !== false) {
$class = str_replace(['DummyView', '{{ view }}'], $this->getView(), $class);
}
return $class;
}
/**
* Get the view name.
*
* @return string
*/
protected function getView()
{
$view = $this->option('markdown');
if (! $view) {
$name = str_replace('\\', '/', $this->argument('name'));
$view = 'mail.'.collect(explode('/', $name))
->map(fn ($part) => Str::kebab($part))
->implode('.');
}
return $view;
}
/**
* Get the stub file for the generator.
*
* @return string
*/
protected function getStub()
{
return $this->resolveStubPath(
$this->option('markdown') !== false
? '/stubs/markdown-mail.stub'
: '/stubs/mail.stub');
}
/**
* Resolve the fully-qualified path to the stub.
*
* @param string $stub
* @return string
*/
protected function resolveStubPath($stub)
{
return file_exists($customPath = $this->laravel->basePath(trim($stub, '/')))
? $customPath
: __DIR__.$stub;
}
/**
* Get the default namespace for the class.
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace.'\Mail';
}
/**
* Get the console command options.
*
* @return array
*/
protected function getOptions()
{
return [
['force', 'f', InputOption::VALUE_NONE, 'Create the class even if the mailable already exists'],
['markdown', 'm', InputOption::VALUE_OPTIONAL, 'Create a new Markdown template for the mailable', false],
];
}
}