Laravel по-русски

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

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

#1 Laravel 5.x » апгрейд dump() функции для распечатки методов » 08.02.2018 11:03:46

Yurri_87
Ответов: 2

как можно апгрейдить dump() функцию, чтобы помимо свойств происходила еще распечатка методов (всех: закрытых, открытых, защищенных)
думаю, может кому-то еще кроме меня пригодится.
Смысл в том, что иногда нужно знать - какие методы есть у объекта.
Например это может быть полезно при изучении компонентов фреймворка.
Предлагаю сделать и юзать вместе. По мне это ловчее, чем постоянно обращаться к документации.
Документацию, конечно, этим не заменишь, но иногда просто требуется лишь бегло взглянуть, какие методы есть у объекта.

#3 Laravel 5.x » многократное использование объекта Builder » 08.02.2018 07:46:14

Yurri_87
Ответов: 2

Создаем объект Builder:

$items_builder = Item::where('field','statement');

Теперь я хочу использовать его для разных целей 3 раза:

$items_type1 = $items_builder->where('field','statement1')->get();
$items_type2 = $items_builder->where('field','statement2')->get();
$items_type3 = $items_builder->where('field','statement3')->get();

Корректно отрабатывает только

$items_type1 = $items_builder->where('field','statement1')->get();

Видимо, потому, что отрабатывается первым.
Вопрос в том - что происходит с объектом Builder ($items_builder) после первого применения?
И как сделать правильно?

#4 Laravel 5.x » как работает авторизация API VK » 30.09.2017 00:03:00

Yurri_87
Ответов: 2

Laravel 5.2
Для аутентификации использую API VK.
Для этого использую пакет "socialite-providers/vkontakte".
Все сделал по инструкции https://laravel-news.ru/blog/tutorials/socialite-login.
Все работает отлично, но назрела необходимость подпилить кое-что (кроме имени, емейла и vk_id сохранять еще и url аватарки юзера), а значит разобраться детально как это работает.
Желание разобраться есть, но кое-чего не понимаю...

Начал с простого - открыл routes.php, увидел строчку

Route::get('/social_login/{provider}', 'SocialController@login');

ок, направляемся в контроллер SocialController, смотрим метод login():

public function login($provider)
    {
        return Socialite::with($provider)->redirect();
    }

ок, смотрю на верх, вижу:

use Socialite;

хорошо, это я знаю, посмотрю в алиасах (config/app.php) что это за класс:

'Socialite' => Laravel\Socialite\Facades\Socialite::class,

открываю этот класс и вижу:

namespace Laravel\Socialite\Facades;
use Illuminate\Support\Facades\Facade;

class Socialite extends Facade
{

    protected static function getFacadeAccessor()
    {
        return 'Laravel\Socialite\Contracts\Factory';
    }
}

И тут я попадаю в тупик, потому что не понимаю, как это работает и каким образом мне разобраться куда направиться дальше.
Куда дальше идет вызов?
Пожалуйста, подскажите непутевому. Если объясните на пальцах - отлично. Направите на ресурс - тоже хорошо.

#7 Laravel 5.x » доступ к методу модели из другого класса » 17.09.2017 18:28:03

Yurri_87
Ответов: 4

модель

User

имеет

public static function getAllMessages()

с помощью

use App\User

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

App\Http\Sockets\MyNameClass

возможно дело в autoload композера?
сделал

php composer update

- не помогло

#8 Re: Laravel 5.x » WebSocket: закрывается соединение при попытке получить куки » 15.09.2017 13:59:34

пока вижу решение без идентификации на стороне сервера, но с использованием уникального токена : генерировать токен (символов 30) для каждого разговора, как идентификатор разговора и перед началом беседы помещать его в input type="hidden" и передавать в сообщении. На стороне сервера делать вставку данных в БД, взависимости от этого токена без идентификации. Уж перебором токенов вряд ли кто будет заниматься чтобы в чужой чат что-то написать.

Но все-же вопрос остается открытым - почему не работает идентификация по кукам.

#9 Re: Laravel 5.x » роли юзера в layout.blade.php » 15.09.2017 07:14:03

если не ошибаюсь - посредники созданы чтобы не пропустить запрос дальше. Разве подходит использование посредника, если мне нужно не запретить прохождение запроса дальше, а просто определить роль и передать ее название в переменной, чтобы уже во вьюхе, взависимости от имени роли вывести нужные кнопки.
вьюха:

