Laravel по-русски

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

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

#51 Re: Laravel 5.x » Прикрепление файлов » 31.03.2015 12:09:47

Чтобы файлы залить в папку storage нужно прописать в контроллере:

        if ($request->hasFile('image_file'))
        {
            $file = $request->file('image_file');
            $filename = $file->getClientOriginalName();
            \Storage::put('/images/'.$filename, \File::get($file));
        }

Т.к. в конфиге config/filesystems.php у нас прописано:

'root'   => storage_path().'/app',

то изображение попадет в папку storage/app/images/ Меняем пути в конфиге config/laravel-glide.php

<?php

return [
    'source' => [
        'path' => storage_path('app/images'),
    ],
    'cache' => [
        'path' => storage_path('app/images/cache'),
    ],
    'baseURL' => 'img',
    'maxSize' => 2000 * 2000,
    'useSecureURLs' => true
];

После чего выводим во вьюхе наши фото через Glide:

<img src="{{ GlideImage::load($page->image)->modify(['w'=> 50, 'filt'=>'greyscale']) }}" alt="{{ $page->title }}" />

где $page->image - это имя файла, ренее сохраненного в storage/app/images/

#52 Re: Laravel 5.x » Прикрепление файлов » 31.03.2015 11:34:56

Выяснил в чем проблема была, оказывается нужно было изображение заливать в папку storage. Т.е. я принудительно закинул фото foto.jpg в папку storage/images, после чего во вьюхе прописал:

<img src="{{ GlideImage::load('foto/foto.jpg')->modify(['w'=> 50, 'filt'=>'greyscale']) }}" />

и вуаля все заработало.
При этом в AppServiceProvider и в routes.php ничего не дописывал, использовал пакет freekmurze/laravel-glide и делал все по инструкции.
Теперь возникает вопрос, как залить фото в папку storage/images?

#53 Re: Laravel 5.x » Прикрепление файлов » 31.03.2015 10:19:33

В реквесте приходит массив с полями, одно из которых 'image' - файл картинка, в базе у меня тоже поле 'image' - имя файла. При выполнении

$page->update($request->all());

в поле 'image' бд записывается что-то типа temp\phpCC3E.tmp.
Проблему решил переименованием поля в image_file, а в контроллере добавлением в массив реквеста поля 'image' и обновления всех полей:

$file = $request->file('image_file');
$filename = $file->getClientOriginalName();
$request['image'] = $filename;
$page->update($request->all());

Запись файла в папку public/images через функцию в контроллере:

$file = $request->file('image_file');
$filename = $file->getClientOriginalName();
$file->move('images', $filename);

проходит нормально. Как потом к этой фотографии применить Glide, во вьюхе пишу:

<img src="{{ GlideImage::load($page->image)->modify(['w'=> 50, 'filt'=>'greyscale']) }}" alt="{{ $page->title }}"/>

где $page->image - имя файла картинки, которая лежит в public/images.
При этом фотография выводится со своими размерами, т.е. 1024x768 вместо 50px
В конфиге config/laravel-glide.php

<?php

return [
    'source' => [
        'path' => storage_path('images'),
    ],
    'cache' => [
        'path' => storage_path('glide/cache'),
    ],
    'baseURL' => 'uploads',
    'maxSize' => 2000 * 2000,
    'useSecureURLs' => true
];

Что делаю не так?

#54 Re: Laravel 5.x » Прикрепление файлов » 30.03.2015 16:05:53

Оказалось пропустил в форме enctype = "multipart/form-data"
А как сохранить путь до файла для поля image? Почему-то сохраняется какой-то временный путь, типа: temp\phpCC3E.tmp
Хотя сам файл успешно залился в uploads/filename.jpg?

#55 Re: Laravel 5.x » Прикрепление файлов » 30.03.2015 15:14:23

Не подскажите как организовать загрузку файлов?
В форме использую поле image для загрузки фото:

<div class="row form-group">
    <div class="col-md-2"> {!! Form::label('image', 'Изображение') !!} </div>
    <div class="col-md-4"> {!! Form::file('image', null, ['class' => 'form-control']) !!} </div>
