ホームページ  >  記事  >  バックエンド開発  >  Yii の urlManager コンポーネントの設定

Yii の urlManager コンポーネントの設定

不言
不言オリジナル
2018-05-05 09:41:472988ブラウズ

この記事では、主に Yii の urlManager コンポーネントの構成を紹介します。これを必要な友人に共有します。

構成コンポーネントには主に次のものが含まれます。欠落している場合は、デフォルトのクラス

  • 属性を使用します。欠落している場合は、デフォルト クラスの対応する属性を使用します

  • Yii の urlManager コンポーネントの設定 コンポーネントの簡単な理解

  • urlManager はクラスですが、なぜコンポーネントと呼ばれるのでしょうか?今のところは心配する必要はありません。コンポーネントのクラスを指定する必要があることだけを知っておいてください。指定されていない場合、コンポーネントにデフォルトのクラスがない場合は、エラーが報告されます。これはコアコンポーネントです。B をインストールして、yii アドバンストテンプレートを例として見てください。

ピス: 特に指定がない限り、以下のパスは名前空間ではなく、ファイルの特定のパスを指します

/frontend/web/index.php を開いて確認してください。
フロントエンド エントリ スクリプト
最初、配列ヘルパー クラスのmergeメソッドを使用して配列を再帰的にマージし、最後の配列が前の配列を上書きして最終的な構成を取得します。次に、構成データをApplicationのコンストラクターに渡します。 を選択し、その run メソッドを実行します。

    verdoryiisoftyiiYii の urlManager コンポーネントの設定webApplication.php の run メソッドに移動します。詳細は見ません。コンポーネント関連のものはどこにありますか? components を検索すると、coreComponents メソッドが実行されており、その内容は
    Yii の urlManager コンポーネントの設定
    urlManager のデフォルト クラスが見つかりませんでした。また、各構成ファイルで urlManager のクラスが指定されていませんでした。なぜエラーが発生しなかったのですか?報告?これは、親クラスの coreComponents メソッドを呼び出すためです。
  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 コンポーネントの設定baseApplication.php にジャンプします。ここで urlManager コンポーネントがクラスを指定していることがわかります。
    Yii の urlManager コンポーネントの設定🎜🎜コア コンポーネントのクラスが coreComponents を通じて指定されることはわかっていますが、このメソッドはどのように呼び出すのでしょうか?思い返してみると、エントリースクリプトでは他に何をしましたか? Application クラスをインスタンス化すると、コンストラクターが自動的に呼び出されます。 ~webApplication を省略すると、親クラスの構築メソッドがカバーされていないことがわかりました。つまり、親クラスの構築メソッドを確認してください🎜🎜Yii の urlManager コンポーネントの設定🎜🎜🎜🎜 preInit メソッドにジャンプします。 -initialization メソッドでは、受け入れられるパラメータは参照です。つまり、このメソッドでは、Yii の urlManager コンポーネントの設定$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 コンポーネントの設定がコメント化されていることを意味します。 uses urlManager コンポーネントは、クラスの属性のデフォルト値を、特に vendoryiisoftyiiYii の urlManager コンポーネントの設定wbeUrlManager.php で指定します。
    設定ファイル urlManager🎜 🎜 🎜要約すると、コンポーネントの設定では、最初にクラスを指定し(デフォルトがない場合は、設定ファイルに指定する必要があります)、Yii の urlManager コンポーネントの設定番目の設定属性、属性はクラスのメンバー変数です🎜🎜🎜🎜Yii の urlManager コンポーネントの設定仮想ホストを追加します🎜🎜便宜上、まずフロントエンドプロジェクトに仮想ホストを追加します。詳細についてはリンクを参照してください🎜
    RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . index.php
    🎜🎜このステップは必要ありません~🎜🎜🎜3 各設定関数🎜🎜はをリクエストできます>Site コントローラーの aboutアクションの例🎜🎜🎜🎜enablePrettyUrl: 🎜🎜🎜Pis: これを false に設定すると、次の設定は機能しません🎜🎜 🎜🎜🎜🎜false [デフォルト]: エントリ script?r =[Module/]Controller/action モード経由でアクセスします。つまり、 http://localhost/advanced/frontend/web/index.php?r=site/about🎜🎜🎜🎜tru​​e: 整形ルーティングをオンにします (これを true にのみ設定することに注意してください) 、他には何もありません 設定 (つまり、デフォルトを使用します)、エントリー script/[module/] コントローラー/アクション モードを通じてアクセスします。つまり、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 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。