【问题标题】:How can I use $app in custom classes in Silex?如何在 Silex 的自定义类中使用 $app?
【发布时间】:2023-03-16 06:19:01
【问题描述】:

我知道这看起来像是 Inject Silex $app in my custom class 和其他人的重复,但我无法从他们的解决方案中得到它。

我这样定义我的服务:

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

我的班级是这样的:

<?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 放在我的所有方法中,我怎么能做同样的事情?

【问题讨论】:

    标签: php silex


    【解决方案1】:

    为什么不注入呢?

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

    这是你修改后的类:

    <?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"]);
    };
    

    这样你的班级就变成了:

    <?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;
        }
    }
    

    【讨论】:

    • 谢谢。在我尝试注入并几乎使用相同的解决方案之前......我只是缺乏对类和基本 PHP 的理解。我有$db-&gt;fetchAll(..) 而不是$this-&gt;db-&gt;fetchAll(...)
    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多