</div>

Также используется PageRequest, для валидации, в нем

'image' => 'image|between:50, 2000',

т.е. предполагается что в этом поле будет файл, размером от 50 до 2000 кб
При этом при загрузке файла и создании страницы Page появляются ошибки что поле должно быть изображением и размер не правильный, хотя выбираю стандартные фото из проводника с размером около 500кб.
Если смотреть по документации то в контроллере должно быть:

if (Request::hasFile('image'))
{
    //
}

Но до этого не доходит, т.к. PageRequest не пускает, если убрать из PageRequest проверку image, то Request::hasFile('image') не определяет, что существует поле с файлом.
Если есть возможность напишите, как организовать загрузку файлов?

#56 Re: Laravel 5.x » Случайная (рандомная) запись из БД » 30.03.2015 13:31:43

ide helper стоит, в доки поглядываю время от времени, а вот про шторм не знал, думал он автоматом цепляет методы, спасибо еще раз.

#57 Re: Laravel 5.x » Случайная (рандомная) запись из БД » 30.03.2015 13:18:01

Спасибо, думал, что orderByRaw не работает в 5ке, т.к. phpstrom не подсветил метод.

#58 Laravel 5.x » Случайная (рандомная) запись из БД » 30.03.2015 12:57:27

Johnson
Ответов: 4

Как получить рандомную запись из БД?
Пока использую этот вариант:
Для пользователей

$user_id = \App\User::all()->random(1)->id;

#59 Re: Laravel 5.x » Роли и права пользователей » 26.03.2015 13:51:55

В документации по валидации наткнулся как раз на контроль доступа, переписал в UserController

$this->middleware('role', ['except' => ['edit', 'update']]);

В UserUpdateRequest прописал секцию authorize так:

    public function authorize()
    {
        if(\Auth::user()->hasRole('admin')) return true;
        elseif ($this->route('users') == \Auth::id()) return true;
    }

Теперь у пользователя появился доступ к редактированию и обновлению своих данных, при этом можно спокойно открыть для редактирования данные другого пользователя, зная его id, данные при этом не сохраняются т.к. id не совпадают, но это все равно не правильно показывать данные других пользователей.

Как ограничить доступ к экшену edit контроллера UserController чтобы пользователи могли редактировать только свои данные?
Пока решил записью в контроллере UserController в функции edit добавлением строки:

if (!\Auth::user()->hasRole('admin') && \Auth::id() != $id) return redirect('/');

А на уровне middleware нельзя как нибудь это решить или и этот способ сойдет?

#60 Laravel 5.x » Прикрепление файлов » 26.03.2015 12:48:16

Johnson
Ответов: 18

Кто-нибудь знает как поставить https://github.com/CodeSleeve/laravel-stapler на Laravel 5?
Есть ли нормальные альтернативы CodeSleeve/laravel-stapler?

#61 Re: Laravel 5.x » Изменение данных пользователя » 26.03.2015 11:46:01

Проблему валидации "alpha_num" решил заменой на регулярное выражение, получилось так:

'name' => 'required|min:3|regex:#^[aA-zZ0-9\-_]+$#',

Теперь можно ввести только латинские буквы, цифры, подчеркивания и тире

#62 Re: Laravel 5.x » Роли и права пользователей » 26.03.2015 10:57:53

Как запретить пользователям кроме админа управление пользователями(просмотр, редактирование, обновление, удаление), но при это разрешить пользователю редактировать свой собственный профиль?
Есть пока две группы пользователей: admin и editor, в routes прописано:

Route::resource('users', 'UserController');

В UserController:

    public function __construct()
    {
        $this->middleware('role');
    }

В Middleware/Role.php прописано:

        if( ! Auth::user()->hasRole('admin'))
        {
            return redirect('/');
        }

В результате управлять пользователями могут только админы, но как дать доступ для редактирования своего профиля пользователю?
Прописать другой маршрут? Или есть еще варианты?

