使用Laravel valet工具配置yii2项目

2017-9-27 邪哥

关于laravel valet 工具的安装及使用 这边就不说了

随便搜索下,参考文档进行操作就好了


由于使用了valet,自然不希望再通过自定义配置  nginx  vhost 各种配置 以及 /etc/hosts 文件来进行 yii2的项目开发测试

但是valet默认支持的项目类型驱动中不包含yii2。



系统环境: Mac 10.12

项目简介: Yii2 Advance 模版,以backend为例


首先我们在  backend/runtime 目录中添加文件 .yii2 供valet用作Driver判定标识(当然你也可以定位到  Yii.php )

然后我们来你自定义一个Driver,源码如下


<?php
class YiiValetDriver extends ValetDriver
{
    public function serves($sitePath, $siteName, $uri)
    {
        if (file_exists($sitePath.'/runtime/.yii2')) {
            return true;
        }
        return false;
    }

    public function isStaticFile($sitePath, $siteName, $uri)
    {
        if (file_exists($staticFilePath = $sitePath.'/web/'.$uri)) {
            return $staticFilePath;
        }
        return false;
    }

    public function frontControllerPath($sitePath, $siteName, $uri)
    {
        return $sitePath.'/web/index.php';
    }
}



完了   valet  restart 重启  (注意,编辑完自定义Driver类不重启,可能会导致valet驱动类型解析失败)

并   valet link path/to/backend  (以backend目录为 valet link的根目录),尝试访问,正常情况都会有异常

原因是经过常规的配置之后  @webroot    @web 映射的目录都是错的,为什么会出错可以研究下 yii\web\Application 的源码

这边说下解决途径: (调整项目入口文件 backend/web/index.php) 


<?php
 (new yii\web\Application($config))->run();

//修改为如下代码:


$app = (new yii\web\Application($config));

$sf = $app->getRequest()->getScriptFile();
if (strpos($sf, 'valet')) {
    \Yii::setAlias('@webroot',$app->basePath.'/web');
    \Yii::setAlias('@web','/');
}

$app->run();


刷新试试

注意文中,样例代码项目的目录关系

(ps: 虽然这样能解决问题,不过还是有点让人膈应。  如果你有方法可以不用修改项目代码  就能解决 yii2 在valet中的部署,欢迎留言)


另外就是成功之后, 项目中的链接都会添加一长串前缀 。。。。(不知道你有没有发现呢)

是由于valet使用了 ~/.composer/vendor/laravel/valet/server.php 为代理入口文件的问题。。

网上搜索了下,发现有人已经处理过了

https://github.com/chinaphp/yii2-valet-driver/blob/master/Yii2ValetDriver.php 

通过在驱动中直接修改 $_SERVER 的相关信息进行解决

   public function frontControllerPath($sitePath, $siteName, $uri)
    {
        $_SERVER['SCRIPT_FILENAME'] = $sitePath.'/web/index.php';
        $_SERVER['SCRIPT_NAME'] = '/index.php';
        $_SERVER['PHP_SELF'] = '/index.php';
        $_SERVER['DOCUMENT_ROOT'] = $sitePath;
        return $sitePath.'/web/index.php';
    }

折腾完之后发现链接没问题了,再一想,之前的 @webroot  @web解析的错误,通过重写$_SERVER 之后 也一并解决了。

so  我们可以把入口文件恢复到之前的项目状态了

这边对于之前的操作过程就不做删减了,也希望对看到这篇文章的你   有一定的启发和帮助  :)


发表评论: