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 【问题描述】:我需要我的控制器中的一些代码每十分钟运行一次。使用Scheduler
和Commands
很简单。但。我创建了一个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