Laravel: Как сделать маршруты типа / admin / customer / address и сделать возможной фильтрацию по клиенту - PullRequest
0 голосов
/ 25 февраля 2020

Я немного запутался в отношении laravel маршрутов и того, как это должно быть сделано.

У меня есть две модели:

Customer
CustomerAddress

Отношения такие, как можно было бы ожидать:

Customer hasMany CustomerAddress
CustomerAddress belongsTo Customer

В моем файле маршрутов у меня есть это для клиента, который работает отлично:

Route::get('/admin/customers', 'Admin\CustomersController@index')->name('admin.customers.index');
Route::get('/admin/customers/create', 'Admin\CustomersController@create')->name('admin.customers.create');
Route::post('/admin/customers', 'Admin\CustomersController@store')->name('admin.customers.store');
Route::get('/admin/customers/{customer}', 'Admin\CustomersController@show')->name('admin.customers.show');
Route::get('/admin/customers/{customer}/edit', 'Admin\CustomersController@edit')->name('admin.customers.edit');
Route::patch('/admin/customers/{customer}', 'Admin\CustomersController@update')->name('admin.customers.update');
Route::delete('/admin/customers/{customer}', 'Admin\CustomersController@destroy')->name('admin.customers.destroy');

(я знаю, что мог бы использовать маршрут ресурса, но мне нравится способ, которым это документирует доступное маршруты)

Что касается адресов клиентов, я хотел бы иметь возможность использовать что-то вроде:

Route::get('/admin/customers/addresses', 'Admin\CustomersAddressesController@index')->name('admin.customers.addresses.index');

Это раньше не работало и возвращало 404, но в конце концов я понял, что это это было потому, что он занимался «адресной» частью и осуществлял поиск в базе данных, а поскольку действительного покупателя не было, он вернул мне 404. Я исправил это, переместив его до того, как клиенты отправятся в путь. Это правильный способ сделать это?

Я также хотел бы иметь возможность фильтровать адреса по идентификатору пользователя примерно так:

Route::get('/admin/customers/{customer}/addresses', 'Admin\CustomersAddressesController@index')->name('admin.customers.addresses.index');

И возвращать только указанные c адреса клиентов, но я не уверен, как это должно быть сделано.

Что касается именования моделей, у меня есть две миграции: одна для таблицы с именами клиентов, следовательно, модель Customer, а другая для таблицы, называемой Customers_addresses. следовательно, модель CustomerAddress.

Это то, как это должно быть сделано?

Кажется немного странным, что обе модели имеют Customer в названии, но так как таблицы похожи, это то, что я и сделал. Должен ли я изменить имена моделей только на Customer и Address?

Должен ли я также изменить имена таблиц на клиенты и адреса вместо клиентов и users_addresses?

То же самое относится к контроллерам, которые в настоящее время с именами CustomersController и CustomersAddressesController.

Какова правильная структура имени для этого?

Я знаю, что это много, но я действительно запутался в этом, и я просто хочу сделать это правильно путь. Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Прежде чем ответить на ваш вопрос. Я хотел бы сказать вам, что я не очень хорош в Engli sh, но я рад поделиться.

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

  2. относительно имени вашего контроллера. Я бы использовал одно имя, а не множественное, как вы. поэтому CustomerAddressController вместо CustomersAddressesController.

  3. По поводу вашего файла имени маршрута все в порядке. Я сделаю то же самое, что и ты. потому что он следует за laravel документом.

  4. , но для вашего файла маршрута. Я предпочитаю использовать пространство имен и префикс вместо того, чтобы снова и снова писать admin.

Route::namespace('Admin')->prefix('admin')->name('admin.')->group(function () {
    Route::get('customers', 'CustomersController@index')->name('customers.index');
});

, чтобы узнать больше, вы можете прочитать Laravel Best Practice

Спасибо и надеюсь, что это поможет

0 голосов
/ 25 февраля 2020

во-первых, что касается соглашения об именах, вы правы. наименование может показаться немного странным и длинным, но, следуя соглашениям об администрировании базы данных, вы должны называть таблицы и столбцы именами, тесно связанными с тем, что они представляют (1NF, Правило базы данных в первой нормальной форме).
нам нужно всегда постарайтесь предусмотреть и создать приложение, которое будет масштабируемым. если вы решите изменить имя таблицы Customer_addresses, просто указав адрес, это может вызвать конфликт в будущем, когда вы намереваетесь добавить различные роли, такие как customerService, vendors и т. д. c. если вы намереваетесь хранить их адреса в разных таблицах по какой-либо конкретной причине c, возможно, для уменьшения количества запросов и поиска, необходимых для сбора результатов адресов для пользователя определенной роли, вы столкнетесь с конфликтом именования, если вы решите переименовать таблицу customer_address в простые адреса.
Примечание, за исключением того, что вы собираетесь собрать все адреса в этой таблице (что не рекомендуется), тогда вы можете это сделать. Кроме того, пользователь может иметь более одной роли, он / она может использовать разные адреса, поэтому вы можете сохранить их в своих указанных c таблицах

Далее для маршрута, я Если вы пытаетесь скрыть данные клиента от URL-адреса при получении адресов клиентов, вы можете сделать это с помощью шифрования.
Вы должны использовать это.

Route::get('/admin/customers/addresses/{customer}', 'Admin\CustomersAddressesController@index')->name('admin.customers.addresses.index');

, но шифровать с помощью Crypt :: encrypt. Ваша ссылка get может быть чем-то вроде

<a  href="{{route('/admin/customers/addresses',['customer' => Crypt::encrypt(customer_id) ])}}">Customers Address</a>


Ваш контроллер

public function getCustomerAddress($customer){    
    $customer_id = Crypt::decrypt($customer);    
    //then your action      
}

это отправит зашифрованный параметр через URL. Я мой ответ смог помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...