コントローラクラスで次の行を使用しています。
\Drupal::moduleHandler()->alter('mymodule_myfunction', $plugin_items);
Pareview.shがこのエラーメッセージを表示しています。
\ Drupal呼び出しはクラスでは避けてください。代わりに依存関係注入を使用してください。
どうすればこれを達成できますか?コンストラクター、メソッド、またはサービスを作成する必要がありますか?もしそうなら、サービスはどのコードを必要としますか? 「クラスではDrupal呼び出しを回避する必要があります。代わりに依存性注入を使用してください」 でサービスがすでに存在する場合の例を見つけました.
コントローラでは、サービスコンテナを使用してサービスを注入します。たとえば、ModuleHandler
:
namespace Drupal\mymodule\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
class MyController extends ControllerBase {
/**
* The module handler service.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* Constructs a MyController object
*
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler service.
*/
public function __construct(ModuleHandlerInterface $module_handler) {
$this->moduleHandler = $module_handler;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('module_handler')
);
}
次に、挿入されたサービスを使用して\Drupal
呼び出しを回避できます。
$this->moduleHandler->alter('mymodule_myfunction', $plugin_items);
コア/コントリビュートからの既存のサービスや、*.services.yml
ファイルのカスタムコードで定義したサービスを挿入できます。
コアサービス名を見つけるために、私は通常core.services.yml
を調べます。これは、IDEでdrupalプロジェクトに取り組んでいるときに最も速い方法だからです。
Drupal Console を使用して、コアからだけでなく、すべてのサービスを一覧表示できます。
drupal debug:container
Devel module を使用して、名前を検索することもできます。
/devel/container/service