Artisan 是 Laravel 项目根目录下真实存在的可执行文件,必须在项目根目录执行;自定义命令需在 app/Console/Kernel.php 的 $commands 数组中手动注册才能出现在 php artisan list 中。

Artisan 不是插件,也不是可选组件——它是 Laravel 项目根目录下真实存在的 artisan 文件,必须在项目根目录执行,否则所有命令都会报错。
php artisan list 报 “Command not found” 或 “No such file or directory”
这是最常卡住新手的第一步。错误不是因为 Artisan 不存在,而是终端当前路径没进对。
- 先确认你是否真的在 Laravel 项目根目录(即能看到
artisan、composer.json、app/等文件和目录的位置) - 用
ls -la | grep artisan检查artisan文件是否存在且有执行权限(Laravel 9+ 默认是可执行的) - Windows 用户注意:不要双击
artisan,必须用php artisan调用;某些 Git Bash 环境需显式写php ./artisan - 如果项目是通过
laravel new或composer create-project创建的,artisan一定存在;若从 Git 克隆但没跑过composer install,vendor/缺失也会导致命令失效
自定义命令写好了却不在 php artisan list 里出现
生成命令类只是第一步,Laravel 不会自动扫描 app/Console/Commands/ 下的所有类——它只认你在 app/Console/Kernel.php 的 $commands 数组里明确注册的那些。
- 运行
php artisan make:command SendDailyReport后,检查生成的类是否继承了Illuminate\Console\Command - 打开
app/Console/Kernel.php,确认$commands数组中包含\App\Console\Commands\SendDailyReport::class - Laravel 10+ 支持自动发现(auto-discovery),但前提是你的命令类满足:命名空间为
App\Console\Commands、类名符合 PSR-4、且未被composer.json的autoload-dev排除;如不确定,手动注册更稳妥 - 改完
Kernel.php后无需清缓存,但如果你之前运行过php artisan config:cache,得先php artisan config:clear再试
参数和选项写法容易混淆的几个点
$signature 看似简单,但空格、冒号、问号位置错一个,php artisan help 就不显示描述,或者参数根本取不到。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 必填参数:
{user}→ 用$this->argument('user')取值 - 可选参数:
{user?}→$this->argument('user')返回null如果没传 - 带默认值的可选参数:
{user? : john}→ 注意冒号前后必须有空格,否则会被当作文本字面量 - 布尔选项:
{--queue}→$this->option('queue')返回true或false - 带值的选项:
{--path=}→ 必须写等号,否则 Laravel 当成布尔型处理;调用时写--path=storage/logs - 描述字段要加在参数/选项后,用冒号隔开:
{user? : 用户名,留空则使用默认值},冒号前不能有空格,后必须有空格
在代码里调用 Artisan 命令要注意什么
用 Artisan::call() 看起来方便,但它本质是同步执行另一个命令进程,不是函数调用。
- 不要在 HTTP 请求中频繁调用耗时命令(比如
migrate或大表db:seed),会阻塞响应 -
Artisan::call('cache:clear')返回的是 exit code(整数),不是输出内容;想捕获输出得用Artisan::output(),且必须在call()之后立即调用 - 传递参数时不能直接传数组,得展开:
Artisan::call('report:send', ['user' => 'admin', '--queue' => true]) - 如果被调用的命令本身用了
$this->confirm()或$this->ask(),在非交互环境(如 Web 请求)里会卡住或抛异常,务必加--no-interaction选项或提前判断$this->isInteractive()
真正容易被忽略的,是 artisan 文件本身的可执行权限和 Kernel.php 的注册时机——这两处出问题,连最基础的 list 都看不到,但错误信息又极其模糊。先盯住路径和注册,再谈逻辑和参数。










