本文实例讲述了Laravel 5.1 on SAE环境开发方法。,具体如下:
Laravel-简洁、优雅的PHP开发框架,为 WEB 艺术家创造的 PHP 框架,如今正式移植到SAE环境。
由于Laravel 5.1相比于Laravel 4有很多的改动,不仅以目录结构更加清晰,而且功能也更丰富。但是Laravel官方还是没有原生支持SAE环境(估计永远不会支持),所以我就做了一个移植版本,可以很优雅的切换本地和SAE环境。
由于SAE的特殊性,那么这几个核心问题就必须要解决
#1 putenv()函数禁用
#2 模板编译
#3 缓存类
#4 日志处理
#5 Session类
#6 服务提供者缓存
#1 putenv()函数禁用
Laravel 5.1使用了这个putenv()函数来向当前的环境中动态添加变量,但是很遗憾的是SAE的PHPRuntime禁用了该函数,所以只能使用折中的方法来实现。当初本来想Hook掉该实现,后来觉得没必要,这个函数在Laravel 5.1中主要是为了使用.env配置文件来统一团队的配置。所以我是直接禁用了该功能,在vendor/vlucas/phpdotenv/src/Dotenv.php的86行左右,直接注释掉该函数,然后把所有的配置信息都写到config文件夹的相应配置文件中。虽然解决了该函数被禁用的问题,但是实现的不够优雅,希望有大神可以给出更加优雅的实现。
#2 模板编译
该问题主要还是因为SAE的本地环境写入被禁止,所以我使用了Wrapper来把编译后的模板文件写入到Storage。本来是打算写到KVDB中,但是会出现一些奇奇怪怪问题,原因不明。
在configview.php文件中修改:
$compiled = [
'paths' => [
realpath(base_path('resources/views')),
],
'compiled' => realpath(storage_path('framework/views')),
];
if(SAE){
$compiled['compiled'] = 'saestor://'.SAE_STORAGE.'/compiled';
}
return $compiled;
注意要在相应的Storage中建立compiled文件夹。
#3 缓存类
Laravel 5.1没有直接提供SAE可用的Memcache缓存驱动,这个解决比较简单,直接写一个服务提供者注册到app.php即可,然后在configcache.php中注册,具体实现看项目源码
#4 日志处理
这也是一个比较棘手的问题,由于Laravel 5.1的日志处理已经不是和4一样使用服务提供者,而且直接注入到启动器中,这就使得我们只能覆写原生ConfigureLogging启动类,而官方也没有给出如何覆写和在哪里覆写,所以我这边的解决方案是判断当前环境为SAE后直接重写Http内核中的一个启动器属性,核心代码:
namespace IlluminateCloudSAE;
use AppHttpKernel as DefaultKernel;
class Kernel extends DefaultKernel{
/**
* The bootstrap classes for the application.
*
* @var array
*/
protected $bootstrappers = [
'IlluminateFoundationBootstrapDetectEnvironment',
'IlluminateFoundationBootstrapLoadConfiguration',
'IlluminateCloudSAELogConfigureLogging',
'IlluminateFoundationBootstrapHandleExceptions',
'IlluminateFoundationBootstrapRegisterFacades',
'IlluminateFoundationBootstrapRegisterProviders',
'IlluminateFoundationBootstrapBootProviders',
];
}







