이 글에서는 주로 Yii의 urlManager 구성 요소를 소개하는데, 이는 특정 참조 값을 가지고 있습니다. 이제 필요한 친구들이 참조할 수 있습니다.
구성 구성 요소에는 주로 다음이 포함됩니다.
지정된 클래스. 누락된 경우 기본 클래스
속성을 사용하세요. 누락된 경우 기본 클래스의 해당 속성을 사용하세요
urlManager는 클래스인데 왜 컴포넌트라고 부르나요? 지금은 걱정하지 마세요. 구성 요소에 대한 클래스를 지정해야 한다는 점만 알면 됩니다. 지정하지 않으면 구성 요소에 기본 클래스가 없으면 오류가 보고됩니다. 핵심 구성 요소입니다. B를 설치하고 yii 고급 템플릿을 예로 들어 보겠습니다.
Pis: 별도로 지정하지 않는 한 아래 경로는 네임스페이스가 아닌 파일의 특정 경로를 나타냅니다/frontend/web/index.php
를 열고Application의 생성자에 전달합니다.
를 선택한 다음 해당 실행 메서드를 실행합니다. /frontend/web/index.php
,看到
首先,用数组助手类的merge方法递归合并数组,后覆盖前得出最终配置,然后,将配置数据传到Application
的构造方法里,再执行其run方法。
跳转到verdoryiisoftyiiYii의 urlManager 구성 요소 구성webApplication.php
的run方法,它触发了很多事件,具体就不看了,貌似无关~,components相关东西在哪?搜索components
,发现执行了coreComponents方法,其内容是
并没有发现urlManager的默认类,并且各个配置文件都没为urlManager指定class,为什么没报错?因为它调用了父类的coreComponents
方法。
跳转到verdoryiisoftyiiYii의 urlManager 구성 요소 구성baseApplication.php
,原来urlManager组件在这里指定了类。
我们已经知道是通过coreComponents
指定核心组件的类了,但它是如何调用这个方法的呢?回头想想,在入口脚本还干了什么?实例化Application
类时,自动调用构造方法!我们发现省略~webApplication
没有覆盖父类的构造方法,即看父类的构造方法
跳转到preInit
方法,在这个预初始化方法里,接受的参数是引用,即这个方法要对$config
数组改造,重点看
大概意思是,如果配置文件没有配置某组件或没有为某组件指定类,这个组件就用coreComponents
指定的类。将$config
变量构造好后,传到Component::__construct($config)
,开始组件的具体内容,就不往下走了。
下面看组件属性的配置,跳到/项目目录/frontend/config/main.php
,我们看到urlManager组件配置被注释掉了,即意味着其使用了urlManager
组件指定类的属性的默认值,具体在vendoryiisoftyiiYii의 urlManager 구성 요소 구성wbeUrlManager.php
。
小结一下:组件配置,一指定类(无默认就要在配置文件写明),二配置属性,属性就是类的成员变量
为了方便,先给前台项目添加虚拟主机,具体看链接
<VirtualHost *:Yii의 urlManager 구성 요소 구성0>DocumentRoot "${INSTALL_DIR}/www/advanced/frontend/web/"ServerName frontend.advanced.com</VirtualHost>
这步不是必须的~
以请求Site
控制器的about
动作为例子
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 메소드가 실행되었고 그 내용은coreComponents
메서드를 호출하기 때문입니다. 🎜🎜🎜🎜 verdoryiisoftyiiYii의 urlManager 구성 요소 구성baseApplication.php
로 이동하세요. urlManager 구성 요소가 여기에서 클래스를 지정하는 것으로 나타났습니다. coreComponents
를 통해 지정된다는 것을 알고 있는데 이 메서드를 어떻게 호출합니까? 돌이켜보면, 참가 스크립트에서 또 무엇을 했나요? Application
클래스를 인스턴스화하면 생성자가 자동으로 호출됩니다! ~webApplication 생략
이 상위 클래스의 구성 방법을 다루지 않는다는 것을 발견했습니다. 즉, 상위 클래스의 구성 방법을 살펴보세요🎜🎜🎜🎜🎜🎜 preInit
메소드로 이동합니다. 이 pre에서 -초기화 방법, 허용되는 매개변수는 참조입니다. 즉, 이 방법은 $config 배열을 변환해야 합니다. /000/Yii의 urlManager 구성 요소 구성Yii의 urlManager 구성 요소 구성3/Yii의 urlManager 구성 요소 구성9Yii의 urlManager 구성 요소 구성/Yii의 urlManager 구성 요소 구성Yii의 urlManager 구성 요소 구성cbYii의 urlManager 구성 요소 구성cccceabYii의 urlManager 구성 요소 구성feYii의 urlManager 구성 요소 구성4ccYii의 urlManager 구성 요소 구성fdYii의 urlManager 구성 요소 구성Yii의 urlManager 구성 요소 구성Yii의 urlManager 구성 요소 구성c9Yii의 urlManager 구성 요소 구성Yii의 urlManager 구성 요소 구성cYii의 urlManager 구성 요소 구성Yii의 urlManager 구성 요소 구성-4.png " alt="Yii의 urlManager 구성 요소 구성" title=""/>🎜🎜아마도 🎜구성 파일이 특정 구성 요소를 구성하지 않거나 특정 구성 요소에 대한 클래스를 지정하지 않은 경우를 의미합니다. , 이 구성 요소는 coreComponents
🎜에 지정된 클래스를 사용합니다. $config
변수를 구성한 후 이를 Component::__construct($config)
에 전달하여 구성 요소의 특정 콘텐츠를 시작하고 더 이상 진행하지 않습니다. 🎜🎜🎜🎜 구성 요소 속성의 구성을 살펴보겠습니다. /Project Directory/frontend/config/main.php
로 이동하면 urlManager 구성 요소 구성이 주석 처리되어 있음을 알 수 있습니다. < 코드>urlManager 구성 요소는 특히 vendoryiisoftyiiYii의 urlManager 구성 요소 구성wbeUrlManager.php
에서 클래스 속성의 기본값을 지정합니다. RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . index.php
about
Action을 예로 들어🎜🎜🎜🎜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提示找不到页面,
这意味着,apache服务器找不到url请求的文件,按apache理解,省略~/web/
下没有site
目录,所以,想要实现隐藏入口脚本,还要在/frontend/web/
下添加.htaccess
文件,官方文档介绍,具体步骤如下:
RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . index.php
在.htaccess
添加内容如下,意思是,如果请求的文件或目录找不到,就转到index.php
enableStrictParsing
:
false [默认]:不启用严格解析路由,意思是,如果请求url与所有rules
规则都不匹配的话,就按照默认的路由处理方式来处理,即按[模块/]控制器/动作,方式去解析url。
true:设为true后,当请求url与rules
规则不匹配,就报错。
如,通过http://frontend.advanced.com/site/about
请求,得到Yii框架的报错提示
这意味着,请求经过apache的转发,已经找到目的文件(入口脚本),目的文件运行过程中,没有得到期望参数(没传或验证不通过),因此Yii框架抛异常了。
注意与上面apache提示找不到页面区分~
suffix
: 后缀名,如设置为suffix => '.html
,需通过http://frontend.advanced.com/site/about.html
才能访问到
rules
: 规则的配置就很复杂了,下面详讲。
rules
配置想访问Site
的about
动作,要在rules里加
'site/about' => 'site/about'
其中,左边称为pattern
,对应输入的url,右边为route
,对应[模型/]控制器/动作。
如果不想为每个动作都加一个规则,可以这样
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
可以这样理解,左边,接收请求url的对应值,对它们作\w
验证,即必须是字母或数字或下划线,以/site/about
为例,验证通过,赋值给临时变量controller
,action
,右边使用,从而找到Site
控制器的about
动作。
同理,模块下的控制器动作也可以这样实现
'<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
restful的路由规则,在研究,日后再补~
suffix
设了.html
, 下面的rules都会用到,要想不用,需要在规则数组单独声明suffix=> ''
restful路由配置,pluralize
参数默认为true,假如控制器为UserController
,要通过users
的url才能访问到,设为false的话,就不用加s,通过user
即可访问,如果控制器本来就是UsersController
,不管pluralize
如何配置,都是通过users
访问
相关推荐:
위 내용은 Yii의 urlManager 구성 요소 구성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!