আমি অন্য মডিউল দ্বারা সংজ্ঞায়িত রুটকে কীভাবে পরিবর্তন করব?


14

অন্য কথায়, ড্রুপল 8 হুক_মেনু_াল্টার () এর সমতুল্য কী?

ড্রুপাল 8 এখনও হুক_মেনু () ব্যবহার করে তবে আমি যা দেখতে পাচ্ছি তার জন্য হুক দ্বারা ফেরত তথ্য হ্রুপটি দ্রুপাল in এ ফিরে এসেছে তার থেকে পৃথক ।

  $items['user'] = array(
    'title' => 'User account',
    'title callback' => 'user_menu_title',
    'weight' => -10,
    'route_name' => 'user_page',
    'menu_name' => 'account',
  );

একটি এন্ট্রি ROUTE_NAME সম্পত্তি সংযোগগুলি user.routing.yml ফাইল।

user_page:
  pattern: '/user'
  defaults:
    _content: '\Drupal\user\Controller\UserController::userPage'
  requirements:
    _access: 'TRUE'

এটি সিম্ফনির সাথে করা থেকে আলাদা এবং এটি কোনও মডিউল অন্য ব্যবহারকারী থেকে সংজ্ঞায়িত রুটকে কীভাবে পরিবর্তন করতে পারে তা সম্পর্কে আমাকে বিভ্রান্ত করে।

শুধুমাত্র ফাংশন যে এখনও invoking hook_menu_alter()হয় menu_router_build () , কিন্তু যে ফাংশন এখনও যেহেতু এটি এখনও ব্যবহার করছে এখন অবচিত, কোড যে আপডেট করা প্রয়োজন রয়েছে drupal_alter()

  // Alter the menu as defined in modules, keys are like user/%user.
  drupal_alter('menu', $callbacks);
  foreach ($callbacks as $path => $router_item) {
    // If the menu item is a default local task and incorrectly references a
    // route, remove it.
    // @todo This may be removed later depending on the outcome of
    // http://drupal.org/node/1889790
    if (isset($router_item['type']) && $router_item['type'] == MENU_DEFAULT_LOCAL_TASK) {
      unset($callbacks[$path]['route_name']);
    }
    // If the menu item references a route, normalize the route information
    // into the old structure. Note that routes are keyed by name, not path,
    // so the path of the route takes precedence.
    if (isset($router_item['route_name'])) {
      $router_item['page callback'] = 'USES_ROUTE';
      $router_item['access callback'] = TRUE;
      $new_path = _menu_router_translate_route($router_item['route_name']);

      unset($callbacks[$path]);
      $callbacks[$new_path] = $router_item;
    }
  }

উত্তর:


6

বিদ্যমান রুটের পরিবর্তন এবং গতিশীলগুলির উপর ভিত্তি করে নতুন রুট যুক্ত করা দেখুন ; অনুসন্ধান মডিউল দ্বারা পরিচালিত হ্যান্ডল / সন্ধান করা আমার পক্ষে এটি দুর্দান্ত কাজ করেছে। আমার ক্ষেত্রে, আমি নিম্নলিখিত কোডটি ব্যবহার করেছি।

<?php
/**
 * @file
 * Contains \Drupal\ua_sc_module\Routing\SearchAlterRouteSubscriber.
 */

namespace Drupal\ua_sc_module\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

/**
 * Listens to the dynamic route events.
 */
class SearchAlterRouteSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  public function alterRoutes(RouteCollection $collection) {
    // Remove the /search route.
    $collection->remove('search.view');
  }

}

12

বিদ্যমান রাউটিং আইটেমগুলিকে ওভাররাইড করার জন্য দর্শনগুলিকে কেবল বিদ্যমান কার্যকারিতা ব্যবহার করুন।

আপনি যদি কোনও রুটের সাথে সংযুক্ত তথ্যটি পরিবর্তন করতে চান তবে মেনু নয়, প্রকৃত ব্যবহৃত নিয়ন্ত্রকের মতো, বা প্রয়োজনীয়তাগুলি (অনুমতি / ভূমিকা ইত্যাদি) আপনি দ্রুপালের দ্বারা সরবরাহিত ইভেন্ট ব্যবহার করতে পারেন:

  <?php

  use Drupal\Core\Routing\RouteBuildEvent;
  use Drupal\Core\Routing\RoutingEvents;
  use Symfony\Component\EventDispatcher\EventSubscriberInterface;

  class RouteSubscriber implements EventSubscriberInterface {

   /**
    * {@inheritdoc}
    */
   public static function getSubscribedEvents() {
      $events[RoutingEvents::ALTER] = 'alterRoutes';
     return $events;
   }

  /**
   * Alters existing routes.
   *
   * @param \Drupal\Core\Routing\RouteBuildEvent $event
   *   The route building event.
   */
  public function alterRoutes(RouteBuildEvent $event) {
    // Fetch the collection which can be altered.
    $collection = $event->getRouteCollection();
    // The event is fired multiple times so ensure that the user_page route
    // is available.
    if ($route = $collection->get('user_page')) {
      // As example add a new requirement.
      $route->setRequirement('_role', 'anonymous');
    }
  }

  }

