Laravel:有没有办法转换为依赖注入

时间:2014-06-30 05:16:59

标签: php laravel

我正在构建搜索功能。

速度优先从查询中获取结果,因此,我使用本机SQL。

结果取决于用户/组权限,关键字和搜索选项(名称,描述,全部等)。

该选项是可扩展的,因此最好使用依赖注入,但我无法弄清楚如何将它与此要求一起使用。

我知道“if”声明会正常工作。但是,我试图遵循“单一责任原则”并提出以下代码。

它目前工作正常,但它看起来不太正确。有没有办法将其转换为依赖注入?也许你可以帮助解释为什么下面的代码已经很好或者只是坏了并给我一个解决方案。

界面:

interface SearchQueryInterface
{
    public function searchQuery($user_id,$user_group, $keyword);      
}

实现接口的类:

// search by All
class SearchAll implements SearchQueryInterface{

    public function searchQuery($user_id,$user_group, $keyword)
    {
        // results = Select query based on $user_id, $user_group and $keyword
        // return query results;
    }
}

// search by Name
class SearchName implements SearchQueryInterface{

    public function searchQuery($user_id,$user_group, $keyword)
    {
        // results = Select query based on $user_id, $user_group and $keyword
        // return query results;
    }
}

// search by Description
class SearchDescription implements SearchQueryInterface{

    public function searchQuery($user_id,$user_group, $keyword)
    {
        // results = Select query based on $user_id, $user_group and $keyword
        // return query results;
    }
}

控制器:

class SearchController extends \BaseController {   

    public function postSearch()
    {
        $user_id = 2;
        $user_group = 1;

        $option = Input::get('search_option');
        $keyword = '%'. Input::get('search_keyword') .'%';

        // get the class based on option
        $search_query = App::make('Search'. $option );
        $results = $search_query->searchQuery($user_id,$user_group, $keyword);

        var_dump($results);
    }
}

1 个答案:

答案 0 :(得分:1)

你的问题很有趣。在第一句中你说“我正在建立一个搜索功能。”然后你想出了很多与对象相关的代码 - 而不是函数。

事实上,你在这里问的是哲学,而不是事实。所以我想,在这个论坛中没有人能够给你一个明确的过程或方法。所以你接触了几个问题,一组专家可以讨论多年。让我努力吧:

  1. 我是否需要Web应用程序中的对象?是的说法者认为代码的清晰度和作为常识模式的oop(因为他们的思维方式是对象)。没有说话者会指出你对http protocal的性质,强烈 - 实际上只是 - 很好地支持导入过程输出模式(可以通过oop解决,但oop不会增加功能编程的价值)。 / p>

  2. 您需要在哪里应用MVC模式? MVC-pros将这作为总体生命哲学,即使这些人甚至不能喝一杯咖啡而又无法告诉过程和所有获得的资产如何融入MVC。然后有些人倾向于将MVC扩展到任何方向,因此两个人显然会对MVC有不同的定义。第三组人将能够成功地质疑MVC的各个方面。

  3. 如何将对象映射到数据库?这本身就是一个很好的反模式。关系数据库的一个主要好处是,与同一主键相关的所有外键也彼此相关。对象的对象只存储指针。从包含对象的指针到另一个指针的结束数据需要有更多指针。所有这一切都必须保持。在那个对象上,heros发明了各种各样的性能,比如对象到数据库的映射,很明显,幸运的是,给定的示例代码段拒绝使用。

  4. 嗯,我想我可以做更多关于扩展和'class'-keyword和php中的对象符号以及名称空间和依赖注入以及所有这些事情。但是我害怕,我已经开始对我的言语提出一些挫败感。让我们不要悲伤,让我们停在这里。

    我唯一的建议是:如果你想构建一个搜索函数,只需这样做并删除所有这些开销,这会使你的函数成为一个对象。