Drupal - Adding autocomplete for text-field

If you want to select an entity, then there is a way easier way to do that. Drupal 8 has a standard entity_autocomplete field type, just specify your form element like this:

$form['node'] = [
  '#type' => 'entity_autocomplete',
  '#target_type' => 'node',

See Custom autocomplete field for more information.

Also, never do database queries against node/entity tables. Use \Drupal::entityQuery() for that.

Your class need some modification you need to check request and put it into $string.


namespace Drupal\mymodule\Controller;

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Drupal\Component\Utility\Unicode;

class DefaultController extends ControllerBase

   * Returns response for the autocompletion.
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   The current request object containing the search string.
   * @return \Symfony\Component\HttpFoundation\JsonResponse
   *   A JSON response containing the autocomplete suggestions.

  public function autocomplete(request $request) {
    $matches = array();
    $string = $request->query->get('q');
    if ($string) {
      $matches = array();
      $query = \Drupal::entityQuery('node')
      ->condition('status', 1)
      ->condition('title', '%'.db_like($string).'%', 'LIKE');
      //->condition('field_tags.entity.name', 'node_access');
      $nids = $query->execute();
      $result = entity_load_multiple('node', $nids);
      foreach ($result as $row) {
        //$matches[$row->nid->value] = $row->title->value;
        $matches[] = ['value' => $row->nid->value, 'label' => $row->title->value];
    return new JsonResponse($matches);

  1. Create a routing.yml file and add the below code : admin_example.autocomplete:


  path: '/admin_example/autocomplete'
    _controller: '\Drupal\admin_example\Controller\AdminNotesController::autocomplete'
    _permission: 'access content'
  1. The form which you have build in mymodule/src/Form/EditForm.php is correct

You need to change the code in controller .The code is below :

public function autocomplete(Request $request)
 $string = $request->query->get('q');
    $matches = array();
      $query = db_select('node_field_data', 'n')
          ->fields('n', array('title', 'nid'))
          ->condition('title', $string . '%', 'LIKE')
    foreach ($query as $row) {
        $matches[] = array('value' => $row->nid, 'label' => $row->title);

    return new JsonResponse($matches);