>백엔드 개발 >PHP 튜토리얼 >Yii의 urlManager 구성 요소 구성

Yii의 urlManager 구성 요소 구성

不言
不言원래의
2018-05-05 09:41:473008검색

이 글에서는 주로 Yii의 urlManager 구성 요소를 소개하는데, 이는 특정 참조 값을 가지고 있습니다. 이제 필요한 친구들이 참조할 수 있습니다.

구성 구성 요소에는 주로 다음이 포함됩니다.

  • 지정된 클래스. 누락된 경우 기본 클래스

  • 속성을 사용하세요. 누락된 경우 기본 클래스의 해당 속성을 사용하세요

Yii의 urlManager 구성 요소 구성 컴포넌트에 대한 간단한 이해

urlManager는 클래스인데 왜 컴포넌트라고 부르나요? 지금은 걱정하지 마세요. 구성 요소에 대한 클래스를 지정해야 한다는 점만 알면 됩니다. 지정하지 않으면 구성 요소에 기본 클래스가 없으면 오류가 보고됩니다. 핵심 구성 요소입니다. B를 설치하고 yii 고급 템플릿을 예로 들어 보겠습니다.

Pis: 별도로 지정하지 않는 한 아래 경로는 네임스페이스가 아닌 파일의 특정 경로를 나타냅니다

    /frontend/web/index.php를 열고
    프런트엔드 항목 스크립트
    첫 번째 , Array Helper Class의 병합 메서드를 사용하여 배열을 재귀적으로 병합하고 마지막 배열은 이전 배열을 덮어써서 최종 구성을 가져옵니다. 그런 다음 구성 데이터를 Application의 생성자에 전달합니다. 를 선택한 다음 해당 실행 메서드를 실행합니다.
  1. /frontend/web/index.php,看到
    Yii의 urlManager 구성 요소 구성
    首先,用数组助手类的merge方法递归合并数组,后覆盖前得出最终配置,然后,将配置数据传到Application的构造方法里,再执行其run方法。

  2. 跳转到verdoryiisoftyiiYii의 urlManager 구성 요소 구성webApplication.php的run方法,它触发了很多事件,具体就不看了,貌似无关~,components相关东西在哪?搜索components,发现执行了coreComponents方法,其内容是
    Yii의 urlManager 구성 요소 구성
    并没有发现urlManager的默认类,并且各个配置文件都没为urlManager指定class,为什么没报错?因为它调用了父类的coreComponents方法。

  3. 跳转到verdoryiisoftyiiYii의 urlManager 구성 요소 구성baseApplication.php,原来urlManager组件在这里指定了类。
    Yii의 urlManager 구성 요소 구성

    我们已经知道是通过coreComponents指定核心组件的类了,但它是如何调用这个方法的呢?回头想想,在入口脚本还干了什么?实例化Application类时,自动调用构造方法!我们发现省略~webApplication没有覆盖父类的构造方法,即看父类的构造方法

    Yii의 urlManager 구성 요소 구성

  4. 跳转到preInit方法,在这个预初始化方法里,接受的参数是引用,即这个方法要对$config数组改造,重点看Yii의 urlManager 구성 요소 구성

    大概意思是,如果配置文件没有配置某组件或没有为某组件指定类,这个组件就用coreComponents指定的类。将$config变量构造好后,传到Component::__construct($config),开始组件的具体内容,就不往下走了。

  5. 下面看组件属性的配置,跳到/项目目录/frontend/config/main.php,我们看到urlManager组件配置被注释掉了,即意味着其使用了urlManager组件指定类的属性的默认值,具体在vendoryiisoftyiiYii의 urlManager 구성 요소 구성wbeUrlManager.php
    Yii의 urlManager 구성 요소 구성

    小结一下:组件配置,一指定类(无默认就要在配置文件写明),二配置属性,属性就是类的成员变量

Yii의 urlManager 구성 요소 구성  添加虚拟主机

为了方便,先给前台项目添加虚拟主机,具体看链接

