Laravel 5 - 如何从 Artisan 命令运行控制器方法?

Posted

技术标签:

【中文标题】Laravel 5 - 如何从 Artisan 命令运行控制器方法?【英文标题】:Laravel 5 - how to run a Controller method from an Artisan Command? 【发布时间】:2016-07-30 19:35:55 【问题描述】:

我需要我的控制器中的一些代码每十分钟运行一次。使用SchedulerCommands 很简单。但。我创建了一个Command,用Laravel Scheduler(在Kernel.php)注册它,现在我无法实例化Controller。我知道这是解决这个问题的错误方法,但我只需要快速测试。有没有办法,提醒你一个hacky的方式,来完成这个?谢谢。

更新 #1:

Command:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Http\Controllers\StatsController;


class UpdateProfiles extends Command

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'update-profiles';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Updates profiles in database.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    
        parent::__construct();
    

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    
        StatsController::updateStats('<theProfileName>');
    

StatsController.php 中的updateStats() 方法

public static function updateStats($theProfileName)  
   // the body

这会返回一个FatalErrorException

[Symfony\Component\Debug\Exception\FatalErrorException] 
syntax error, unexpected 'if' (T_IF)

更新 #2:

原来我在updateStats() 方法中有一个错字,但@alexey-mezenin 的回答就像一个魅力!将Controller导入Command也足够了:

use App\Http\Controllers\StatsController;

然后像往常一样初始化它:

public function handle() 
   $statControl        = new StatsController;
   $statControl->updateStats('<theProfileName>');

【问题讨论】:

您可以将路由映射到控制器方法并使用this command 运行路由路径。 为什么不以正确的方式将需要运行的代码移出控制器并分别从命令/控制器调用它。比 hacky 解决方案干净得多。 我完全同意,但是当您第一次遇到这些东西并只想学习时,您不可避免地会使用 hacky 解决方案。在你学得够多之后,理解概念,你重构它。 【参考方案1】:

尝试在您的命令代码中使用use Full\Path\To\Your\Controller; 并静态使用方法:

public static function someStaticMethod()

    return 'Hello';

在您的命令代码中:

echo myClass::someStaticMethod();

【讨论】:

斯帕西博。我试过了,但不幸的是,它没有用。这是它返回的内容:[Symfony\Component\Debug\Exception\FatalErrorException] syntax error, unexpected 'if' (T_IF) 我的意思是带有'unexpected if'的代码。您在控制器或其他类中有语法错误。 我认为这个异常直接来自 Symfony,我如何确定它来自哪个文件?当我使用 Artisan 运行命令时,我只得到它,没有别的,没有堆栈跟踪。 检查 Laravel 日志,也许你会在那里找到踪迹。还要检查您所做的所有最后更改。 哇。哇。最后没有分号,你是对的,只是 updateStats() 方法中的一个错字。现在可以了!谢谢!

以上是关于Laravel 5 - 如何从 Artisan 命令运行控制器方法?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 从 5.1.46 更新到 5.2.* php artisan Segmentation fault

Laravel 的Artisan 命令学习

Laravel 5 - 为包创建 Artisan 命令

如何从 Laravel Artisan 触发单元测试

如何使用 Artisan 命令 (PHP) 在 Laravel 5.2 中创建 RESTful 资源控制器

在 Laravel 5 中找不到类“App\Http\Controllers\Artisan”