Task
Taskというのは、ここでは、Symfonyの特定のアクションをwebブラウザ経由でアクセスすることなく実行する機能を指します。分かりやすい例としては「cron」や「sched」あるいはCLI(コマンドライン)で実行するというものです。
symfony1の頃はtask機能が標準添付しておりましたが、Symfony4には初期状態では導入されておらず、サードパーティのbundleを利用する必要があります。
ただ、これは個人的な所感ですが「言われた通りに構成しても動作しない」または「わざわざ別のbundleを導入する必要はない」という理由で「symfony/console」を導入してコマンドラインからアクションを実行出来れば後はOS標準のスケジューラ(cron等)を用いれば良いというように考えています。
Console Componentは下記コマンドで導入します。
$ composer require symfony/console
導入後は下記のコマンドを実行して「コマンドを新規作成」します。maker-bundleが導入されていないと「make:command」は利用出来ないのでご注意ください。
$ bin/console make:command
ここでコマンド名を入力する事により、src/Commands配下にコマンドファイルが配置されます。例えば「test-exec」という名前を入力すると「testExecCommand.php」というファイルになります。
次に件のファイルを編集して「$defaultName」の定義を「test:exec」と変更して、下記のコマンドを実行します。
$ bin/console test:exec
下記のような実行結果になれば成功です。
$ bin/console test:exec [OK] You have a new command! Now make it your own! Pass --help to see your options.
後は内容を適宜修正し、上記コマンドをcronやschedに登録するなり、外部から自動実行されるなりすればtaskとして実装出来ます。
Doctrineを使用する場合
Controllerと同じように「use Doctrine\ORM\EntityManager;」と記述してもCommand上でそれは使えません。下記のような記述が別途必要となります。
namespace App\Command; use Doctrine\ORM\EntityManagerInterface; use App\Entity\Table; class TestExecCommand extends Command { protected static $defaultName = 'test:exec'; private $em;public function __construct(EntityManagerInterface $em) {
parent::__construct();
$this->em = $em;
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$repository = $this->em->getRepository(Table::class);
$result = $repository->findBy(array(),array('id'=>'DESC'));
private $emは無くても動作するかも知れません。__construct()にてEntityManagerInterfaceを読み込んで変数定義をする事で、execute()側で利用できるようになるという仕組みになります。この作法を用いる事で、後はControllerと同じようにDoctrineを利用出来ます。