master

laravel/framework

Last updated at: 29/12/2023 09:23

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],
        ];
    }
}