Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 15.02.2013 16:20:41

Обработка 404

Что-то я так и не понял, как сделать 404 нормальную?
Написать контроллер, взять статус ответа и выдать шаблон, чтоб она на сайте показывалась, а не отдельно шаблоном, как-то так

Изменено Proger_XP (15.02.2013 17:13:34)

Не в сети

#2 15.02.2013 17:13:12

Re: Обработка 404

PHP
Event::fire(404);
// или
Response::error(404);

p.s: впредь прошу писать более литературным языком, без «чё».

Не в сети

#3 15.02.2013 18:33:44

Re: Обработка 404

Это я знаю: 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

Не в сети

#4 15.02.2013 18:45:40

Re: Обработка 404

Во-первых, твой перекрытый error() не отличается от умолчательного. Во-вторых, удали алиас из application/config/application.php, настройка aliases — иначе стандартные классы Laravel в глобальном пространстве имён связываются с Laravel\ и файлы из других мест для них не подгружаются.

Не в сети

#5 15.02.2013 21:44:21

Re: Обработка 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);
}

Вот только есть ли возможность узнать как был вызван контроллер (запрос) чтобы нельзя было из строки браузера вызвать?

Не в сети

#6 15.02.2013 21:47:29

Re: Обработка 404

  1. чтобы нельзя было из строки браузера вызвать?

Варианта два — либо просто не использовать класс контроллера (зачем он тебе, если он не вызывается из браузера?), а сделать обычный, либо просто не регистрировать этот контроллер.

Не в сети

#7 16.02.2013 06:36:15

Re: Обработка 404

Спасибо, действительно, я его зарегистрировал, а потом думаю как сделать, что бы не вызывался.
Не привыкну никак к подходу в 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)

Не в сети

#8 16.02.2013 09:53:27

Re: Обработка 404

Мне кажется у тебя не совсем правильная логика. Обычно выводить шаблон при ошибке (404, 500 и т.д.) — как раз достаточно, и вот почему:

xml@layout('base')
@section('content')
  <h1>404 Not Found</h1>
  <p>Страница не найдена</p>
@endsection

Это твой шаблон. Он встраивается в базовый шаблон твоего сайта через @layout.

Вторая часть — добавить в этот базовый шаблон общие вещи вроде меню, breadcrumbs, assets и т.д. Для жтого используется «составитель» (composer):

PHP
// application/start.php
View::composer('base', function ($view) {
  
$view->with('menu'Config::get('application.menu'));
}

При таком подходе не нужно использовать контроллер, даже если ты просто хочешь вывести шаблон с нужными переменными. И для маршрутов это тоже будет работать.

Не в сети

#9 16.02.2013 15:16:29

Re: Обработка 404

Про composer не знал. Сделал так. Для этого случая работает.
Дело в том, что я все делал не через return View::make('home'); а через $this->layout->nest('content', 'home'); и в layouts у меня {{ $content }}
И как в composer указать breadcrumbs, assets если они для каждого экшена свои в основном и там же определяются.

Изменено amberlex (16.02.2013 15:17:01)

Не в сети

#10 16.02.2013 21:00:04

Re: Обработка 404

  1. и в layouts у меня {{ $content }}

Можно заменить это на:

PHP
{{ isset(Section::$sections['content']) ? Section::$sections['content'] : $content }}

Можно наследовать Section и добавить туда метод, чтобы не писать каждый раз вручную.

  1. И как в composer указать breadcrumbs, assets если они для каждого экшена свои в основном и там же определяются.

Под «хлебными крошками» я имел в виду не путь к текущей странице, а предыдущие посещения страниц пользователем — они-то не зависят от конкретного контроллера.

Ресурсы обычно есть какие-то общие для всего сайта и какие-то специфичные для отдельных страниц — первые можно привязать в составителе, а вторые — в отдельных контроллерах/методах, где им и место.

Не в сети

#11 19.04.2013 14:27:09

Aleksei

Re: Обработка 404

Текст удалён.

Изменено Proger_XP (19.04.2013 15:38:23)

#12 19.04.2013 15:38:01

Re: Обработка 404

Алексей, для таких целей есть электронная почта и другие мои контакты, а для рекламы — раздел Прочее.

Не в сети

#13 14.07.2013 19:23:03

Re: Обработка 404

Доброго времени! В продолжение темы обработчика ошибки 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/

Не в сети

#14 14.07.2013 22:58:39

Re: Обработка 404

  1. Верно ли я понял документацию и правильно ли организовывать обработку 404 таким образом?

Вероятно. А в чём проблема?

Не в сети

#15 15.07.2013 00:09:50

Re: Обработка 404

Proger_XP пишет:

А в чём проблема?

В общем понимании. Написание приложения на базе такого рода фреймворка для меня в новинку.
Конкретно алгоритм камрада 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/

Не в сети

#16 15.07.2013 08:20:43

Re: Обработка 404

Код обработки ошибки можно или в контроллер поместить, или в маршрут (как у тебя). «Статус ответа» в случае PHPApp::missing() — 404, а «шаблон» у тебя — PHPView::make('404');. Имя может быть любым другим: PHPView::make('errors.not_found'); — это зависит от от твоего именования файлов и папок.

Не в сети

Подвал раздела