在 laravel 5 中运行 artisan 命令

Posted

技术标签:

【中文标题】在 laravel 5 中运行 artisan 命令【英文标题】:Run artisan command in laravel 5 【发布时间】:2016-09-11 04:44:18 【问题描述】:

我有这样的控制器

 public function store(Request $request)

   Artisan::call("php artisan infyom:scaffold $request['name'] --fieldsFile=public/Product.json");

显示错误

“php artisan infyom”命名空间中没有定义命令。

当我在 CMD 中运行此命令时,它可以正常工作

【问题讨论】:

【参考方案1】:

您需要删除php artisan 部分并将参数放入数组中以使其工作:

public function store(Request $request)

   Artisan::call("infyom:scaffold", ['name' => $request['name'], '--fieldsFile' => 'public/Product.json']);

https://laravel.com/docs/5.2/artisan#calling-commands-via-code

【讨论】:

非常感谢。我忘了删除它。 @Alexey Mezenin,看来你可以帮助我。这是关于 infyom laravel 生成器的。看这里:***.com/questions/40952901/… public function checkBooking(Request $request) Artisan::call('booking:check', []); 第一个参数是你的命令签名。如果你不传递外部数据,你可以传入一个空数组。 @Alexey Mezenin 你能看到这个***.com/questions/51858447/…【参考方案2】:

如果您有简单的工作要做,您可以从路由文件中完成。例如,您要清除缓存。在终端中会是 php artisan cache:clear 在路由文件中会是:

Route::get('clear_cache', function () 

    \Artisan::call('cache:clear');

    dd("Cache is cleared");

);

要从浏览器运行此命令,只需转到您的项目路线和 clear_cache。示例:

http://project_route/clear_cache

【讨论】:

【参考方案3】:

指挥作业,

路径:project-path/app/Console/Commands/RangeDatePaymentsConsoleCommand.php

这是使用 artisan 命令运行的作业。

class RangeDatePaymentsConsoleCommand extends Command 
    protected $signature = 'batch:abc startDate endDate';
    ...

web.php,

路径:project-path/routes/web.php

web.php 管理所有请求和路由到相关控制器,并且可以为多个控制器和同一控制器内的多个功能提供多个路由。

$router->group(['prefix' => 'command'], function () use ($router) 
    Route::get('abc/start/startDate/end/endDate', 'CommandController@abc');
);

CommandController.php,

路径:project-path/app/Http/Controllers/CommandController.php

此控制器是为处理工匠命令而创建的,名称可以不同,但​​应与 web.php 控制器名称和函数名称相同。

class CommandController extends Controller 

    public function abc(string $startDate, string $endDate) 
        $startDate = urldecode($startDate);
        $endDate = urldecode($endDate);

        $exitCode = Artisan::call('batch:abc',
            [
                'startDate' => $startDate,
                'endDate' => $endDate
            ]
        );
        return 'Command Completed Successfully. ';
    

请求:http://127.0.0.1:8000/command/abc/start/2020-01-01 00:00:00/end/2020-06-30 23:59:59

服务器启动后,可通过浏览器或 Postman 访问。运行此命令以在 project-path

处启动 php 服务器
php -S 127.0.0.1:8080 public/index.php

【讨论】:

请在您的答案中添加一些解释,以便其他人可以从中学习【参考方案4】:

除了在另一个命令中之外,我不确定我是否能找到这样做的充分理由。但是如果你真的想从控制器(或模型等)调用 Laravel 命令,那么你可以使用Artisan::call()

Artisan::call('email:send', [
        'user' => 1, '--queue' => 'default'
]);

一个有趣的功能是Artisan::queue(),直到我在谷歌上搜索到正确的语法时才知道,它将在后台处理命令(由您的队列工作人员):

Route::get('/foo', function () 
    Artisan::queue('email:send', [
        'user' => 1, '--queue' => 'default'
    ]);
    //
);

如果您从另一个命令中调用命令,则不必使用 Artisan::call 方法 - 您可以执行以下操作:

public function handle()

    $this->call('email:send', [
        'user' => 1, '--queue' => 'default'
    ]);
    //

来源:https://webdevetc.com/programming-tricks/laravel/general-laravel/how-to-run-an-artisan-command-from-a-controller/

【讨论】:

【参考方案5】:

移除 php artisan 部分并尝试:

Route::get('/run', function () 
    Artisan::call("migrate");
);

【讨论】:

以上是关于在 laravel 5 中运行 artisan 命令的主要内容,如果未能解决你的问题,请参考以下文章

laravel 无法打开输入文件:artisan (5.3)

Laravel 的Artisan 命令学习

在没有 php artisan serve 的情况下运行 laravel 5 应用程序

Laravel 5.6 artisan 命令从 URI 获取路由

我的 laravel 5.6 项目在 localhost 上打开,但不在 php artisan serve cmd 上打开

无法在 laravel 上运行 php artisan 命令