php laravel弹性设计

laravel

简洁优雅的php开发框架,采用了大量设计模式,让代码高内聚,低耦合。开发效率大幅提升,同时可维护性也大大提升。

弹性设计

简单的小项目可能会把数据库查询,业务逻辑,数据传给View几乎所有操作都放在Controller,如何项目后期需求变大,最后Controller会变得很臃肿,难懂,不易维护(同样,有些会把所有增删改查,功能类写在Model,Controller再从Model一个个的拿,导致Model很乱,Model有关联表的时候可能会引起一些不必要的数据库查询)

我们可以采用添加service层,presenter层,formatter层来对数据业务逻辑等进行处理,方便代码的优化,而这些也是java种spring的设计思想。

Repository

使用 repositories

其实完成整个repository模式需要相当多的步骤,但是一旦你完成几次就会自然而然变成了一种习惯了,下面我们将详细介绍每一步。

1.创建 Repository 文件夹

首先我们需要在app文件夹创建自己Repository 文件夹repositories(类似于Model,也可以说这就是个Model,哈哈),然后文件夹的每一个文件都要设置相应的命名空间。(这是重点,笔者就曾经进过忘记设置相应的命名空间的坑,悔恨中…)

2: 创建相应的 Interface类

第二步创建对应的接口,其决定着我们的repository类必须要实现的相关方法,如

<?php 
namespace App\Repositories;

interface HouseRepositoryInterface {

    public function selectAll();

    public function find($id);
}

3:创建对应的 Repository类

现在我们可以创建我们repository类 来给我们干活了,在这个类文件中我们可以把我们的绝大多数的数据库查询都放进去,不论多么复杂。 (创建一个DBRepository工厂类,具体的逻辑在这里写就可以了,和数据库互动在这里写就可以)

<?php 
namespace App\Repositories;
use House;

class DbHouseRepository implements HouseRepositoryInterface { 

    public function selectAll()
    {
        return House::all();
    }
    public function find($id)
    {
        return House::find($id);
    }
}

4:创建后端服务提供,也就是我们经常使用的serviceprovider.

<?php 

namespace App\Repositories;
use IlluminateSupportSeriveProvider;

class BackSerivePrivider extends ServiceProvider {

    public function register()
    {
       $this->app->bind(
            'App\Repositories\HouseRepositoryInterface', 
            'App\Repositories\DbHouseRepository');
    }
}

当然你也可以新建一个文件夹主要放我们的provider相关文件。

5:更新你的Providers Array

其实在上面的代码中,我们已经实现了一个依赖注入,但如果我们要使用在此我们是需要手动去写的,为了更为方面,我们需要增加这个providers 到app/config/app.php 中的 providers数组里面,只需要在最后加上

App\Repositories\BackendServiceProvider::class,

6:最后使用依赖注入更新你的controller 当我们完成上面的那些内容之后,我们在Controller只需要简单的调用方法代替之前的复杂的数据库调用,如下面内容:

<?php 

use App\repositories\HouseRepositoryInterface;

class HousesController extends BaseController {
    protected $house;

    public function __construct(HouseRepositoryInterface $house)
    {
        $this->house = $house;
    }

    public function index()
    {
        $houses = $this->house->selectAll();

        return View::make('houses.index', compact('houses'));

    }

    public function create()
    {
        return View::make('houses.create');
    }

    public function show($id)
    {
        $house = $this->house->find($id);

        return View::make('houses.show', compact('house'));

    }
}

总结

因为将所有的业务逻辑放入到controller层会导致c层过于臃肿,因此,我们选择拆分,让controller层变得简单,这样我们就需要添加一些其它的业务逻辑层。