Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Что-то я так и не понял, как сделать 404 нормальную?
Написать контроллер, взять статус ответа и выдать шаблон, чтоб она на сайте показывалась, а не отдельно шаблоном, как-то так
Изменено Proger_XP (15.02.2013 17:13:34)
Не в сети
Не в сети
Это я знаю: Response::error(404);
Как мне это заменть на свой обработчик?
Я так понимаю, этот код в /laravel/response.php
public static function error($code, $data = array())
{
return new static(View::make('error.'.$code, $data), $code);
}
Сделал в /libraries/Responce.php
class Response extends \Laravel\Response
{
public static function error($code, $data = array())
{
return new static(View::make('error.'.$code, $data), $code);
}
}
Ну он не перекрывает первый
В общем чтобы при вызове Response::error(404); направлялся на мой роут и срабатывал мой контроллер с view и ответом 404
Не в сети
Не в сети
Удалил из алиас, вот так работает
class Response extends \Laravel\Response
{
public static function error($code, $data = array())
{
return Controller::call('error@index', array($code, $data));
}
}
Error_Controller
public function action_index($code, $data = array())
{
// тут готовим какие-то данные
return new Response(View::make('error.'.$code, $data), $code);
}
Вот только есть ли возможность узнать как был вызван контроллер (запрос) чтобы нельзя было из строки браузера вызвать?
Не в сети
Не в сети
Спасибо, действительно, я его зарегистрировал, а потом думаю как сделать, что бы не вызывался.
Не привыкну никак к подходу в Laravel (лучше тогда роут убрать, который я написал для него)
Не думал, что Controller::call
class Response extends \Laravel\Response
{
public static function error($code, $data = array())
{
return Controller::call('error@index', array($code, $data));
}
}
сработает без роута.
> зачем он тебе, если он не вызывается из браузера?
Я строю приложение примерно так:
class Frontend_Controller extends Base_Controller
Все остальные контроллеры для фронтенда наследуют Frontend_Controller
В Frontend_Controller action before() строятся "Главное меню", "Каталог товаров" и присваиваются переменным шаблона, которые обычно всегда присутствуют на сайте.
При вызове Response::error('404') вызывается Error_Controller extends Frontend_Controller, там уже есть этии переменные и я могу использовать нужный view и отобразить их там. Но вот со строки браузера его запускать как раз не нужно.
Примерно так. Если интересно, могу потом выложить полное решение структуры приложения.
р.s. Хотя, может лучше выдавать более "легкую" страницу 404? И так и так встречал.
Изменено amberlex (16.02.2013 07:01:30)
Не в сети
Мне кажется у тебя не совсем правильная логика. Обычно выводить шаблон при ошибке (404, 500 и т.д.) — как раз достаточно, и вот почему:
xml@layout('base') @section('content') <h1>404 Not Found</h1> <p>Страница не найдена</p> @endsection
Это твой шаблон. Он встраивается в базовый шаблон твоего сайта через @layout.
Вторая часть — добавить в этот базовый шаблон общие вещи вроде меню, breadcrumbs, assets и т.д. Для жтого используется «составитель» (composer):
// application/start.php
View::composer('base', function ($view) {
$view->with('menu', Config::get('application.menu'));
}
При таком подходе не нужно использовать контроллер, даже если ты просто хочешь вывести шаблон с нужными переменными. И для маршрутов это тоже будет работать.
Не в сети
Про composer не знал. Сделал так. Для этого случая работает.
Дело в том, что я все делал не через return View::make('home'); а через $this->layout->nest('content', 'home'); и в layouts у меня {{ $content }}
И как в composer указать breadcrumbs, assets если они для каждого экшена свои в основном и там же определяются.
Изменено amberlex (16.02.2013 15:17:01)
Не в сети
- и в layouts у меня {{ $content }}
{{ isset(Section::$sections['content']) ? Section::$sections['content'] : $content }}
Можно наследовать Section и добавить туда метод, чтобы не писать каждый раз вручную.
- И как в composer указать breadcrumbs, assets если они для каждого экшена свои в основном и там же определяются.
Под «хлебными крошками» я имел в виду не путь к текущей странице, а предыдущие посещения страниц пользователем — они-то не зависят от конкретного контроллера.
Ресурсы обычно есть какие-то общие для всего сайта и какие-то специфичные для отдельных страниц — первые можно привязать в составителе, а вторые — в отдельных контроллерах/методах, где им и место.
Не в сети
Не в сети
Доброго времени! В продолжение темы обработчика ошибки 404:
Следуя документации к Laravel 4 добавил в секцию Application Error Handler, файла app/start/global.php обработчик следующего вида:
App::missing(function()
{
return View::make('404');
});
Верно ли я понял документацию и правильно ли организовывать обработку 404 таким образом?
Изменено konfuji (14.07.2013 19:52:41)
Taylor Otwell @taylorotwell
In other news, features debuting at @laraconeu are going to rock your world. Can’t wait to show you!
http://live.laracon.eu/
Не в сети
Не в сети
А в чём проблема?
В общем понимании. Написание приложения на базе такого рода фреймворка для меня в новинку.
Конкретно алгоритм камрада amberlex:
Написать контроллер, взять статус ответа и выдать шаблон
посеял сомнение.
Taylor Otwell @taylorotwell
In other news, features debuting at @laraconeu are going to rock your world. Can’t wait to show you!
http://live.laracon.eu/
Не в сети
Не в сети
Страницы 1