Often times, you want to offer your users other ways to interact with your package. A common usecase is to give a REST API in your package to handle data.
For Laravel-FAQ I originally wanted a nice Single Page App interface for the front-end. In preparation for this, I worked to create a flexible REST API for the future when I may want to add this functionality.
To start, create a route group prefixed with 'api' within one of your customizable route groups. While this could be customizable with a configuration option, I'm choosing to opt into some convention in order to tame somethings in. Similarly, to reduce headaches later we will use raw Route::get, Route::post, and Route::delete to handle our various actions and give us the ability to reference them using route('laravel-faq::api.questions.*').
So our route group looks a bit like this:
Route::group(array('prefix' => 'questions'), function()
{
Route::get('/', array('uses' => 'Rtablada\LaravelFaq\Api\QuestionsController@index'));
Route::get('all', array('uses' => 'Rtablada\LaravelFaq\Api\QuestionsController@all'));
Route::post('/', array('uses' => 'Rtablada\LaravelFaq\Api\QuestionsController@store'));
Route::get('search', array('uses' => 'Rtablada\LaravelFaq\Api\QuestionsController@search'));
Route::get('{id}', array('uses' => 'Rtablada\LaravelFaq\Api\QuestionsController@show'));
Route::delete('{id}', array('uses' => 'Rtablada\LaravelFaq\Api\QuestionsController@delete'));
});
Now we just need to look at our controller:
<?php namespace Rtablada\LaravelFaq;
use Rtablada\LaravelFaq\Repositories\FaqRepository;
use View, Session, Redirect, Input, Config;
class QuestionsController extends BaseController
{
protected $faqRepo;
public function __construct(FaqRepository $faqRepo)
{
$this->setupViews();
$this->faqRepo = $faqRepo;
}
public function index()
{
$faqs = $this->faqRepo->paginate();
return View::make('laravel-faq::home', compact('faqs'));
}
public function create()
{
$input = Session::getOldInput();
return View::make('laravel-faq::questions.create', compact('input'));
}
public function store()
{
$input = Input::all();
if ($this->faqRepo->create($input)) {
Session::flash('success', 'Your Question Has Been Updated');
return Redirect::route('laravel-faq::index');
} else {
return Redirect::back()->withInput();
}
}
protected function setupViews()
{
$paths = Config::get('laravel-faq::views.paths');
foreach ($paths as $path) {
View::addLocation($path);
}
}
}
Quick and easy right? The thing to remeber is that Package Developmnet really isn't much different than developing a regular Laravel Application! It just requires a few extra steps and decisions to add that extra layer of flexibility to make it easy to plug and play in your next project.