使用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 我们可以把入口文件恢复到之前的项目状态了
这边对于之前的操作过程就不做删减了,也希望对看到这篇文章的你 有一定的启发和帮助 :)
Thanks for your kindness :)
sometimes
then
How about you ?
发表评论: