记得上次描述到入口文件,今天就来看看进入入口文件后怎么去到其他地方。。。

场景一:关于URL美化

对于刚安装好新项目,在访问的时候我们会看到和乱码一样令人不适的url地址,那么就要开始处理了!

准备工作:

配置好服务器(要域名访问的就把你的域名指向你当前项目的web文件夹下)确保可以正常访问,并且有定义可以重写url(或者叫重定向,运维的专业名词还是不能完全掌握啊)

第一步:

在项目里(高级版安装好有一个frontend和backend,把每一个当做一个项目)找到config中的main.php文件,添加:

'urlManager' => [

'enablePrettyUrl' => true, // 启用美化URL

'enableStrictParsing' => true, // 是否执行严格的url解析,这条和下一条一起出现可以去掉index.php访问

'showScriptName' => false, // 在URL路径中是否显示脚本入口文件

'rules' => [

'/' => 'site/login',//这里不写,无法指明根目录页面每个页面都必须加载

"/"=>"/",

],

],

最后一行是你的解析规则,根据需要可以任意定义,但是注意,不要有太多特殊符号,容易先解析问题

举个例子:

//有模块的时候,以模块/控制器/方法访问

'//' => '//',

//模仿未美化前的样式

'?r=/'=>'/',

很容易看出:

就是表达模块的名字。

就是表达控制器的名字。

就是表达方法的名字。

下面是一些不常用的解析规则示例:

''=>'/index',

'.'=>'/',

'-.'=>'/',

'-'=>'//index',

'-.'=>'//index',

'-.'=>'//',

'-.-'=>'//',

'-.---'=>'//',

那么现在就可以用漂亮的解析了么?不然

第二步:

需要添加一个文件:项目位置/项目/web/.htaccess

里面的内容:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . index.php

这个文件是不会显示的,属于隐藏文件哈~

完成这两步就可以直接访问了~注意,这是配置在独立项目里的,也就是如果你配置在frontend里,backend仍然不可以美化后方式访问

场景二:需要新的项目

如果这个项目不再只需要网站的前端和后台,还需要给手机端提供接口,这时候需要一个新的项目。

加新项目的方法:

在common的config中有一个bootstrap.php文件,添加

Yii::setAlias('@新的模块文件夹名', dirname(dirname(__DIR__)) . '/新的模块文件夹名');

这是与frontend同级的新模块加法,要区别与项目内的模块(Module)

场景三:需要新的模块

所谓module,就是项目最小的模块。作为模块需要特别注意的是:

1.创建模块的结构

2.模块的路径被识别

3.url美化后可以访问

首先看结构,这个结构是有一定的标准的,就标准的MVC来看,就是:

Module------v1

|

-youke

|

-lianxi -------Module.php

|             |

|              -comtrollers

|             |

|              -models

|             |

|              -views

|

-   ….

这个标准结构下要主要的是Module.php。这个决定我们是不是可以正常识别解析模块中的内容

对于这个文件有两种实现方法。第一是直接继承原声的,在上层进行赋值,但是弊端就是每个模块都写一次,所以有第二种实现的方式,就是写一个封装类。将应该配置的内容统一化。

参考教程:

http://www.yiichina.com/topic/7201

http://blog.csdn.net/terry_water/article/details/39480059

http://blog.csdn.net/mr_raptor/article/details/50757578

总结上述,都是需要多次定义很多内容公有化的父类文件:

我定义在common的base下:

namespace common\base;

use Yii;

class BaseModule extends \yii\base\Module

{

//版本列表

private $_registers = [];

//版本与命名空间对照表

private $_version_namespace = [

'模块名' => '项目名\modules\模块名\controllers',

];

public function init()

{

parent::init();

}

}

于是可以看到。新的模块只要在列表里添加就好

那么这个是父类的文件,在每个新的模块中要出现的Module的内容呢:

/**

* Created by PhpStorm.

* User: loong

* Date: 2017/8/7

* Time: 10:34

*/

namespace forTool\modules\v1;

use common\base\BaseModule;

class Module extends BaseModule

{

public function init()

{

parent::init();

}

public function beforeAction($action)

{

if (!parent::beforeAction($action)) {

return false;

}

// your custom code here

return true; // or false to not run the action

}

}

好了,这样就实现了第一个部分呢

如果对于模块间界限不是那么明显,可以添加版本解析的路由,在如果是手机版本可以根据传过来的参数在添加版本限制可以添加路由方法,并在调用父类之前调用这个方法

public function apiVersionRoute()

{

//获取接口url

$uri = Yii::$app->requestedRoute;

//分析接口版本号 parseRequest

$paser_uri = explode( '/' , $uri );

$module_name = $paser_uri[0];

$controller_name = '';

$action_name = '';

// var_dump($paser_uri);die;

//在版本对照表中查找当前版本接口实际访问的版本代码

//如果url的版本号没有找到版本命名空间,默认使用base版本,尽可能避免这种问题

if ( !array_key_exists( $module_name , $this->_version_namespace ) )

{

$this->controllerNamespace = $this->_version_namespace['base'];

return true;

}

//url分解出controller和action名称,判断方法是否存在于当前命名空间,没有直接访问base版本

if ( isset( $paser_uri[1] ) )

{

$controller_name = $paser_uri[1];

}

if ( isset( $paser_uri[2] ) )

{

$action_name = $paser_uri[2];

}

//get_class_methods

//控制器地址

$controller_class = $this->_version_namespace[ $module_name ] . "\\" . ucwords( $controller_name ) .'Controller';

//方法名称

$methodName = 'action' . str_replace(' ', '', ucwords(implode(' ', explode('-', $action_name))));

if (method_exists( $controller_class , $methodName))

{

$this->controllerNamespace = $this->_version_namespace[ $module_name ];

}

else

{

$this->controllerNamespace = $this->_version_namespace['base'];

}

return true;

}

2.这些内容被识别为模块,需在添加一些配置。

在当前的项目里的main.php添加模块配置:

'modules'=>[

'v1' =>[

'class'=>'forTool\modules\v1\Module',

],

],

这是添加在return里的,是和美化url一级的哦。

最后就是在美化了url怎么被识别,在添加一个规则!

'//' => '//',

当然如果还是不可以,可以尝试把是否严格遵守改成否试试看、

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