Зачастую у вас появляется желание предоставить вашим пользователям разные способы взаимодействия с вашим пакетом. Обычным решением является создать REST API к вашему пакету для обработки данных.
Изначально, я хотел получить приятный одностраничный интерфейс для Laravel-FAQ. Для этого в рамках подготовки к этому я работал над созданием гибкого REST API, который позволит добавлять реализованный функционал, когда мне это понадобиться.
Для начала, создайте группу маршрутов с префиксом api в одной из ваших настраиваемых групп маршрутов. Хоть это и может быть настроено через параметр конфигурации, я предпочитаю использовать соглашения, чтобы определённые вещи оставались неизменными. Кроме того, чтобы избежать лишних проблем позже, мы будем использовать явные PHPRoute::get()
, PHPRoute::post()
и PHPRoute::delete()
, чтобы реагировать на наши действия и позволить ссылаться на них через PHProute('laravel-faq::api.questions.*')
.
Таким образом, наша группа маршрутов выглядит следующим образом:
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'));
});
Теперь просто посмотрим на наш контроллер:
<?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', 'Ваш вопрос был обновлён');
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);
}
}
}
Быстро и просто, правда? Нужно помнить, что разработка пакета действительно не сильно отличается от разработки очередного приложения на Laravel. Она просто требует несколько дополнительных шагов и решений для того, чтобы сделать пакет более гибким, что позволит его легко подключать и использовать в вашем следующем проекте.