symfony欧宝娱乐app下载地址 1.3新增功能:项目创建自定义
今天,我非常激动地宣布即将发布的symfony 1.3版本的一个很棒的新特性:自定义项目创建过程的能力。欧宝娱乐app下载地址让我来解释一下为什么它很有用,以及如何利用这个很酷的功能。
自定义生成:项目
任务
您可能知道,symfony任务是类。欧宝娱乐app下载地址与任何其他类一样,定制和扩展现有任务非常容易;除了其中之一:生成:项目
的任务。这是因为当你执行这个任务时,没有项目存在,所以没有办法自定义它…直到现在。该任务现在需要一个——安装程序
选项,这是一个PHP脚本,将在项目创建过程中执行:
$ PHP /path/to/欧宝娱乐app下载地址symfony生成:project——installer=/domewhere/fabien_installer.php
的URL文件访问
包括()
在你的php . ini
,你甚至可以传递一个URL作为安装程序(当然,当你对脚本一无所知时,你需要非常小心):$ 欧宝娱乐app下载地址symfony generate:project——installer=http://example.com/sf_installer.php
的上下文中执行此脚本sfGenerateProjectTask
实例,所以你可以访问它的所有方法来完成你的工作,有很多方法。
installDir ()
第一个有用的方法是installDir ()
.它允许您在新创建的项目中复制一堆文件。假设你想在默认的目录结构中添加一些文件,在一个框架目录下创建它们,并在安装程序脚本中添加以下代码:
这个美元->installDir(目录名(__FILE__)./骨架的);
runTask ()
方法运行另一个任务runTask ()
方法。它接受任务名称,以及一个表示参数和你想传递给它的选项的字符串:
这个美元->runTask(配置:作者的,“法比效力”);
你也可以将参数和选项作为数组传递:
这个美元->runTask(配置:作者的,数组(“作者”= >“法比效力”));
任务快捷方式名称也可以正常工作:
这个美元->runTask(“cc”);
你当然可以安装插件:
这个美元->runTask(“插件:安装”,“sfDoctrineGuardPlugin”);
如果你想安装一个特定版本的插件,只需将所需的选项追加到参数字符串:
这个美元->runTask(“插件:安装”,'sfDoctrineGuardPlugin——release=10.0.0——stability=beta');
如果你需要从新安装的插件中执行一个任务,不要忘记重新加载任务:
这个美元->reloadTasks();
伐木工人
当你在任务上下文中时,你可以很容易地记录事情:
//简单的日志这个美元->日志('一些安装消息');//记录一个数据块这个美元->logBlock(数组('',“法比安\ '“疯狂的安装者”,''),“错误”);//登录一个section这个美元->logSection(“安装”,安装一些疯狂的文件);
你可以要求确认:
如果(!这个美元->askConfirmation(“你确定要运行这个疯狂的安装程序吗?”)){这个美元->logSection(“安装”,“你做了正确的选择!”);返回;}
你也可以问任何问题:
美元的秘密=这个美元->问(为CSRF秘密提供一个唯一的字符串:);
或者问一个问题并验证答案:
美元的验证器=新sfValidatorEmail(数组(),数组(“无效”= >“嗯,这看起来不像一封电子邮件!”));美元的电子邮件=这个美元->askAndValidate(“请给我你的邮箱:”,美元的验证器);
文件系统操作
如果你想改变文件系统,你可以像这样访问文件系统对象:
这个美元->getFilesystem()- >…();
它只是一个PHP脚本
安装程序脚本只是另一个PHP文件。所以,你可以做任何你想做的事情。有创意!
示例脚本
下面是一个例子,它使用了上面描述的很多可能性:
<?php这个美元->logBlock(数组('',“法比安\ '“疯狂的安装者”,''),“错误”);如果(!这个美元->askConfirmation(“你确定要运行这个疯狂的安装程序吗?”)){这个美元->logSection(“安装”,“你做了正确的选择!”);返回;}这个美元->installDir(目录名(__FILE__)./骨架的);这个美元->runTask(“插件:发布资产”);美元的验证器=新sfValidatorEmail(数组(),数组(“无效”= >“嗯,这看起来不像一封电子邮件!”));美元的电子邮件=这个美元->askAndValidate(“请给我你的邮箱:”,美元的验证器);这个美元->runTask(配置:作者的,sprintf(“% s”,美元的电子邮件));美元的秘密=这个美元->问(为CSRF秘密提供一个唯一的字符串:);这个美元->runTask(“生成:应用”,'frontend -escaping-strategy=true -csrf-secret='.美元的秘密);这个美元->runTask(“插件:安装”,“sfDoctrineGuardPlugin”);这个美元->reloadTasks();这个美元->runTask(“警卫:创建用户”,“法比SuperPassword”);这个美元->runTask(“缓存:明确”的);
沙盒创建过程
你可能知道symfony沙盒。欧宝娱乐app下载地址这是一个预先打包的symfony项目,包欧宝娱乐app下载地址含一个现成的应用程序和一个预先配置的SQLite数据库。它可以帮助新手完全绕过命令行,因为他们只需要下载存档就可以使用了。
沙盒只不过是在创建存档之前执行的一堆命令。到目前为止,这项工作是由数据/ bin / create_sandbox.sh
脚本。从symfo欧宝娱乐app下载地址ny 1.3开始,它只是一个安装程序脚本。所以,你可以创建一个和沙盒一样的项目,就像这样:
$ PHP 欧宝娱乐app下载地址symfony generate:project——installer=/path/to/symfony/data/bin/sandbox_installer.php
创建沙盒有用吗?可能不会。但是你可以看看安装脚本,作为一个很好的例子,可以做什么:
这个美元->installDir(目录名(__FILE__).' / sandbox_skeleton ');这个美元->logSection(“安装”,为Wind欧宝娱乐app下载地址ows用户添加symfony CLI);这个美元->getFilesystem()->复制(目录名(__FILE__).' 欧宝娱乐app下载地址/ symfony.bat ', sfConfig::得到(“sf_root_dir”).' 欧宝娱乐app下载地址/ symfony.bat ');这个美元->logSection(“安装”,“添加许可证”);这个美元->getFilesystem()->复制(目录名(__FILE__).“/ . . / . . /许可证”, sfConfig::得到(“sf_root_dir”).“/许可证”);这个美元->logSection(“安装”,'默认为sqlite');这个美元->runTask(“配置:数据库”,sprintf(“‘sqlite: % s / sandbox.db’”, sfConfig::得到(“sf_data_dir”)));这个美元->logSection(“安装”,“创建应用程序”);这个美元->runTask(“生成:应用”,“前端”);这个美元->logSection(“安装”,“公布资产”);这个美元->runTask(“插件:发布资产”);这个美元->logSection(“安装”,修复sqlite数据库权限);触摸(sfConfig::得到(“sf_data_dir”).' / sandbox.db ');修改文件权限(sfConfig::得到(“sf_data_dir”),0777);修改文件权限(sfConfig::得到(“sf_data_dir”).' / sandbox.db ',0777);这个美元->logSection(“安装”,“在空目录中添加空文件”);见过美元=数组();foreach(新RecursiveIteratorIterator(新RecursiveDirectoryIterator(sfConfig::得到(“sf_root_dir”)), RecursiveIteratorIterator::CHILD_FIRST)作为美元的路径= >美元的项目){如果(美元的项目->isDir()& & !美元的项目->isLink()& & !收取(见过美元[美元的路径])){触摸(美元的项目->getRealPath().' / . sf ');}见过美元[美元的项目->getPath()]=真正的;}
差不多就是这样…
现在,您可以创建自己的安装程序脚本,并按照您想要的方式调整symfony项目安装,而不是每次创建新的symfony项目时都一次又一次地运行相同的任务。欧宝娱乐app下载地址
我希望您能找到这个新特性的有用用法。如果您创建了很棒的安装程序脚本,请与社区分享(在评论中复制URL)。欧宝下载链接
评论
评论截止。
为了确保评论保持相关性,旧帖子将被关闭。
谢谢。
如果通过http://?引用安装程序脚本,installDir将如何工作大概不会吧?
好了!
PS:我猜你第一个片段上的“domewhere”是个错别字。: -)
我使用自己之前创建的脚本进行自定义设置,但这看起来更可定制和扩展。