我有几个大的Symfony项目,并注意到在将所有内容更新到Symfony 4(Flex)之后,当我们的部署自动化运行其正常过程时:
composer install --no-dev
我们最终得到(例如)这个:
Symfony operations: 2 recipes (72fad9713126cf1479bb25a53d64d744)
- Unconfiguring symfony/maker-bundle (>=1.0): From github.com/symfony/recipes:master
- Unconfiguring phpunit/phpunit (>=4.7): From github.com/symfony/recipes:master
Run Code Online (Sandbox Code Playgroud)
然后,正如预期的那样,这会导致更改为symfony.lock和config/bundles.php,以及其他任何内容,具体取决于其中包含require-dev的内容composer.json.
这些都不是完全破坏,但让生产部署不再具有干净的git status输出是令人讨厌的,并且可能导致对实际部署的内容产生混淆.
对此有各种解决方法,例如我可以放入所有内容require而不是require-dev因为在部署这些内容时没有真正的危害,或者我可以省略--no-devComposer命令的一部分.
但实际上,这里的正确做法是什么?如果您只是部署一个锁定的软件,就没有办法告诉Flex不对配置进行任何更改,这似乎很奇怪.这是一个功能请求,还是我在这里错过了一些配置?
我们在Rails下有一个大型的多开发人员项目,我们正在使用模型和控制器的测试.现在,开发人员必须在运行测试之前切换"测试"环境的数据库参数以匹配其本地开发环境.我想知道是否有办法在"测试"以外的任何环境中运行这些测试?
例如我们在database.yml中:
test:
database: ...
host: ...
username: ...
password: ...
...
dev-one:
...
dev-two:
...
Run Code Online (Sandbox Code Playgroud)
我在文档中找不到任何关于此的内容,但也许我在找错了地方.有任何想法吗?
谢谢!
使用Symfony2和FOSRestBundle我试图实现API方法,这些方法在路由中定义了一些固定参数以及查询字符串中可能存在的一些可选参数.
例如:
http://somesite.com/api/method/a/b
http://somesite.com/api/method/c/d?x=1&y=2
Run Code Online (Sandbox Code Playgroud)
根据FOSRestBundle的文档,ParamFetcher是使用@QueryParam注释执行此操作的正确方法.但是,我已经有一个控制器定义如下:
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FOS\RestBundle\Controller\Annotations\Get;
use FOS\RestBundle\Controller\Annotations\View;
class MyController extends Controller
{
/**
* @Get("/method/{a}/{b}")
* @View()
*/
public function getMethodAction($a, $b)
{
// do stuff
return array('foo' => 'bar');
}
}
Run Code Online (Sandbox Code Playgroud)
现在看来我需要能够访问ParamFetcher的实例,但我不知道如何(谷歌搜索没有多大帮助).我从文档中知道我可以简单地更改方法签名以包含ParamFetcher,但是,当我这样做时,它将参数移动到查询字符串中,这是我不能拥有的.
有没有办法混合两者,或者我应该放弃ParamFetcher并直接使用Symfomy的内置Request对象检查请求?
从Symfony 2.7开始,Symfony PHPUnit Bridge已经被创建为从测试中获取弃用通知的好方法(参见相关的Symfony博客条目).作为此软件包的一部分,垃圾收集也已被禁用,这似乎使大型测试套件的内存占用空间失控.
例如,没有桥:
Time: 5.01 minutes, Memory: 964.75Mb
OK, but incomplete, skipped, or risky tests!
Tests: 1189, Assertions: 2380, Incomplete: 2.
Run Code Online (Sandbox Code Playgroud)
并且启用了桥接的相同测试套件:
Time: 4.98 minutes, Memory: 3003.00Mb
OK, but incomplete, skipped, or risky tests!
Tests: 1189, Assertions: 2380, Incomplete: 2.
Remaining deprecation notices (9)
Run Code Online (Sandbox Code Playgroud)
在文档中,注意到在测试期间删除垃圾收集旨在减少在某些条件下发生的分段错误,这不是我们尚未经历过的.
我意识到我们可以在特定于应用程序的PHPUnit引导文件中重新启用垃圾收集,或者我们也可以从自动加载器中删除桥接并手动仅注册弃用处理程序.不过,我更感兴趣的是这个包含背后的意图(事实上,可能缺少的是关于如何避免这种行为的一些文档).
除此之外,为了处理这个问题,我们必须对我们构建测试的方式进行相关更改吗?这是一个测试套件,包括许多全栈功能测试和诸如此类的东西.看起来没有垃圾收集的运行可能会破坏许多大型测试套件,除非我遗漏了一些东西.
这是在PHP 5.5.9,PHPUnit 4.7.7和Symfony 2.7.3下.
我想知道是否有可能在FOSRestBundle方法中定义路由,指定格式除了前面的"点"以外的东西.
例如,假设我想要以下工作:
http://somesite.com/api/user/20 (renders in the default/fallback format)
http://somesite.com/api/user/20/json (renders in JSON)
http://somesite.com/api/user/20/xml (renders in XML)
Run Code Online (Sandbox Code Playgroud)
如果我尝试定义如下路线:
/**
* @Get("/user/{id}/{_format}
*/
public function getUserAction($id)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
Route pattern "/api/users/{maximum}/{_format}.{_format}" cannot reference variable name "_format" more than once.
这让我意识到它 - 并且由此我假设我们正在谈论FOSRestBundle而不是默认的Symfony2 - 自动将".{_ format}"添加到我定义的任何路径的末尾.我很惊讶!
所以现在,在我之前的例子中,它的工作原理如下:
http://somesite.com/api/user/20 (renders in the default/fallback format)
http://somesite.com/api/user/20.json (renders in JSON)
http://somesite.com/api/user/20.xml (renders in XML)
Run Code Online (Sandbox Code Playgroud)
确实有一点不同,但是,我试图移植使用此语法的遗留应用程序.我正在尝试做什么?如果是这样,我如何禁用每个路由的".{_ format}"自动添加?
谢谢!
我试图将Doctrine模型包装在PostgreSQL中的遗留数据库表中,该表具有:
Column | Type | Modifiers
------------+--------------------------+------------------------------------------------------
id | integer | not null default nextval('table_name_id_seq'::regclass)
Run Code Online (Sandbox Code Playgroud)
如果我尝试映射,如:
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer", unique=true)
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
Run Code Online (Sandbox Code Playgroud)
然后架构更新工具给我这个:
ALTER TABLE table_name ALTER id DROP DEFAULT;
Run Code Online (Sandbox Code Playgroud)
如果我尝试显式定义默认值,例如:
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer", unique=true, options={"default"="nextval('table_name_id_seq'::regclass)"})
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
Run Code Online (Sandbox Code Playgroud)
然后它仍然给出:
ALTER TABLE table_name ALTER id SET DEFAULT nextval('table_name_id_seq'::regclass);
ALTER TABLE table_name ALTER id DROP DEFAULT;
Run Code Online (Sandbox Code Playgroud)
最后,如果我尝试手动指定序列:
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer", unique=true)
* @ORM\GeneratedValue(strategy="SEQUENCE")
* @ORM\SequenceGenerator(sequenceName="table_name_id_seq", initialValue=1, allocationSize=1) …Run Code Online (Sandbox Code Playgroud) symfony ×5
symfony-2.1 ×2
composer-php ×1
doctrine ×1
php ×1
phpunit ×1
postgresql ×1
symfony-flex ×1
symfony4 ×1
testing ×1
unit-testing ×1