我正在使用 Symfony 4.1。我正在尝试创建一个只能从“开发”环境中访问的路由“/dev/import/{file}”。
Symfony 2 的这个答案建议将路由routing_dev.yml添加condition: "request.getScriptName() == '/app_dev.php'"到或添加到您的路由定义。
这两种选择都不起作用。在 Symfony 4 中没有routing_dev.yml,现在是dev\routing_dev.YAML,据我所知只是配置(即你不能在那里创建路由)。必须定义routes.yaml适用于所有环境的路线。
添加路由routes.yaml和应用条件也不起作用,因为我们试图匹配app_dev前端控制器,它已在 Symfony 4 中删除。
根据Symfony 4 文档,路由中的条件仅公开Context和Request对象,两者(AFAICT)都不包含有关当前环境的任何信息。所以,除非我遗漏了什么,否则其他条件也不起作用。
一种可能的,但(恕我直言)不优雅的解决方案是$_SERVER['APP_ENV'] = 'dev'在控制器中检查它,RouteNotFoundException如果没有则抛出一个。
而不是这样做,我真的希望要么在不在“开发”中时根本不可用路线,要么以某种方式定义路线以测试“开发”环境。
关于如何做到这一点的任何想法?最好使用注释。
所以我有一个 Symfony 控制器,我通过参数将所需的服务注入到我的方法中。
MySqlGroupDAO $groupDAO此控制器类的所有方法都使用参数 ( ) 之一。
目前,我将“通用”参数作为每个方法中的最后一个参数传递,如下所示:
/**
* @Route("/{id}", methods={"POST"})
* @IsGranted("EDIT_GROUP", subject="parentGroup")
*/
public function addGroup(Request $request, MySqlGroupDAO $groupDAO) {
$group = new Group();
//code to init group from request
$groupDAO->addGroup($group);
return new Response("Adding $groupName");
}
Run Code Online (Sandbox Code Playgroud)
这样做可以让我消除我的__construct方法。但是,我不确定这是最好的方法。由于它在所有方法中都很常见,因此最好重新添加我的构造函数并执行以下操作吗?:
private $groupDAO;
public function __construct(
Config $config,
ValidatorInterface $validator,
TranslatorInterface $translator,
RequestStack $requestStack
) {
parent::__construct($config, $validator, $translator, $requestStack);
$this->groupDAO = new MySqlGroupDAO($config);
}
/**
* @Route("/{id}", methods={"POST"})
* @IsGranted("EDIT_GROUP", subject="parentGroup")
*/
public function addGroup(Request $request) …Run Code Online (Sandbox Code Playgroud) 在PHP中,我想知道以下功能是否相同?
class Foo {
public $bar;
...
public function setBar($bar) {
$this->bar = (array)$bar;
}
}
class Foo {
public $bar;
...
public function setBar(array $bar) {
$this->bar = $bar;
}
}
Run Code Online (Sandbox Code Playgroud)
哪两个被认为是最佳做法?两者都有意义吗?:
class Foo {
public $bar;
...
public function setBar(array $bar) {
$this->bar = (array)$bar;
}
}
Run Code Online (Sandbox Code Playgroud) 在命名空间中创建全局函数(并从全局命名空间调用它)之间的区别是什么:
<?php
namespace MyNamespace {
function MyFunction($x, $y) {
return $x + $y;
}
}
namespace { //global code... in a new file
var_dump(MyNamespace\MyFunction(1,2));
}
Run Code Online (Sandbox Code Playgroud)
并创建一个静态类方法,并从全局命名空间调用?:
<?php
class MyClass {
public static function MyFunction($x, $y) {
return $x + $y;
}
}
var_dump(MyClass::MyFunction(1,2));
Run Code Online (Sandbox Code Playgroud)
是否有理由更喜欢一种方法而不是另一种方法?
在 PHP 中,当我为应该返回类实例的方法指定返回类型时,我可以这样做:
class Foo {
public function bar(): self { ... }
}
Run Code Online (Sandbox Code Playgroud)
或者:
class Foo {
public function bar(): Foo { ... }
}
Run Code Online (Sandbox Code Playgroud)
两者似乎产生相同的结果/行为。
有什么不同?一种最佳实践优于另一种吗?
谢谢。
我有一个 POPO(普通旧 PHP 对象):
namespace App\Objects;
class POPO {
private $foo;
private $bar;
// getters and setters //
}
Run Code Online (Sandbox Code Playgroud)
在其他地方,我有一个(详细信息 - 该类做什么并不重要)类需要知道 POPO 属性的名称。POPO 不会传递到此类中,此类也不实例化 POPO 或关心其属性的值。
class POPODetails {
private $POPOclassName = "App\Object\POPO"; //determined programatically elsewhere.
public getProperties(): array {
return get_class_vars($this->POPOClassName); //this will only return public properties.
}
}
Run Code Online (Sandbox Code Playgroud)
要使用,get_object_vars我需要传入一个实例化对象,否则我不需要该对象,并且仍然只能获取公共属性。我可以使用ReflectionClass::getProperties(),但还需要传入一个实例化对象。
那么,有没有一种方法可以仅使用完全限定类名来获取类变量列表?
php ×6
symfony ×2
type-hinting ×2
casting ×1
constructor ×1
global ×1
namespaces ×1
reflection ×1
return-type ×1
routes ×1
setter ×1
static ×1
symfony4 ×1