如何在Silex中的自定义类中使用$ app?

twh*_*mon 1 php silex

我知道这看起来像我的自定义类和其他人中的Inject Silex $ app的副本,但我无法从他们的解决方案中获得它.

我这样定义我的服务:

$app['user.repo'] = function () {
    return new MyApp\Repository\User();
};
Run Code Online (Sandbox Code Playgroud)

我的班级看起来像这样:

<?php
namespace MyApp\Repository;
use Silex\Application; 

class User {
    public function findAll(Application $app) {
        $users = $app['db']->fetchAll('SELECT * FROM user');
        return $users;
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用这样的服务:

$users = $app['user.repo']->findAll($app);
Run Code Online (Sandbox Code Playgroud)

如果不放入$app我的所有方法,我怎么能做同样的事情呢?

Mae*_*lyn 6

你为什么不注射它?

$app['user.repo'] = function () use ($app) {
    return new MyApp\Repository\User($app);
};
Run Code Online (Sandbox Code Playgroud)

这是你修改过的课程:

<?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;
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至更好:不是注入整个应用程序(从而隐藏真正的依赖关系,使单元测试变得痛苦),而只注入你真正需要的东西:

$app['user.repo'] = function () use ($app) {
    return new MyApp\Repository\User($app["db"]);
};
Run Code Online (Sandbox Code Playgroud)

这样你的班级就变成:

<?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;
    }
}
Run Code Online (Sandbox Code Playgroud)