Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Чтобы файлы залить в папку 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/
Выяснил в чем проблема была, оказывается нужно было изображение заливать в папку 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?
В реквесте приходит массив с полями, одно из которых '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
];
Что делаю не так?
Оказалось пропустил в форме enctype = "multipart/form-data"
А как сохранить путь до файла для поля image? Почему-то сохраняется какой-то временный путь, типа: temp\phpCC3E.tmp
Хотя сам файл успешно залился в uploads/filename.jpg?
Не подскажите как организовать загрузку файлов?
В форме использую поле 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') не определяет, что существует поле с файлом.
Если есть возможность напишите, как организовать загрузку файлов?
ide helper стоит, в доки поглядываю время от времени, а вот про шторм не знал, думал он автоматом цепляет методы, спасибо еще раз.
Спасибо, думал, что orderByRaw не работает в 5ке, т.к. phpstrom не подсветил метод.
Как получить рандомную запись из БД?
Пока использую этот вариант:
Для пользователей
$user_id = \App\User::all()->random(1)->id;
В документации по валидации наткнулся как раз на контроль доступа, переписал в 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 нельзя как нибудь это решить или и этот способ сойдет?
Кто-нибудь знает как поставить https://github.com/CodeSleeve/laravel-stapler на Laravel 5?
Есть ли нормальные альтернативы CodeSleeve/laravel-stapler?
Проблему валидации "alpha_num" решил заменой на регулярное выражение, получилось так:
'name' => 'required|min:3|regex:#^[aA-zZ0-9\-_]+$#',
Теперь можно ввести только латинские буквы, цифры, подчеркивания и тире
Как запретить пользователям кроме админа управление пользователями(просмотр, редактирование, обновление, удаление), но при это разрешить пользователю редактировать свой собственный профиль?
Есть пока две группы пользователей: admin и editor, в routes прописано:
Route::resource('users', 'UserController');
В UserController:
public function __construct()
{
$this->middleware('role');
}
В Middleware/Role.php прописано:
if( ! Auth::user()->hasRole('admin'))
{
return redirect('/');
}
В результате управлять пользователями могут только админы, но как дать доступ для редактирования своего профиля пользователю?
Прописать другой маршрут? Или есть еще варианты?
Не работают правила валидации "alpha_num"
В описании "alpha_num" - Поле можно содержать только латинские символы и цифры.
По факту ввожу русские буквы и никаких ошибок нет, язык в app/config.php роли не играет
Как заставить пользователя вводить латинские буквы и цифры, а не русские?
Пока остановился на https://github.com/Zizaco/entrust/tree/laravel-5
Вроде все нормально, вместо фильтров использовал middleware, т.к. теперь фильтры в роутах вроде не используются?
Нашел хороший способ, кстати описанный в документации. В файле 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, в нашем случае все так и происходит.
Есть маршрут:
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?
Ну насколько я понял rydurham/Sentinel - это отличный пакет от cartalyst/Sentinel, просто он расширяет функционал cartalyst/sentry.
А как у сентри с локализацией?
Есть ли где пример реализации сентри, где рассмотрены не аутентификация и регистрация пользователей, а именно права пользователей и группы?
Спасибо, а вы сами какой используете?
И кто-нибудь что-нибудь знает о пакете https://github.com/rydurham/Sentinel
Вроде как он основан на cartalyst/sentry ?
Начал изучать ларавел и возник вопрос по настройке ролей и прав пользователей, может кто подскажет какой-нибудь толковый пакет для этих целей?