如何在 Silex 的自定义 类 中使用 $app?
How can I use $app in custom classes in Silex?
我知道这看起来像是 Inject Silex $app in my custom class 和其他人的重复,但我无法从他们的解决方案中得到它。
我这样定义我的服务:
$app['user.repo'] = function () {
return new MyApp\Repository\User();
};
我的 class 看起来像这样:
<?php
namespace MyApp\Repository;
use Silex\Application;
class User {
public function findAll(Application $app) {
$users = $app['db']->fetchAll('SELECT * FROM user');
return $users;
}
}
我是这样使用服务的:
$users = $app['user.repo']->findAll($app);
如何在不将 $app
放入我的所有方法中的情况下做同样的事情?
为什么不注射呢?
$app['user.repo'] = function () use ($app) {
return new MyApp\Repository\User($app);
};
这是您修改后的 class:
<?php
namespace MyApp\Repository;
use Silex\Application;
class User {
/** @var Application */
protected $app;
public function __construct(Application $app) {
$this->app = $app;
}
public function findAll() {
$users = $app['db']->fetchAll('SELECT * FROM user');
return $users;
}
}
甚至更好:与其注入整个应用程序(从而隐藏您真正的依赖关系,使单元测试变得痛苦),不如注入您真正需要的东西:
$app['user.repo'] = function () use ($app) {
return new MyApp\Repository\User($app["db"]);
};
这样你的 class 就变成了:
<?php
namespace MyApp\Repository;
use Silex\Application;
class User {
protected $db;
public function __construct($db) {
$this->db = $db;
}
public function findAll() {
$users = $this->db->fetchAll('SELECT * FROM user');
return $users;
}
}
我知道这看起来像是 Inject Silex $app in my custom class 和其他人的重复,但我无法从他们的解决方案中得到它。
我这样定义我的服务:
$app['user.repo'] = function () {
return new MyApp\Repository\User();
};
我的 class 看起来像这样:
<?php
namespace MyApp\Repository;
use Silex\Application;
class User {
public function findAll(Application $app) {
$users = $app['db']->fetchAll('SELECT * FROM user');
return $users;
}
}
我是这样使用服务的:
$users = $app['user.repo']->findAll($app);
如何在不将 $app
放入我的所有方法中的情况下做同样的事情?
为什么不注射呢?
$app['user.repo'] = function () use ($app) {
return new MyApp\Repository\User($app);
};
这是您修改后的 class:
<?php
namespace MyApp\Repository;
use Silex\Application;
class User {
/** @var Application */
protected $app;
public function __construct(Application $app) {
$this->app = $app;
}
public function findAll() {
$users = $app['db']->fetchAll('SELECT * FROM user');
return $users;
}
}
甚至更好:与其注入整个应用程序(从而隐藏您真正的依赖关系,使单元测试变得痛苦),不如注入您真正需要的东西:
$app['user.repo'] = function () use ($app) {
return new MyApp\Repository\User($app["db"]);
};
这样你的 class 就变成了:
<?php
namespace MyApp\Repository;
use Silex\Application;
class User {
protected $db;
public function __construct($db) {
$this->db = $db;
}
public function findAll() {
$users = $this->db->fetchAll('SELECT * FROM user');
return $users;
}
}