2014-07-26 24 views
0

在我的应用程序中,我使用ajax测试了Google Directions API,但由于我只是测试了所有逻辑,它们都在routes.php文件中。现在我想以正确的方式做事,并且有三层:路线,控制器和服务。在Laravel4上使用我自己的服务

所以在路线我告诉Laravel应执行方法:

Route::get('/search', '[email protected]'); 

而且方法只是返回哪些服务应该返回:

class DirectionsAPIController extends BaseController { 
    public function search() { 
     $directionsSearchService = new DirectionsSearchService(); 
     return $directionsSearchService->search(Input::all()); 
    } 
} 

app/libraries/Services/Directions创建的服务并将其命名为DirectionsSearchService.php并复制了我在路线中开发的所有逻辑:

class DirectionsSearchService { 
    public function search($input = array()) { 
     $origin = $input['origin']; 
     $destination = $input['destination']; 
     $mode = $input['mode']; 

     // do stuf... 

     return $data; 
    } 
} 

我读the docssome place else(和this太),并做了我应该做的注册服务:

class DirectionsAPIController extends BaseController { 
    public function search() { 
     App::register('libraries\Services\Directions\DirectionsSearchService'); 
     $directionsSearchService = new DirectionsSearchService(); 
     return $directionsSearchService->search(Input::all()); 
    } 
} 

// app/libraries/Services/Directions/DirectionsSearchService.php 
use Illuminate\Support\ServiceProvider; 

class DirectionsSearchService extends ServiceProvider { 
} 

我也试过在app/config/app.php添加libraries\Services\Directions\DirectionsSearchServiceproviders阵列。

不过,我得到这个错误:

HP Fatal error: Class 'libraries\Services\Directions\DirectionsSearchService' not found in /home/user/www/my-app-laravel/bootstrap/compiled.php on line 549

我在做什么错?什么是通常的方式来使用自己的服务?我不想把所有的逻辑控制器...

+0

友善的警告,你正在阅读Laravel 3文档在http://three.laravel.com/docs/models。自那以后,很多事情都发生了变化。 – Unnawut

回答

1

2您缺少主要的事情:

  1. 有一个的ServiceProvider和类之间的差异。 Laravel的服务提供商告诉Laravel去哪里寻找服务,但它不包含服务逻辑本身。所以DirectionsSearchService不应该是两个,恕我直言。
  2. 您需要注册您的课程composer.json,以便自动加载器知道您的课程存在。

为了保持简单,我将使用Laravel IoC的automatic resolution,而不是现在使用服务提供商。

应用程序/库/服务/路线/ DirectionsSearchService.php:

namespace Services\Directions; 

class DirectionsSearchService 
{ 
    public function search($input = array()) 
    { 
     // Your search logic 
    } 
} 

您可能注意到,DirectionsSearchService不扩展任何东西。您的服务变得非常松散。

而在你DirectionsAPIController.php你这样做:

class DirectionsAPIController extends BaseController 
{ 
    protected $directionsSearchService; 

    public function __construct(Services\Directions\DirectionsSearchService $directionsSearchService) 
    { 
     $this->directionsSearchService = $directionsSearchService; 
    } 

    public function search() 
    { 
     return $this->directionsSearchService->search(Input::all()); 
    } 
} 

通过上面的代码中,当Laravel试图__construct()控制器,它会寻找Services\Directions\DirectionsSearchService,并自动注入到该控制器为您服务。在构造函数中,我们只需将其设置为实例变量,以便您的search()可以在需要时使用它。

你缺少的第二件事是用composer的autoload注册你的类。通过向composer.json的自动加载部分做到这一点:

"autoload": { 
    "classmap": [ 
     ... // Laravel's default classmap autoloads 
    ], 
    "psr-4": { 
     "Services\\": "app/libraries/Services" 
    } 
} 

并更改composer.json后做composer dump-autoload。而你的代码应该再次工作。


上面的建议对服务提供商和接口编码也可以更好。它可以更容易地控制注入控制器的内容,从而更容易创建和注入模拟测试。

它涉及到更多的步骤,所以我不会在这里提到,但是您可以在Exploring Laravel’s IoC containerLaravel 4 Controller Testing中看到更多内容。

相关问题