R - роутер

Mar 15, 03:35 am Категория:

От теории к практике, как говорится. Я попробовал роутеры Lumen и Laravel. В в обоих фреймворках роутинг имеет общие принципы, но есть и отличия. Почитать об этом можно на соответствующих страницах руководств для Lumen и Laravel Замечу, что в Lumen используется Fast request router for PHP от Никиты Попова (@nikic). Но до Люмена доберусь только при создании API сам не знаю чего. А пока буду издеваться в основном над Ларавелем.

А вот и сам файл routes.php, каким я его создал. Подробности в конце публикации.

<??php

$router->group(['prefix' => 'admin', 'middleware' => 'auth', 'namespace' => 'Admin'], function() {

    Route::get('/',         ['uses' => 'DashBoardController@dashboard', 'as' => 'dashboard']);
    Route::get('archive',   ['uses' => 'ArchiveController@index',       'as' => 'archive']);
    Route::get('images',    ['uses' => 'ImagesController@index',        'as' => 'images']);
    Route::get('links',     ['uses' => 'LinksController@index',         'as' => 'links']);
    Route::get('posts',     ['uses' => 'PostsController@index',         'as' => 'posts']);

});


$router->group(['prefix' => 'auth', 'middleware' => 'web'], function() {
    Route::auth();
});


$router->group(['middleware' => 'web'], function () {

    Route::get('/', ['uses' => 'HomeController@index', 'as' => 'home'] );

    Route::get('about',     'PageController@about');
    Route::get('archive',   'PageController@archive');
    Route::get('downloads', 'PageController@downloads');
    Route::get('faqs',      'PageController@faqs');

    Route::get('articles',  ['uses' => 'ArticlesController@index',  'as' => 'articles']);
    Route::get('articles/{id}/{slug}', 'ArticlesController@show');

    Route::get('txp',       ['uses' => 'ArticlesController@index',  'as' => 'txp']);
    Route::get('txp/{id}/{slug}',      'ArticlesController@show');

    Route::get('tags',      ['uses' => 'TagsController@cloud',      'as' => 'tags']);
    Route::get('tags/{tag}',           'TagsController@list');

    Route::get('category',  ['uses' => 'CategoriesController@index', 'as' => 'category']));
    Route::get('category/{slug}',      'CategoriesController@list');

    Route::get('contact',   ['uses' => 'ContactsController@viewForm', 'as' => 'contact']));
    Route::post('contact',             'ContactsController@sendForm');

});

$router->group(['middleware' => 'robots'], function() {

    Route::get('robots.txt', function (){
        $robots = View::make('robots.robots');
        return Response::make($robots, 200, ['Content-Type' => 'text/plain']);
    });

    Route::get('sitemap.xml', function(){

    });

    Route::get('rss', function(){

    });
});

Разбор полётов

Во-первых, это обычный файл PHP, начинающийся вполне традиционно.

Строка 3 определяет группу маршрутов доступа в админку:

  • Маршруты начинаются с /admin/
  • Middleware - маршруты доступны после авторизации
  • Namespace - контроллеры находятся в поддиректории Admin.

Строки с 3 по 9 содержат заглушки из перечисления возможных вызовов административных функций. Чисто для памяти. Пути расширяются до /admin/, /admin/archive, /admin/images*, и т.д. Роуты поименованы. В каждом случае вызывается специализированный контроллер, который ещё даже не спроектирован. Ну заглушки, что с них взять?

Строки 14-16 определяют набор маршрутов авторизации. Несмотря на краткость записи, эти строки полностью описывают маршруты для регистрации, авторизации, сброса пароля и чего-то ещё. Причём маршруты эти начинаются с /auth/. Правда я не уверен, что всё это богатство будет работать до запуска команды:

php artisan make:auth

Самое время эту команду выполнить. Что такое artisan и чего можно добиться с его помощью, где и как его нужно запускать можно прочесть по ссылке. Точнее даже не можно, а нужно. Это один из основных инструментов Laravel.

19-я строка начинает серию маршрутов непосредственно сайта.

21-я строка отвечает за главную страницу. Иногда главная страница сайта сильно отличается от остальных по логике построения, стилю и ещё чему-нибудь. Для этого главную страницу я буду создавать отдельным контроллером.

Строки 23-26 - это вызовы страниц "О сайте", "Архив", "Загрузки", "FAQ". Т.е. страниц, которые можно сначала сгенерировать вручную и отдавать их в таком виде, пока руки до них не дойдут. А когда дойдут, то процесс можно и автоматизировать как-то. За эти статические страницы отвечает один контроллер.

Строки 28-29 - это отображение постов. Как списка, так и индивидуальных публикаций. Поскольку Textpattern у меня настроен на вывод номера и пути статьи, то маршрут учитывает это. Как распорядиться этим знанием в дальнейшем решу... впоследствии.

Строки 31-32 - это отдача нюансов проектирования сайта, при котором статьи были разведены по секциям. В результате они публиковались в разных секциях и теперь мне нужно их как-то свести вместе. Я использую тот же контроллер, что и для статей. Я могу как наладить вывод, так и установить переадресацию и собрать статьи в одном разделе. Но это после переноса данных.

Для меток строки 34-35. Вроде всё понятно.

Строки 37-38. Категории. С ними всё непонятно. Соберу в одну кучку, а потом подумаю, как можно эти данные использовать. Или не использовать.

Строка 40 - вывод контактной информации, включая и возвратную форму. Можно было бы эту функцию делегировать контроллеру, отвечающему за статические страницы, но есть способ лучше. Я надеюсь, что есть.

Строка 41 интересна тем, что впервые используется метод POST. Это обработка отправляемой пользователем возвратной формы. Процессу обработки форм нужно будет посвятить отдельную публикацию.

Строки 45 и до конца файла - это фантазия на тему общения с различными роботами. Я чисто для себя эти строки поставил, чтобы не забыть сделать генерацию всяких robots.txt, rss-потоков и карт сайта. Т.е. можно сделать так, что в корне сайта вообще не будет ни одного файла. Правда .htaccess под Apache лучше оставить в покое.

В таком виде всё это богатство выкладывать можно только в качестве плана. Отсутствующие маршруты и контроллеры будут вызывать ошибки до тех пор, пока не появятся и не заработают. Можно сразу созадать все контроллеры, чтобы они при вызове просто "подавали голос" - выводили своё имя, к примеру. А потом последовательно писать нутрянку. А можно закомментировать всё и открывать по одному маршруту. У каждого свой подход. А создание сайта и перенос существующего - вообще третий случай.

Отбор своих - залог успеха. Сами знаете откуда. Надеюсь, что все необходимые для старта ошибки в маршрутах я сделал и осталось ил только найти. Пора переходить к переносу базы данных.

PS Пока проектировал роутер понял как должны использоваться категории.

 

Комментарии

2017-10-18 10:13 pm , Оставь комментарий