小编Mic*_*icE的帖子

具有对象初始化的工厂类 - 试图避免静态

我正在尝试为我们的系统设计一组工厂类,其中工厂创建的一些对象也需要在正确使用之前进行初始化.

例:

$foobar = new Foobar();
$foobar->init( $qux, ... );
// $foobar ready for usage
Run Code Online (Sandbox Code Playgroud)

对于相同的示例,假设该$qux对象是唯一Foobar需要的依赖项.我想要的是:

$foobar = Foo_Factory( 'bar' );
Run Code Online (Sandbox Code Playgroud)

为了避免需要$qux在整个系统中传递对象并将其作为另一个参数传递给工厂类,我想Foobar直接在工厂类中执行初始化:

class Foo_Factory {

    public static function getFoo( $type ) {

        // some processing here
        $foo_name = 'Foo' . $type;
        $foo = new $foo_name();
        $foo->init( $qux );

        return $foo;
    }

}
Run Code Online (Sandbox Code Playgroud)

想到的解决方案很少,但没有一个是理想的:

  1. 将静态setter方法添加$qux到工厂类,并让它将引用存储$qux在私有静态变量中.系统可以$qux在开始时设置,工厂类可以防止将来的任何更改(出于安全原因).
    虽然这种方法有效,但是$qux在单元测试期间使用静态参数来存储引用是有问题的(例如,由于其静态状态,它很快就能在各个测试之间存活).
  2. 使用Singleton模式创建一个新的上下文类,并让工厂类使用它来获取对它的引用$qux.这可能比选项#1更简洁一些(尽管我们将静态问题从工厂类移到上下文类).
  3. 一直使用依赖注入,即传递$qux给使用工厂类的任何对象,并让该对象将其作为另一个参数传递给工厂类:Foo_Factory::getFoo($type, $qux);. …

php static factory-pattern

7
推荐指数
1
解决办法
1589
查看次数

Sonata Admin Dashboard:配置每个实体的操作

我正在使用SonataAdminBundle作为Symfony2(v2.0.x)驱动的网站的管理界面的基础.

在SonataAdmin中添加到仪表板的实体默认情况下具有以下操作:

  • 名单

这适用于大多数实体,但是该网站有一些实体,其数据不是通过管理界面添加的 - 即它们是从面向公众的网站输入的.管理员只需要查看它们(仪表板中的"列表"操作),编辑它们或删除它们.管理员不应该能够向这些实体添加数据.

有没有办法配置SonataAdmin仪表板中各个实体旁边显示哪些操作?

php symfony symfony-sonata sonata-admin

5
推荐指数
2
解决办法
3680
查看次数

如何在输入/输出中保持FK的表示统一(RESTful JSON API)

我们正在编写第一个非XML API,我想问一下在API中表示相关资源的最佳实践.让我解释一下user资源及其相关资源 - organization.

XML中,这非常简单:

  1. 响应主体(GET) - 它包含资源ID和URI:

    GET /users/321/
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <user>
        <!-- ... --->
        <organization name="Lorem Ipsum Ltd." href="/organizations/123/">123</organization>
    </user>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 请求正文(POST/PUT/PATCH) - 使用ID:

    PATCH /users/321
    
    ...&organization=123
    
    Run Code Online (Sandbox Code Playgroud)
  3. URI过滤器 - 使用相关资源的ID:

    GET /users/?organization=123
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <users>
        <!-- ... --->
    </users>
    
    Run Code Online (Sandbox Code Playgroud)