if($role == 'masger'){
  echo '<div class="button" href="ссылка для мастера">Кнопка для мастера</div>';
}
if($role == ....)...

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

#10 Laravel 5.x » WebSocket: закрывается соединение при попытке получить куки » 15.09.2017 04:28:07

Yurri_87
Ответов: 2

Доброго времени!
Laravel 5.2. Для чата используется websocket на php "orchid socket" - GitHub - Orchid Socket
если не использовать ф-цию getUserFromSession($conn), то работает прекрасно. Но как-раз требуется идентифицировать пользователя на стороне сервера. Данный Package (вроде бы на Ratchet) позволяет это сделать по кукам, но что-то не работает:

public function getUserFromSession($conn){

  $session = (new SessionManager(App::getInstance()))->driver();
  $cookies = $conn->WebSocket->request->getCookies();

// Но где-то здесь, при попытке получить куки закрывается соединение с кодом 1000
// Может потому-что $session возвращает пустой объект? (проверил). А почему пустой?
// Все что ниже по ходу уже не имеет смысла

  $laravelCookie = urldecode($cookies[Config::get('session.cookie')]);
  $idSession = Crypt::decrypt($laravelCookie);
  $session->setId($idSession);
  $conn->session = $session;
  $conn->session->start();
  $userId = $conn->session->get(Auth::getName());
}

#11 Re: Laravel 5.x » роли юзера в layout.blade.php » 02.09.2017 22:02:59

порылся в русскоязычной документации, нашел такое:

Route::resource('photos', 'PhotoController');

это то самое? Если нет, то можно, пожалуйста код написать? Очень благодарен за инфу.

#12 Re: Laravel 5.x » роли юзера в layout.blade.php » 01.09.2017 15:11:20

и последний вопрос: насколько логично это делать в middleware?
не будет ли это логичнее сделать в группе роутов? Если да - то как(код)?

#13 Re: Laravel 5.x » роли юзера в layout.blade.php » 01.09.2017 00:17:43

тоесть таким образом?:

namespace App\Http\Middleware;

use Closure;
use User;

class Roles
{
    public function handle($request, Closure $next)
    {
        $isAdmin = User::isAdmin();
        $isClient = User::isClient();
        $isMaster = User::isMaster();
 
        return $next($request);

        а как тут данные то прицепить?????
        return $next($request)->with(['isadmin'=>$isAdmin,'isclient'=>$isClient,'ismaster'=>$isMaster,]); так чтоли???
    }

}

не могу понять каким образом

#14 Re: Laravel 5.x » роли юзера в layout.blade.php » 31.08.2017 16:15:56

так все-таки каким образом передавать данные во вьюху?
с тем, как получить роли юзера - проблем нету.
дело в том, что разные роуты используют вьюхи, которые наследуются от одного и того же лейаута, поэтому вопрос состоит в дублировании кода. Можно ли как-то на этапе роутинга передавать переменную роли? например для целой группы роутов выполнять функцию получения роли, как это будет выглядеть? Или ничего страшного, если роль дергается прямо из вьюхи? Просто это вроде бы плохая практика во вьюхе использовать функции.
Вобщем вопрос не в способе получения роли, а в том откуда ее передать во вьюху.

#15 Laravel 5.x » роли юзера в layout.blade.php » 31.08.2017 01:27:46

Yurri_87
Ответов: 11

для вывода уникального меню (взависимости от роли пользователя)во вьюхе лейаута есть такой код:

@section('navbar')
        @if(!Request::is('/*') and $isClient)
            <li><a href="{{ url('/') }}">кабинет клиента</a></li>
        @endif
        @if(!Request::is('master') and $isMaster)
            <li><a href="{{ url('master') }}">кабинет мастера</a></li>
        @endif
        @if(!Request::is('admin') and $isAdmin)
            <li><a href="{{ url('admin') }}">админка</a></li>
        @endif
@endsection

переменные $isClient, $isMaster, $isAdmin определяются в контроллере и далее происходит return view('вьюха')->with(['isClient' => $isClient, 'isMaster' => $isMaster, 'isAdmin' => $isAdmin]);
проблема в том, что это "популярный лейаут" и используется где только можно. Следовательно чтобы избежать повтора кода в разных контроллерах - переменные $isClient, $isMaster, $isAdmin желательно получать прямо в лейауте. Однако такой вариант не выглядит правильным.
Подскажите как сделать не через зад? Какая практика является правильной?

