Yii 2 컨트롤 러 만 들 기(createcontroller)방법 상세 설명

5838 단어 Yii2컨트롤 러
이 사례 는 Yii 2 가 컨트롤 러(createcontroller)를 만 드 는 방법 을 설명 한다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
yii 에서 컨트롤 러 를 만 든 것 은 application 에 있 는 request 가 UrlManager 를 통 해 경로 정 보 를 분석 한 다음 yii\base\Module 에 있 는 것 입 니 다.

public function runAction($route, $params = [])

방법 은 컨트롤 러 를 만 들 고 마지막 으로 컨트롤 러 가 해당 하 는 동작 을 수행 합 니 다.
먼저 명확 해 야 한다.Yii 의 경 로 는 세 가지 상황 으로 나 뉜 다.
첫 번 째 는 모듈 이 있 는(module id/controller id/action id)입 니 다.
두 번 째 는 네 임 스페이스(하위 디 렉 터 리)가 있 는(sub dir)/controller id/action id)입 니 다.
세 번 째 는 컨트롤 러 와 동작 만 있 는(controller id/action id)입 니 다.
이 세 가 지 는 우선 순위 가 있 기 때문에 컨트롤 러 를 만 들 때 도 모듈 형식의 경로 인지 확인 하고,그렇다면 이 모듈 을 가 져 온 다음 이 모듈 로 컨트롤 러 를 만 듭 니 다.
이 어 두 번 째 네 임 스페이스 가 있 는 지 판단 한다.

public function createController($route)
{
  //      ,        
  if ($route === '') {
    $route = $this->defaultRoute;
  }
  // double slashes or leading/ending slashes may cause substr problem
  //        (“/”),        “//”,   false    。
  $route = trim($route, '/');
  if (strpos($route, '//') !== false) {
    return false;
  }
  /*
   *        ,
   *       id (module id/controller id/action id),
   *         (   ) (sub dir)/controller id/action id)
   *             (controller id/action id)
   *            “/”      ,$id $route  ,
   */
  if (strpos($route, '/') !== false) {
    list ($id, $route) = explode('/', $route, 2);
  } else {
    $id = $route;
    $route = '';
  }
  // module and controller map take precedence
  /*
   *     id     ,     ,             。
   *   ,                                 。
   *
   *    url: http://www.yii2.com/index.php?r=test/index
   *        application        test   ,  index   。
   *
   *             test,    IndexController
   *
   *        $id=test,$route=index
   *
   *              ,       test     index   ,
   *      application   test    index  
   */
  $module = $this->getModule($id);
  if ($module !== null) {
    return $module->createController($route);
  }
  //   controllerMap           ,                  
  if (isset($this->controllerMap[$id])) {
    $controller = Yii::createObject($this->controllerMap[$id], [$id, $this]);
    return [$controller, $route];
  }
  /*
   *       $route   “/”,          home/index/aa
   * $id:home(    )
   * $route:index/aa
   *         home    ,         (   ),
   *
   *          
   * $id:home/index     (   )home   index   
   * $route:aaa
   *
   */
  if (($pos = strrpos($route, '/')) !== false) {
    $id .= '/' . substr($route, 0, $pos);
    $route = substr($route, $pos + 1);
  }
    /*
     * $id:home/index
     * $route:aaa
     */
  $controller = $this->createControllerByID($id);
  if ($controller === null && $route !== '') {
      //      ,   route  id    
    $controller = $this->createControllerByID($id . '/' . $route);
    $route = '';
  }
  return $controller === null ? false : [$controller, $route];
}

이 함수 에서$id 는 두 가지 상황 이 있 습 니 다.하 나 는 앞 에 네 임 스페이스 가 있 고 하 나 는 컨트롤 러 ID 가 있 습 니 다.

public function createControllerByID($id)
{
    if (!preg_match('%^[a-z0-9\\-_/]+$%', $id)) {
      return null;
    }
    /*
     *   $id  “/”,       ,     
     *
     */
    $pos = strrpos($id, '/');
    if ($pos === false) {
      $prefix = '';
      $className = $id;
    } else {
      $prefix = substr($id, 0, $pos + 1);
      $className = substr($id, $pos + 1);
    }
    //       IndexController
    $className = str_replace(' ', '', ucwords(str_replace('-', ' ', $className))) . 'Controller';
    //     (      、    ),           
    $className = ltrim($this->controllerNamespace . '\\' . str_replace('/', '\\', $prefix) . $className, '\\');
    //      ,       “-”,   ,
    if (strpos($className, '-') !== false || !class_exists($className)) {
      return null;
    }
    //        
    if (is_subclass_of($className, 'yii\base\Controller')) {
      return new $className($id, $this);
    } elseif (YII_DEBUG) {
      throw new InvalidConfigException("Controller class must extend from \\yii\\base\\Controller.");
    } else {
      return null;
    }
}

이 과정 이 끝 난 후에 만 든 컨트롤 러 가 그 안의 동작 을 수행 합 니 다.

public function runAction($route, $params = [])
{
  $parts = $this->createController($route);
  if (is_array($parts)) {
    /** @var Controller $controller */
    list($controller, $actionID) = $parts;
    $oldController = Yii::$app->controller;
    Yii::$app->controller = $controller;
    //          
    $result = $controller->runAction($actionID, $params);
    Yii::$app->controller = $oldController;
    return $result;
  } else {
    $id = $this->getUniqueId();
    throw new InvalidRouteException('Unable to resolve the request "' . ($id === '' ? $route : $id . '/' . $route) . '".');
  }
}

Yii 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 는 Yii 프레임 워 크 를 기반 으로 한 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기