现在,由于JSON不使用属性,因此它不是1:1的过渡.

  1. 响应机构(GET):

    我们不是使用ID作为值,而是切换到URI以遵守REST的连通性原则:

    GET /users/321/
    
    {
        ...,
        "organization": "/organizations/123"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 请求正文(POST/PUT/PATCH) - 接受URI(为了便于阅读,未编码的示例):

    PATCH /users/321
    
    ...&organization=/organizations/123/
    
    Run Code Online (Sandbox Code Playgroud)
  3. URI过滤器 - 为了保持URI清洁,我们在通过GET参数进行过滤时仍然使用ID而不是URI:

    GET /users/?organization=123
    
    {
        "users": [
            ...
        ]
    }
    
    Run Code Online (Sandbox Code Playgroud)

最后一位打破值的请求和响应之间的一致性(ID与URI),但我们宁愿使用ID,而不是URI的,因为ID是更具可读性和因为有可能是我们需要把多个值的情况下,过滤器(例如?organization__in=123,124 …

api rest json

5
推荐指数
1
解决办法
204
查看次数

如何在Django中预取聚合的@property?

我们有两个型号(简化版):

class Contestant(models.Model):
    email = models.EmailField(max_length=255, unique=True)
    # plus some other fields

    @property
    def total_points(self):
        return self.points.aggregate(total=Sum('value'))['total'] or 0

class Points(models.Model):
    contestant = models.ForeignKey(Contestant, related_name='points')
    value = models.PositiveIntegerField()
    # plus some other fields which determine based on what we
    # awarded ``Points.value``
Run Code Online (Sandbox Code Playgroud)

当我们显示参赛者名单及其total_points价值时,会导致对每个结果进行额外查询 - 即执行以下查询:

  1. 获取参赛者名单
  2. 取得total_points第一名选手的价值
  3. 取得total_points第二名选手的价值
  4. 等等

我尝试更改查询集以预取数据,如下所示:

Contestant.objects.filter(...).prefetch_related('points')
Run Code Online (Sandbox Code Playgroud)

...,但即使它有效,在列出参赛者时也不会使用预取数据(因此每个结果仍然会尝试total_points 在单独的查询中获取).

是否有可能:

  • 以某种方式告诉ORM在为各个模型对象填充数据时使用@property字段的预取值(例如,访问Contestant.total_points@property方法中的预取值)?
  • 或者以不同的方式预取它们(与上面的例子相反)?
  • 或者使用完全不同的方法来实现相同的结果?

(tastypie如果重要的话,我会列出结果.)

谢谢.

django orm aggregate

5
推荐指数
1
解决办法
3978
查看次数

Django + solr.thumbnail:get_thumbnail() 在测试环境中失败

我正在尝试找到一种在使用 Django 和 的sorl-thumbnail方法时测试缩略图生成的方法get_thumbnail()

环境:

Django==1.5.5
Pillow==2.1.0
sorl-thumbnail==11.12
Run Code Online (Sandbox Code Playgroud)

测试中的简化代码(在测试环境中运行):

from StringIO import StringIO
from PIL import Image

from django.conf import settings
from django.core.files.uploadedfile import InMemoryUploadedFile
from django.db import models
from sorl.thumbnail import get_thumbnail

# simple class with ImageField
class User(models.Model):
    avatar = models.ImageField(upload_to='avatars', default=None, null=True, blank=True)

    def get_thumbnail_uri(self):
        avatar_thumbnail = get_thumbnail(self.avatar, '100x100')

        return avatar_thumbnail.url

# make sure we're using in-memory test env.
assert settings.THUMBNAIL_STORAGE  == 'inmemorystorage.InMemoryStorage'
assert settings.DEFAULT_FILE_STORAGE == 'inmemorystorage.InMemoryStorage'

# prepare image
fake_file = StringIO() …
Run Code Online (Sandbox Code Playgroud)

python testing django sorl-thumbnail

5
推荐指数
1
解决办法
1002
查看次数

如何在RESTful Web应用程序中映射不同的UI视图?

我正在设计一个Web应用程序,它将支持标准UI(通过浏览器访问)和RESTful API(基于XML/JSON的Web服务).用户代理将能够通过在AcceptHTTP标头中使用不同的值来区分它们.

RESTful API将使用以下URI结构("article"资源的示例):

  • GET /article/ - 获取文章列表
  • POST /article/ - 添加一篇新文章
  • PUT /article/{id} - 根据更新现有文章 {id}
  • DELETE /article/{id} - 删除基于的现有文章 {id}

但是,应用程序的UI部分需要支持多个视图,例如:

  • 标准资源视图
  • 提交新资源的视图
  • 用于编辑现有资源的视图
  • 删除现有资源的视图(即显示删除确认)

请注意,后三个视图仍然可以通过GET,即使它们是通过重载处理的POST.


可能的解决方案:
在URI中引入额外的参数(关键字)来识别各个视图 - 即,除此之外,应用程序将支持以下URI(但仅适用于Content-Type: text/html):

  • GET /article/add- 显示添加新文章的表单(通过GET,通过处理获取POST)
  • GET /article/123- 以"查看"模式显示文章123(通过提取GET)
  • GET /article/123/edit- 以"编辑"模式显示文章123(GET通过PUT重载获取,通过重载处理POST)
  • GET /article/123/delete- 显示第123条的"删除"确认(GET通过DELETE重载处理,通过重载处理POST)

更好的实现可能是将add/edit/delete关键字放入GET参数中 - 因为它们不会更改我们正在使用的资源,所以最好保持基URI同样适用于所有这些.


我的问题是:
考虑到每个资源可以有多个视图,您如何将上述URI结构映射到提供给普通用户的UI?您是否同意上述可能的解决方案,或者您是否会根据您的经验推荐不同的方法? …

architecture rest user-interface web-services

2
推荐指数
1
解决办法
1521
查看次数