<VirtualHost *:Yii의 urlManager 구성 요소 구성0>DocumentRoot "${INSTALL_DIR}/www/advanced/frontend/web/"ServerName frontend.advanced.com</VirtualHost>

这步不是必须的~

3 各配置作用

以请求Site控制器的about动作为例子

  1. enablePrettyUrl

    Pis:这个设为false,下面的设置都不起作用

  • false [默认]:通过入口脚本?r=[模块/]控制器/动作 方式访问。即http://localhost/advanced/frontend/web/index.php?r=site/about

  • true:开启美化路由,(注意是仅配置这个为ture,其他不配置,即用默认),通过入口脚本/[模块/]控制器/动作 方式访问。即http://localhost/advanced/frontend/web/index.php/site/about

  • showScriptName

    完成后,才能通过http://frontend.advanced.com/site/about

    verdoryiisoftyiiYii의 urlManager 구성 요소 구성webApplication.php의 실행 메소드로 이동합니다. 많은 이벤트가 발생합니다. 자세한 내용은 살펴보지 않겠습니다~. 컴포넌트를 검색해 보니 coreComponents 메소드가 실행되었고 그 내용은

    urlManager의 기본 클래스를 찾을 수 없으며 각 구성 파일에서 urlManager에 대한 클래스를 지정하지 않았습니다. 왜 오류가 발생하지 않았습니까? 보고됐나요? 상위 클래스의 coreComponents 메서드를 호출하기 때문입니다. 🎜🎜🎜🎜 verdoryiisoftyiiYii의 urlManager 구성 요소 구성baseApplication.php로 이동하세요. urlManager 구성 요소가 여기에서 클래스를 지정하는 것으로 나타났습니다.
    Yii의 urlManager 구성 요소 구성🎜🎜우리는 핵심 구성 요소 클래스가 coreComponents를 통해 지정된다는 것을 알고 있는데 이 메서드를 어떻게 호출합니까? 돌이켜보면, 참가 스크립트에서 또 무엇을 했나요? Application 클래스를 인스턴스화하면 생성자가 자동으로 호출됩니다! ~webApplication 생략이 상위 클래스의 구성 방법을 다루지 않는다는 것을 발견했습니다. 즉, 상위 클래스의 구성 방법을 살펴보세요🎜🎜Yii의 urlManager 구성 요소 구성🎜🎜🎜🎜 preInit 메소드로 이동합니다. 이 pre에서 -초기화 방법, 허용되는 매개변수는 참조입니다. 즉, 이 방법은 Yii의 urlManager 구성 요소 구성🎜🎜아마도 🎜구성 파일이 특정 구성 요소를 구성하지 않거나 특정 구성 요소에 대한 클래스를 지정하지 않은 경우를 의미합니다. , 이 구성 요소는 coreComponents🎜에 지정된 클래스를 사용합니다. $config 변수를 구성한 후 이를 Component::__construct($config)에 전달하여 구성 요소의 특정 콘텐츠를 시작하고 더 이상 진행하지 않습니다. 🎜🎜🎜🎜 구성 요소 속성의 구성을 살펴보겠습니다. /Project Directory/frontend/config/main.php로 이동하면 urlManager 구성 요소 구성이 주석 처리되어 있음을 알 수 있습니다. urlManager 구성 요소는 특히 vendoryiisoftyiiYii의 urlManager 구성 요소 구성wbeUrlManager.php에서 클래스 속성의 기본값을 지정합니다.
    구성 파일의 URL 관리자🎜 🎜🎜요약하자면: 구성요소 구성은 먼저 클래스를 지정하고(기본값이 없으면 구성 파일에 명시해야 함), 두 번째 구성 속성, 속성은 클래스의 멤버 변수🎜🎜🎜🎜 Yii의 urlManager 구성 요소 구성 가상 호스트 추가🎜🎜 편의를 위해 먼저 프런트엔드 프로젝트에 가상 호스트를 추가하고 자세한 내용은 링크를 참조하세요🎜
    RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . index.php
    🎜🎜이 단계는 필요하지 않습니다~🎜🎜🎜3 각 구성 기능🎜🎜은 Site 컨트롤러의 aboutAction을 예로 들어🎜🎜🎜🎜enablePrettyUrl: 🎜🎜🎜Pis: false로 설정하면 다음 설정이 작동하지 않습니다🎜 🎜🎜🎜🎜🎜false [기본값]: 입력 스크립트를 통해?r =[모듈/]컨트롤러/작업 모드 액세스. 즉, http://localhost/advanced/frontend/web/index.php?r=site/about🎜🎜🎜🎜true: 미화 라우팅을 켭니다. (이것을 true로만 구성하세요. , 기타 항목 없음 구성, 즉 기본값 사용), 항목 스크립트/[모듈/] 컨트롤러/작업 모드를 통해 액세스됩니다. 즉, http://localhost/advanced/frontend/web/index.php/site/about🎜🎜🎜🎜🎜showScriptName: 🎜🎜완료 후 http://frontend.advanced.com/site/about방문🎜
    • true [默认]: 不隐藏入口脚本,即要加入口脚本文件名index.php才能访问到,http://localhost/advanced/frontend/web/index.php/site/about

    • false:按理解,设为false,应该是http://localhost/advanced/frontend/web/site/about即可访问,但发现是apache提示找不到页面
      Yii의 urlManager 구성 요소 구성这意味着,apache服务器找不到url请求的文件,按apache理解,省略~/web/下没有site目录,所以,想要实现隐藏入口脚本,还要在/frontend/web/下添加.htaccess文件,官方文档介绍,具体步骤如下:

      RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . index.php
    1. .htaccess添加内容如下,意思是,如果请求的文件或目录找不到,就转到index.php

  • enableStrictParsing

    • false [默认]:不启用严格解析路由,意思是,如果请求url与所有rules规则都不匹配的话,就按照默认的路由处理方式来处理,即按[模块/]控制器/动作,方式去解析url。

    • true:设为true后,当请求url与rules规则不匹配,就报错。

      如,通过http://frontend.advanced.com/site/about请求,得到Yii框架的报错提示
      Yii의 urlManager 구성 요소 구성

      这意味着,请求经过apache的转发,已经找到目的文件(入口脚本),目的文件运行过程中,没有得到期望参数(没传或验证不通过),因此Yii框架抛异常了

      注意与上面apache提示找不到页面区分~

  • suffix: 后缀名,如设置为suffix => '.html,需通过http://frontend.advanced.com/site/about.html才能访问到

  • rules: 规则的配置就很复杂了,下面详讲。

  • 4 rules配置

    1. 想访问Siteabout动作,要在rules里加

      &#39;site/about&#39; => &#39;site/about&#39;

      其中,左边称为pattern,对应输入的url,右边为route,对应[模型/]控制器/动作。

    2. 如果不想为每个动作都加一个规则,可以这样

      &#39;<controller:\w+>/<action:\w+>&#39; => &#39;<controller>/<action>&#39;,

      可以这样理解,左边,接收请求url的对应值,对它们作\w验证,即必须是字母或数字或下划线,以/site/about为例,验证通过,赋值给临时变量controller,action,右边使用,从而找到Site控制器的about动作。

    3. 同理,模块下的控制器动作也可以这样实现

      &#39;<module:\w+>/<controller:\w+>/<action:\w+>&#39; => &#39;<module>/<controller>/<action>&#39;,
    4. restful的路由规则,在研究,日后再补~

    Yii의 urlManager 구성 요소 구성 Notice

    • suffix 设了.html, 下面的rules都会用到,要想不用,需要在规则数组单独声明suffix=> ''

    • restful路由配置,pluralize参数默认为true,假如控制器为UserController,要通过users的url才能访问到,设为false的话,就不用加s,通过user即可访问,如果控制器本来就是UsersController,不管pluralize如何配置,都是通过users访问

    相关推荐:

    yii的CURD操作

    위 내용은 Yii의 urlManager 구성 요소 구성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.