Laravel по-русски

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

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

#1 03.01.2017 11:29:21

Request вручную

Добрый день дорогие форумчане. С новым всех годом!

Помогите пожалуйста решить задачку.
Смотрите.
У меня есть PostController с методом store

например

public function store(PostsRequest $request)
    {
        Post::create($request->all());
        return Redirect::back();
    }

перед тем как создать что то данные валидируются в  PostsRequest

И все конечно работает. Но тут мне понадобилось усложнить приложение.
Смотрите в чем проблема

Есть контроллер в который попадает массив с данными на базе которых мне нужно сгенерировать более 1 записи Post

то есть что я хочу сделать

public function storeMultiplePosts(MultiplePostsRequest $request)
{
$request_data  =  $request->all();
$data =  $request_data['exposts'];
foreach ($data as $item){
 (new PostController)->store($PostsRequest);
}

}

иными словами мне вручную надо как то подготовить  и сделать PostsRequest и передать его в  PostController->store

Спасибо за помощь!


в разработке

Не в сети

#2 03.01.2017 12:19:09

Re: Request вручную

Выноси создание одного поста в модель, буквально сегодня на похожий вопрос ответил. А еще лучше, выноси в модель и используй batch (bulk) insert, чтобы вставить данные одним запросом, а не создавать N отдельных запросов.

Изменено AlexeyMezenin (03.01.2017 12:19:32)

Не в сети

#3 03.01.2017 13:36:04

Re: Request вручную

Выноси создание одного поста в модель, буквально сегодня на похожий вопрос ответил. А еще лучше, выноси в модель и используй batch (bulk) insert, чтобы вставить данные одним запросом, а не создавать N отдельных запросов.

одним запросом не выйдет. Так как данные что придут извне имеют еще кучу всего, настройки, отдельные модификации поста

мне надо вручную подготовить данные для валидации и сделать PostsRequest.

$request_data  =  $request->all();
$data =  $request_data['exposts'];

опять же повторю.
ниже кусок кода лишь пример.

public function store(PostsRequest $request)
    {
        Post::create($request->all());
        return Redirect::back();
    }

чтобы вставить данные одним запросом, а не создавать N отдельных запросов.

можно пример?


в разработке

Не в сети

#4 03.01.2017 13:44:54

Re: Request вручную

Что бы было понятно напишу немного подробнее что я хочу что бы было

public function storeMultiplePosts(MultiplePostsRequest $request)
{
        $request_data  =  $request->all();
         $data =  $request_data['exposts'];
         foreach ($data as $item){
           $post_ = [];
                  /* куча кода что бы подготовить массив на основе того что есть в $item, так как дать гарантию не могу того что попадает в item ввиду того что эти данные приходят со стороннего ресурса */
                   /* плюс к этому на основании настроек что так же придут мне надо внести изменения отдельно в каждый пост. например в данном item не использовать текст или метки или дату публикации выставить другую
                 /* тот массив что я подготовил теперь нужно валидировать */
                //например как то так
                 $valid_post_data = new PostsRequest($post_ )
                       // и после того как уже мы проверили то что мы сгенерировали мы отправляем в контроллер
                (new PostController)->store($valid_post_data);
}

}

в разработке

Не в сети

#5 03.01.2017 13:48:46

Re: Request вручную

fagtr пишет:

можно пример?

Судя по твоему коду (foreach и create), у тебя структура правильная для insert(). Тогда делаешь так:

public function storeMultiplePosts(MultiplePostsRequest $request)
{
    $rows = Post::insert($request->exposts);
}

Если твой код был "левым", то нужно будет построить массив с правильной структурой для insert(). Структура такая:

$data = [
    ['name' => 'Vasya', 'city' => 'Moscow'],
    ['name' => 'John', 'city' => 'London']
];

Изменено AlexeyMezenin (03.01.2017 13:50:25)

Не в сети

#6 03.01.2017 14:01:50

Re: Request вручную

я вас понял спасибо.

Но тут есть одно но...

вы правильно сказали что структура левая. Она абсолютно левая.
на основе данных что приходят я могу сгенерировать массив.
Но мне его нужно валидировать. Так как самому богу известно что туда может попасть.
И вот как мне сделать валидацию?

$data = [
    ['name' => 'Vasya', 'city' => 'Moscow'],
    ['name' => 'John', 'city' => 'London']
];

К тому же у меня Request еще и занят предварительной подготовкой данных.

Небольшой пример из PostsRequest

    public function sanitize()
    {
        $input = $this->all();

        if (!isset($input['slug']) or empty($input['slug'])) {
            $input['slug'] = str_random(15) . '-' . Carbon::now()->toDateTimeString();
        }
        $input['slug'] = strtolower(preg_replace("/[\s_:]/", '-',preg_replace("/[\s-]+/", " ",$input['slug']) ));

        if ((!Auth::user()->able('posts_create')) or (!Auth::user()->able('posts_edit'))){
            $input['state'] = 1;
            $input['user_id'] = Auth::user()->id;
            $input['access'] = 1;
            $input['published_at'] = Carbon::now();
        }
        $this->replace($input);
        return $this->all();
    }

в разработке

Не в сети

#7 03.01.2017 14:12:05

Re: Request вручную

к сожалению мне не  достаточно еще и создать запись. в методе стор еще кучу всего приходится делать(возможно я и не прав что это делаю именно в контроллере)

    public function store(PostsRequest $request)
    {
        $created_item = Post::create($request->all());
        $created_item->tags()->sync($this->gettaglist($request['tagstring']));
        
        if (isset($request['pictures']) && $request['pictures'])
            foreach ($request['pictures'] as $id) 
                $created_item->attach($created_item->user_id,'Picture',$id);

        if (isset($request['youtube']) && $request['youtube'])
            foreach ($request['youtube'] as $id) 
                $created_item->attach($created_item->user_id,'Youtube',$id);
      
        $posts_settings = NULL;
        if ($created_item and $created_item->state == 1 and isset($request['postssettings'])) {
            $posts_settings = PostsSetting::create(array_merge(['post_id' => $created_item->id ],$request['postssettings'])); 
        }

        if ($posts_settings) 
            event(new PostWasCreated($created_item,$posts_settings));
        $this->clearcache($created_item);

        return Redirect::back();
    }

в разработке

Не в сети

#8 03.01.2017 15:41:01

Re: Request вручную

вопрос пока открыт как вручную сделать Request что бы его потом передать в контроллер


в разработке

Не в сети

#9 03.01.2017 15:48:57

Re: Request вручную

Вообщем нашел таки я решение... Если кому то еще понадобиться вручную работать с Request откопал у себя же решение в одном из проектов

                    $tagRequest = new Requests\TagRequest([
                        'title' => $tag_title,
                        'slug' => $tag_slug
                    ]);
                    $tagValidator = Validator::make($tagRequest->sanitize(), $tagRequest->rules());

                    if (!$tagVa->fails()) 
                        $tag = (new TagController())->store($tagRequest);

Изменено fagtr (03.01.2017 15:50:28)


в разработке

Не в сети

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