Alex
у меня ajax
Alex
то есть изначально это было написано так что чувак регается, получает токен и потом по этому токену опять идет запрос на сервер, чтобы поулчить Layer
Alex
Я эту бредятину хочу переписать чтобы LayerController@show сразу отдавался при регистрации
Alex
И в принципе работает но смущает копипаста
Alex
То есть если я в LayerController@show что то поменяю надо будет не забыть ручками в RegisterController тоже актуализовать
Pavel
Вынеси логику из этих методов с отдельный сервис?
Pavel
Или в модель пользователя
Alex
Ну это жестоко чот
Pavel
СОЛИДно жеж
Alex
абстракция на абстракции сидит
Alex
я думаю в register вызвать этот экшен layer, потом просто с ним поработать как с json потом вернуть уже юзеру
Alex
но меня смущает что надо инъекцию LayerController тогда делать в Register
Станислав
d
Dmitry
Alex
Как вызвать экшен другого контроллера?
Alex
Вариант с тем чтобы создавать отдельный сервис, в который будут стукаться оба контроллера мне кажется еще более худшим вариантом
Dmitry
Alex
Dmitry
Провайдер
:) нет это совсем из другой оперы. Сервис это класс или модуль который реализует какой то кусок твоей бизнес логики. И вся бизнес логика должна быть в сервисах
Alex
Есть LayerController, который отдает слои пользователя
Alex
Есть RegistrationController, который его регистрирует
Alex
Я хочу чтобы при регистрации отдавались слои пользователя
Alex
Как это реализовать?
Dmitry
Alex
Категории пользовательские
Alex
Не суть, модель, которая привязана к пользователю
Dmitry
Категории пользовательские
задача контроллера принять запрос, как то его обработать, и отдать ответ.
все данные ты получаешь в котроллере и отдаешь с ответом. Этому каждый контроллер уникален, и его нет смысла куда то ижектить. Скинь код этих 2х контроллеров так понятенее будет что ты пытаешься сделать
Alex
class LayerController extends Controller
{
public function show(Layer $layer) {
$markers = $layer->markers('clean');
$layer = $layer->only(['id','name']);
return response()->json(array(
'layer' => $layer,
'markers' => $markers,
));
}
Alex
class RegisterController extends Controller
{
$layers = $user->layers('clean');
$markers = $layers->first()->markers('clean');
return response()->json([
'success'=> true,
'id'=> $user['id'],
'name' => $user['name'],
'layers' => $layers,
'markers' => $markers,
])->header('Authorization', "Bearer ".$token);
Aleksey Y.
Dmitry
Alex
В общем, есть три модели: User, Layer и Marker. Layer принадлежит User, Marker принадлежит Layer. У каждого свой контроллер на просмотр, создание и тд
Alex
Я хочу при регистрации User создать ему дефолтный Layer с дефолтными Marker
Alex
Для этого мне надо вызвать экшены create у LayerController и MarkerController соответственно. Причем сделать это из RegistrationController
Alex
Мне кажется достаточно типовая задача
Aleksey Y.
Делай через события
Alex
Сейчас я ее решил тем что заинъектил LayerController в RegistartionController
class RegisterController extends Controller
{
public function __construct(LayerController $layerCtrl, Faker $faker)
{
$this->layerCtrl = $layerCtrl;
Alex
И обращаюсь через $this->layerCtrl->create...
Alex
и меня это смущает, но я не могу понять как по-другому
Aleksey Y.
Aleksey Y.
Alex
Через события тоже не совсем понятно, потому что я же хочу при запросе на RegistrationController сразу отдать данные и с Layer и с Marker. То есть я предполагаю что мне надо изнутри RegistrationController что то сделать
Alex
Естественно при стороннем обращении к LayerController есть валидация и тд
Aleksey Y.
Dmitry
Alex
Бинго!
Alex
$myRequest = new Request([
'name' => 'Главная',
'user_id' => $user['id'],
'icon' => 'pin',
]);
$this->layerCtrl->create($myRequest);
Dmitry
Alex
Нет
Dmitry
Нет
вот зря, смотри как у тебя должен работать котроллер регистрации (примерно)
class Register
function registerUser(Request $request, UserRegisterService $service){
$responce['result'] = true;
try{
$user = $service->registerUser($request);
$responce['user'] = $user;
}catch(Exeption $e){
}
return $responce;
}
Dmitry
все, больше тут ничего не должно быть
Alex
Ок, в UserRegisterService как вызвать экшен LayerController?
Dmitry
Ок, в UserRegisterService как вызвать экшен LayerController?
в сервисе не надо вызывать контролле там просто создаешь пользователя
class UserRegisterService
$user = User::create(...);
if(!$user){
throw Exeption
}
$loyer = $user->loyer()->create(...);
$loyer ->markers()->create(...);
return $user ;
Alex
Можно решить событиями если мне просто нужно уведомть LayerController. Но если мне нужно получить результат экшена? Ребята предлагают написать отдельный провайдер, в который и LayerController и RegistrationController будут стукаться но это вообще жесть
Dmitry
Dmitry
Alex
Aleksey Y.
Evgenii
Всем привет. я только начинаю знакомство с Laravel и меня несколько смутила двойственная ситуация с внешними ключами. подскажите пожалуйста мне.
В документации говорится, что можно делать, а можно и нет, просто сказав в eloquent что имеются такие-то отношения между моделями. Но зачем это? Чтобы самому за целостностью данных следить?( Высокоуровнево абстрагироваться от бд? О_о
Какие best practices приняты в Laravel?
Дима
Дима
Я принципиально не буду писать ответ, все есть в доках
Evgenii
я не про получение, а скорее про удаление и мертвые записи. если не ввести внешние ключи и их ограничения - я подозреваю, что мы можем получить ряд "мертвых" записей, при удалении некоторых записей, связанных с другими
Evgenii
наверное если не генерить ключи - надо как-то в логике модели это дело обрабатывать
Evgenii
http://www.diegocaprioli.com/laravel-migrations-write-those-foreign-keys-from-the-start/#I_see_dead_records8230 вот примерно на чем основывается мое беспокойство.
лично мне кажется что лучше сгенерить внешние ключи и прописать все эти действия сразу. такие например как каскадное удаление, или запрещение удаления, если есть связанные сущности.
но зачем-то же в архитектуре laravel сделано так что можно по одному и по второму пути пойти. как в сообществе laravel считается хорошим тоном работать?
Samat
Evgenii
Anton
Евгений, это сильно зависит от принятых соглашений, никаких бест практик тут нет.
Evgenii
Evgenii
вы извините, если я туплю. я laravel только начал смотреть, а опыт разработки у меня из таких страшных областей пхп, которые не очень сочетаются с концепциями нормальных пхп фрэймворков
Dmitry
Dmitry
Dmitry
но в контексте AR так и придется делать. Но если это сделать в сервисе, то код станет гибче
Evgenii
так-с, ну примерно понял, да. спасибо👍