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を利用出来ます。

前の記事

WooCommerce

次の記事

CentOS memo