অতিরিক্তভাবে আপনাকে এই শ্রেণীর জন্য ট্যাগ 'ইভেন্ট_সুবস্ক্রাইবার' ট্যাগ সহ একটি পরিষেবা নিবন্ধিত করতে হবে।



7

যেহেতু আমি এই প্রশ্নটি জিজ্ঞাসা করেছি, ড্রুপাল 8 কোর পরিবর্তিত হয়েছে এবং রুটগুলি সম্পর্কে কয়েকটি সমস্যা স্থির করা হয়েছে।

hook_menu()ড্রুপাল 8 থেকে আর ব্যবহার করা হয় না; একটি মডিউল যে রুটগুলি ব্যবহার করে সেগুলি একটি .routing.yml ফাইলে সংজ্ঞায়িত করা হয় (উদাঃ user.routing.yml )। পরিবর্তিত হুকগুলি এখনও ব্যবহৃত হয়, তবে যেহেতু hook_menu()আর ড্রুপাল কোর থেকে hook_menu_alter()আর ব্যবহৃত হয় না , এটিও ব্যবহৃত হয় না।

অন্যান্য মডিউল থেকে সংজ্ঞায়িত একটি রুট পরিবর্তন করার জন্য প্রয়োজনীয় পদক্ষেপগুলি নিম্নলিখিত:

  • একটি পরিষেবা সংজ্ঞায়িত করুন

    services:
      mymodule.route_subscriber:
        class: Drupal\mymodule\Routing\RouteSubscriber
        tags:
          - { name: event_subscriber }
  • ক্লাস প্রসারিত একটি ক্লাস তৈরি করুন RouteSubscriberBase

    namespace Drupal\mymodule\Routing;
    
    use Drupal\Core\Routing\RouteSubscriberBase;
    use Symfony\Component\Routing\RouteCollection;
    
    /**
     * Listens to the dynamic route events.
     */
    class RouteSubscriber extends RouteSubscriberBase {
    
      /**
       * {@inheritdoc}
       */
      protected function alterRoutes(RouteCollection $collection) {
        // Change the route associated with the user profile page (/user, /user/{uid}).
        if ($route = $collection->get('user.page')) {
          $route->setDefault('_controller', '\Drupal\mymodule\Controller\UserController::userPage');
        }
      }
    
    }

লক্ষ্য করুন যে পূর্ববর্তী দ্রুপাল 8 রিলিজের সাথে তুলনা করে কিছু বিবরণ পরিবর্তন করা হয়েছে।

  • রুটের নাম থেকে পরিবর্তন করা user_pageহয়েছেuser.page
  • থেকে পরিবর্তিত যে রুট জন্য প্রয়োজনীয়তা _access: 'TRUE'থেকে_user_is_logged_in: 'TRUE'
  • কোনও রুটের কন্ট্রোলার সেট করার জন্য সম্পত্তিটি পরিবর্তিত _contentহয়েছে_controller

আপনি যদি একাধিক রুটের সাথে মিল রাখতে চান, $ ম্যাচযুক্ত ভেরিয়েবলটিকে মিথ্যা হিসাবে সেট করার চেয়ে আরও কি মার্জিত কোনও উপায় আছে, তারপরে একসাথে সবগুলি দিয়ে পুনরাবৃত্তি করতে হবে $collection->get()? আমি কোনও সুস্পষ্ট পদ্ধতি দেখতে পাচ্ছি না।
উইলিয়াম তারেল

@ উইলিয়ামট্যুরেল আপনি এর ArrayIteratorসাথে একটি বস্তু পেতে পারেন RouteCollection::getIterator(); এতে সমস্ত আইটেমের মধ্যে পুনরাবৃত্তি করা সহজ হবে $collection। আপনি এর $collectionসাথে সমস্ত রুটও পেতে পারেন RouteCollection::all()যা একটি অ্যারে দেয়।
কিমলালুনো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.