#16 Re: Laravel 5.x » Зачем нужны посредники, если есть контроллеры » 30.08.2017 21:02:04

я понимаю что это хорошая практика и я буду не прав если скажу что без разницы, где реализована логика.
Но мне нужно логически понять и разложить по полочкам, почему все так.
В случае, если метод контроллера должен использоваться не только админом, но и обычным юзером, то почему бы в этом методе не описать if($user->role() == 'admin'){...} else if($ser->role() == 'bastard'){...} в чем геморой непойму. А вообще - принцип единой ответственности не будет нарушен, если вместо большого метода сделать несколько маленьких, ведь разные роуты можно обрабатывать разными методами одного и того же контроллера. В чем тогда преимущество мидлвары? Ведь чтобы написать отдельную мидлвару, нужно потратить столько же усилий, сколько для того чтобы написать дополнительный метод.

#17 Re: Laravel 5.x » Зачем нужны посредники, если есть контроллеры » 30.08.2017 16:22:28

DRY говорит что функционал должен быть описан один раз.
Этот функционал я могу описать скажем в модели User и использовать его в контроллере. Например Auth::user()->isAdmin(). Разве это противоречит концепции DRY? Метод isAdmin() описан один раз, и используется когда необходимо. В чем выгода создавать вместо такого метода middleware?

#18 Laravel 5.x » Зачем нужны посредники, если есть контроллеры » 29.08.2017 18:10:41

Yurri_87
Ответов: 5

В чем логика создания нового Middleware, если ту-же самую проверку я могу описать в контроллере?
Интересует вопрос в чем логика и удобство.
Хочу использовать Laravel осмысленно.

#19 Re: Laravel 5.x » не пойму, как это работает » 17.07.2017 12:09:33

return возвращает управление программой модулю, из которого была вызвана функция. Выполнение программы продолжается с инструкции, следующей за местом вызова

Ну да, а там их целых две: сначала после return выходим из безымянной функции, выполнение продолжается в метод/функцию (ведь нет разницы с точки зрения областей видимости?) синглтон. Тоесть там "двойная стенка, защищающая от обрыва" метод registerAuthenticator().
Программирование такая штука что надо стабильно кодить, чтобы через месяц-другой не спотыкаться о вещи, которые раньше не доставляли проблем. А значит нужно зарабатывать $, а не просто увлекаться.

#20 Re: Laravel 5.x » не пойму, как это работает » 16.07.2017 20:20:56

Про ioc контейнер и регистрации понятно.
Буду читать про замыкание, спасибо. Думал метод должен обрываться. Оказалось плохо ООП знаю.

#21 Re: Laravel 5.x » Как обновить блок div при изменении статуса в БД? » 16.07.2017 18:41:12

В success ajax'a удали ненужное и вставь/редактируй нужное.
Например с помощью jQuery что-нибудь вроде:

success: function(){
$('#oldBadDiv').remove();
$('#targetDiv').html('<div id="new_status">content</div>');}

или, если ajax для вывода дергает данные из базы:

success: function(data){
$('#oldBadDiv').remove();
$('#targetDiv').html(data);}

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

дело то в том, что приложение уже отработало и инструкции @ шаблонизатора тоже. Переменные, переданные в шаблонизатор отработали и исчезли, оставив после себя лишь html. Поэтому, если нет необходимости использовать какой-нибудь контроллер для получения данных, то данный вопрос (как изменить блок) больше связан с ajax, js, jquery, чем с Laravel. Хотя, если требуется логика Laravel, для получения необходимой html-разметки, то тем же ajax можно обращаться к интересующему тебя контроллеру.

#22 Laravel 5.x » не пойму, как это работает » 16.07.2017 18:25:11

Yurri_87
Ответов: 4

Версия Laravel: 5.2
Версия PHP: 5.6

в сервис-провайдере \Illuminate\Auth\AuthServiceProvider
не пойму как работает следующий код:
Код:

protected function registerAuthenticator()
    {
        $this->app->singleton('auth', function ($app) {
            $app['auth.loaded'] = true;
            return new AuthManager($app);
        });

        $this->app->singleton('auth.driver', function ($app) {
            return $app['auth']->guard();
        });
    }

А именно: почему после первого return

return new AuthManager($app);

продолжает выполняться код:

$this->app->singleton('auth.driver', function ($app) {
            return $app['auth']->guard();
        });

я не такой уж и новичек в php, но сейчас я в ступоре. Буду благодарен даже легкому намеку.

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