Laravel по-русски

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

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

#1 16.05.2018 11:43:30

Как передать модель в action?

Допустим у нас есть контроллер ArticleController и его метод create который соответственно будет создавать новую статью. Предположим у нас уже есть какая-то примитивная форма в которой будут заполняться поля этой статьи (кстати в каком они должны быть формате?). Как передать в этот метод данные формы? Сорьте за нубский вопрос, но я не смог найти этого в доках.

P.S. Предвидя что будет что-то вроде Request::get('Article') для получения массива полей переданных из формы спрошу - а нельзя ли задать вот так?

public function create(Article $article) {}

Так было бы удобнее... Чтобы фреймворк самостоятельно смаппил массив из запроса в модель.

Изменено Dahotta (16.05.2018 11:45:00)

Не в сети

#2 16.05.2018 13:27:32

Re: Как передать модель в action?

Новую статью создает метод store. Данные содержатся в переменой $request

Не в сети

#3 16.05.2018 13:33:27

Re: Как передать модель в action?

Новую статью создает метод store. Данные содержатся в переменой $request

Вообще не ответ. Я не это спрашивал.

Не в сети

#4 16.05.2018 16:01:06

Re: Как передать модель в action?

Зачем это делать? Чтобы не писать

public function store(Request $request, Article $article)
    {
$article->fill($request->input());

?

Изменено maximilianno (16.05.2018 16:16:28)

Не в сети

#5 16.05.2018 16:05:22

Re: Как передать модель в action?

Зачем это делать? Чтобы не писать$article->fill($request->input());?

Да. Меньше кода.

Но для начала покажите мне дефолтный способ - вот то что вы сейчас написали, но полностью. Т.е. откуда берутся переменные $article и $request? Можете привести примерный код метода создания статьи?

Не в сети

#6 16.05.2018 16:10:40

Re: Как передать модель в action?

Отредактировал выше. И правильно сказали create() - отображать должен форму, а store(Request $request) сохранять данные. И введенные данные нужно проверять и корректировать, поэтому так не нужно делать, это усложнение.

Изменено maximilianno (16.05.2018 16:13:53)

Не в сети

#7 16.05.2018 16:23:22

Re: Как передать модель в action?

public function store(Request $request, Article $article)
    {
$article->fill($request->input());

Серьезно? Т.е. это то что я и спрашивал? А что тогда в переменной $article изначально? Она пустая? Типа как $article = new Article()? Почему ее фреймворк тогда сам не заполняет перед вызовом?

Отредактировал выше. И правильно сказали create() - отображать должен форму, а store() сохранять данные. И введенные данные нужно проверять и корректировать, поэтому так не нужно делать, это усложнение.

Хмм, спорно, но возможно... Я просто сижу на Yii2, где такой метод обычно делается примерно так:

public function actionCreate() {
	$article = new Article();
	
	if ($article->load(Yii::$app->requst->post()) and $article->validate()) {
		$article->save();
		return $this->goHome();
	}
	
	return $this->render('create', ['model' => $article]);
}

Причем стыдно признаваться, но иногда я еще и мешаю create и update в один метод. Выглядит это все конечно паршиво.Вот поэтому и есть большое желание перейти на laravel. Но сначала хочу понять что тут к чему...

Кстати если у вас два метода: create - который как я понял нужен чтобы отрисовывать вьюху и store который уже принимает post запрос с данными, то где у вас будет валидация? Вон например в yii (пример выше) если модель не прошла валидацию то в ней будут указаны ошибки и при рендере они выведутся. А как у вас тут это устроено?

Изменено Dahotta (16.05.2018 16:28:00)

Не в сети

#8 16.05.2018 16:36:41

Re: Как передать модель в action?

Валидация в своем, допустим, ArticleRequest наследнике обычного Request, тогда в store(ArticleRequest $request) будет, а модель автоматом заполняется только в некоторых случаях, когда данные из базы берутся, типа отображение страницы с редактируемой статьей.

Не в сети

#9 16.05.2018 16:57:28

Re: Как передать модель в action?

Валидация в своем, допустим, ArticleRequest наследнике обычного Request, тогда в store(ArticleRequest $request) будет

Вы это серьезно? Для валидации модели нужен отдельный класс? Тьфу... У меня сейчас так резко уменьшилось желание переходить на этот фреймворк. Я конечно за SOLID, но реально ведь почти во всех фреймворках на всех языках валидация модели вешается на тот же класс (причем самое удобное делать это аннотациями как в Java или C#). Разве что иногда делается разделение на dao модель и модель для вьюх. Или вы это и имели ввиду?

Не в сети

#10 16.05.2018 17:00:25

Re: Как передать модель в action?

Валидация через класс реквеста в бест практис, а так можно как хочешь валидировать, способов много

Изменено maximilianno (16.05.2018 17:01:40)

Не в сети

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