#63 Re: Laravel 5.x » Изменение данных пользователя » 25.03.2015 16:50:13

Не работают правила валидации "alpha_num"
В описании "alpha_num" - Поле можно содержать только латинские символы и цифры.
По факту ввожу русские буквы и никаких ошибок нет, язык в app/config.php роли не играет
Как заставить пользователя вводить латинские буквы и цифры, а не русские?

#64 Re: Laravel 5.x » Роли и права пользователей » 25.03.2015 16:42:53

Пока остановился на https://github.com/Zizaco/entrust/tree/laravel-5
Вроде все нормально, вместо фильтров использовал middleware, т.к. теперь фильтры в роутах вроде не используются?

#65 Re: Laravel 5.x » Изменение данных пользователя » 20.03.2015 13:00:44

Нашел хороший способ, кстати описанный в документации. В файле UserRequest вместо

public function authorize()
	{
		return true;
	}

	public function rules()
	{
	return [
            'name' => 'required|min:3',
            'email' => 'required|email|unique:users',
            'password' => 'required|confirmed|alpha_num|min:6'
	];
	}

вставляем

	public function authorize()
	{
		return true;
	}

	public function rules()
	{
        $id = $this->route('users');
		return [
            'name' => 'required|min:3',
            'email' => 'required|email|unique:users,email,'.$id,
            'password' => 'required|confirmed|alpha_num|min:6'
		];
	}

Здесь $id получает id пользователя из маршурта users/{users}, где {users} - наш id
далее для уникальных полей можно проигнорировать поле с конкретным id, в нашем случае все так и происходит.

#66 Laravel 5.x » Изменение данных пользователя » 20.03.2015 09:56:30

Johnson
Ответов: 5

Есть маршрут:

Route::resource('users', 'UserController');

В контроллере UserController есть методы на создание и редактирование

	public function store(UserRequest $request)
	{
        $user = new User;
        $user->name = $request['name'];
        $user->email = $request['email'];
        $user->password = \Hash::make($request['password']);

        $user->save();
        return redirect('users');
	}
public function update($id, UserRequest $request)
	{
        $user = User::find($id);
        $user->update($id, $request->all());

        return redirect('users');
	}

Они используют UserRequest в ктором прописаны следующие функции:

	public function authorize()
	{
		return true;
	}

	public function rules()
	{
	return [
            'name' => 'required|min:3',
            'email' => 'required|email|unique:users',
            'password' => 'required|confirmed|alpha_num|min:6'
	];
	}

При создании пользователя все нормально, а вот при редактировании валидация не проходит, т.к. поле email должно быть уникальным, т.е. при редактировании присутствует поле email, которое уже заполнено существующим emai.

Вопрос заключается в следующем: как в UserRequest изменить rules так, чтобы при редактировании если поле email заполнено и принадлежит текущему пользователю, отменить проверку на email?

Второй вопрос заключается в изменении пароля, как в том же UserRequest при заполнении поля пароля провести проверку на password, а при оставлении пустым не изменять пароль, т.е. отменить проверку на password?

#67 Re: Laravel 5.x » Роли и права пользователей » 18.03.2015 12:22:51

Ну насколько я понял rydurham/Sentinel - это отличный пакет от cartalyst/Sentinel, просто он расширяет функционал cartalyst/sentry.
А как у сентри с локализацией?
Есть ли где пример реализации сентри, где рассмотрены не аутентификация и регистрация пользователей, а именно права пользователей и группы?

#68 Re: Laravel 5.x » Роли и права пользователей » 18.03.2015 09:30:57

Спасибо, а вы сами какой используете?
И кто-нибудь что-нибудь знает о пакете https://github.com/rydurham/Sentinel
Вроде как он основан на cartalyst/sentry ?

#69 Laravel 5.x » Роли и права пользователей » 17.03.2015 16:31:34

Johnson
Ответов: 14

Начал изучать ларавел и возник вопрос по настройке ролей и прав пользователей, может кто подскажет какой-нибудь толковый пакет для этих целей?

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