使用Doctrine命令在Symfony2应用程序中生成CRUD时,生成的Twig模板内容以这种方式在Twig块中定义:
{% block body -%}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
连字符-%}
是什么意思?没有连字符它工作正常,我在Twig文档中找不到类似的东西.
嫩枝使用{{ }}
,{% %}
,{# #}
分隔符.
但是如何{{ }}
在Twig模板中显示?我不是在谈论HTML转义.
我问这个问题,因为我想在我的Twig模板中包含一个小胡子模板,这样我就可以填充来自AJAX调用的数据.
我不确定我的问题是否相关,因为我可能会尝试混合不应混合的工具(Capistrano和Docker).
我最近使用Capistrano部署了一个部署的应用程序.Docker compose用于开发和登台环境.
这就是我的项目的样子(应用程序文件未显示):
Capfile
docker-compose.yml
docker-compose.staging.yml
config/
deploy.rb
deploy
staging.rb
Run Code Online (Sandbox Code Playgroud)
Docker Compose文件创建了所有必要的容器(Nginx,PHP,MongoDB,Elasticsearch等),以便在开发或登台环境中运行应用程序(因此定义了一些特定的参数docker-compose.staging.yml
).
使用以下命令将应用程序部署到登台环境:
cap staging deploy
Run Code Online (Sandbox Code Playgroud)
服务器上的文件夹架构是Capistrano之一:
current
releases
20160912150720
20160912151003
20160912153905
shared
Run Code Online (Sandbox Code Playgroud)
已在current
登台服务器的目录中运行以下命令,以实例化运行应用程序所需的所有容器:
docker-compose -f docker-compose.yml -f docker-compose.staging.yml up -d
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.在下一次部署时,事情变得更加复杂:current
符号链接将指向目录的新releases
目录:
deploy.rb
定义了需要在容器内执行的命令(比如docker-compose exec php composer install
PHP),Docker会告诉容器尚不存在(因为现有的容器是在前一个发行版文件夹中创建的).docker-compose up -d
在Capistrano部署过程中执行命令,由于端口冲突(前面的容器仍然存在),我会收到一些错误.您对如何解决此问题有所了解吗?我是否应该离开卡皮斯特拉诺并做些不同的事情?
我们的想法是保持Capistrano提供的(近乎)零停机时间部署以及Docker容器的灵活性(例如,为同一服务器上的各种应用程序提供多个PHP版本).
我有一组变量,我想在Twig模板中显示,每个变量可以是字符串或日期.
如果变量是日期,我想像这样应用date
过滤器:
{{ my_var|date('d/m/Y') }}
Run Code Online (Sandbox Code Playgroud)
如果它是一个字符串,我希望它以通常的方式显示它:
{{ my_var }}
Run Code Online (Sandbox Code Playgroud)
有没有办法测试变量是否是日期(即PHP DateTime对象的实例)?
如果我有这样的文件:
[
{
"model": "iPhone",
"brand": "Apple"
},
{
"model": "Nexus 5",
"brand": "Google"
}
]
Run Code Online (Sandbox Code Playgroud)
而且我创建的查询只返回查询中的model
字段,如下所示:
{
"fields": ["model"],
"query": {
"term": {
"brand": "apple"
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在数组中返回每个文档字段,如下所示:
{ "model": ["iPhone"] }
Run Code Online (Sandbox Code Playgroud)
代替
{ "model": "iPhone" }
Run Code Online (Sandbox Code Playgroud)
如何避免这种情况并使用与fields
未定义查询选项时相同的格式获取字段?
我配置了Symfony和FOSHttpCacheBundle(遵循FOSHttpCache文档中的Varnish配置说明).
我向控制器添加了一个动作,test
在响应HTTP标头中添加了一个标记:
<?php
use FOS\HttpCacheBundle\Configuration\Tag;
class MyController extends Controller
{
/**
* @Route("/test1", name="acme_my_test1")
* @Tag("test")
*/
public function test1Action()
{
return new Response(rand(0, 1000));
}
}
Run Code Online (Sandbox Code Playgroud)
但是,每当我调用/test1
URL时,数字都会更改,表示缓存未处于活动状态.请注意,我的应用程序不使用任何cookie,我可以测试X-Cache-Tags
标题是否发送到Varnish(由于该vlc_deliver
指令,它将其在对浏览器的响应中剥离).
在配置中有什么我会错过的吗?Varnish和Nginx都在同一台服务器上运行.
以下是我的Symfony config.yml
文件中与HTTP缓存相关的配置:
framework:
trusted_hosts: ~
trusted_proxies: [127.0.0.1]
fos_http_cache:
proxy_client:
varnish:
servers: 127.0.0.1:80
base_url: mywebsite.localhost.com
tags:
enabled: true
Run Code Online (Sandbox Code Playgroud)
和Varnish配置/etc/varnish/default.vcl
:
vcl 4.0;
backend default {
.host = "127.0.0.1";
.port = "8080";
}
acl invalidators {
"localhost";
}
sub vcl_recv { …
Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多关于RabbitMQ集成到Symfony应用程序的文章.
所述RabbitMqBundle使得它很容易忘恩它,并且它提供了方便的rabbitmq:consumer
命令从像这样的队列的消息:
app/console rabbitmq:consumer -m 50 upload_picture
Run Code Online (Sandbox Code Playgroud)
不过我有一个问题.您是否应该建议将此命令添加到crontab?有没有关于它的最佳实践?
我有一个要在页面上显示的项目列表,上面有一个搜索表单来过滤这些项目,就像在任何通常的后端一样.问题是我不知道如何将搜索条件添加到带有连接的现有查询中...这就是我所拥有的:
我在与实体关联的存储库上使用特定方法来在查询上添加联接(以避免许多查询).控制器看起来像这样:
class ModelController extends Controller
{
public function indexAction(Request $request)
{
// ...
$em = $this->getDoctrine()->getManager();
$query = $em->getRepository('AcmeDemoBundle:Item')->getList();
}
}
Run Code Online (Sandbox Code Playgroud)
在getList
对信息库的方法如下:
use Doctrine\ORM\EntityRepository;
// ...
class ItemRepository extends EntityRepository
{
public function getList()
{
$queryBuilder = $this
->createQueryBuilder('i')
->innerJoin('i.brand', 'b');
return $queryBuilder->getQuery();
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个ItemSearchType
包含多个字段的表单对象来搜索项目.
如何从搜索表单中提供的数据轻松添加搜索条件以显示已过滤的项目?
这是我的控制器中有关搜索表单的内容:
class ModelController extends Controller
{
public function indexAction(Request $request)
{
// ...
if ($request->getMethod() === 'POST') {
$searchForm->bindRequest($request);
if ($searchForm->isValid()) {
$searchCriteria = $searchForm->getData();
// Do something …
Run Code Online (Sandbox Code Playgroud) 我对Symfony2中实现访问控制列表的方式感到有点不安.
在Zend Framework(版本1和版本2)中,定义了资源列表和角色列表,并为每个角色分配了允许访问的资源子集.因此,资源和角色是ACL实现的主要词汇,而Symfony2则不是这种情况,只有角色才是规则.
在遗留应用数据库中,我有表定义角色列表,资源列表和每个角色允许资源列表(多对多关系).为每个用户分配一个角色(管理员,超级管理员,编辑器等).
我需要在Symfony2应用程序中使用这个数据库.我的资源如下所示:ARTICLE_EDIT,ARTICLE_WRITE,COMMENT_EDIT等.
我User
在Symfony中的实体实现了Symfony\Component\Security\Core\User\UserInterface
接口,因此有一个getRoles)
方法.
我打算使用这种方法来定义允许的资源,这意味着我使用角色作为资源(我的意思是Zend Framework中所谓的资源在这里被称为角色).
你确认我应该使用这种方法吗?
这意味着我不再关心每个用户的角色(管理员,编辑器......),而只关心其资源.
然后我会$this->get('security.context')->isGranted('ROLE_ARTICLE_WRITE')
在我的控制器中使用.
这是正确的方法吗?在Symfony中使用角色不是一种规避的方法吗?
我有一个现有的PostgreSQL数据库,其中包含如下所示的表:
CREATE TABLE product (id SERIAL PRIMARY KEY, name VARCHAR(100) DEFAULT NULL)
Run Code Online (Sandbox Code Playgroud)
该表在Symfony2项目中的YML Doctrine2文件中描述:
Acme\DemoBundle\Entity\Product:
type: entity
table: product
fields:
id:
id: true
type: integer
nullable: false
generator:
strategy: SEQUENCE
name:
type: string
length: 100
nullable: true
Run Code Online (Sandbox Code Playgroud)
当我第一次运行Doctrine Migrations diff任务时,我应该得到一个版本控制文件,其中没有数据up
和down
方法.但我得到的是这样的:
// ...
class Version20120807125808 extends AbstractMigration
{
public function up(Schema $schema)
{
// this up() migration is autogenerated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() != "postgresql");
$this->addSql("ALTER TABLE product ALTER id DROP DEFAULT");
}
public …
Run Code Online (Sandbox Code Playgroud) symfony ×4
twig ×3
doctrine-orm ×2
php ×2
acl ×1
capistrano3 ×1
deployment ×1
docker ×1
postgresql ×1
rabbitmq ×1
symfony-2.1 ×1
varnish ×1