>在本文中,您将学习如何使用Laravel的Artisan命令行工具以及如何创建自定义命令。请注意,您需要熟悉Laravel框架才能充分利用本文。
>
<span>cssmin 'output_path' 'file1'...'fileN' --comments --concat</span>
和三个选项:
- 路径:默认情况下,命令存储在应用程序/命令文件夹中,但是,您可以使用此选项更改该命令。
- 名称空间:您可以使用此选项来命名您的一组命令,例如在命令命令中:make,make命令在命令名称空间下。<span>cssmin 'output_path' 'file1'...'fileN' --comments --concat</span>
我们的cssmincommand类扩展了IlluminateConsolecommand并覆盖两种方法(getArguments,getOptions)。
>执行您的命令时,将调用火法,因此我们需要放置命令逻辑。
注册命令
>如果您不想将命令放入artisan.php文件中,则可以创建一个单独的文件并包含它,或者如果您创建一个软件包,则可以在服务提供商中注册。
参数
在我们的getArguments方法中,我们将定义输出和文件。<span>use Illuminate<span>\Console\Command</span>; </span><span>use Symfony<span>\Component\Console\Input\InputOption</span>; </span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span> <span>class CssminCommand extends Command{ </span> <span>protected $name = 'cssmin'; </span> <span>protected $description = 'Command description.'; </span> <span>public function __construct(){ </span> <span><span>parent::</span>__construct(); </span> <span>} </span> <span>public function fire(){ </span> <span>// </span> <span>} </span> <span>protected function getArguments(){ </span> <span>return array( </span> <span>array('example', InputArgument<span>::</span>REQUIRED, 'An example argument.'), </span> <span>); </span> <span>} </span> <span>protected function getOptions(){ </span> <span>return array( </span> <span>array('example', null, InputOption<span>::</span>VALUE_OPTIONAL, 'An example option.', null), </span> <span>); </span> <span>} </span><span>}</span>
模式:可以具有三个选项之一:
<span>Artisan<span>::</span>add( new CssMinCommand ); </span> <span>//or through the container </span><span>Artisan<span>::</span>add( App<span>::</span>make("CssMinCommand") );</span>
>
<span>array( 'name', 'mode', 'description', 'defaultValue' )</span>
>
快捷方式:您选项的较短版本(例如: - Verbose和-v)。模式:可以是四个选项之一(inputoption :: value_is_array,inputoption :: value_optional,inputoption :: value_required,inputoption :: value_none),前三个值与参数相似。
<span>protected function getArguments(){ </span> <span>return array( </span> <span>array( </span> <span>'output', </span> <span>InputArgument<span>::</span>REQUIRED, </span> <span>'Path to output directory' </span> <span>), </span> <span>array( </span> <span>'files', </span> <span>InputArgument<span>::</span>IS_ARRAY | InputArgument<span>::</span>OPTIONAL , </span> <span>"List of css files to minify" </span> <span>), </span> <span>); </span> <span>}</span>
,所以我们的getOptions方法将是:
<span>cssmin 'output_path' 'file1'...'fileN' --comments --concat</span>
当我们的火法被称为时,我们需要收集我们的论点和选择。我们可以单独的功能为我们做到这一点:
><span>use Illuminate<span>\Console\Command</span>; </span><span>use Symfony<span>\Component\Console\Input\InputOption</span>; </span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span> <span>class CssminCommand extends Command{ </span> <span>protected $name = 'cssmin'; </span> <span>protected $description = 'Command description.'; </span> <span>public function __construct(){ </span> <span><span>parent::</span>__construct(); </span> <span>} </span> <span>public function fire(){ </span> <span>// </span> <span>} </span> <span>protected function getArguments(){ </span> <span>return array( </span> <span>array('example', InputArgument<span>::</span>REQUIRED, 'An example argument.'), </span> <span>); </span> <span>} </span> <span>protected function getOptions(){ </span> <span>return array( </span> <span>array('example', null, InputOption<span>::</span>VALUE_OPTIONAL, 'An example option.', null), </span> <span>); </span> <span>} </span><span>}</span>
参数和选项方法以键作为参数并返回适当的值。
<span>Artisan<span>::</span>add( new CssMinCommand ); </span> <span>//or through the container </span><span>Artisan<span>::</span>add( App<span>::</span>make("CssMinCommand") );</span>
>最后,我们的火法只会调用这两种方法:
<span>array( 'name', 'mode', 'description', 'defaultValue' )</span>
提示:您也可以使用呼叫方法运行外部命令。
<span>protected function getArguments(){ </span> <span>return array( </span> <span>array( </span> <span>'output', </span> <span>InputArgument<span>::</span>REQUIRED, </span> <span>'Path to output directory' </span> <span>), </span> <span>array( </span> <span>'files', </span> <span>InputArgument<span>::</span>IS_ARRAY | InputArgument<span>::</span>OPTIONAL , </span> <span>"List of css files to minify" </span> <span>), </span> <span>); </span> <span>}</span>
第一个命令将在public/css目录上创建两个文件(style.min.css,willsive.min.css)。
<span>array('name', 'shortcut', 'mode', 'description', 'defaultValue')</span>
因为我们使用了 - comments和 - concat标志,所以我们将获得一个名为all.min.css的文件,其中包含两个文件,其中剩下的两个文件。
><span>protected function getOptions(){ </span> <span>return array( </span> <span>array('comments', 'c', InputOption<span>::</span>VALUE_NONE, 'Don\'t strip comments' , null), </span> <span>array('concat', null, InputOption<span>::</span>VALUE_NONE, 'Concat the minified result to one file' , null), </span> <span>); </span> <span>}</span>
>
改进命令在我们继续之前,在最终的github存储库之前,我将为我们的命令创建一个新标签,以便您可以切换和测试每个标签。
使命令有点冗长,Laravel为我们提供了一些输出功能:这将输出:
在仅显示消息之外,您可以向用户询问信息,例如:
<span>private function init(){ </span> <span>// retrun an array </span> <span>$this->files = $this->argument('files'); </span> <span>// return a string </span> <span>$this->output_path = $this->argument('output'); </span> <span>// return true if passed, otherwise false </span> <span>$this->comments = $this->option('comments'); </span> <span>// return true if passed, otherwise false </span> <span>$this->concat = $this->option('concat'); </span><span>}</span>
>
询问方法将向用户询问输入,而不仅仅是y/n,如果将其留为空,则返回默认值。>选择方法将为用户提供一个编号列表以供您选择,如果将其剩下,则返回默认值。
秘密方法将提示用户提出问题并隐藏键入,但是将返回用户输入。
<span>private function minify( $css, $comments ){ </span> <span>// Normalize whitespace </span> <span>$css = preg_replace( '/\s+/', ' ', $css ); </span> <span>// Remove comment blocks, everything between /* and */, unless preserved with /*! ... */ </span> <span>if( !$comments ){ </span> <span>$css = preg_replace( '/\/\*[^\!](.*?)\*\//', '', $css ); </span> <span>}//if </span> <span>// Remove ; before } </span> <span>$css = preg_replace( '/;(?=\s*})/', '', $css ); </span> <span>// Remove space after , : ; { } */ > </span> <span>$css = preg_replace( '/(,|:|;|\{|}|\*\/|>) /', '', $css ); </span> <span>// Remove space before , ; { } ( ) > </span> <span>$css = preg_replace( '/ (,|;|\{|}|\(|\)|>)/', '', $css ); </span> <span>// Strips leading 0 on decimal values (converts 0.5px into .5px) </span> <span>$css = preg_replace( '/(:| )0\.([0-9]+)(%|em|ex|px|in|cm|mm|pt|pc)/i', '.', $css ); </span> <span>// Strips units if value is 0 (converts 0px to 0) </span> <span>$css = preg_replace( '/(:| )(\.?)0(%|em|ex|px|in|cm|mm|pt|pc)/i', '0', $css ); </span> <span>// Converts all zeros value into short-hand </span> <span>$css = preg_replace( '/0 0 0 0/', '0', $css ); </span> <span>// Shortern 6-character hex color codes to 3-character where possible </span> <span>$css = preg_replace( '/#([a-f0-9])\1([a-f0-9])\2([a-f0-9])\3/i', '#', $css ); </span> <span>return trim( $css ); </span> <span>}//minify</span>
我们的功能现在打印一些有用的消息,以跟踪正在发生的事情。
注意:这将在GitHub存储库上标记为我们命令的V2。
>
使用Symfony Console Helper
启动方法接受两个参数,$ this->输出是Symfony控制台中的consoleouput实例。第二个参数是最大步骤数。
><span>cssmin 'output_path' 'file1'...'fileN' --comments --concat</span>
>您可以尝试使用多个文件的命令或删除睡眠功能线以查看实时效果。
<span>use Illuminate<span>\Console\Command</span>; </span><span>use Symfony<span>\Component\Console\Input\InputOption</span>; </span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span> <span>class CssminCommand extends Command{ </span> <span>protected $name = 'cssmin'; </span> <span>protected $description = 'Command description.'; </span> <span>public function __construct(){ </span> <span><span>parent::</span>__construct(); </span> <span>} </span> <span>public function fire(){ </span> <span>// </span> <span>} </span> <span>protected function getArguments(){ </span> <span>return array( </span> <span>array('example', InputArgument<span>::</span>REQUIRED, 'An example argument.'), </span> <span>); </span> <span>} </span> <span>protected function getOptions(){ </span> <span>return array( </span> <span>array('example', null, InputOption<span>::</span>VALUE_OPTIONAL, 'An example option.', null), </span> <span>); </span> <span>} </span><span>}</span>
注意:此版本将在最终存储库上标记为V3。
结论
在本文中,我们了解了如何创建和扩展Laravel命令。 Laravel有很多可以探索的内置命令,您还可以检查我们在Github上的最终存储库以测试最终结果。问题?评论?您想查看更多工匠司令部教程吗?让我们知道!
Laravel CSS Minify Command
上的常见问题(常见问题解答)> Laravel Mix如何帮助CSS Minification?
是的,您可以在不使用laravel的情况下缩小CSS文件混合。有几种在线工具和NPM软件包可以帮助您缩小CSS文件。但是,建议使用Laravel Mix,因为它与Laravel无缝集成,并提供了一种简单便捷的方法来管理和优化您的CSS文件。
>> >在Laravel中缩小CSS通常是一个简单的过程,如果您的CSS文件包含语法错误,您可能会遇到问题。这些错误会导致缩小过程失败,从而导致不优化的CSS文件。因此,重要的是要确保您的CSS文件在尝试缩小它们之前是无错误的。
我可以在Laravel中自动化CSS Minification的过程?是的,您可以使用Laravel Mix的版本控制功能来自动化Laravel中CSS缩小的过程。每当您运行生产构建命令时,此功能都会自动减小CSS文件。这样可以确保您的CSS文件始终得到优化,而无需每次手动缩小它们。
>我可以使用Laravel Mix缩小其他类型的文件吗?
>我如何确保如何正确提供我的CSS文件?为了确保正确提供了缩小的CSS文件,您可以使用Laravel Mix的版本操作功能。此功能将唯一的哈希附加到您缩小的CSS文件的文件名上,以确保客户端始终接收您的CSS文件的最新版本。
以上是如何创建Laravel CSS-Minify命令的详细内容。更多信息请关注PHP中文网其他相关文章!